From 9cf564ffe4af4c9ba8ce675399d508c74673cacf Mon Sep 17 00:00:00 2001 From: TLINDEN Date: Fri, 10 Feb 2012 20:22:49 +0100 Subject: [PATCH] CHANGED: does no more use the external touch command to create a new file, use perls open() instead. CHANGED: excluded some of the help texts from the usage message and the interactive help command to a manpage. ADDED: new commandline flag "--encrypt" which one can use to encrypt the mysql database password. This will be decrypted before connecting to the db. There is also a new config file option "encrypt_passwd" which indicates an encrypted db-password. ADDED: another new config option "ShortCd", which can be set to "yes" or 1 and if set, then a command like "cd 13" would jump directly to the topic of the note with the number 13. ADDED: now you can at any time cd back to the "root" of the topic-structure using the command "cd /". CHANGED: mysql.pm does now only do a table-lock on single write accesses, no more on the whole session. This allows one to access the same db twice or more. FIXED: Changed README and Changelog for readability on 80 by 25 displays. And changed indentation of the note script itself. ADDED: NOTEDB.pm - a generic module, which holds some methods, which are used by binary.pm, mysql.pm and dbm.pm. ADDED: NOTEDB.pm generate_search(), which allows one to use AND, OR and various combinations of them using ( and ). ADDED: a search does now return the 2nd line of a note if a matching note's first line is a topic. CHANGED: use "unshift" instead of push to add $libpath to @INC. ADDED: a new feature, Caching of notes. supported by binary.pm and mysql.pm. To turn it on, one need to set "Cache" in the config to a true value. --- 0x49/CVS/Entries | 3 + 0x49/CVS/Repository | 1 + 0x49/CVS/Root | 1 + 0x49/contents/CVS/Entries | 14 + 0x49/contents/CVS/Repository | 1 + 0x49/contents/CVS/Root | 1 + 0x49/contents/about | 13 + 0x49/contents/changelog | 294 ++++ 0x49/contents/cvs | 20 + 0x49/contents/deutsch | 19 + 0x49/contents/download | 17 + 0x49/contents/index | 49 + 0x49/contents/installation | 42 + 0x49/contents/license | 342 ++++ 0x49/contents/menu | 19 + 0x49/contents/screenshots | 16 + 0x49/contents/upgrade | 45 + 0x49/contents/usage | 350 +++++ 0x49/contents/version | 1 + 0x49/images/CVS/Entries | 14 + 0x49/images/CVS/Repository | 1 + 0x49/images/CVS/Root | 1 + 0x49/images/anybrow.gif | Bin 0 -> 1286 bytes 0x49/images/button.gif | Bin 0 -> 948 bytes 0x49/images/gproc.jpg | Bin 0 -> 72417 bytes 0x49/images/linux.gif | Bin 0 -> 1770 bytes 0x49/images/msfree.gif | Bin 0 -> 1654 bytes 0x49/images/note-be.jpg | Bin 0 -> 227425 bytes 0x49/images/note-linux.gif | Bin 0 -> 7387 bytes 0x49/images/note-win32.gif | Bin 0 -> 7627 bytes 0x49/images/note.jpg | Bin 0 -> 1202 bytes 0x49/images/note_be_small.png | Bin 0 -> 23865 bytes 0x49/images/note_linux_small.png | Bin 0 -> 997 bytes 0x49/images/note_win32_small.png | Bin 0 -> 1167 bytes 0x49/images/notes.png | Bin 0 -> 760 bytes 0x49/index.html | 86 + CVS/Entries | 12 + CVS/Repository | 1 + CVS/Root | 1 + Changelog | 272 ++-- Makefile.PL | 7 +- NOTEDB.pm | 213 +++ NOTEDB/CVS/Entries | 5 + NOTEDB/CVS/Repository | 1 + NOTEDB/CVS/Root | 1 + NOTEDB/binary.pm | 128 +- NOTEDB/dbm.pm | 49 +- NOTEDB/mysql.pm | 161 +- README | 191 ++- TODO | 4 +- bin/CVS/Entries | 2 + bin/CVS/Repository | 1 + bin/CVS/Root | 1 + bin/_note | 1681 ++++++++++++++++++++ bin/note | 2496 +++++++++++++++--------------- bin/system_and.patch | 19 + config/CVS/Entries | 2 + config/CVS/Repository | 1 + config/CVS/Root | 1 + config/noterc | 11 + config/rc | 154 ++ mysql/CVS/Entries | 5 + mysql/CVS/Repository | 1 + mysql/CVS/Root | 1 + note | 5 +- note.1 | 636 ++++++++ note.pod | 501 ++++++ 67 files changed, 6310 insertions(+), 1604 deletions(-) create mode 100644 0x49/CVS/Entries create mode 100644 0x49/CVS/Repository create mode 100644 0x49/CVS/Root create mode 100644 0x49/contents/CVS/Entries create mode 100644 0x49/contents/CVS/Repository create mode 100644 0x49/contents/CVS/Root create mode 100644 0x49/contents/about create mode 100644 0x49/contents/changelog create mode 100644 0x49/contents/cvs create mode 100644 0x49/contents/deutsch create mode 100644 0x49/contents/download create mode 100644 0x49/contents/index create mode 100644 0x49/contents/installation create mode 100644 0x49/contents/license create mode 100644 0x49/contents/menu create mode 100644 0x49/contents/screenshots create mode 100644 0x49/contents/upgrade create mode 100644 0x49/contents/usage create mode 100644 0x49/contents/version create mode 100644 0x49/images/CVS/Entries create mode 100644 0x49/images/CVS/Repository create mode 100644 0x49/images/CVS/Root create mode 100644 0x49/images/anybrow.gif create mode 100644 0x49/images/button.gif create mode 100644 0x49/images/gproc.jpg create mode 100644 0x49/images/linux.gif create mode 100644 0x49/images/msfree.gif create mode 100644 0x49/images/note-be.jpg create mode 100644 0x49/images/note-linux.gif create mode 100644 0x49/images/note-win32.gif create mode 100644 0x49/images/note.jpg create mode 100644 0x49/images/note_be_small.png create mode 100644 0x49/images/note_linux_small.png create mode 100644 0x49/images/note_win32_small.png create mode 100644 0x49/images/notes.png create mode 100644 0x49/index.html create mode 100644 CVS/Entries create mode 100644 CVS/Repository create mode 100644 CVS/Root create mode 100644 NOTEDB.pm create mode 100644 NOTEDB/CVS/Entries create mode 100644 NOTEDB/CVS/Repository create mode 100644 NOTEDB/CVS/Root create mode 100644 bin/CVS/Entries create mode 100644 bin/CVS/Repository create mode 100644 bin/CVS/Root create mode 100755 bin/_note create mode 100644 bin/system_and.patch create mode 100644 config/CVS/Entries create mode 100644 config/CVS/Repository create mode 100644 config/CVS/Root create mode 100644 config/rc create mode 100644 mysql/CVS/Entries create mode 100644 mysql/CVS/Repository create mode 100644 mysql/CVS/Root create mode 100644 note.1 create mode 100644 note.pod diff --git a/0x49/CVS/Entries b/0x49/CVS/Entries new file mode 100644 index 0000000..db015e8 --- /dev/null +++ b/0x49/CVS/Entries @@ -0,0 +1,3 @@ +/index.html/1.1.1.1/Sat Jul 1 14:40:50 2000// +D/contents//// +D/images//// diff --git a/0x49/CVS/Repository b/0x49/CVS/Repository new file mode 100644 index 0000000..ee4a33e --- /dev/null +++ b/0x49/CVS/Repository @@ -0,0 +1 @@ +NOTE/0x49 diff --git a/0x49/CVS/Root b/0x49/CVS/Root new file mode 100644 index 0000000..9c415c0 --- /dev/null +++ b/0x49/CVS/Root @@ -0,0 +1 @@ +zarahg@cvs.htnews.sourceforge.net:/cvsroot/htnews diff --git a/0x49/contents/CVS/Entries b/0x49/contents/CVS/Entries new file mode 100644 index 0000000..861a20b --- /dev/null +++ b/0x49/contents/CVS/Entries @@ -0,0 +1,14 @@ +/about/1.1.1.1/Sat Jul 1 14:40:50 2000// +/deutsch/1.1.1.1/Sat Jul 1 14:40:50 2000// +/index/1.1.1.1/Sat Jul 1 14:40:50 2000// +/installation/1.1.1.1/Sat Jul 1 14:40:50 2000// +/license/1.1.1.1/Sat Jul 1 14:40:50 2000// +/screenshots/1.1.1.1/Sat Jul 1 14:40:50 2000// +/upgrade/1.1.1.1/Sat Jul 1 14:40:50 2000// +/usage/1.1.1.1/Sat Jul 1 14:40:50 2000// +/cvs/1.2/Sat Jul 1 14:55:31 2000// +/menu/1.2/Sat Jul 1 14:58:41 2000// +/changelog/1.2/Sun Jul 9 22:16:25 2000// +/version/1.2/Sun Jul 9 22:16:43 2000// +/download/1.4/Sun Jul 9 23:03:12 2000// +D diff --git a/0x49/contents/CVS/Repository b/0x49/contents/CVS/Repository new file mode 100644 index 0000000..67873a3 --- /dev/null +++ b/0x49/contents/CVS/Repository @@ -0,0 +1 @@ +NOTE/0x49/contents diff --git a/0x49/contents/CVS/Root b/0x49/contents/CVS/Root new file mode 100644 index 0000000..9c415c0 --- /dev/null +++ b/0x49/contents/CVS/Root @@ -0,0 +1 @@ +zarahg@cvs.htnews.sourceforge.net:/cvsroot/htnews diff --git a/0x49/contents/about b/0x49/contents/about new file mode 100644 index 0000000..484ea34 --- /dev/null +++ b/0x49/contents/about @@ -0,0 +1,13 @@ +

about note and this page

+

+The author of note is Thomas Linden. if you have any questions, suggestions, votes or even flames, please feel free to +send me an E-mail! +

+This page is hosted by ConSol* GmbH, Germany - THANKS A LOT! +

+Powered by ePerl and vi. +

+ +

+Logo created with:
+ diff --git a/0x49/contents/changelog b/0x49/contents/changelog new file mode 100644 index 0000000..e603761 --- /dev/null +++ b/0x49/contents/changelog @@ -0,0 +1,294 @@ +

changelog

+ +
+ +
+

















+ +0.1: +INITIAL RELEASE. + + diff --git a/0x49/contents/cvs b/0x49/contents/cvs new file mode 100644 index 0000000..7247410 --- /dev/null +++ b/0x49/contents/cvs @@ -0,0 +1,20 @@ +

CVS

+

+ +The whole note source tree is now maintained via CVS at sourceforge.net. + +You can browse the repository via the web: +
+http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/NOTE/?cvsroot=htnews. + +

+ +Or you can use the cvs command: +
+

+cvs -d:pserver:anonymous@cvs.htnews.sourceforge.net:/cvsroot/htnews login 
+
+cvs -z3 -d:pserver:anonymous@cvs.htnews.sourceforge.net:/cvsroot/htnews co NOTE
+
+
+When prompted for a password for anonymous, simply press the Enter key. diff --git a/0x49/contents/deutsch b/0x49/contents/deutsch new file mode 100644 index 0000000..b2e9a46 --- /dev/null +++ b/0x49/contents/deutsch @@ -0,0 +1,19 @@ +

Hinweise für deutsche Besucher

+note ist ein Konsolenprogram, mit dem man einfach Notizen verwalten + kann, ähnlich wie bei "knotes". Es ist in Perl geschrieben. Note + verwendet externe (mitgelieferte!) Module als Speicher-Backend, um + die Daten zu speichern. Momentan ist ein mysql-Modul dabei, sowie + ein "binary"-Modul, note's eigenes Datenformat und seit 1.0.5 auch ein + DBM modul. Das mysql Modul verwendet Perls Standard Modul DBI + und ist damit für alle gängigen DBMS verwendbar. + Seit Version 1.0.0 wird Verschlüsselung unterstützt(IDEA oder DES), + man kann also durchaus auch sensible Daten speichern. +

+Die Dokumentation für note liegt leider nur in englisch vor. Trotzdem müssen Deutsche +nicht ganz leer ausgehen :-) +

+Hannes Lau hat auf seiner Homepage eine kurze Beschreibung bereitgestellt (Tausend Dank!). +

+Eine ausführliche Beschreibung des Programmes ist ausserdem im +LinuxMagazin 5/2000 S. 106 erschienen (allerdings basierend auf einer +älteren Version...)!
*stolzsei* ;-) diff --git a/0x49/contents/download b/0x49/contents/download new file mode 100644 index 0000000..609781f --- /dev/null +++ b/0x49/contents/download @@ -0,0 +1,17 @@ +

downloads

+

+Here you can find the note package for free download. Follow the installation instructions in the +README file provided with the package or read the online version. +

+ newest: note-1.0.8.tar.gz
+ note-1.0.7.tar.gz
+ note-1.0.6.tar.gz
+ note-1.0.5.tar.gz
+ read the README
+ read the Changelog
+ +


+If you encounter any problems with the site above, try to use one of the following mirrors:

+ftp://www.0x49.org/pub/scip/note/ +
+http://sourceforge.net/project/filelist.php?group_id=656 diff --git a/0x49/contents/index b/0x49/contents/index new file mode 100644 index 0000000..29e5fbb --- /dev/null +++ b/0x49/contents/index @@ -0,0 +1,49 @@ +

welcome to the homepage of note by Thomas Linden

+note is a small console program written in perl, which allows +you to manage notes similar to programs like "knotes" from +commandline. Note can use different database-backends for +notes-storage. It ships with a DBI-based mysql-module(which +can also be used for other by DBI supported DBMS) and another +module, which uses a binary file for storage and a DBM module.
+Note supports since version 1.0.0 encryption(IDEA or DES)!

+Here is a brief list of it's features: + +

+ +

+ note is released under the terms of the Gnu Public License(GPL) + and is therefore free Software. diff --git a/0x49/contents/installation b/0x49/contents/installation new file mode 100644 index 0000000..c4e43bc --- /dev/null +++ b/0x49/contents/installation @@ -0,0 +1,42 @@ +

installation of note

+

+ Unpack the tar-ball and issue the command:
+ $ perl Makefile.PL
+ It will ask you a few questions about file destinations. + The script will find itself the proper destinations for + the files. So, if you agree with it, simply press ENTER. + However, you may decide to use other destinations. In this + case, enter it, when asked. This maybe usefull, if you are + installing it in your ome-directory and if you are not root! +

+ For installation instructions for the mysql database installation + see mysql/README. +

+ If want to use another SQL database, i.e. postgresql then set + the option "DbDriver" to the name of the responding DBI-driver + and create a symlink of this name like this: +
/usr/lib/perl5/siteperl/NOTEDB $ ln -s mysql.pm oracle.pm +
The functionality is the same, but not the name! +

+ The default binary file backend does not need any special installation + procedure, you need only to spceify a filename in your config file. +

+ The DBM backend(NOTEDB::dbm) requires the existence of a directory, + which you must specify in your config using the option "DbName". +

+ + +Configuration + + This version of note doesn't neccessarily need + a configuration file. But you can have one and change + some default values. Take a look to the file config/noterc + provided with this tarball. There are detailed instructions + about every available parameter. +
Simply copy this file into your home-directory and name it + .noterc + If you decide not to use the default database backend (a binary + file), you will *need* a configuration! + + + diff --git a/0x49/contents/license b/0x49/contents/license new file mode 100644 index 0000000..3f49b1b --- /dev/null +++ b/0x49/contents/license @@ -0,0 +1,342 @@ +

                    
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  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 Library 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
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    
+    Copyright (C) 19yy  
+
+    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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 19yy name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  , 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
diff --git a/0x49/contents/menu b/0x49/contents/menu new file mode 100644 index 0000000..c3a3630 --- /dev/null +++ b/0x49/contents/menu @@ -0,0 +1,19 @@ + +
home

installation

usage

upgrade

changelog

download

license

cvs

screenshots

deutsch

about

+


+
last updated 02.07.2000 +

+best viewed with any browser +

+ diff --git a/0x49/contents/screenshots b/0x49/contents/screenshots new file mode 100644 index 0000000..3329a3d --- /dev/null +++ b/0x49/contents/screenshots @@ -0,0 +1,16 @@ +

screenshots

+ +Yes there are also screenshots of note available :-) +
+Simply click on a tumbnail to enlarge the image! +

+ Linux +
+

+ Win32 +
+

+ BeOS +
+

+and finally here a desktop of a user with note running. diff --git a/0x49/contents/upgrade b/0x49/contents/upgrade new file mode 100644 index 0000000..2158119 --- /dev/null +++ b/0x49/contents/upgrade @@ -0,0 +1,45 @@ +

upgrade from previous version of note to 1.0.x

+

+In any case: BACKUP your existing note database!!!!!!! +The format has not changed, but some default values +(see the new config file-sample). Use this command +to save your note database with your *old* version +of note:
+ "note -D"
+This works with both the mysql and the binary version. +

+You need to reedit your configfile. Please refer to the +sample config in config/noterc. +

+


+

+This version of note has now encryption support build in. +If you decide to use it, you need to re-initialize your +note database. That's why, because your current database +is unencrypted and *if* you want to secure your data, you +need to secure everything. That means, your existing data +must be encrypted before you can use this new capability! +

+Follow this steps: +

+From now on, your data is encrypted. You will need the passphrase +you set above for decrypting it! So - don't forget it! + + diff --git a/0x49/contents/usage b/0x49/contents/usage new file mode 100644 index 0000000..821d26d --- /dev/null +++ b/0x49/contents/usage @@ -0,0 +1,350 @@ +

usage of note

+

+1. Description

+2. Topics

+3. Formatting of note-text

+4. Scripting

+5. Binary DB

+6. Mysql DB

+7. Dump Format

+8. Security

+


+

+ +

Decription

+ + If you don't know, how to run note, try "note -h" first. + It will tell you all available commandline options. +

+ To create a new note, simply run "note". You can enter + the note (the length is by default limited to 4096 bytes, + which you can change from your config file if you are using + the binary backend, therwise there is no limitation). + End by typing a . on a line itself. note will tell you the + number of the note. +

+ If you want to view the note, type "note 1", if the notenumber + was 1. +

+ If you want to get an overview of all notes, type "note -l". + You will get a list of all notes, containing the number, + the first line and the creation date. If topic-support is + turned on (which is by default), then all subtopics under the + current topic will be displayed first. +
If you want to get a listing of all + If you want to see the timestamps, use "-L" instead of "-l". + Read more about topics below in the section "Topics". + You can also specify the topic which notes you want to see: + "-l mytopic" does the trick. +
Additional, you might want to get an overview of your topic- + strcture. You can use the command "-t" in this case, which + will display a tree-view of your tpic-structure. You can + use the command "-T" if you want to see the notes under each + topic too. "-T" will also show the number of each note. +

+ To edit a certain note, type "note -e 1". It will invoke your + editor (vi or pico). You can edit it, after saving, note + will store the changed note to the database. +

+ Of course you can drop a certain note: "note -d 1" deletes + note number 1. If a note in the middle or the beginning of + the database will be deleted, note will recount the other + existent notes. For example there are 3 notes, number 1, 2 + and 3. If you delete number 2, then number 3 will become + number 2. +
You can also make use of the extended delete-syntax: + To delete note 1 and 2, use "-d 1,2" + To delete note 1,2 and 3, use "-d 1-3". +

+ If you cannot remember, which note you are looking for, you + can use the search capability of note: "note -s ". + note will search the whole note database case insensitive for + an occurence of this string and tell you the number and first- + line it have. +

+ Instead of using note from the commandline you can use the + interactive mode. Run note with "note -i". If you need assistance + type "?" or "h" at the ">" prompt. The interactive mode + provides you the most functions of note. +

+ You can also dump the contents of your note-database into a + ASCII-textfile(-D). You can use this file later to import it into + your note-database(-I). This is usefull, if you want quickly trans- + fer your notes from one host to another (i.e. you could mail + your note-dump form your office to home and import it there + for further use). +
The dumps from the two versions of note are in the same format. + Using dumps it is also possible to reinitialize your database. You + can use the "-o" switch whcih causes note to overwrite your existing + database. This is very handy if you changed heavily your config. And + it is required, if you changed: encryption, db-driver, (binary-format) + and the password. You can use the following command for reinitializing: +
$ note -D - | note -o -I - +
What the hell, does it?! Step by step: +

+ Before you use the "-o" switch, I consider yuo to make a backup! + +

+ +top

+

Topics

+ + If topic-support is turned on (which is by default), the various + notes are sorted under various topics. There is no special database + field for the topic. Instead the topic will be stored right in the + note. +
If the first line of your note contains some text bordered by slashes + (or whatever you prefer, set "TopicSeparator" in your config! default is slash), + then note will consider it as the topic of this certain note. For examle: +
/TodoList/ +
If you are using topics, no data after the topic is allowed, if there + is any text, note will consider it as a subtopic! Therefore, don't for- + get to put a newline after the topic-line. +

+ If you are in interactive mode, you can "cd" to a different note simply + by typing it's name at the command-prompt, or you can use the well-known + syntax "cd topic". +
The list-command will only show you notes under this topic. If you create + a new note, it will automagically inserted under the current topic (note + will prepend the string "/topicname/" to the text of your note). +

+ You can create at any time from any point a new topic. Just create a new + note and type the name of the new topic bordered by slashes (or TopicSeparator) + at the first line of this note. After saving, there will be available a + new topic with one note in it. +

+ You can create as many subtopics as you like, the format is similar to a + filesystem-path. An example, say, you want to create such a structure: +

+

        
+        (root - top level)
+        |
+        |----test
+        |      |----subtopic
+        |      |       |--note 1
+        |      |       |--note 2
+        |      |
+        |      |--note 4  
+        |
+        |--note 3
+
+

+ Then you may create those 4 new notes: +
+

+        --- snip ---
+        /test/subtopic/
+        note 1
+        --- snip ---
+        /test/subtopic/
+        note 2
+        --- snip ---
+        note 3
+        --- snip ---
+        /test/
+        note 4
+        --- snip ---             
+

+ I hope, you got the point ;-) +

+ + + If a note does not contain the "magic" /topic/ construction on the first + line, it will be listed under the "root" of note, that is the point you are + at the startup of note. +

+ You can subsequently move a note without a topic to a certain topic. Simply + edit it and insert at the first line the above mentioned construction. +

+ Note: Please don't forget the prepending and appending a slash of a topic. + You will get strange results without it! + + +

+ +top

+

Formatting of notes

+ + Another very nice feature is the possibility to format the note-text (as much as + shell allows it). First, you can use the note-internal "magic-strings" for color- + izing. Those strings looks much like HTML: +i
"here is a green line of text no more green." + As you see, the beginning of another color starts with a tag(kinda) of the color + and ens with an end tag . +

+ The following colors are available: + black, red, green, yellow, blue, magenta, cyan and white. +

+ Beside colorizing text, you can also create bold or underlined text! If you decide + to use this (additional) feature, you need to set the Config-Option "FormatNotes" + to 1 which turns it on. +
Usage is very straightforward, if a word (a word is defined as some text with at least + one space surrounded) is between a magic mark-character. Here are the available + things, you can do: +

+                bold:           **word**
+                underlined:     __word__
+                inverse:        {{word}}
+
+ The text will be formatted using the actually note-color. +

+ + +top

+

Scripting

+ + Since version 1.0.3 there are some additions which allows you to use note in + scripts, without user-interaction. You might run a special script as cronjob, + which adds a note under a certain topic every week. Or the like. +

+ Here are the possibilies you have: +

+ You can add a new note through a pipe, another commands output becomes + note's input: +
$ cat /var/spool/news/daily | note - +
This command adds the content of a file "daily" as a new note. Note the dash. + it stands for "Standard Input". Note will be completely silent and it will not + ask for something. +

+ Suppose you are using encryption. You might wonder, how note will get your + passphrase? The solution: You need to set up an environment variable which + contains the password: +
$ export NOTE_PASSWD=secret +
If the variable is present, note will not ask you for a passphrase! +

+ Another thingy you might find useful is the -r (--raw) command-line flag. This + turns note into raw mode , which means it will only print the + data without any formatting. Raw mode is available for list and display, + since it makes no sense, interactive mode doe not support raw mode. +

+ + + +top

+

Format of the notedb (binary backend)

+ + The database where the notes are stored is a binary fixed record length file + of the following format: + It consists of three fixed length fields per entry. The fields + have the following types: + + You can change the sizes of the fields "Note" and "Time" in + the configfile "~/.noterc". If it does not exist, the above + defaults will be used. +
If the data to be stored is smaller then the size of the field, + it will be filled with ZERO's ("\0"). The Note and the Time + fields will be uuencoded before storage. Of course, this is + no security, never mind... + +

+ +top

+

The note-database (mysql backend)

+ + The sql-database for the mysql version has the following design: +
+        +--------+---------+------+-----+---------+----------------+
+        | Field  | Type    | Null | Key | Default | Extra          |
+        +--------+---------+------+-----+---------+----------------+
+        | number | int(10) |      | PRI | 0       | auto_increment |
+        | note   | text    | YES  |     | NULL    |                |
+        | date   | text    | YES  |     | NULL    |                |
+        +--------+---------+------+-----+---------+----------------+
+
+ +

+ +top

+

Format of the ASCII-dump file (note -D)

+ + The dump of a note-database (if you use note -D) has the following + format: +
        
+        --- snip ---
+        Number: 1
+        Timestamp: 14.01.2000 00:25:01
+        This is a sample text
+        in a sample note.
+
+        Number: 2
+        Timestamp: 14.01.2000 02:37:40
+        And this is another sample
+        of a note.
+        --- snip ---
+
+

You can reimport a dump into your note-database with "note -I " + Existing notes will not overwritten, note will append the imported + data to your note-database. +

+ + +top

+

Security

+ + If you are using the MySQL driver, refer to the mysql + manual for more informations about security of mysql databases: + http://www.mysql.org/Manual_chapter/manual_Privilege_system.html +

+ If you are using notes proprietary binary driver, then + the permission 0600 of the file "~/.notedb" is strongly required! +

+ Additional, you can turn on encryption from the config file. + Simply set UseEncryption to 1. Please note, that you need + to decide, if you want to use encryption before the first use + of note! If have already a note database and want to "migrate" + to encryption, I suggest you to follow the directions in the + file UPGRADE! +

+ You can choose from different encryption algorythms. The default + is IDEA, but DES or BLOWFISH is also possible. You need to have + installed the following additional perl-modules on your system: +

+ After turning on encryption, note will ask you for a passphrase + everytime it runs! It will *not* store this passphrase! + So, don't forget it! Be careful! +

+ Once note have encrypted some data using this passphrase, you + cannot simply switch to another passphrase, because all data + within the database needs to be encrypted using the same passphrase! + If you want to change the passphrase for any reason, please read + the file UPGRADE and follow it's directions! +
Someday I will add a "change passwd" function, which will do all + these things for you. Someday, I said... + For now you can use the "re-initialze database" functionality, mentioned + earlier in the "Usage" section (at the end of the section). +

+ Note: To make sure, the encrypted data can be stored properly, + it will be uuencoded after encryption. +

+ Note: *If* you forgot your passphrase and *if* you don't have + a backup of your database without encryption, PLEASE + don't bother me with "helpme" emails! If you don't know + the phrase, then the data can't be decrypted. Even if it + is possible - I am not responsible for that! +

+ Note: How does note know, if the passphrase was incorrect? It uses the + specified phrase and encodes at least one note (the first one) + and checks if the decrypted timestamp field matches the following + expression: "^\d+\.\d+". Translated from perl to human: + the timestamp must begin with minimum one digit (possibly more), + followed by one dot, followed by minimum one digit (possibly more). + Chances are bad, that a wrong passphrase will cause a timestamp + matching the rule above. If you have other experiences, please + drop me a mail! diff --git a/0x49/contents/version b/0x49/contents/version new file mode 100644 index 0000000..b0f3d96 --- /dev/null +++ b/0x49/contents/version @@ -0,0 +1 @@ +1.0.8 diff --git a/0x49/images/CVS/Entries b/0x49/images/CVS/Entries new file mode 100644 index 0000000..a2d8974 --- /dev/null +++ b/0x49/images/CVS/Entries @@ -0,0 +1,14 @@ +/anybrow.gif/1.1.1.1/Sat Jul 1 14:40:51 2000// +/button.gif/1.1.1.1/Sat Jul 1 14:40:51 2000// +/gproc.jpg/1.1.1.1/Sat Jul 1 14:40:51 2000// +/linux.gif/1.1.1.1/Sat Jul 1 14:40:51 2000// +/msfree.gif/1.1.1.1/Sat Jul 1 14:40:51 2000// +/note-be.jpg/1.1.1.1/Sat Jul 1 14:40:52 2000// +/note-linux.gif/1.1.1.1/Sat Jul 1 14:40:51 2000// +/note-win32.gif/1.1.1.1/Sat Jul 1 14:40:51 2000// +/note.jpg/1.1.1.1/Sat Jul 1 14:40:52 2000// +/note_be_small.png/1.1.1.1/Sat Jul 1 14:40:51 2000// +/note_linux_small.png/1.1.1.1/Sat Jul 1 14:40:51 2000// +/note_win32_small.png/1.1.1.1/Sat Jul 1 14:40:51 2000// +/notes.png/1.1.1.1/Sat Jul 1 14:40:51 2000// +D diff --git a/0x49/images/CVS/Repository b/0x49/images/CVS/Repository new file mode 100644 index 0000000..45ba545 --- /dev/null +++ b/0x49/images/CVS/Repository @@ -0,0 +1 @@ +NOTE/0x49/images diff --git a/0x49/images/CVS/Root b/0x49/images/CVS/Root new file mode 100644 index 0000000..9c415c0 --- /dev/null +++ b/0x49/images/CVS/Root @@ -0,0 +1 @@ +zarahg@cvs.htnews.sourceforge.net:/cvsroot/htnews diff --git a/0x49/images/anybrow.gif b/0x49/images/anybrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..d7c0e0ed88252e7064a94df2b20054f2128255d3 GIT binary patch literal 1286 zcmb7@?NibR0DyllyeWqhMG&&W6htLbvs?CJ{LE7#BQjP<(?J2^)MfM{nl{8tpbfDy zY-fhS(jv_+aqHF=#58f!b7n5L>V#^iU6yTmrIl{|346XjAD$0S=BA9*DKasz6qo^k z(a}+-)9G+H8XG+pi^XU(YBZX{!a}9eke%Hi5?x76ZOP2^vRHQ*j0+%m35M^0;9C-D zj?I3bl{KqWj%hRtM~)1fIrDDFV0e4}{5!S!zC`kx&tF)zYL-qPjf(0`N%>JIv4^;+T4H0bLeLlpz5&6UoE!u}m`o;tKmh(f><`L^7A|Jq1xR^pT3w%A?JY`z zhi>6%nlMR?md>S<#12e4e{RBAgf--@8n=u`wx zl`*PMGNPjO+Ht#A5SUuITj;XS4{pVTb9vIKot_%~smZkdu7V$I0vkV9oM3E#;y-Py zBJ&3+g={gdC=vTLtpg?2R=AgOo5`x3`t{QoqXeo5>ZlnVYPu-Cpgr5L6SgsA_jQt1eccB~6c4 zRlg4UW8=xao88rzfM*-TV@ImgvkNI&E;LpDXbFU0SF*V3_hR>0T1*jkK-Lg0lBM;W z+84RrHBa*UYU#&Vetq<5mERB@7==UlonrA-=ymb&ntKlkRFa-RBP!j3EVD{Pfe zH|unT@~#eFVgwthvLeHi2#l)iNuyzS;;HDP!S8(zk+-c6OJXR^a*D`mKoR5_4x~xZ z>BiCRz(X=kC4Gij9Bi(_M%+7rVDDa%Z`nf7CL@Z_5r3hA^w{rM{+c2b9tX(cg!@-Q zI-{rxl65Tt2d@)yKcQ9tX={k>`SoCU0ZA9gAi4Cb&Lxj`qKF56$&QS5$_F+FYKFOd z<`d?20Wsb+aKK#*k8H-rtJ??83UDAQ^rv(Z z6g+;|1-+T8<@Roc71_`v-E68%pWGIVW1SizfK0124II>_H<#tM4b7BKIj5TY(Mczz zhl56#TwTcvO8g7A$_oL`x(kRRNmkkgYB8UMXrT3X6c%l4P-R;blws)C{- a&Yr!+EAk7Jr3K|OwVb0mP+SB6YySl@6!3ol literal 0 HcmV?d00001 diff --git a/0x49/images/button.gif b/0x49/images/button.gif new file mode 100644 index 0000000000000000000000000000000000000000..244ed012286b28039ba5976c9aa44ac86610c305 GIT binary patch literal 948 zcmZ?wbhEHb6k!lz_|Cu}At9luscC3vXlZHbqn{Gh7mC1_lcp8XH$}Fp3yBJWy<86O@YC5YgDc#Kt3) X;L2Il%*rO9G=-&m%le}Y3=Gx)D~bmo literal 0 HcmV?d00001 diff --git a/0x49/images/gproc.jpg b/0x49/images/gproc.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1b8730ce90c81c9d04e562142c079d37d38f6dd0 GIT binary patch literal 72417 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 literal 0 HcmV?d00001 diff --git a/0x49/images/linux.gif b/0x49/images/linux.gif new file mode 100644 index 0000000000000000000000000000000000000000..afa21e0ac94b4dcd589ebca965902f297352b7c0 GIT binary patch literal 1770 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 literal 0 HcmV?d00001 diff --git a/0x49/images/note-be.jpg b/0x49/images/note-be.jpg new file mode 100644 index 0000000000000000000000000000000000000000..94d58805cc14ee65e435a4fce7bd88335c2ec630 GIT binary patch literal 227425 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

  • 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 R&97~4u7u6p<<$Q=_Ft>EB>?~c literal 0 HcmV?d00001 diff --git a/0x49/images/note-linux.gif b/0x49/images/note-linux.gif new file mode 100644 index 0000000000000000000000000000000000000000..acdfdba092ef29204073a22b2e486d120eca7fe7 GIT binary patch literal 7387 zcmV<193Pg0pkDw00030|NqR)%m4uYe}8`f0DnzQO#lFZ<>lp>nVGV( zvH$?h%>d2+|NsC0|NsC0A^r|cVPs_>cWHEJAV*0}Pyj3d0001R0;>T41pW}nNvpj$ z>&?6WU?`4cX`X1Ru59bRa4fq)ZQr&q?0oP4z@TtQEE41ejE!#qVl`-y zlVSn{Wos5_Y;FObj5vKZZ={|zbDuYHpLngQub_^zw6(UkxVgH!ymgQP2*JX_muJAk z!^Hx}$ibJGkd-)VZC$d7vDSL8s-@cB-rR86bmXPxz3J-f?CtLF?Y{_WoB+lM2@3lA zm-fr}3ep6`1kFsp3Y^-IQpF8b7gP>SJ@huQ+rox&x`7g>tyL_K{?;5m^cYbb!;KT+ zsa(mjrOTJOeHU=t^Rg3@kKlNIrsMv&o9c2o)yX;P)&mQp+!aw^e{ zO;e(S$+fH3uVCZVm^U-$KbsYN-aBKjXFs3^DI~lK^(fJjb(umvcTHndr%O#*9hns+ z$FPVKD_+bPkj%3FfZ04oM(sZ|ncikzHs(?_r+)2L1!s{iQoq-XsveiR@Mx*oLciYH zxVG)vxK+x_w@+U`on(8O1$G84S%R6N$sH+Q904c6W))@$>_|s-zFb5)l zCg!N)jy#HG1_3|@8DwP72sxxNMH(reK{I{W0+o_zM{=btVdBx59m7Ha6Bh$gD& zqKr1`=%bKED(R$@R%+>`m}aW!rkvtHXBn7uD(a}DmTKy$sHUpws;su^>KC7W`s%E- z)@tjmxaO+suDr%ND6hZ+G}8Ml0>4%KkF#wb*8>?Y7*m zT5Y%BhAZy4+in+2Q2Ww1Q%@Z z!3Za;@WKPP+wHp!M=bHg6jv+;#1?0)@x~l$i*d&whb;2Qw|-3W$tb6+aQvdKF4?DNm&*1RmxL>Fx|wmcuL^wLb{nsn1pM=f=!Pfu<2)mTGX zb=F*W?KP}ITl@9cWRtyh*=VPI^x0~+?KaMAzb*IND926r-FRzkciw#W&FF2FFL&PzaxKx@q|7P zJoSmr-l_DH7(e`d5Pj-1;G_WPK?_b0RtS7x3-y;n5Pr~mFN{?5IG900g|C4EB;xW; z2tVz4L4?XvAnt<4yeTrVf7ol_{tEf`x+bDfidyU;`MfB@?oH8nPJCh#!FWb2q7aQ# zTw(~9(T(SGTmti##^|L{d?vhL7bOTs?46HZ0jOXi4X{W>%F71xDkB?>jYEqD3>tGbM*Gk>R@snQ+!wBsd zN)F<0f6!xID~CD9Rl1UxqdcU&Y7ogqGLwW7 z9Op>NF?Lay_VeESR#?AtI?<1`WMURMY0Lro&WnSTWG#^xLn4M#oJizkChrN$R0?#D z`E+G6!EmotC^@H!f=-W<=#HUC(sBUv!DPCsS4R?z|~3blwcEMNi(WM zx-_UYb)XMFn$R%T^Nm$~WkU0)Ql1uYre-zhQx%Fqsa_PLGacq1!w6JcrqhZ! zZ7V~UiAbbEGopH3ss^v=##qXejBUgsIjK6$I2I3{g)L@X75Yw*qVIi$jI0?Io7g8_ z7PFc~=VNh7v&T}AmfR$3N1@u;c$RjgqqQPp@w!=f{gsi3Y^H7>dD1EhmS%*-AsrVt z+(=Nfdacu1azp-CTvC}%c*{l9OSQVd-)`%2&81d!Z3x}$GU~aV0`K9r+g--8?||O5 zuE(0H-uAk8R)Bl2eCJy__R{yh_??`6^UL4`c4ziGkOynXP`N&94^1ha;V;(#CW=(#wlwTI*DO>quRlc&8 zL6+q$dpToW{<4@Q7UnUV8FeZ?vzk-(u4Z~+0dNk(ZYzknPA1q>x*Xx{_AI}*3KxnP zwW$`@EdDAtXSk_J#lZq>uxL5oHkS1yC7%uZ3lmy;vY*8>&FoxG&k}l6i56U&CHiJY zivh5j9v-DLt?5!qI>D;;tn$P*>rM|E(}Dgpra~RKQ5UMwdv)loW8LaXV;aw@PWGJ* zyX<}@`+3GDUZizxDPH@{*O35ru%+2iVh{V(rByb#k6qVE%d*nO?lkYBP3=xuyTgbk z^%u0gZC+p6)2`+;u`liIR@+*a{!Zz?+kL5b^9|czpm)9HJ?o_Gjv-E5WbyW|_!RL5H!Z(hUs=6j8(BAv}o z{+6qI-2yZ>#m~L&pPn0rNI$yIW6tqMey_~nW2&k!j&G)~80uEf`mnIB^{(%V>s}AL zt-vn!vb&1xW>5R((yaEjHw*1YtmL}e{qA_ryWaQCcY-mQ?Q#!%u;4EE!czgw~FwNkGv5XFZs$lm-3d+{H7qU`OaGtRLWz(rbO>~&wq^ci$c8^R9||_ zV~q8df_>{H|N0s*K=h1K#)E_r0He=OL#10N~#E!7sk;gTMUd3qSMkQvLCd z-+bUZANI0;zT=~RgXtsR`QN|37qYK?#h;7y-rs%rmB0S*m%sAo$AR*BzkA*O1ON89 ze?RmwumAq9Jh=WBfGGrk0$6~PM}P*HfB*-8_-A_!_yy#rfcqC*^9O#+Cx5Fafr1x* z80dZ%cqkF5fnmpi-DiO&XnhZee<3J>Sx17*Cwnk>f%(URZs&s42Z1>FdnHJNZD)hu z7lY#$geJ&?BWOt#=z&AXelxg&MA&Z8=X)v$1}a#8zbAc6*o4%^d05zj{I`X}*M(j< zfuI+L254ees46IUhC&E}WOz4b7<+KIgQ=G&YWRV5*oHClhLv)Mgo1vJQipulfq1w! zjF*DRXNc7Yg&$aj_D6mXXnZIri0qev_g9Je2Zd1xiT1~cgP3DRn2G+9*nY(~iO5Ha zcDRV*Cx?ERijkm*qj-qmH-qhmik;YFg{Xw0Sc(ovf3)a+rs#m(_lT=Fi>;V^#;A%i z2#V5Ii=K#peJFmf=zYtlemTgBIf#qM2#JOAiqja1zF3V&$c#F}Hr&XI-6)MeNPR-6 zjzFl3*654un0?&nj`XOGthkKfD2_4{H^Ml5!nl5qIE28si($}@nAnJG=!h?9iO`sd z1{sX{Xp7D$D!*tdM;MWUMR)x>Elf7t@S3{2dD2RP%h?N+Oj%bDQsQ!%vsfkA!fk>H(54n`M zhmbzmG3N)0+30~e36aEDkzEOam-vE)qL9#djP)prVJVPRNoI(LjXepDZmE<7$(7Z} zj%vA!WSNW8=#aQLk36}S57U-1D3s4Qm?xNlggKZOS(kGOl|LwjW!a5)37CJ=mI3LK za=DIQ`HorHj&}K&3E7ylNPT{(m+7dIlo>JPIDQQImP$E)tqGP?8Je0%m#m4JwYikB z7@LTwm8oeltBI0E6_pwn%ilWAeoqt@|SCfn1)%5H7S$e{&=1nvzo1ml}34xz*v8qScPLL zmzODtK^c>AnV-7(m9WX4^jR!dnVha@mQGog=;)T=nU=(OkBcatv{;%L>W;*@px1Jo zk(rMOs*4ngpOCqi|Ja!s>W$$zipuz&jfk5diZp_Wj1{Sq>9?6AnxgbbpfXCBu*sO7 z8KgBzE+T50;~9--*`b+ot+{nVTqzmsE(Bycvl;8m77F zrBQjN9Vw3~IHpaSoLU;9=}9XJnkgR|r&u7Z~y5^{y+F*M6sZQppqRL;STB`VUs;Ej| zs=BK3)vB)QUa%Ug>NTsh8eyS&t1M=#x=K;J+N%|otH4TPzdEc>C#=T$Va1xPgR`v6 z+H1)AtQUq|8mC?9HD1?RQREd~+lsB#T3)$UI^CLf)EchV`mNlWtvsZzlQXWF!>-@u zu8ksIRJB8Sm1iltu|Y&#J~dG{ z^eFG9QT>Inf<{7y(oL)7v*R^cj>Y~|{mMt&b+htAM<82WOWU$ZyRk=yP*ICsL@TwD zG_sbWu%>FSfCN|Xb4A^wS{^I5zLi>#wQ@0=Pp$<}>oiLW)JJCfPV)LU43deD>s6RGz{`udV}-&HEV>A+!fI8&se8QYq)jm#N*3!rT!gr2v{JpxSHBCt&ZM(l z3xNBoucwu^w1vMUY__1)T6KF+1YB7(fX zuq&)eM00G&a{JkUy0&<5R%?3~c3On~~#&=<>I4-L`rEYayq(fI{2 z6OGZDy3iZV(bc5U7Y)(@?a(7l((fhGDBZy(z0$qxGA<3On;O$4z0fqB(E@$bZsTJA z+;ktU)95+=(~0ua-fUYy-7_l9C`27{Cw zw85w*)lHq%dD_xSjn7^!%}Eu!kW1E32GwT`xoM5hZC%uM?bd82tYVG9eHGRleAjqg z);8@ZcTClVt#f&t*nypgIlb6igV2s0)Po(_A>G)N9b<51+9i|Oi}KTognda^o;Z-&s!c1R-P&XAXs9TQHJOI|Ior8i+gr!lh>|e9 z9ow`Cnno?$&~n>~^3g{H+omm)WD4BO9WBm1)WN-N(mkGsX@azU-H$`urb5~`INdA? zn&JK}-rhpq<;_T(&8D2~pE?NG?9HH-ecwd`+4_xULfzkT!`}doF4;Zcx@^`49^mes z;Am6e3_i>Y{@}(O;S!$A2wve0PT?4yH4eVvkDcEhPGuk-;!pkGB+lU@e&T`+(~#2B z*L>3NdulPR;?KgfeF|IF56?c^Ff=WnOik?VALtmjp(8rp z=hi*xB%|hQj_H|>7P#OlFj0-ZRw~^;G({5tzMt6e$BDYF{VE1 zwGL*Fp6f`u>%1;5lK$)P^mOq_O0xf zPVH$v>&uPXWxnNVo#pM!?Wl6=7wmU={?%43?lI2n<_=tyPT1JK*M0rIGY;?Z{(tix z)%A|n_de)vzVB4y?UZ8gf!@|(PVl3G?$rk95KriC&h89PJH%e`HGc6J-{*|J@p_~2 z9)Bzje=G5Fr#&i#b(*CGiF*2u(Ia0g=B@Is>7$Th^5EC<5dHE8kL}S!{(s?_osq)Z zg<0g{t@D!t-4Z2@zP*?9eWvh8l~W0sPg#mON%YKZ^ev7sCHR?WX@Okdm$3MvNvViK zi1P!D^%V5)MoONiIh89qkV=Y!NNJC#X!d7s@HdD+lG&tuZ=8FMnkIf0i)1_~h@0Sn7e@ zFU;Q$?$FPacG>szpQ82e_+n~~2CAV}AK4H90s)c+9E{1`e=rogZ8SA5V6t_^T2}Sk z(S=_br*VDu`wop(Iu(saWKy|gHl0ssR63<+1RMuA4SJ+tDSz0SquG(DPUEW^bU*L}0i{N78W8`Gz<&5DjX6R_?Y3gbzXG3f4 zZSHPwU2LzEZ}M{UbM&fk4A6AWHuTrOqKqzOhPlMVew z^vhYW=1-vUZZ5f_(}Pi?L6t7;2$L8)pGb;E1%Z?*Q>q(QG{ZPV$q*0E(z6FuAZZCaqMg8uR zXwD2ZB9fb+6s5Cp=-!C$DM2REk>$*(JdfVJ+Wzzt+(Qtt4kG)eCFhA=_1^yb>+S5r zk5kmV)1@>j@Ne3GpHhoSG_emd_X?y2JQ3PbP{APD(4>wA6@hS$@*)(_!3o7Pa6`S| zLqt9kzL4;TN+20Ax$<`4S@R8vz$=%xx<{)G(-SGNcy)>osTb+}k@bv2J$@#yuK1A-N{ zKvr}0)!0LRokH1xkQId4E1nU4&-E9CdF_Q4;DD9T77u;H)i=6qv)DCXfJazZ7zxOY z7>S9I*y3JsGd7{(iZAxq<8G56_uhY>AQ=O0M^3rq5l%K21DE&RcxIR{rdem_*sE7z zVrSI1WrJe|Io_O82|3@6mjJoknQIPVMgvjl16Z>k}rX`s#D> z#a3vCEgpN_pXX&4gpK=sTi%ZTwJlihf(Kc8Yj5*znrvaV{d;V|@4j|!yhX@5ZFCox z7xJC^rr7P5XHXL)pP5+wY zx{;3D-`_z8KJ#YEMLF=(ldsxvsJ%vBc<6s7zInSfAKdo9oBmyHuECWY`rO-Qp6OwO zSKfAbKTqC#>2bEvE!SIr>yGS4@2+9bQFecCqi+XWc=i#`auj1()avIh~ZI7UkG}KvjYY&d@L&+0ChLQjJ2gMs*#`b)YcySrLTHs z17ZJgcf#j!@PBmcg8u#x2(cU%u7tZo-}zp)vI$BId&9e%5%cFh9ZqjxH{71i%qKqm zl}v;vTpj!t6PI>8uyYJ!+Y`NZ#^7C#fHwr+0W-+NBKj|jIZR*?7bvnQDo=Y-lo=Y= z2S*c*@OCrwBjMC2Lqb*#hhr?B`s#=}Lq@VHY>`V~{L;F(*^i90dkP~twz&tw&4WkV zVdK!pw@{AKk+BO{5J%~~R>m@wnxh=u1_sMo;?0$&yrKtTDK}7xl862)Bq{}2JQ5O& zb1*xYELXQe)@8;qVM*8vy;H1*g@#*YQ^z)+AT2+Dvk&52mNzlRwIMcf7P5n3oDfOD za%S@gXA7G=ubN>_K9Eys_KX%jjetad?t-1ybf>BedJ4oUq7$WP zMJ;+!jAm4$8|7$6J^E3QhE${@C22`bdQz08RHa*>od6d4Qk2|D00f|EO>KHpoaR)g zJLPFlefm?N234p-C2CQPdQ_w)RjEs5YEzy1RH#N(s#B#ZQ&)ObtY%fKTjgq3z4}$K NhE=R%EolS*06U)0EHMB8 literal 0 HcmV?d00001 diff --git a/0x49/images/note-win32.gif b/0x49/images/note-win32.gif new file mode 100644 index 0000000000000000000000000000000000000000..3c379a36a112b877065d6fea84401adc131725f7 GIT binary patch literal 7627 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 SO)o~TpoX9+3m_ck|2F|i!sMm^ literal 0 HcmV?d00001 diff --git a/0x49/images/note_be_small.png b/0x49/images/note_be_small.png new file mode 100644 index 0000000000000000000000000000000000000000..b7ee8d11afe8ea7d5aa40e2b02f10ac6d7512faa GIT binary patch literal 23865 zcmV*~KqbG4P)VZ86 zMn=a0K$0X8HhU190f`6^Zc?8@ zKtR{tXb6ZQ-iCgS2>#%SPo?9lp6SG)006}*3KG**hOKsWX@PWI=!*NCf*0Y?s<_z| zHjt&2HRwtJ1@#An;4|P3mp#=$$NINled-&Hcf3veXk`5KtRt%swmj}v$>m(&h!nhk z@L50d#7DmQ%(sgsAQ2z~01=_pF#!M(0uZ_VnmbolKopU#)L#)Uw%J0E=&vn00#t%3u-tHJ^@|t zXmm#q)HtGT+wVIZdw91D0P2VCEqQx_u?*88C>Ddfh)6{D9l4hwA=Oe7LwQ`c!W zL}1+i$b(&v92h%sX66geU6?kFw|)T2KDGMT7xXg^#g^_B)on5pfaHoFI28WE56%_! z5ftUCd9Pk6|MB1dopUdKVdd0kzrQyAl5^zh>*QL2fXK3iqC+ZLLInUuCxl-c61WeN z1g_5+W4RK>L&%Ub1Qd{Sj=&U=KXfk&3;})DLjqs`vcx6PcL7`gAYeRV*ReO-vsaDX zx>vaAAkN>MEBGKb>h)?7HA7ojS_t=L>!37qSQc1TwOSQLu~w@^A`##B8DoqwS(dZe ztOy$$(!;~zqlYHB&nHKEN00t+*&ed^Wt9Vo{QkXtp78sNOMm#DfqPzF@{kFeZipN> zU^es6zxo;a&tHFafkqIo-2c35wB*fvx@+PgmYB5v>)(TLJ+*U{Ab|6=-;5YK0D#w# zAhbq20*FGPeV(@typEsPakBF!0040C035v8k9|wQiT>A5FV{c>fb;+K1$WPVwMwnG zFS{w*%*;%=T()g{U|?W&cGhv6si~>HzCI!n5n7`i0su6g{jOJ=oge6Xb!B;`B3dBe z`bfDM8ENfb?+ZOwp3A=Xr@h?DiKUnc$Z!a^dEFbuzqIl@n{)d^_)$l|- zWP~=Fg_+lK8Z^%J(v8Ih_)_7m~vtRhC7aoA_!A{Nha>!B7uY4_bBz~dSIo5!C zZj087{r&xyE=`BSVb62x^}1n%^7;IsLx+ffF(DRBhf&22!+BIFJ7wE>Y^yw zw!OHxSSpntee_XPeY*=*Kp{1&{J*}mEWErFOkxO@ujYCL8py=)z(@ZYi2Bmu`FstD z2#^tQh9ONd6sci52&~#L162e72q3IUHPg`*2?!jI%UCl#6$Mcd1;_J=Korq&eE@I^ z^NocQ^+w$sWevIJWbhh*#jT`qGj4T(vi$FXW1vrkO6sTS$E2zyI)9Uw1E1 z@P5=H9dJ|c8_aMK*C#y9c1KjJ)eOUE^E#KoTQt&}jO#ARcI%9xX_>$OsTXUYUsu^Q zn2m|S1UVDc_Kl?0s&+_`R8>aqU0kkp#kGj8l2%sOO^1cfb~K2~;ow+$-$*=H zvZjVoiY$KTjoEs`y`Go6I*5Ygm@qsvoXfj&3v};28qv)pv;ve$1w@QS<2U`zn{fK{ z$sId(K!;{}^<2-=>V;ByO<*^w)rtTBgvZY3j$OzRQ72{a<_rNK!6tg0{_&aPopNz$ zskrH;1PH(YKu-<5x;za)00tH704S=y+D}((O<#NQT>D-Cz=7RFVr?5Bt*)*N4-c11 zps2zvD(J$6^9K*!b1Uw=3B^(Yu9xYpR;!j}NwRb`nTZI<7gtY(y1FWqrjE}lwnvyi zq_*%@+f=d5*%bt%l`JKCq(sk#UKs;E`U*F2d8=NUz1vmvayJ6P!-tPB#wI7#=1c~g zoHDjZ+I5QrV#}5l5Xk_|XACM9n=DXA5+VWMfddB_Ln7Y!I&H1sCKhz~-uth6%vBWC zb{dj&Rf5%{*6#_Q9dFd!`*NT7V${ms)9!-AYkh*w-s_6C!tGP9qFbiTN4H#k7X-0Z ztD05=hsXZ8p*ft3^(He3P z0jSwFF4M;#;B|j-1nkg%?>rD86bgmHp_Y-fBc-XV1Lw`!3H~x{>Ip;uzyVnM!l3dX zm~phM96>w8mf44zbA^uXrd7vH(wdrWaO3%{mo)FzZs)5 zHPdyU7^|(!)uc!_C)Oq@#rAh?X;;nXL89M!YNsS4V@$uP+zcmj9Y;}=FaO}p7cVt# z;+?M_NH4$q(!qlV9LEPzRSlni;Rg)aks}WtJ^K8iLx;clt*@JAWAC25vaG%I^7ERe z=~}2#DfjgB9yoC5`0-<_xz)$s^`7I$UoVylp66656;)M3Mp%+0K@blex)0hC+OF^Q zzs-Y9qOeKMI&*Hh1ffGPpMU;)58VIo^^JzIEU8-LDqFii;M5a)erCt&pFWe-tOBkR zNg`}`&vg*uM1Nx6)a2UQS}=>w<#M@PPE}Rk_XR=VoY(7hK@h^>aM1b~W3KC_)9JOf zwY9ai?(XiDl@(3XbX`xSQjX)qVlhN?97hyI#@Mqjzj^m~PpGO2ge?}zk4B=N?*hP~ zL-zx~9xG0uv-j z8Xwv*|-GFE7_>wPZ300E(ix zu3IXVlF4MiO%stU%jI&}ahy;nWSXX;D66Zh<#IWZNYv|f*L6M5Ycv{(L_*h_q=+O* zzVExP+bj%k{>1*8fW!gWo;`bs2$2VRz^+|WO)mz5V7!Y&A^=>L<-L0jKy$DQ`U}2u z=S~0s;HgwPnM@-0|3UN^r^ghzy-c z2naYewKvc-ZZ#x^5A5!(){-^bO+?fe-&}1ciR#Gi5D0Ev zK|MXaw`Uaad^mb`RTfYb#ie|SV4be&(6L(2(xjLH>-Bm%-hJuPrQY6NS(X7H7zByP zbzNDOeczv-pU-BqflV6#EX%4^tLb#waU4Mq1mUfE<6YxJx9Ekh70XMj0B9It!wBE$ zXL&n;0BUs;1p&y#bu}HJNst0GXK9<2N93Gy&R=@zCD(NujRqo$q6h#xckb-%?X6a; z<#PFj7hZ@&B2PZ~Bmk7l< zhDQt|+IhBKFJHWLanJ7kn`oi8Ea-M%hd%p(M-TN5|H}(6e)iOhpZmMUueXy#Tp#)Z z?j`sY4A*$_ls7Y91P~A!L1;kHXtO$WW zB@z-4aRAn0)S=BYuQPxEh=2rsQ{gtYlNot(9<9M}(8`kBqk>uz8`5*7S_rZ~o{mZMhzMd!w&}cXUWBEe; z{zF5b`OH7O|EUivMsL(m8@8KG>y?V*n9G0p*MIiMfAr@^Ut5Ys)nrr$##8ag(_jCJ zs_O4}#|P&Y%adb?THP&{?08fg8A#6O%Ef%8zb_ey7`JZPovX7{`3v66YXf`U`?vq) zOW3_WEfiZ*vu0LmPbUx%*;>gucA_vlUxpen3p`48Vayppfz3NEd= z5@IYWKX-KD(ffzHGRE_-%*4Wa!*OS3%kOxw$8qGj`IU4s{Ok+!x2kRc5a^4adWX+B z6EG49>zZ6BSeApFAe%M-;LPb$q9_dZ$1I1Y=a>7sVwT0jA!a$gCc@0@tgcCkxPEEI zl0{jT1=BPoNs2`@*YS#FQ&Xiv(dzGwEi9FZFrUveTEQqG*#uMt?VpZ4WWLyOT&m$sen0B@1gmgI?l^LSIM4$7y z#d2SF)b$-rQ47T?3anc5`g_8r$s-|Uak-jGO4X`YZMY##iY64_B~H+2xV4%SGGtAa zWR=Au^05=E?a}(CH$No)iH{%NGjY#aan17~6pk30>T@zQWqvs?iDId+IyO3#U#l4* zO+;q7Hu;!{hij(2u#nSL7X(8VWFw>*x?}aQE0hKBsRW~zm>td zdOh;w>6e*60QB5z7u3iV+^I#kN>;@eW5bE^+?wd=83g$I?_BE5rdn^+EO*_|8Q}Lm z_UN_RZG7MT`gboV5{t(T(=uI)VsT?RSM2YOjgDq&HPdx@tzpTMY8zm`XXs;Y! zV!$WHGqt*tD>Os_=N2j`U?!>QsvL`G4NJH*of9P?7?lZyaLBM4wyvopT-AzqQ{n>!lc-MovD9VC}YXx)Hc#kNu$q=5*5 z^<MlAWtnV=m6F?c24TU?Fx|Sl7+-xLy(hD2fUIK#+_#+p8e7 zrijfB6PwOQ%|~uO-pvOhj`XEQ`oT0UV3Hz>2ltNnjt2sWB5N`-*N(e}s=Ia&7-}M< zZ(f%37OqL!EM^cuETR)20mdTh!_(VX zK5hV^P&6LhR)^ajrK*Vx+qM>lKnTU9f% z6R^9%cKLRMwuU>DMlLks3-r*q4T6;+pNRV$T>PfcWAc;!M!Q&!gI`g$Vg&gZgS(NsLVYlmJa z)=Q!009x~01mLYqjDT3viJJg~7G=W`7zesEQyd*^_C2j>FEStw2*40{ zbD}~RToT-{X%xBPwP@E&kP;bMW}tug>WiqE%SOmJckc9W{LKs9T^VtGX$Wk#6#_u9 zR3$=PSBfPo98y$8{7ra(o27(A9gQ@k@w$QZ-50=PcQ)XG4RczZ;TE2iC&%4pr?~bFnpreHjx0z=0 z2E2G|Hk*oQnlwF|S0rJzXp17tuU7W#%r30f-f?6&laAfZ(sC`J<&`B_mJ^B8#`FCA zh4X_0gOaq(`U1zbXJ%){$HqE|u6%wO08^=L=ITVWxHumQg(KTpO9*KC(#7uXE=Ac8 zx5u{YOH0c`LnE82`Yj5&;}EGu(rhao?|J8*;9$pSHxT#86`9Z)FoXWp17ZXMBKNt^ zkOiKS%`D&tPKDfanaF?yTz5qF0Rb%$3n&2H`V{UzxSIT|KqlWb6q&$@M25aw`;$NUga7AG z|KjAiyk)uFnMf?EefcY26eaPIN1iHF>~vfuj*jP6>u%JLhX&K1{QJLo;J$}P#`fk* zc2`P8CNvtBAc&=sdC&g-|MZt1|M{Q$WhQ5$Vb!#}Oj57ZY_q=n7k~9<|LITv`h{0# z;xRoE))- z64Xq$R4@~X$a1duu7^eiLHN!OE=V#On&NZR4asb{m1;u}ML>G=zL76IeY~$H=K8)W ziMk;%kQno7Cbt@1GNJW!h1#g_2oscpj&COhdqn7tUFZ-P4nG zEPwjq%0O?tWZUtGQZ+qYp-QFXanVr4#pO~e9%3lCuE#kSn26-8=Igqu_y3 z=ue(KpOa;=SaQOK?s>L=Va5c<^A=XCBCteEvuzIn1jfYey4c$WJosyW)&8-rSpxvV zAN}I)zOJc4p`3_EyR(rCmzL`dKNeFR$Lq>OR`az$t8iRr$5^&fvuEc^v54+_KIa?- zh9D&3ve|GlnaK29!7!ADX`Om=dH3!<1ZbG9B#EiGR&UsqnjMcArsIhsMnYP#WOB}Z z;+n!d2V@B|*;_c}Mx-}RytH@f@Z7?jswk;c8Zc0woBHRQZ=M(*pOj?@2sro*S!?Ms z*tUKC{JE)JdjP4q#2ImEX%P{#+3seK+u^ZG1T!W#Vixyi{%2(kq_J;TMtCB`tD?QVTELS%vF6)a&~U*>-6mG`Q-WEjTz z^JkjM`?|`$ovlz7#cVpJsR{sa4)sPolL|?KP^vh#k;4b3GeXYu%F=iutgL$O8LRvL$zAX2y-9an3sosJOl=t2trud;sL!3*J8H8bncq z=Ax{QRat!9JtSEEg$T$12yR_LJw4kD9k&@Gz{XkECSn9B6f(9<%TSi@q+)n0KtzTS z4jBdjClZ1H&+8l?G)JH2;ijavcTvaZ@8p?Ue*>n6ZI~Zzz1s~J1VQYEn^-&74i;#F z>)7--{|VBl3w{B9F)e;6Q$GEf6Q-K+S7g zh4JQE4CII$kl(2aIez>N&i$EL|NGB-!SK7TO9lTro@;Yb$N5eTY}4QQh51sc3~lA< za(BDof?hfH@*NMgBCgK^JFOS3=JfSvPKG0jrYe%e1crpD%0i)Rk?-GoVEEPJb3^?Z z&bj9~r_bh!6*HMo89>8w>J7)T@SP70hr{yuOGT?;_V&ap6_W%;zDHc#JJkn3$4@Qn z-qHQtA6y6-Qg>HeQ$$UZGeHXwXKqyc;%kwXOfgMp7X|ZrGkAh_R@aFVr}vcu3VW2>=i7 z?L!a&(6ZgWUVCUDCNc_#^+Ks$H(ddls)#_CimRq32m*$~n(esRuH>6%SC>|D-I?@Y zU#i}4CdX0@)5#>mp65HRb4LX0(4j*_I6QP!0mrTnQ@f_HNmblh+;h*pH&_Z0a3Zr| zxvs+r5g-PI0Zqc7MV05?#I#`f!XhT3|A{LDH zsv?b#^t8{%VjI?5ZWG4&P$W<{!XXU+jP-aSq6T+Ld&7FY(u&;xob&Y|3sGPU86XIO zdgJ*%0BsDZfPx?fp0bQVu(-FWQn$Gz06}DdY7RuVuArV9?iUfk^W5cJ@yxlk-o8kw z?A)`P8AfPjt$y~>ssN~HlEg5Z)=e7#y+*^|zi)#(@upQeKfbUmQ`e2w5@fQ>Isxcf zsA1N0O{ZoEaReaOb!AB+0MGM?NRnjF^F7biR2_f^gNN%nk|Y73=en-v>e_nKYMY`1 zY^wNnN3-?(21UMQliobn0ssKhs;jDgLm!numgN4v?vcSR$MH)QQ#T9%m>A9Mn#h`# z2Y{L?c0OCxTO4_04a5 zGq;wz|H%E4B!BDMU(-}gRW;Xh2l|GO969pJt1p#Gr6-?w{|hfZH#avcNn)u~)-+X7 zltdz#N@fCzwT%tx`DLDG>-kPazMZ^j$P0eG^6JqCA9(1-*MSA@QnJi4spdErP?egt z;m+Gih`1qfySHq`EBp~hCX?aBHMMDx@9ygMJRcFJruGo=#~*)^bDuGR`~DN}ejg_; zOEP23wrwKl?e3e}wHpxj?l~|vIw6XJX_~(8OOnKWzo(}kTI@i}!3JO>aS))BS!nl0 zZDwIz4aVkIY1)fA1TM(j+tYW)iRCRi);114KNch9$jGQ|TQ$oj@;Rp<8hfFz1^@uW zSm3fj01ys`eV+%>X?0yM77Iqma9yWTDI%bv$N*r34Bu;p{wfsn-yemB001BWNklx{xQ%DT+Z{|*mFCuZt$1jy{Xej2;%%A;0U(HO(oAh<4u%gz z0tK7l&^p8-NJnJtnfom&=#FD+kF|kXQx&mpxzUg+ih?AGsic9(Raxl>-S#7brKQD8 zCT&@0T9}NBa|?3}Szq5Et-6#VgdkLoK$g!H9~dGqRu?EF1%c}~(chieFr00dwDrPk zJ>Ns zzu4NsC`jT>g0^!$j2nd)TYBxbWH+{!9RRf#6toO#0qxti6i^Vnq+=&*YVEbrybRl^ zTdRa%=gyr(G%_L#0}`-ZJExipPNIx{MRpmmMGt#K1kaz8fRm2|Bmi;*VUu3E(HosM zwb$UkO}kM*d#GzBVds->wJLTN#1MH1Jpk5n9@)8L3W06+qPG+s+Xt-kSg?H`)Yl!e zoVW6b;>1^%i@Kpmim1tw>yq5shGljk*PV@Vj*2Wft|bT}(FWHV0=_V}mhFmq+*jqz zq2v*~nb|@trU$X{!{LzYx~|VlmAdb7T~jit2qT}C$a~^;INe~1S5pzwa1K;smcf<7+)YH>@!fC zZrBPG)oqz@;-CJfqm!cv*TX`&p~-^hd+C%;cPETvy0{ZyRxR`Xo~d3r{4@4(xv&*u8Gvoe_(&5<|Jau(bwm` z`@-C>f8@}ai}l?*vfur|*@y2RdiKSOdnPl{h@MJBx2tzFjOeBqjX%LP00Wk**-APH z((PsIGJ^-=ho0KIyi(}S#_J6y8Z{ip7X)%V5)p07)m8ZL2lgwnKmYcPmh3X zVzk@$T-$P0Rr$!z-J@%wAPBDGEUuK3aZS_I2ksqv;K(@m7&06H_UMB<5#Y&p?8vWG zZQH#At@+0ft)L*C3e*NcS~p5>{2FNJ>gaG65NMi$$Ye(dt_lR8 zs%l@ajJUp8@pezQLGJ;8PRH@fUjm&vVr$geCVxwXy4>BM(`?gOO2CP3$$Z&@?l{;M z=b+1WT%Dl6BZ!bNP?|XbZ#ii}OCfKOdqhD7BEldW@Rmn3wX+9*0Xeo*Z9ri_q}dc#@GR{^O~Z6K0qIf3Q*6QBHx zmtTIqR(Fb}IyPUB0Lio*0Q$o}{&yEIoL$XVP1|XhuIGD}KA?AU(MAJxa)eRS#7uI^a;tkU=ZPRf`5}?ws>QzUUrEE&~IZ1--Bc)@; za=wIsnM{0nwY-+Ex#SJ^B|XOlCWOP9EZv5vB(##R`Q*`GR{G@kp^;S7g*Q zmALD=S?uIqB&(^QdAAYz{HOM=ke;|~!$j|&2`EDr!wO@d~mt{@&fB9Q0P zTko546RMyY6yykW@?IMnPtNh0eQ zb%`k8bwE|6R#8YD8W#cHVxd|`Q;^##UuV)=w)@SFD@`{1Eeg7ZyIuZ#+X#Ja_rGnp z5|4G66eRe-f>5~hYueHpdc_mB9zO8a5zK=2#gW=Hb+$eAaHyT zWE9Xht=U!7G|Gm>y4MJW!*|@b?yka?9&3}G_HtS%q3gK-swnVM#Wpn7XfOcCCX9i; z^vrx=crfwOs~3B_;;Dol4eNlwiKMO=04Rzi2wMrKJB*VjkE^O0jm5a{yRLWqrPtqU zKEVv)=+Xyd;bnll&!ax8i?H8=ezEcje*RT|Y!H8Dguh&T@!o?+LZP3SgVrHJYj(k# z)NY$*rltzL?NkZj+=W7SmtSkRiHIsPbv0kA)*E_B9_mjcA^E9FAH zQnM9V8t9L8r$gOc>%q0UawN~iJykVyNfhWg;x(-$|b5apg zL{zPpQwgC~D}C_&qX+=NhyXDH&1j3{`#iX<@9}7KQ~10)1v-EJd{0kzB+};07>Y6g zz+mtT5H|V_#Y6;9Wkx?1L8Y%5A|UJ@O#k{*dlgv;Hsl3>nVA{WG)IRA5PbkxSy{D#c_Ul71` z-KCY~SS)pS^jM(l`nJ(>euC>mvnmx?aU3VunTUv1S66Gb+R>v&hlYmc=H_%=9~l|R z<#NSh@x>Qk#ve$pjIWOQldabYTBM zqTB3~`8Gx%SZF&o_qnR70Dy@1-h1!mE^u9UadB~AU|Z-1pyxkUjTepC?%7M(wT zK4gS8E%WG%HQ4?c$Wt&ZZpyax;4KhXbr!4(H|a&LAA#$|;J{Ebt|I^dB@%H#6b>FZ zLeQ)pIz2o* ztSAZqeC9Ks*}s3krfF+yYw>v8bzMo4a=BbrS64h9kHumDaO~JI+qM-&>FVk-3?mYW z1SQ@*Yn2djbtNAh24_6aefE3b*|}p100H><3umWjr=Akw6j2h{ga{zwNso>&{2mvo z-2EkF&v{f~O!Iuvhy4;u2n*kJzOf7s92Td1{_OmB9((NZ=7wiKqHt{66j(csTzfAa z>g($RfYYZ>GZrjrqtVe(B1)&zfe;vm5sSqf$MHNb5Ud?Lb`X(eS+Xqax?V1qOQljg z9(Nqawwqf!B@zk8aTsGOD=Sk|Q@8(xuLGhez5B5z+75I*J>7iXrws5BL=k*qOhBFx zn1cQjz&QxS=s_8M?jw+l$Poa#?iGF|N`O99rT6W9Khf=oGjj(a$+D(tYRi+oxvsFi ztL3g;yL{iTR4M?_-`^i(s#dGP!N9-(0C=8PE|&pdY;1#f$EKj!L7t%B0)SL1)o9!? zYe_JOx4X&qmM=llmhN-Ym?g5l7U9?W%TxsbP;OeuQC?39s9!PJa$}9%C0yODMTc`N zK)c7%R8YGomTPi{1N0RNy2Dss34P+yxu;K*YOjC#cYouz=jZ2(#bU8o93CDnm&=xA zmCNOHI-N))a=DzQY2|V`91a%>g+wBus;X_v;@WwPueDCV%y# z|Ko4`>;E|t9W->g)^MXyrCxO^<++dl*&l!M6Q8~`QJesGrSbO67XKP(5>Db#k<8us0@35)tGJmHb+LWtD|=X@03RF_wAh^|{C2F)m9I zC#ad`n`c(zanzw_I_H#R(^8)4VA`nzI^!h9ct%5BuE4?Xl~EE+z1 zAaeM?FaRLZzCHVyAdC(qcaC*At|v+IzTE==Fh1OcNbh*$v4O#%zOLBlU>1nVwMHal zj0^=EEYPEmKDK9SXEK@TeDbx3@IU>lkHw>rhwp3ZC#KcVRrQ{OhnXM@4rB%g*7G~A zMZkKq(cbL!7{%l9gwO3#skD-xA+}ktBuR2DaeQp&74Op&tpD&I{_v%jUb>FwcsnAQ zOn&p5-vofw)m2H7GMNle{kd1p6HoJ+@Qv@jnTQ*TEbiYu_`=IGYef^)9fqMkcl3g7 zJMpL{%EH=O-RCHY!h=T!wCJ9%f9JI8IZr*l@1@tKmzT;uS4M`T$4@Qp-QDy2t26bA z|K2AizV^&%%W_mz4(o#}IlMS`VW>CJ-xqn~d8O zz?ly`^`TD1Pg8XQIB?+b*0+--^~RG26B|=TATV z^uB%j1_y@k-9IV_$QZL79|2TFM5Mz9hLC~h5`nmHsz;Fp$0LR~(Bq2&zcf=6fK82O zy0Wo=zS%$3=TG(^15sk0>xrU#c>fR)B8P|X8wcXZNMHac5|Atig23)SG~&2imV;2u z`0ht11%{$z8;yn)5ecZTCmvGNnrR+;W2UD& zX<6>BiR{IhT+QU%_jE%VAIcyEi!m7y2!hxSyhs3=Dz%UA6kOK@fKsW{DPh5+Ueh#$ z%~3YC1-tX6x;ueJqtVsXl}e@3>2xZU0z^eZ$M!vs9NX&cifFQuNroJsCt~vSYz~0; zW#hd)QRIY3jDcY&R>SGaL~2z#9@8w#=HPoCXNZIl(&Uk$v;fqbjR4@tP{yoVv4}oA zkgPYHTElW(-?7~*Kj>{on-z*iqp21mk;ur%$k5P`u4`8*@js?L766E%7&o2ZZJMx zeK)jCk2N?rc;LW+3l}at@W2DlKmU9>oh}xOuf6tK(7r>V&__S|(F+$YB$LV4UVH7> zv150SIr*9}IXM};QKM0R{k0R&bj5B)c4!+Y+Aaz0wc#D+2O`3Cw_5Dj_c6%WNR`znC-O$x2B+*&|8d+jSUYs7pyiKjdHn6bPW#J+sq30?b|mzJZxFk=;){}rPHTR-$4uD4dSz({cJoQ@9)iU&n1Fdt!7${zAh`^YD7=)yyTUSs| zPw#a%_LY?t)2aoXR_D0a?%l5v+YE(Y`N~&{PN3_ zlanV;o?H(S#iYUEU5;zls%s2IK$Kd;#frx?g4*(#* z%P+rl@Zf<<(|mS@-uX_c)0JV<7uxjs+owAZIzwu;Re?~^Xn2%e-zT{uJkN_KqPL+pk3^yb z{I*9;-hgd}!gJ@&H5!e!?@Hj;&=xF7l&$&-05L+R+TaLl)*2E5kd4f4kfLHX+vR!o zZGMxhM?4(pIJ{rK)~_w zaUy`$ojb0&$puYK?Y+_c3U3(O426AteUp=uf*^!Kp@oHoOeQlkGqWyOsu7CynAN;( zmVpV#K~y!@s>w>owM~v30mg<0h=}_R5tr4FW7dhTYGA%S(Dm)9qL5uF1VCa8f#B8^)YH>@$Ccb|1na2HsI+{hvNm^n-|L!DE|){0h^mD=mlOqy#R34v;|Z{d6yEFrkTIW#QFB`F5em0I zocb2D#~cE%2^1_8){@EOon?Wx(XmdRJlXbq_dIWIZmyG1sGF7^$yO>wAjq%I6L7w8 zo*`7KRbI>!ktnOaXG1FxKKQ=pJN1@x^WA`ezS;;nb?W4iBlpeCS>+n;-YK3rdlCrm zyYFFGbMbl3(%jbt$O6?63qD93O_9r-9#HU(J8%*Qmxw$7#2jIta^~#G`|o?`&QiPE z=vd$R&Ue!3w5Dm{aQMQ73&X?1Z@&3v`(qeJEYmwySedTZO2HY;h&JjK!wB21&27gA z9*LzTSy{_1NRs4xK5?HDzk7JpWHR}&k9}<8IqdK6=RS|cBvo^XXrO=C_dNi>9?5^F z10utD5Bd$@oEJeL!Pf|V@vd?UMqtn<62RcV$en(c?S{ff9(km%udi0Cg~Q=`y*@TJ zcJk!Oc4|15R8?co;U{XfV$ZRZ<+!oS#0u>z;S5%%0Qq zkRU42c=TIe{*-OiZ{vGiGkSXZ8)nUQ8bp-KamED3gyrQW0?rVb2arLQuLteW=bUQ9 zIcMhjd|430=H4)f0Ob2#2mgn`X~qP`TK?*sh?Q z3*ug&tF`F(VC&xNoY<%4%-S2*oO;6-Cut=Z=Mj-h^%a zjSx{&4NcuHWLJ}^q|JMtt(!P--R1)8|21h&YLi14$OmJWVJ~k|K{rB|Xqr~8m^bc{ zwT+Gyi^cZs+o$U~BCf8k#$vHxAy)tSS_MK;6iw4Q7xZ2qwh_$FeeQF*u1BL$$8oCFYBrmlo11HQFtV)1 z5}9ItnSg+E0Hmgr0C5h0$V4L?tyM}u9w3U6Bq^Hf*sfy(01%0i?0PN>GzkWbNk%wc zDdhotAQWX$6l6hC8r32J38L(Ko*)XIWAmHT$t9D?U;Wiz-EfNN;%wpK#q+0ZCz2SQ z7)hVMxKcO4aT^aEp8V!BPe1zT6OJEJWSm{Br&9*{zN#sX>m(zbIIWc{FT6ZIzg*t4 zv%9Y=vADD#%i8Ow7IJH~upuR4`h}UbNLa1cy>~w{F*7^c-8FFP?9!X6*wOTqE-Z9pF{N&<4ef8KcJSFTH?YpMRaa~tY6xY2`@78T} zterb|4h{}B8jZfbzSm!WJsSQ0+xxO0Ij$?a`<7fQYwN1ss?i%7OJi#g+{6VWMN*{f z8PCX;G>*_{!r>T4jQ!z=@x<@p$N5h65J7ly|7$B`R_q3bmJ21n~F zODQY6ynHcN=tU%&mYO;H!SL3-QbtljtG+U_b-&Z9DT=bXGS^qy-mEVTjqIF0{ocsf zF3)qD)g{NSUAc7fRy{qtPI`7I4k6{SLR*c5Ayl+ z%g;?VTLA)+mR~5OY`euco7^$bleZY9K^T|%@}3_9kUhHx_Us(UTJ3Cd^S4e_)gX*- z{!vH{{KKazV{#2qcky0|o!^q8K`z6G&A2ypyJ%ufm#ml+EfZeQGxt`U< zD?NRsz-y&*{cfv)APFUmX|UU=b!^}oFS z`j0c|EUcM9wx|AUB$f7^TKga3)j3UElX9r7J5d&05q|SD19BxP1BI zKmSj^Uh7QpaX5}sEEbcI^vENR0KhZPJkz-Yk&FK7GC^d}wzymK1%#E0zwXOXz{=Gx zM1Vp;v>E`w0P+T)d$EuKh~~2fKrr8zClHl62Wi{-I?*VGzC4F$o+|)Rb8Jg)Y|F>a z;bw4+Tuw^)+;h(+U%=V3XDOxQTeqHg>j!WC^#4Bl&3~GX*cC&tFc z-hTV-^@x?q_Vx}>)mJW2$`N7$G>$?*&`gUn-E(U|ks!_WZ+DyJ&~@r7GkA}2v#wc$ zrj)Mxj)@<1SACHXP7FkTXtQK#K8C9!KVlGg^OX}1>*dLvqz8qwx_3OVPU~E z&DGV_k&zMK_rL!2uYcOly|2(^VC8bT?c28lKt7-U;SYa!@ZiBihYnqR6k55*pZ!L) zGT*3_2_;b!1IS#VR9l|&z1GOK1NGH;A&`Ldy_V~=_8xe_Zmrg4QDg|1( zyxXcXt{_6IQKgjh6o(e(&OP+l%PUKl8E3xZ80kzdKXCLnuaEC|xLzrnnLJljyHzCu zRXrtTBtbT-E2}H>pZ1#9RZZ7p_wLYY=Rdxka#hpJ)FaP+>%xRZpd|uGdOgS*|KpwlAH|7KgSi%$^z8 zGXBxKKa(i7?|UZjTfSopjK;^dxz!{000Hp zy?giOuJkH8%?hu*sx9*QJY!5sv9xey z{}a#m_4gXONeDs2!NI{#e*Xikq07K}^UXIEMY$>@B&1WY${1f>ZXvYG&j}S=5(Ffs zm3N&QfFx_RWpZ%_2rMuDI+^Vu%mV-c@Pk$qxCAHw-g%zG^@7ZG96x^Cw(afPw=d2f zUs<>uM`1`ZD5at(k3Rb7ojl3UJG$gpOG``Zg4OBi>4}Mn_uhMN{oBv=^bZV~joMNte{jFA2Q+3yArt<|U zNNsg43^tsm-3}BA*ZIS&A@T0%?d=^J9y<2^|2trQyC;*Ko105=%?H>#y5v}$g4If; zGC4Wf=_09U#?a`_;@}u(EQ%u;$CT00t@~`Jq3fwQ^5f7;7lz8SXEfb1tdwqKQ&x8R z5Z<`8QjaqF{)eL%Gmap9X#wQ6TCMEztB9^v2`7i(SMZ-)n#yT6G zJ-|kA9ajqBx^13tmx$FVSOtJXhYofAUO5%3OJ|cxB~2=rBPIH%t)hSp#fByXN z@G$56;>C-}P-9fd^bLEhY7}@9BLE6O80D#4Z?jrfxN2tmTGhqWP!Hpp6p>*SD5IX! z5LpV606|qthrSIY1w`t44ndmfm!i-KoJJG}1W}?)=Z8e(d2WL-1ptHy6mFW?-d1e^ zMGOF{k@el`XQMmZU==Tu$ut^`VzIb$Q2gd%JtpRn500c#*7EYQ5F(D_m6a7C#Dg;F z^$4R#XIdg{g02y(Q?R)C4g z0wGY^_NZN%vx-AbeG!00VX$@2i@xuIh+MBO0yk3_$q$URs>|to;oL_*9oRY|Wh~>+ z%5JHzUi4~Z#jvEJ4~#u(*B21O-qO^S^S>d4jO}?@N}m7$5HrVrcFVurzP`SJfdNE( z{O|v1cI?FP$i%*>hY*2KAV3kZv$f{~bRt=?pmgJi)hSpF!*FS7Nl}z_avWg{oR)p* zbV5K%We45nGEvhl&v7pt6H-#fTFui!L=C5fQW79Q$;|Y-2oeP$fP_+@ZoRrB;;^!; zAT=&eA0-4NAfp$g2oVUlENl4WNg3{dK( z6$Bm#9N9j#c;%cBB923pQqy%QL>z@c2v;;Konu_BEX|s!yz4eiGea43n^hp7o0;O^ zxNp}HVYz(amavn%30AL#ZQF0W@y55m{f8O2B(?N%d1?C6ua=gUip8R$C}9{bE-pU# zakwTb7JVdb4g_M=e4-C&t zAK{9^xfX>XA&63Fx-ma{I+O32JO4i8I*M3JrJBtZLNV~_tvd0XrmAZB{^9c6G~;~z z`F)evj2e>=LMfF}9{ccp&irCeCaDs4a4H<8mjo21$FbkHcY+Xr!a%pP z>B8}ap|!+iXpKW$=mUTqW54^U?!rdcNU++8N~Ln>(4jy0gKw@}ey3q`g&jU3@&NGM zbI)DVmhnCVzCF{t;&>a2tqFhvU1x=zf>qD+#>U1B!&qKkPJW=enU7>Rxb@LE3Nm{#Efb2OY@Vt7g#-9S4Jn4Cv zsADPP3j47X0ze`p1}aR7uw8&hf*=uq5{4j)y`$CY0s&;I0>C_{aW4d_E`rtTP^nao z9zA;S;L~sa>QLC6UtF&Jw^x1%0F1Hz{(jH%I;lkW4+y~cl~bqx{jUoLAIpZVn!4d~ zewQ4pQ?UBlYp?CyyLWJK@CQHmK{Bv7CyzY$52MJl-G&T>#LzITD3XeJ2lT&DASWaBF(2Y-SzC_x%q){BYa0ZR17vTs3Mm{U814N3QE8 zMdO!Vdg(qLSOj-X3~pD80x$?8FAzOxvnQ?m-P<$4$DRGV46IJUD(8HDem-fOoTL;{ z98+LswxlpsM82NNN0Fa6j1<5Y#VSQ zMIcm>7!yDwbj@|SZJhXNI!}E9ZXj5#)oP|`#v=OJkN-~bFFpLiw|o1yOg;Q0BF1s7 zC<-Cuz8zHn0PSu`WW7L&Yu$XV!6yh-zyJO3f8{G*DV0j!``-7GS)pcF&%E?)+pf=F zIF|3-5=UO(IbrDcm$nf`4b6;WsT!$E)9?58jn}L5j@^(l9vs@ys4WITFg(6%VfKuw zSz#0u3#HkaWA$qJcHW3CxPf3bk$*k))RSg-=1NVJ=P$qY&XFjJ!Z6Hcvr@`~2M-pD z#XEVn_ZZrKI0T?=cE7=XUFuk!g4KLJfByV=$8oN9{}M6^169-V{Ug2o!$L?!)#Es* zRm!8|`&!MF%G{ap!hzE0PTk1l3ca511B#TD?H}HWGSUoFH?oG2@_n~=Xk5{?58r<6 z-kD?#4Grzsu|w0eUC;c}mDm4AwlMVc@OI0xgb=E#20_r(XXgHaByuE2{@#K9*FU&? z#pYz=;N7L%aJ^u4b#--ea&mo#mCJ1keA%7@0Mp7MV(2u_9lZnq1mM!?pF%QqTtmIv zXD7$$Jo25v4Fs#}BF! zVs#2uj~qENIXP*X=Fy`^ldYPW%@jvv9Qt;Za3;fus+!-dH|utYuAjFrKYT&!9DfW%Z8a< z4jo0aDCdRYy%>eu%u3;fEgMlN139`dE#o-bJ1SAcQuc1y)mXhEj~th#w=Yib-vp4XO~(FtBqu=-PfZE95EGf!v@n*I$^0-T2#U&^c7RC8Mx6Jtu`xwaE?>SJ zMUiD$Q52b`S*z7x?a_pYmSw4`TCG+AAfM0I>-FoOo5_ot`Qoo!Iypak3IW^C)pZ-- zwVLYPXG+{>AON*i;7gSt)PxT}oG?m46mjD<$7z7BvqHl#4jed;N~ON~)vq2sdbCt3 zan3pCl}g37?P9U0s%qlHnNFt>ab;ztUau!UEt;lHPftJo_~VMA_`ZMX(xoFuj#Mg@ z&pZa!-gs4>)BekYF?E+f5?Am}K0{}#pS2fjv%-%2{>+&()6>(4c>MVBgmskY2(GDE ztVb^Z7#tidm&>pgr7m2!kSs3_4h|+!?E&sLv?CU!v{WjMj*foj1C5M~bp8AA@bG6o z=54}#UOm4vXh$rRGI^ri?en>fkWwbAgb!wgcK}zD_nw}fC!Tm>VPPSPBF=dn$4NVe z+d;rJ(>;Vxr@6A$yAce-5J*K73lZo>CJbF6VgNLB6De18)2=S9W$e;0OaX*3#djKj z1OW{*6Zp2K8(dArQRul10KyrIMa&tGMMMy6yLJA;%q_o`2j~h89jWk(FTPkVml4tT z{bbe5ah&(wd#_Tdbba$@<9#DyzA&t&dpK8g-H4^UeCn-2-U?_o+cOA2QG^I24gxcs zaaK+^p{DBA@V3Y7MlIjl?>6gU{X)$SMt3|FiI7ubH>y^qc<#4v6nlI1!tS0zsa`E} zP8;<~p}3{hSk_bN$d6{uz7G!u)}6xDh$V#h?svZn0En1Mr7X)@US7s^8WgTg1lDI~ z$uo4lpRYsnIoiqBCJ`RXI!h-s+xClb^atl21FvDQ!f)BumS`i z4sQ(s^#L}6t80acb=}2_7XiR^U0v7LCiX-((;^O|I0Qt-xDY~7)hG%OfHQ?EO5oe7 zq9QO#XcTz>gfk8Rv4~Y&4}H%_^+b^)!VmxmA%WZQo%MWLbtj+o6ZgRZbQbAkTF#?hA5-hb?Q;z0Dz+DaTsc;j0^*}u|yanzz8EMH>22# z10Mlh=br9%{sqI;Iu;`C+qZ9YbQBR2GS=b4hm(jkvG>bB!L3(S(`r`d5QwIyH9Zyi z4uBMds)`!7W|vp$R<2~_3Q~lMVlh<{ev@#$wtQLBEy_7pRS||tDh+Wg5jbao>qWw` z(tT10clB)3@wSZZr(A7R7xYwK#zCvTRO%UOEX{D$8W`OZdQQ5~ckbvf1_pYx>^2F| ztk0XNqRQ2JeM!?&x!%EMZN+z6`JTb*@@#%!RAJn<8=7iNpLhr0{0;BMO(79kgkc!R z@$LJRy8=XPwOW+Yc+;I%+Y#&F!KV*A^pIs)jIo4$i-<43{BqJ6y|*;NxrQ<%loQw$ zMLr>nE1D1?Av7t4$Nos8*(wZ9$T%XDrcyn2bD2^Ol*o7|5DJ74pacjo0s;v|DUlK? zrKFTeDMGj8xn8b+8~~*lXOs&WqXfoT80=IugHk3%Oc~!gpc^V-Mp03?5PK-42vW*D zG7bq4%10;xpiIOQ1Q-y4Qc4sP!`WRsM&Y*6W(XmgrmefDe36h`8bH!ScT;HRSW|m; zkByG>m%7xPNSok%<0BGW%chbnOd_G=)0y90+j8;-d*YYYXtA5UPVDGC>3QBp(~+Bm z=XsRUFWyoUB6^pO(ZK}Q>N1yXhuTXe-|IjTzEFmN@$G_!Az88@6 zl!&8vlW~g!K-rcHEpIbFVI&^;{KxsUMqYYIE-WmBVd(q5X_~(8r&6iSgs~t9I(ynW zj-zQ>GKmI&<>lqX>d0}Nxw$#VaZJ->j3tf_xABs0102UuRn_->P1B^5lv2i+rt6yw z_B^4Y0JPg^U$;Y>7`XnA&gJTxF~+#di3oyW7>Tu?uIrrhYwXn4jYB$z5g~*z*6G`Z zh>6TFQDT~=nJ8LSRn;^tj^pIu3DM{dT-GgwlrjmxilRsH0#4- zjZXt>ZQQ?rK$6L%FU?*`$j#MS6;ZOy`A{;(7{9t_7=$tr;q{YYoiJ~USA8c@upA2U337l zL-7~id*|~$1-Y}hx{lI}lux>KNC5a)|Au<=2Y7(%v6(0OKr!|I0l!m!^m$SxivR!s M07*qoM6N<$g8UeBxc~qF literal 0 HcmV?d00001 diff --git a/0x49/images/note_linux_small.png b/0x49/images/note_linux_small.png new file mode 100644 index 0000000000000000000000000000000000000000..f42b78f516feb6e47c3b9a680efff4c587b40426 GIT binary patch literal 997 zcmVlp>nVGV(vH$?h%>d2z zObG4(00U`BL_t(|ob8>9mf|1`KnYvHoLi2JENue;5J~Zh8Y7p z_K!q>Vhvb;?J)uNrCdJpB`d)0JYTQPzO3C0Y{nE3fc%r%T^b+D5oR_?1ng$5i6SK; zrMZwp02mT@aC0~SW1jZ8hhg`4#)#|~iP()|KnF{N8%u;6ON1Lsgd0i3P#rV4ku5{z z>8<cQr(7zj6_9x2PnMv|H0ctn!8&k-T1S>GM60EjdixO^OKaq~?L0t15Shs9=e3 zV~KD>nTTV;Wf29a5@{o9@-I2pFwNB``FZE+MNIN&n@+sU2Tx$(MiE0J0!>6rx%wp6 zL{y+m_-EfNCKR6^0%<#|RR-QeWoCarR4^7O>~w#z0qL6yrfRM#6Bg2+abJ zE9)x)6LgOeiL4LkxUodIu|&9`O2m)3X1>WfqKRjis8q{C=Gmm$4^>@W(>?iGB}MDV zy21kHYeCA_B8g|DGPTWDJIwd;Bwq_N*z$h(NWK;ksSN>7cB=tjlgHXrK-2E?c?R9A zltsX~_Q@`Ys7cOL!4l!d65+;}9VC<_qCiDe*HXa};l>i-1{HDSTHFhAD-z!uluKds z5pij`^r7EZP&q~lE;L`6$Oul;waSM9t%wX0l@Srm65+-Y;l_Bbg=bo_j_%#LR$c%< zTNXnX5tjoYTSPRo_ah=%BHU0pMnrScwPd|>pNimjtwKdaqgn(z)XDswz^&Vzh&VI} zZF(uoRP3{^L5G$LGY&u zF-AnOM7W_+#7)-3a3s~#$pZQ7L!lxCH6o(<=d8D3GG&Buq^5%%=Y`_L%8;j!@im#I zaFD6rd8M2($`BFF65+-Y;Rc&&7yjY|5;lJm`%aPX&gi*8L`~OH!PfnQ7`glfy;zQk TGnK=i00000NkvXXu0mjfhzZLO literal 0 HcmV?d00001 diff --git a/0x49/images/note_win32_small.png b/0x49/images/note_win32_small.png new file mode 100644 index 0000000000000000000000000000000000000000..ea3a86d2ad13eddbd404357f31d83d379436a7c1 GIT binary patch literal 1167 zcmV;A1aSL_P)SJ8YQxF${xClwGixDCa3_vE+nzX3` zM4*V>G<^gh5_CadLiD~8AOXxM2O9!1jT%ILc6s)Aj1L1MOAb|m)Bu7Z$P|{yBb)M*MTV8WhGiP$YPoV12H91K(M5vL!b`=@OT$eq~$?U z;za-s0~|U)@&jD2w%SN(BhF9LuI70?Rx*$L|ROOR` zt4~1gueLxU{}t#_UAvzWa&rx^7LnUAD0E%%@tdpW$e)3HA39ZS5!Cuvw!IH9PIS?P1bmc=?{Ow0U z_TN^YI!JBmAhoH3)TXvTPK^CR@PC<32C*YQ9saLT5Jh=W);D=~?4?IhZlDfQo3^e+ z+0qGJ*X2H4ixTJdQD8T3V=HU)hD^6ghKRSVMFIb{?bO#!880XgLL7GM#xs!km$w)M>0RWfo+Ez$%8aM2 zHd5M%Gt@z9Q+nZ9?DYaaEvM*5aHH&k0U9)+QR&jLhTNNTYvaNHUQQFk1rhbAtu|8H zh%?lqD7C3AkZcsipTpDi3$^aX2i-52-q#Kv$ei%E+ImQ2WJjcP54KDU%xWxr%T!{U z`jYaSse{y}4pN&sNNw7>q+DOKTRJY~$453P<=z9tmt4kU18y}-%E8V@5Bd#tEh%Sj h*bmZ%=3#C`{{b)Dg|pat4tQ6_S6z z2dBHJQ`sDrg1;VqG{^03B6%L~{hkls?>UDba?ar_iq3>`3J@axF9;D4ad`M;W|nlK zi=Lh*wY61@vEt%lLyefSF-RZ=2Yann3lRbEqaz*&c#~~O+0S6B_^6L2f_S|z=I5uZ zRto@d&N+ur=ra+HjPxf13d;D@l0h^??Ck8+G|g(YaDK!&5aI0Xm+WlC;kZFWcKbD( z&6Y}e@YpXr>a9j15s&9?S65p>!TCTSl#`QPS!rjC$+8>>gzD;?L})f!bQA;7*47px zdOUTiTJ3h%m`t)POD2a?av~ny&8#eCa`JfWRKmo7Vd0bpk4&Ct->q&OUo98W|yGelfj`Gkl>#2Aw# zsj$#?aB$ey_f*_!QrXhd4gkjM7ocG9b!ll408C6wZ*T9$<9kkL1rZ5Qd3o8|TBM}p zmi{5*|5SZ_y{3H~7 + + + + + + + + www.0x49.org - the note homepage (<? print $src ?>) + + + +
    + + + + +
    + + + + + + + + +
    + note + ; + close VERSION; + chomp $version; + print $version; + ?> + homepage +
    + + ; + close MENU; + foreach (@menu) { + if(/\Q$me\E/) { + print "$_"; + } + else { + print; + } + } + ?> + +

     

    +
    + + + + +
    +; + print @lines; + close SRC; +?> +
    +
    +
    +

    + + diff --git a/CVS/Entries b/CVS/Entries new file mode 100644 index 0000000..1cfbb0e --- /dev/null +++ b/CVS/Entries @@ -0,0 +1,12 @@ +/Makefile.PL/1.1.1.1/Sat Jul 1 14:40:50 2000// +/UPGRADE/1.1.1.1/Sat Jul 1 14:40:50 2000// +/note/1.1.1.1/Sat Jul 1 14:40:50 2000// +/stresstest.sh/1.1.1.1/Sat Jul 1 14:40:50 2000// +D/0x49//// +D/NOTEDB//// +D/bin//// +D/config//// +D/mysql//// +/Changelog/1.2/Sun Jul 9 22:08:40 2000// +/VERSION/1.2/Sun Jul 9 22:10:55 2000// +/README/1.2/Sun Jul 9 22:37:00 2000// diff --git a/CVS/Repository b/CVS/Repository new file mode 100644 index 0000000..2a7999c --- /dev/null +++ b/CVS/Repository @@ -0,0 +1 @@ +NOTE diff --git a/CVS/Root b/CVS/Root new file mode 100644 index 0000000..9c415c0 --- /dev/null +++ b/CVS/Root @@ -0,0 +1 @@ +zarahg@cvs.htnews.sourceforge.net:/cvsroot/htnews diff --git a/Changelog b/Changelog index abc280d..d90fe3e 100644 --- a/Changelog +++ b/Changelog @@ -1,127 +1,188 @@ -================================================================================== +================================================================================ + +1.1.0: +CHANGED: does no more use the external touch command to create a new + file, use perls open() instead. +CHANGED: excluded some of the help texts from the usage message and the + interactive help command to a manpage. +ADDED: new commandline flag "--encrypt" which one can use to encrypt + the mysql database password. This will be decrypted before + connecting to the db. There is also a new config file option + "encrypt_passwd" which indicates an encrypted db-password. +ADDED: another new config option "ShortCd", which can be set to "yes" + or 1 and if set, then a command like "cd 13" would jump + directly to the topic of the note with the number 13. +ADDED: now you can at any time cd back to the "root" of the + topic-structure using the command "cd /". +CHANGED: mysql.pm does now only do a table-lock on single write + accesses, no more on the whole session. This allows one to + access the same db twice or more. +FIXED: Changed README and Changelog for readability on 80 by 25 + displays. And changed indentation of the note script itself. +ADDED: NOTEDB.pm - a generic module, which holds some methods, which + are used by binary.pm, mysql.pm and dbm.pm. +ADDED: NOTEDB.pm generate_search(), which allows one to + use AND, OR and various combinations of them using ( and ). +ADDED: a search does now return the 2nd line of a note if a matching + note's first line is a topic. +CHANGED: use "unshift" instead of push to add $libpath to @INC. +ADDED: a new feature, Caching of notes. supported by binary.pm and + mysql.pm. To turn it on, one need to set "Cache" in the config + to a true value. + +================================================================================ + +1.0.9: jumped directly to 1.1.0, too many additions. + +================================================================================ + +1.0.8: +FIXED: typo in noterc shipped with package may caused confusion + (BLOWFISH instead of Blowfish). +CHANGED: changed the way note manages temporary filez. It uses now a + random string instead of just it's own PID. It does also change + it's umask to 077 and, if applicable (on ext2 filesystems) + issues "chattr +s" which will cause the ext2 inodes to be + zero'd after file deletion. +ADDED: A new config option allows the user to specify her own + temp-directory. The default is still /tmp. + +================================================================================ 1.0.7: FIXED: there was a bug in the search expression, use now \Q and \E. -ADDED: --config allows one to use another config than the default. +ADDED: --config allows one to use another config than the + default. -================================================================================== +================================================================================ 1.0.6: -FIXED: there were some odd bugs in commandline parsing, some options were unavailable. +FIXED: there were some odd bugs in commandline parsing, some options + were unavailable. FIXED: Forgot "PreferredEditor" config-option in the new config format. FIXED: the interactive "cd .." command has ignored the presence of a "DefaultLong" setting(and search too)... thx to Peter. -CHANGED: Optimized a little bit the output routine, now it is better to read. -ADDED: sub format and appropriate config-option for text formatting capabilities. -CHANGED: changed getconfig regexp, which allows now also to use Option = Param. -FIXED: was not possible to override config-options, which are set by default to - something. -ADDED: note chacks now, if a database os actually really encrypted and exits with - an error if it s and the user turned off encryption. This protects her from - destroying it's own database .. +CHANGED: Optimized a little bit the output routine, now it is better to + read. +ADDED: sub format and appropriate config-option for text formatting + capabilities. +CHANGED: changed getconfig regexp, which allows now also to use + Option = Param. +FIXED: was not possible to override config-options, which are set by + default to something. +ADDED: note checks now, if a database os actually really encrypted and + exits with an error if it s and the user turned off encryption. + This protects her from destroying it's own database .. -================================================================================== +================================================================================ 1.0.5: -FIXED: the T (and t respectively) printed nothing out since 1.0.3! It does - it now again... -ADDED: a new database backend added, NOTEDB::dbm, which uses DBM files for - storage. +FIXED: the T (and t respectively) printed nothing out since 1.0.3! + It does it now again... +ADDED: a new database backend added, NOTEDB::dbm, which uses DBM + files for storage. FIXED: &display-tree returns now, if there is no note, otherwise it would die because of an undefined refernce. -CHANGED: Changed the config file format completely. It is now no more a perl - file, instead it is a simple plain text file which note parses. -CHANGED: Changed the way, note loads it database backend. It uses now the - $dbdriver variable as module-name, which makes it possible easily - to write your own backend without the need to change note itself. +CHANGED: Changed the config file format completely. It is now no more + a perl file, instead it is a simple plain text file which note + parses. +CHANGED: Changed the way, note loads it database backend. It uses now + the $dbdriver variable as module-name, which makes it possible + easily to write your own backend without the need to change + note itself. FIXED: Removed Getopt::Long option "bundling", causes errors with perl 5.6.0 and is not senceful. FIXED: Added the Getopt::Long option "no_ignore_case". In 1.0.4 options were case insensitive causing -i to be interpreted as --import instead of --interactive ;-((( -ADDED: a new config option $DEFAULT_LIST, which causes note, \ - if turned to "LONG", to use long-listing as default. | - But it will still be able to use short-listing if you | - explicit specify that. | submitted by -FIXED: sub search prints now an appropriate error-message in |==> Peter Palmreuther - case no searchstring was given instead of jumping to | thanks a lot! - usage. | -CHANGED: Changed the text in the interactive help to reflect | - changes of verion 1.0.3 (t and T). / + +Thanks to Peter Palmreuter for the following fixed/additions: +ADDED: a new config option $DEFAULT_LIST, which causes note, + if turned to "LONG", to use long-listing as default. + But it will still be able to use short-listing if you + explicit specify that. +FIXED: sub search prints now an appropriate error-message in + case no searchstring was given instead of jumping to + usage. +CHANGED: Changed the text in the interactive help to reflect + changes of verion 1.0.3 (t and T). -================================================================================== +================================================================================ 1.0.4: CHANGED: Moved from @ARGV-parsing to Getopt::Long, adding options is now much easier and I do now understand my own code ;-) ADDED: --raw, the "Raw Mode", which turns off any formatting of output. -================================================================================== +================================================================================ 1.0.3: ADDED: "-" works also for --dump, but in the other direction. It causes note to dump to standard output instead into a file. -ADDED: you can specify - as filename for use with --import and if you want - to create a new note. "-" stands for standardinput and it allows you - tp pipe another commands output to note! -ADDED: you can now use an environment variable for the passphrase (when using - encryption). If it is presen, note will not ask for a passphrase. This - is very usefull in comination with the addition above, for use in - scripts. +ADDED: you can specify - as filename for use with --import and if you + want to create a new note. "-" stands for standardinput and + it allows you to pipe another commands output to note! +ADDED: you can now use an environment variable for the passphrase + (when using encryption). If it is present, note will not ask + for a passphrase. This is very useful in comination with the + addition above, for use in scripts. CHANGED: the interactive help screen is now coloured. -ADDED: -o commandline switch, which causes note to overwrite an existing - database when importing data from a previous dump. Very handy if - you want to re-initialize your db, i.e. if you changed the format. -ADDED: the long-tree-view (-T) displays now also the note-number of each - note. +ADDED: -o commandline switch, which causes note to overwrite an + existing database when importing data from a previous dump. + Very handy if you want to re-initialize your db, i.e. if you + changed the format. +ADDED: the long-tree-view (-T) displays now also the note-number of + each note. -================================================================================== +================================================================================ 1.0.2: ADDED: Topic-Tree overview command (-t or -T). ADDED: Enhanced list command in interactive mode, you can now specify a topic which notes you want to see. -CHANGED: updated the help and usage sections to reflect the additions above. +CHANGED: updated the help and usage sections to reflect the additions + above. -================================================================================== +================================================================================ 1.0.1: -FIXED: fixed bug in NOTEDB::mysql, which caused note t store NULL values - in db, if encryption was off. A really dump failure :-( +FIXED: fixed bug in NOTEDB::mysql, which caused note to store NULL + values in db, if encryption was off. A really dump failure :-( -================================================================================== +================================================================================ 1.0.0: CHANGED: removed install.sh. use now a Makefile for installation. ADDED: Encryption support. Note can now encrypt notes using IDEA or DES as encryption-protocols(symetric). -================================================================================== +================================================================================ 0.9: FIXED: There were many new bugs after my last changes *grrrrr*. fixed. Works now properly, with both backends! FIXED: and another bug: recounting of numbers did not take care about - the existing order! If you deleted note #12, then note #13 became - not neccessarily #12! Instead it becames any other number (kind of - randomly...). + the existing order! If you deleted note #12, then note #13 + became not neccessarily #12! Instead it becames any other + number (kind of randomly...). CHANGED: NOTEDB::binary set_del function changed, it does no more require a temporary file for number recount. Instead it uses get_all and stores all notes in RAM and then rewrites the database. FIXED: fixed the set_new call within note. It used 0 as the first param - (number) which is not useful since we dont have support for auto- - increment from all database backends. + (number) which is not useful since we dont have support for + autoincrement from all database backends. FIXED: fixed the function set_recountnum in NITEDB::mysql, it was also - incorrect :-((( 0.8 seemed to be a very bad early alpha........... -FIXED: there was a bug in NOTEDB::binary which caused not to recount note - numbers after deleting one :-( + incorrect :-((( 0.8 seemed to be a very bad early alpha... +FIXED: there was a bug in NOTEDB::binary which caused not to recount + note numbers after deleting one :-( -================================================================================== +================================================================================ 0.8: ADDED: NOTEDB::binary. so now 0.8 is ready for shipping ! -FIXED: regexp bug fixed. It was only possible to delete 2 items together +FIXED: regexp bug fixed. It was only possible to delete 2 items + together separated by comma ("d 1,2,3,4" deleted only 1,2!). ADDED: Some new config options which reflects the new module structure. So you can change your database backend without the need to @@ -135,40 +196,42 @@ ADDED: NOTEDB::mysql added. Perlmodule, which I will use within CHANGED: The SQL code does not use Mysql.pm anymore. Instead it is coded using the more portable DBI module. This allows one easily to switch to anther database, which is supported by DBI. -CHANGED: Locking. The db-table will now be locked before note accesses it. -FIXED: width of listings is now always the same independent of the string- - length of a certain note. +CHANGED: Locking. The db-table will now be locked before note accesses + it. +FIXED: width of listings is now always the same independent of the + stringlength of a certain note. -================================================================================== +================================================================================ 0.7: ADDED: one can now use the unix-like "cd" command to change to another topic, thus use "cd topicname" instead just typing "topicname"! -FIXED: there was a smal regex bug which maked it impossible to use such - topics: "4 test", in such a case note just displayed note number 4 - instead of cd'ing to topic "4 test". +FIXED: there was a smal regex bug which maked it impossible to use + such topics: "4 test", in such a case note just displayed note + number 4 instead of cd'ing to topic "4 test". ADDED: a new config option "$KEEP_TIMESTAMP" allows a user to disable - note's default behavior of updating the timestamp of a note after - editing it. + note's default behavior of updating the timestamp of a note + after editing it. -================================================================================== +================================================================================ 0.6: FIXED: oops - the new suptopic feature confused the commandline-mode of - note! quickly corrected! so subtopics also available from command- - line. -FIXED: a small bug fiyed, it was impossible to use -D or -I from command- - line, if $ALWAYS_INT was turned on, now it is. + note! quickly corrected! so subtopics also available from + commandline. +FIXED: a small bug fiyed, it was impossible to use -D or -I from + commandline, if $ALWAYS_INT was turned on, now it is. FIXED: fixed problem with local/global variable $time, which confused - the script under certain circumstances, now $time is no more global, - it will be read in (using &getdate) locally by &new and &edit. + the script under certain circumstances, now $time is no more + global, it will be read in (using &getdate) locally by &new + and &edit. CHANGED: The Topic separator is no longer hardcoded, one can customize - it using the $TopicSep variable, the default is now /, the backslash - will no mor work! + it using the $TopicSep variable, the default is now /, the + backslash will no more work! CHANGED: use perl buildin localtime() function instead of GNU date, which is possibly not installed on every target system (i.e. win32), therefore better portability! @@ -186,7 +249,7 @@ FIXED: A bug at line 769 causing single note where smaller than note- -================================================================================== +================================================================================ @@ -198,47 +261,53 @@ FIXED: There was another bug, which caused the list command to display -================================================================================== +================================================================================ 0.4.2: -ADDED: If run in interactive mode, note will at first do a list command. +ADDED: If run in interactive mode, note will at first do a list + command. FIXED: A bug caused note to save bogus timestamps after editing a note. -CHANGED: It does no more print 3 newlines before the menu in interactive mode. -FIXED: Some more vars will be resetted during each loop in interactive mode. - $ListType. +CHANGED: It does no more print 3 newlines before the menu in interactive + mode. +FIXED: Some more vars will be resetted during each loop in interactive + mode. $ListType. -================================================================================== +================================================================================ 0.4.1: -ADDED: The install.sh script for the mysql version is no able to install the - required Mysql module directly from CPAN, thanks to David A. Bandel! -FIXED: The mysql version did not display notes (i.e.: "note 3" did nothing) -CHANGED: Again, the sql-format of the mysql database has been changed. Now - there are only 3 fields, the number filed is the primary key, the id - field in previous versions was a waste of diskspace... +ADDED: The install.sh script for the mysql version is no able to + install the required Mysql module directly from CPAN, thanks + to David A. Bandel! +FIXED: The mysql version did not display notes (i.e.: "note 3" did + nothing) +CHANGED: Again, the sql-format of the mysql database has been changed. + Now there are only 3 fields, the number filed is the primary + key, the id field in previous versions was a waste of + diskspace... CHANGED: The format of the dump-output has been changed. -ADDED: It is now possible to import previously dumped notes into the notedb +ADDED: It is now possible to import previously dumped notes into the + notedb (dumps from both versions are compatible with each other) FIXED: the function num_bereich() had a bug, which caused ot to ignore under some circumstances one number (i.e. "note -d 4-13" did nothing). -================================================================================== +================================================================================ 0.4: CHANGED: ok, mysql support is back again (upon requests). therefore there are two different version of the script in the same time with - the same features, one for mysql and the other one for the binary - database. + the same features, one for mysql and the other one for the + binary database. ADDED: Dump to textfile capability. Later on I want to dump it into a palm readable format, any help is welcome! ADDED: interactive mode. @@ -250,17 +319,18 @@ ADDED: sub num_bereich(), which allows one to specify more then one -================================================================================== +================================================================================ 0.3: CHANGED: it uses no more a mysql database, but a binary file instead. This is much faster! -ADDED: note can display the notes with colors, it is turned off by default +ADDED: note can display the notes with colors, it is turned off by + default -================================================================================== +================================================================================ 0.2: @@ -271,7 +341,7 @@ FIXED: now numbers of notes will be recounted, if one delete one note, CHANGED: the look of the list output has been changed, similar to a table -================================================================================== +================================================================================ 0.1: INITIAL RELEASE. diff --git a/Makefile.PL b/Makefile.PL index cc0d712..1f1d904 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -2,7 +2,7 @@ # NOTEDB::mysql and NOTEDB::binary are internals # of note. # -# $Id: Makefile.PL,v 1.1 2000/04/17 17:38:49 thomas Exp thomas $ +# $Id: Makefile.PL,v 1.1.1.1 2000/07/01 14:40:50 zarahg Exp $ # # check for the existence of optional modules: sub chk_mod @@ -86,17 +86,22 @@ $install = `which install`; open M, "> Makefile" || die $!; print M qq~BIN = bin/note +MAN = note.1 LIBS = NOTEDB/mysql.pm NOTEDB/binary.pm NOTEDB/dbm.pm +CORE = NOTEDB.pm INSTBIN = $BINDIR INSTLIB = $LIBDIR +INSTMAN = /usr/man/man1 INSTALL = $install all: \@echo "done. Type make install.\\n" install: + \$(INSTALL) -m 755 \$(CORE) \$(INSTLIB) \$(INSTALL) -d -m 755 \$(INSTLIB)/NOTEDB \$(INSTALL) -m 755 \$(LIBS) \$(INSTLIB)/NOTEDB \$(INSTALL) -m 755 \$(BIN) \$(INSTBIN) + \$(INSTALL) -m 644 \$(MAN) \$(INSTMAN) ~; print "Type \"make install\" to install all files.\n\n"; diff --git a/NOTEDB.pm b/NOTEDB.pm new file mode 100644 index 0000000..c8ee73b --- /dev/null +++ b/NOTEDB.pm @@ -0,0 +1,213 @@ +# +# this is a generic module, used by note database +# backend modules. +# +# $Id$ +# +# Copyright (c) 2000 Thomas Linden + + +package NOTEDB; + +BEGIN { + # make sure, it works, otherwise encryption + # is not supported on this system! + eval { require Crypt::CBC; }; + if($@) { + $NOTEDB::crypt_supported = 0; + } + else { + $NOTEDB::crypt_supported = 1; + } +} + + +sub no_crypt { + $NOTEDB::crypt_supported = 0; +} + + +sub use_crypt { + my($this,$key,$method) = @_; + if($NOTEDB::crypt_supported == 1) { + eval { + $cipher = new Crypt::CBC($key, $method); + }; + if($@) { + $NOTEDB::crypt_supported == 0; + } + } + else{ + print "warning: Crypt::CBC not supported by system!\n"; + } +} + + +sub use_cache { + # + # this sub turns on cache support + # + my $this = shift; + $this->{use_cache} = 1; + $this->{changed} = 1; +} + +sub cache { + # + # store the whole db as hash + # if use_cache is turned on + # + my $this = shift; + if ($this->{use_cache}) { + my %res = @_; + %{$this->{cache}} = %res; + } +} + +sub unchanged { + # + # return true if $this->{changed} is true, this will + # be set to true by writing subs using $this->changed(). + # + my $this = shift; + return 0 if(!$this->{use_cache}); + if ($this->{changed}) { + $this->{changed} = 0; + return 0; + } + else { + print "%\n"; + return 1; + } +} + +sub changed { + # + # turn on $this->{changed} + # this will be used by update or create subs. + # + my $this = shift; + $this->{changed} = 1; +} + + +sub generate_search { + # + # get user input and create perlcode ready for eval + # sample input: + # "ann.a OR eg???on AND u*do$" + # resulting output: + # "$match = 1 if(/ann\.a/i or /eg...on/i and /u.*do\$/i ); + # + my($this, $string) = @_; + + my $case = "i"; + + if ($string =~ /^\/.+?\/$/) { + return $string; + } + elsif (!$string) { + return "/^/"; + } + + # we will get a / in front of the first word too! + $string = " " . $string . " "; + + # check for apostrophs + $string =~ s/(?<=\s)(\(??)("[^"]+"|\S+)(\)??)(?=\s)/$1 . $this->check_exact($2) . $3/ge; + + # remove odd spaces infront of and after »and« and »or« + $string =~ s/\s\s*(AND|OR)\s\s*/ $1 /g; + + # remove odd spaces infront of »(« and after »)« + $string =~ s/(\s*\()/\(/g; + $string =~ s/(\)\s*)/\)/g; + + # remove first and last space so it will not masked! + $string =~ s/^\s//; + $string =~ s/\s$//; + + # mask spaces if not infront of or after »and« and »or« + $string =~ s/(?check_or($1, $case) /ge; + + # remove slashes on »and« and »or« + $string =~ s/\/(and|or)\/$case/$1/g; + + # remove spaces inside /string/ constructs + $string =~ s/(? '.*', + '?' => '.', + '[' => '[', + ']' => ']', + '+' => '\+', + '.' => '\.', + '$' => '\$', + '@' => '\@', + ); + + # mask backslash + $str =~ s/\\/\\\\/g; + + if ($str =~ /^"/ && $str =~ /"$/) { + # mask bracket-constructs + $str =~ s/(\(|\))/\\$1/g; + } + $str =~ s/(.)/$globs{$1} || "$1"/ge; + + $str =~ s/^"//; + $str =~ s/"$//; + + # mask spaces + $str =~ s/\s/\\s/g; + return $str; +} + + + + +1; diff --git a/NOTEDB/CVS/Entries b/NOTEDB/CVS/Entries new file mode 100644 index 0000000..1a34910 --- /dev/null +++ b/NOTEDB/CVS/Entries @@ -0,0 +1,5 @@ +/README/1.1.1.1/Sat Jul 1 14:40:52 2000// +/binary.pm/1.1.1.1/Sat Jul 1 14:40:52 2000// +/dbm.pm/1.1.1.1/Sat Jul 1 14:40:52 2000// +/mysql.pm/1.1.1.1/Sat Jul 1 14:40:52 2000// +D diff --git a/NOTEDB/CVS/Repository b/NOTEDB/CVS/Repository new file mode 100644 index 0000000..cc8371e --- /dev/null +++ b/NOTEDB/CVS/Repository @@ -0,0 +1 @@ +NOTE/NOTEDB diff --git a/NOTEDB/CVS/Root b/NOTEDB/CVS/Root new file mode 100644 index 0000000..9c415c0 --- /dev/null +++ b/NOTEDB/CVS/Root @@ -0,0 +1 @@ +zarahg@cvs.htnews.sourceforge.net:/cvsroot/htnews diff --git a/NOTEDB/binary.pm b/NOTEDB/binary.pm index fac520b..003239e 100644 --- a/NOTEDB/binary.pm +++ b/NOTEDB/binary.pm @@ -1,26 +1,19 @@ #!/usr/bin/perl -# $Id: binary.pm,v 1.6 2000/06/25 19:48:00 scip Exp scip $ +# $Id: binary.pm,v 1.1.1.1 2000/07/01 14:40:52 zarahg Exp $ # Perl module for note # binary database backend. see docu: perldoc NOTEDB::binary # +package NOTEDB; + use strict; use Data::Dumper; use IO::Seekable; -package NOTEDB; +use NOTEDB; + use Fcntl qw(LOCK_EX LOCK_UN); -BEGIN { - # make sure, it works, although encryption - # not supported on this system! - eval { require Crypt::CBC; }; - if($@) { - $NOTEDB::crypt_supported = 0; - } - else { - $NOTEDB::crypt_supported = 1; - } -} - + + # Globals: my ($NOTEDB, $sizeof, $typedef,$version); my ($cipher); @@ -48,12 +41,12 @@ sub new exit(1); } - - my $TYPEDEF = "i a$MAX_NOTE a$MAX_TIME"; + my $TYPEDEF = "i a$MAX_NOTE a$MAX_TIME"; my $SIZEOF = length pack($TYPEDEF, () ); $sizeof = $SIZEOF; $typedef = $TYPEDEF; + return $self; } @@ -67,24 +60,7 @@ sub version { return $version; } -sub no_crypt { - $NOTEDB::crypt_supported = 0; -} -sub use_crypt { - my($this,$key,$method) = @_; - if($NOTEDB::crypt_supported == 1) { - eval { - $cipher = new Crypt::CBC($key, $method); - }; - if($@) { - $NOTEDB::crypt_supported == 0; - } - } - else{ - print "warning: Crypt::CBC not supported by system!\n"; - } -} sub set_del_all { @@ -94,8 +70,7 @@ sub set_del_all } -sub get_single -{ +sub get_single { my($this, $num) = @_; my($address, $note, $date, $buffer, $n, $t, $buffer, ); @@ -112,20 +87,24 @@ sub get_single flock NOTE, LOCK_UN; close NOTE; - + return $note, $date; } sub get_all { - my($this, $num, $note, $date, %res); + my $this = shift; + my($num, $note, $date, %res); + if ($this->unchanged) { + return %{$this->{cache}}; + } open NOTE, "+<$NOTEDB" or die "could not open $NOTEDB\n"; - flock NOTE, LOCK_EX; - my($buffer, $t, $n); + flock NOTE, LOCK_EX; + my($buffer, $t, $n); seek(NOTE, 0, 0); # START FROM BEGINNING - while(read(NOTE, $buffer, $sizeof)) { + while(read(NOTE, $buffer, $sizeof)) { ($num, $note, $date) = unpack($typedef, $buffer); $t = ude($date); $n = ude($note); @@ -135,18 +114,27 @@ sub get_all flock NOTE, LOCK_UN; close NOTE; + $this->cache(%res); return %res; } sub get_nextnum { - my($this, $num, $te, $me, $buffer); + my $this = shift; + my($num, $te, $me, $buffer); + if ($this->unchanged) { + $num = 1; + foreach (keys %{$this->{cache}}) { + $num++; + } + return $num; + } open NOTE, "+<$NOTEDB" or die "could not open $NOTEDB\n"; - flock NOTE, LOCK_EX; - - seek(NOTE, 0, 0); # START FROM BEGINNING + flock NOTE, LOCK_EX; + + seek(NOTE, 0, 0); # START FROM BEGINNING while(read(NOTE, $buffer, $sizeof)) { ($num, $te, $me) = unpack($typedef, $buffer); } @@ -160,10 +148,31 @@ sub get_nextnum sub get_search { my($this, $searchstring) = @_; - my($buffer, $num, $note, $date, %res, $t, $n); + my($buffer, $num, $note, $date, %res, $t, $n, $match); + + my $regex = $this->generate_search($searchstring); + eval $regex; + if ($@) { + print "invalid expression: \"$searchstring\"!\n"; + return; + } + $match = 0; + + if ($this->unchanged) { + foreach my $num (keys %{$this->{cache}}) { + $_ = $this->{cache}{$num}->{note}; + eval $regex; + if ($match) { + $res{$num}->{note} = $this->{cache}{$num}->{note}; + $res{$num}->{date} = $this->{cache}{$num}->{date} + } + $match = 0; + } + return %res; + } open NOTE, "+<$NOTEDB" or die "could not open $NOTEDB\n"; - flock NOTE, LOCK_EX; + flock NOTE, LOCK_EX; seek(NOTE, 0, 0); # START FROM BEGINNING while(read(NOTE, $buffer, $sizeof)) @@ -171,11 +180,14 @@ sub get_search ($num, $note, $date) = unpack($typedef, $buffer); $n = ude($note); $t = ude($date); - if($n =~ /\Q$searchstring\E/i) + $_ = $n; + eval $regex; + if($match) { $res{$num}->{'note'} = $n; $res{$num}->{'date'} = $t; } + $match = 0; } flock NOTE, LOCK_UN; close NOTE; @@ -192,7 +204,7 @@ sub set_edit my $address = ($num -1 ) * $sizeof; open NOTE, "+<$NOTEDB" or die "could not open $NOTEDB\n"; - flock NOTE, LOCK_EX; + flock NOTE, LOCK_EX; seek(NOTE, $address, IO::Seekable::SEEK_SET); my $n = uen($note); @@ -203,6 +215,8 @@ sub set_edit flock NOTE, LOCK_UN; close NOTE; + + $this->changed; } @@ -220,6 +234,8 @@ sub set_new flock NOTE, LOCK_UN; close NOTE; + + $this->changed; } @@ -249,6 +265,9 @@ sub set_del } flock NOTE, LOCK_UN; close NOTE; + + $this->changed; + return; } @@ -256,14 +275,14 @@ sub set_recountnums { my($this) = @_; my(%orig, $note, $date, $T, $setnum, $buffer, $n, $N, $t); - + $setnum = 1; %orig = $this->get_all(); open NOTE, ">$NOTEDB" or die "could not open $NOTEDB\n"; flock NOTE, LOCK_EX; seek(NOTE, 0, 0); # START FROM BEGINNING - + foreach $N (sort {$a <=> $b} keys %orig) { $n = uen($orig{$N}->{'note'}); $t = uen($orig{$N}->{'date'}); @@ -274,6 +293,9 @@ sub set_recountnums } flock NOTE, LOCK_UN; close NOTE; + + $this->changed; + return; } @@ -306,6 +328,10 @@ sub ude return $T; } + + + + 1; # keep this! __END__ @@ -318,7 +344,7 @@ NOTEDB::binary - module lib for accessing a notedb from perl # include the module use NOTEDB; - + # create a new NOTEDB object $db = new NOTEDB("binary", "/home/tom/.notedb", 4096, 24); diff --git a/NOTEDB/dbm.pm b/NOTEDB/dbm.pm index cfdc0ba..74b051f 100644 --- a/NOTEDB/dbm.pm +++ b/NOTEDB/dbm.pm @@ -1,25 +1,15 @@ #!/usr/bin/perl -# $Id: dbm.pm,v 1.2 2000/06/25 19:51:11 scip Exp scip $ +# $Id: dbm.pm,v 1.1.1.1 2000/07/01 14:40:52 zarahg Exp $ # Perl module for note # DBM database backend. see docu: perldoc NOTEDB::dbm # use DB_File; #use Data::Dumper; +use NOTEDB; use strict; package NOTEDB; -BEGIN { - # make sure, it works, although encryption - # not supported on this system! - eval { require Crypt::CBC; }; - if($@) { - $NOTEDB::crypt_supported = 0; - } - else { - $NOTEDB::crypt_supported = 1; - } -} # Globals: my ($dbm_dir, $notefile, $timefile, $version, $cipher, %note, %date); @@ -52,25 +42,6 @@ sub version { return $version; } -sub no_crypt { - $NOTEDB::crypt_supported = 0; -} - -sub use_crypt { - my($this, $key, $method) = @_; - if($NOTEDB::crypt_supported == 1) { - eval { - $cipher = new Crypt::CBC($key, $method); - }; - if($@) { - $NOTEDB::crypt_supported == 0; - } - } - else{ - print "warning: Crypt::CBC not supported by system!\n"; - } -} - sub get_single { @@ -104,13 +75,23 @@ sub get_nextnum sub get_search { my($this, $searchstring) = @_; - my($num, $note, $date, %res); + my($num, $note, $date, %res, $match); + my $regex = $this->generate_search($searchstring); + eval $regex; + if ($@) { + print "invalid expression: \"$searchstring\"!\n"; + return; + } + $match = 0; foreach $num (sort {$a <=> $b} keys %date) { - if (ude($note{$num}) =~ /\Q$searchstring\E/i) { + $_ = ude($note{$num}); + eval $regex; + if ($match) { $res{$num}->{'note'} = ude($note{$num}); $res{$num}->{'date'} = ude($date{$num}); } + $match = 0; } return %res; @@ -196,6 +177,8 @@ sub ude } } + + 1; # keep this! __END__ diff --git a/NOTEDB/mysql.pm b/NOTEDB/mysql.pm index 9c47509..e9c7288 100644 --- a/NOTEDB/mysql.pm +++ b/NOTEDB/mysql.pm @@ -1,5 +1,5 @@ #!/usr/bin/perl -# $Id: mysql.pm,v 1.5 2000/06/25 19:50:43 scip Exp scip $ +# $Id: mysql.pm,v 1.1.1.1 2000/07/01 14:40:52 zarahg Exp $ # Perl module for note # mysql database backend. see docu: perldoc NOTEDB::binary # @@ -7,21 +7,10 @@ use DBI; use strict; use Data::Dumper; +use NOTEDB; package NOTEDB; -BEGIN { - # make sure, it works, although encryption - # not supported on this system! - eval { require Crypt::CBC; }; - if($@) { - $NOTEDB::crypt_supported = 0; - } - else { - $NOTEDB::crypt_supported = 1; - } -} - # Globals: my ($DB, $table, $fnum, $fnote, $fdate, $version, $cipher); $table = "note"; @@ -35,7 +24,6 @@ my $sql_getsingle = "SELECT $fnote,$fdate FROM $table WHERE $fnum = ?"; my $sql_all = "SELECT $fnum,$fnote,$fdate FROM $table"; my $sql_nextnum = "SELECT max($fnum) FROM $table"; my $sql_incrnum = "SELECT $fnum FROM $table ORDER BY $fnum"; -my $sql_search = "SELECT DISTINCT $fnum,$fnote,$fdate FROM $table WHERE $fnote LIKE ?"; my $sql_setnum = "UPDATE $table SET $fnum = ? WHERE $fnum = ?"; my $sql_edit = "UPDATE $table SET $fnote = ?, $fdate = ? WHERE $fnum = ?"; @@ -57,11 +45,6 @@ sub new my $database = "DBI:$dbdriver:$dbname;host=$dbhost"; $DB = DBI->connect($database, $dbuser, $dbpasswd) || die DBI->errstr(); - - # LOCK the database! - my $lock = $DB->prepare("LOCK TABLES $table WRITE") || die $DB->errstr(); - $lock->execute() || die $DB->errstr(); - return $self; } @@ -69,40 +52,36 @@ sub new sub DESTROY { # clean the desk! - my $unlock = $DB->prepare("UNLOCK TABLES") || die $DB->errstr; - $unlock->execute() || die $DB->errstr(); - $DB->disconnect || die $DB->errstr; } + +sub lock { + my($this) = @_; + # LOCK the database! + my $lock = $DB->prepare("LOCK TABLES $table WRITE") || die $DB->errstr(); + $lock->execute() || die $DB->errstr(); +} + + +sub unlock { + my($this) = @_; + my $unlock = $DB->prepare("UNLOCK TABLES") || die $DB->errstr; + $unlock->execute() || die $DB->errstr(); + $DB->disconnect || die $DB->errstr; +} + + sub version { return $version; } -sub no_crypt { - $NOTEDB::crypt_supported = 0; -} -sub use_crypt { - my($this, $key, $method) = @_; - if($NOTEDB::crypt_supported == 1) { - eval { - $cipher = new Crypt::CBC($key, $method); - }; - if($@) { - $NOTEDB::crypt_supported == 0; - } - } - else{ - print "warning: Crypt::CBC not supported by system!\n"; - } -} - -sub get_single -{ +sub get_single { my($this, $num) = @_; + my($note, $date); my $statement = $DB->prepare($sql_getsingle) || die $DB->errstr(); - + $statement->execute($num) || die $DB->errstr(); $statement->bind_columns(undef, \($note, $date)) || die $DB->errstr(); @@ -114,7 +93,13 @@ sub get_single sub get_all { - my($this, $num, $note, $date, %res); + my $this = shift; + my($num, $note, $date, %res); + + if ($this->unchanged) { + return %{$this->{cache}}; + } + my $statement = $DB->prepare($sql_all) || die $DB->errstr(); $statement->execute || die $DB->errstr(); @@ -124,6 +109,8 @@ sub get_all $res{$num}->{'note'} = ude($note); $res{$num}->{'date'} = ude($date); } + + $this->cache(%res); return %res; } @@ -131,6 +118,14 @@ sub get_all sub get_nextnum { my($this, $num); + if ($this->unchanged) { + $num = 1; + foreach (keys %{$this->{cache}}) { + $num++; + } + return $num; + } + my $statement = $DB->prepare($sql_nextnum) || die $DB->errstr(); $statement->execute || die $DB->errstr(); @@ -144,30 +139,35 @@ sub get_nextnum sub get_search { my($this, $searchstring) = @_; - my($num, $note, $date, %res); - if($NOTEDB::crypt_supported != 1) { - $searchstring = "\%$searchstring\%"; - my $statement = $DB->prepare($sql_search) || die $DB->errstr(); - $statement->execute($searchstring) || die $DB->errstr(); - $statement->bind_columns(undef, \($num, $note, $date)) - || die $DB->errstr(); - while($statement->fetch) { - $res{$num}->{'note'} = $note; - $res{$num}->{'date'} = $date; - } + my($num, $note, $date, %res, $match); + + my $regex = $this->generate_search($searchstring); + eval $regex; + if ($@) { + print "invalid expression: \"$searchstring\"!\n"; + return; + } + $match = 0; + + my %data; + if ($this->unchanged) { + %data = %{$this->{cache}}; } else { - my %res = $this->get_all(); - foreach $num (sort { $a <=> $b } keys %res) { - $note = ude($res{$num}->{'note'}); - $date = ude($res{$num}->{'date'}); - if($note =~ /\Q$searchstring\E/i) - { - $res{$num}->{'note'} = $note; - $res{$num}->{'date'} = $date; - } - } + %data = $this->get_all(); } + foreach $num (sort { $a <=> $b } keys %data) { + $note = ude($data{$num}->{'note'}); + $date = ude($data{$num}->{'date'}); + $_ = $note; + eval $regex; + if($match) { + $res{$num}->{'note'} = $note; + $res{$num}->{'date'} = $date; + } + $match = 0; + } + return %res; } @@ -177,24 +177,28 @@ sub get_search sub set_edit { my($this, $num, $note, $date) = @_; - + + $this->lock; my $statement = $DB->prepare($sql_edit) || die $DB->errstr(); - $note =~ s/'/\'/g; $note =~ s/\\/\\\\/g; $statement->execute(uen($note), uen($date), $num) || die $DB->errstr(); + $this->unlock; + $this->changed; } sub set_new { my($this, $num, $note, $date) = @_; - + $this->lock; my $statement = $DB->prepare($sql_insertnew) || die $DB->errstr(); $note =~ s/'/\'/g; - $note =~ s/\\/\\\\/g; + $note =~ s/\\/\\\\/g; $statement->execute($num, uen($note), uen($date)) || die $DB->errstr(); + $this->unlock; + $this->changed; } @@ -202,7 +206,8 @@ sub set_del { my($this, $num) = @_; my($note, $date, $T); - + + $this->lock; ($note, $date) = $this->get_single($num); return "ERROR" if ($date !~ /^\d/); @@ -210,6 +215,8 @@ sub set_del # delete record! my $statement = $DB->prepare($sql_del) || die $DB->errstr(); $statement->execute($num) || die $DB->errstr(); + $this->unlock; + $this->changed; return; } @@ -217,14 +224,19 @@ sub set_del sub set_del_all { my($this) = @_; + $this->lock; my $statement = $DB->prepare($sql_del_all) || die $DB->errstr(); $statement->execute() || die $DB->errstr(); + $this->unlock; + $this->changed; return; } -sub set_recountnums -{ +sub set_recountnums { my $this = shift; + + $this->lock; + my(@count, $i, $num, $setnum, $pos); $setnum = 1; $pos=0; $i=0; @count = (); @@ -237,13 +249,14 @@ sub set_recountnums $count[$i] = $num; $i++; } - # now recount them! my $sub_statement = $DB->prepare($sql_setnum) || die $DB->errstr(); for($pos=0;$pos<$i;$pos++) { $setnum = $pos +1; $sub_statement->execute($setnum,$count[$pos]) || die $DB->errstr(); } + $this->unlock; + $this->changed; } sub uen @@ -287,7 +300,7 @@ NOTEDB::mysql - module lib for accessing a notedb from perl # include the module use NOTEDB; - + # create a new NOTEDB object (the last 4 params are db table/field names) $db = new NOTEDB("mysql","note","localhost","username","password","note","number","note","date"); diff --git a/README b/README index 781316c..d512583 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -note 1.0.8 by Thomas Linden, 11/07/2000 +note 1.0.9 by Thomas Linden, 08/08/2000 ======================================= Introduction @@ -72,8 +72,11 @@ Features stdin as well es duming to stdout instead a file. Additional, there is an option --raw available, which prints everything out completely without formatting. + o for better performance, note can cache the database for listings + or searching. o It can be installed without root-privileges. - o Last, a while ago a user stated: "... it simply does, what it says ..." + o Last, a while ago a user stated: "... it simply does, what it + says ..." @@ -189,6 +192,18 @@ Usage note will search the whole note database case insensitive for an occurence of this string and tell you the number and first- line it have. + You can extend the searchstring using B, B ( and ) and + shell-like wildcards: + + $ note -s "moses AND lenin" + + or: + + $ note -s "(mike OR arnold) AND (jackson OR schwarzenegger)" + + If note finds a note, which first line is a topic, then it will + display it's second line. + These rules apply for the interactive search too. Instead of using note from the commandline you can use the interactive mode. Run note with "note -i". If you need assistance @@ -212,10 +227,10 @@ Usage o "note -D -" creates a note-database dump and prints it out to stantdard output. o "|" this is the shell's pipe command. It takes the output - of the left program and gives it to the right program as standard - input. - o "note -o -I -" imports a note-database dump from standard input - and overwrites an existing database. + of the left program and gives it to the right program as + standard input. + o "note -o -I -" imports a note-database dump from standard + input and overwrites an existing database. Before you use the "-o" switch, I consider yuo to make a backup! @@ -229,8 +244,9 @@ Topics field for the topic. Instead the topic will be stored right in the note. If the first line of your note contains some text bordered by slashes - (or whatever you prefer, set "TopicSeparator" in your config! default is slash), - then note will consider it as the topic of this certain note. For examle: + (or whatever you prefer, set "TopicSeparator" in your config! default + is slash), then note will consider it as the topic of this certain + note. For examle: /TodoList/ If you are using topics, no data after the topic is allowed, if there is any text, note will consider it as a subtopic! Therefore, don't for- @@ -239,17 +255,24 @@ Topics If you are in interactive mode, you can "cd" to a different note simply by typing it's name at the command-prompt, or you can use the well-known syntax "cd topic". - The list-command will only show you notes under this topic. If you create - a new note, it will automagically inserted under the current topic (note - will prepend the string "/topicname/" to the text of your note). + The list-command will only show you notes under this topic. If you + create a new note, it will automagically inserted under the current + topic (note will prepend the string "/topicname/" to the text of your + note). + You can use some enhanced capabilities of the cd command. If you turn on + the "ShortCd" parameter in your configuration, then you can cd to a + note number (and thus - to it's topic) i.e. "cd 13" jumps to the topic + of the note number 13. You can always go one level up using the "cd .." + command and you can go to the top-level topic using "cd /". You can create at any time from any point a new topic. Just create a new - note and type the name of the new topic bordered by slashes (or TopicSeparator) - at the first line of this note. After saving, there will be available a - new topic with one note in it. + note and type the name of the new topic bordered by slashes (or + TopicSeparator) at the first line of this note. After saving, there + will be available a new topic with one note in it. - You can create as many subtopics as you like, the format is similar to a - filesystem-path. An example, say, you want to create such a structure: + You can create as many subtopics as you like, the format is similar to + a filesystem-path. An example, say, you want to create such a + structure: (root - top level) | @@ -281,14 +304,15 @@ Topics If a note does not contain the "magic" /topic/ construction on the first - line, it will be listed under the "root" of note, that is the point you are - at the startup of note. + line, it will be listed under the "root" of note, that is the point + you are at the startup of note. - You can subsequently move a note without a topic to a certain topic. Simply - edit it and insert at the first line the above mentioned construction. + You can subsequently move a note without a topic to a certain topic. + Simply edit it and insert at the first line the above mentioned + construction. - Note: Please don't forget the prepending and appending a slash of a topic. - You will get strange results without it! + Note: Please don't forget the prepending and appending a slash of a + topic. You will get strange results without it! @@ -296,22 +320,22 @@ Topics Formatting of notes =================== - Another very nice feature is the possibility to format the note-text (as much as - shell allows it). First, you can use the note-internal "magic-strings" for color- - izing. Those strings looks much like HTML: + Another very nice feature is the possibility to format the note-text + (as much as shell allows it). First, you can use the note-internal + "magic-strings" for colorizing. Those strings looks much like HTML: "here is a green line of text no more green." - As you see, the beginning of another color starts with a tag(kinda) of the color - and ens with an end tag . + As you see, the beginning of another color starts with a tag(kinda) of + the color and ens with an end tag . The following colors are available: black, red, green, yellow, blue, magenta, cyan and white. - Beside colorizing text, you can also create bold or underlined text! If you decide - to use this (additional) feature, you need to set the Config-Option "FormatNotes" - to 1 which turns it on. - Usage is very straightforward, if a word (a word is defined as some text with at least - one space surrounded) is between a magic mark-character. Here are the available - things, you can do: + Beside colorizing text, you can also create bold or underlined text! If + you decide to use this (additional) feature, you need to set the + Config-Option "FormatNotes" to 1 which turns it on. + Usage is very straightforward, if a word (a word is defined as some + text with at least one space surrounded) is between a magic mark- + character. Here are the available things, you can do: bold: **word** underlined: __word__ @@ -322,30 +346,54 @@ Formatting of notes +Cache +===== + + If you have many notes stored in your database then you might + find the cache feature useful. Chaching is currently supported + by the binary and the mysql backend. Set the configuration + parameter "Cache" to "1" or "yes" to turn caching on. + Note will then use an internal copy of your notes-database for + the list/search/tree commands instead of every time accessing + the physically database. If something changed (i.e. you edited + a note or added a new one) then the database will be used and + the cache will be updated. + A "%" character at the top left of the screen indicates that + the cache is in use. + I consider you not to use the cache feature if you are using + multiple instances of note using the same database. + The cache is turned off by default. + + + + + + Scripting ========= - Since version 1.0.3 there are some additions which allows you to use note in - scripts, without user-interaction. You might run a special script as cronjob, - which adds a note under a certain topic every week. Or the like. + Since version 1.0.3 there are some additions which allows you to use + note in scripts, without user-interaction. You might run a special + script as cronjob, which adds a note under a certain topic every week. + Or the like. Here are the possibilies you have: You can add a new note through a pipe, another commands output becomes note's input: $ cat /var/spool/news/daily | note - - This command adds the content of a file "daily" as a new note. Note the dash. - it stands for "Standard Input". Note will be completely silent and it will not - ask for something. + This command adds the content of a file "daily" as a new note. Note + the dash - it stands for "Standard Input". Note will be completely + silent and it will not ask for something. - Suppose you are using encryption. You might wonder, how note will get your - passphrase? The solution: You need to set up an environment variable which - contains the password: + Suppose you are using encryption. You might wonder, how note will get + your passphrase? The solution: You need to set up an environment + variable which contains the password: $ export NOTE_PASSWD=secret If the variable is present, note will not ask you for a passphrase! - Another thingy you might find useful is the -r (--raw) command-line flag. This - turns note into raw mode , which means it will only print the + Another thingy you might find useful is the -r (--raw) command-line + flag. This turns note into raw mode , which means it will only print the data without any formatting. Raw mode is available for list and display, since it makes no sense, interactive mode doe not support raw mode. @@ -356,8 +404,8 @@ Scripting Format of the notedb (binary backend) ===================================== - The database where the notes are stored is a binary fixed record length file - of the following format: + The database where the notes are stored is a binary fixed record length + file of the following format: It consists of three fixed length fields per entry. The fields have the following types: o Number: Integer (1 byte) @@ -440,6 +488,20 @@ Security After turning on encryption, note will ask you for a passphrase everytime it runs! It will *not* store this passphrase! So, don't forget it! Be careful! + + If you are using the mysql backend and if your mysql database + requires a password then you can store an encrypted version of + your mysql password instead of the cleartext one. + You need to turn on the config-parameter "encrypt_passwd" (set it + to 1). Then you need to create an encrypted string from your + mysql-password using note's commandline option --encrypt . + Note will ask you for a passphrase which will be used to encrypt + the mysql-password. This passphrase must be exactly the same as + you use for mysql itself. That means you need to use encryption. + The string you get from this command must be saved in your config + file as attribute to "DbPasswd". Later on note will decrypt that + string using the supplied note-passphrase (that's why it must be + the same used for encrypt) and pass the result to the mysql server. Once note have encrypted some data using this passphrase, you cannot simply switch to another passphrase, because all data @@ -465,30 +527,48 @@ Security and checks if the decrypted timestamp field matches the following expression: "^\d+\.\d+". Translated from perl to human: the timestamp must begin with minimum one digit (possibly more), - followed by one dot, followed by minimum one digit (possibly more). + followed by one dot, followed by minimum one digit (possibly + more). Chances are bad, that a wrong passphrase will cause a timestamp matching the rule above. If you have other experiences, please - drop me a mail! + drop me a mail! + + For the paranoid: do not use the cache-feature, 'cause note stores a + copy of your note database in RAM if cache support is turned on. + This means an attacker could access your (unencrypted!) notes. Comments ======== You can send any comments to Thomas Linden . - If you find a bug or if you have a suggestion for improvement of the script - feel free to send me a patch ;-) + If you find a bug or if you have a suggestion for improvement of the + script feel free to send me a patch ;-) License ======= - This script comes with absolutely NO WARRANTY. It is distributed under the - terms of the GNU General Public License. Use it at your own risk :-) + This script comes with absolutely NO WARRANTY. It is distributed under + the terms of the GNU General Public License. Use it at your own risk :-) You can read the complete GPL at: http://www.gnu.org/copyleft/gpl.html + + +Recources +========= + + The command-line options and all commands of the interactive mode are + described in the supplied note(1) manpage. + You may also refer to the note website http://www.0x49.org. + + + + + Author and Copyright ==================== @@ -506,12 +586,13 @@ Contributors / Credits Jens Heunemann - sub tree. Peter Palmreuther - various additions. - And many other people who sended bug reports, feature requests. If you feel that - I forgot your name in this list, then please send me an email and I'll add you. + And many other people who sent bug reports, feature requests. If you + feel that I forgot your name in this list, then please send me an email + and I'll add you. Last changed ============ - 11/07/2000 + 08/08/2000 diff --git a/TODO b/TODO index 03ee4a3..e782377 100644 --- a/TODO +++ b/TODO @@ -1 +1,3 @@ -- dump to palm compatible format (!) any help out there? +o mysql.pm und dbm.pm generate_search testen! +o Website anpassen +o Announcement on freshmeat. diff --git a/bin/CVS/Entries b/bin/CVS/Entries new file mode 100644 index 0000000..bee8630 --- /dev/null +++ b/bin/CVS/Entries @@ -0,0 +1,2 @@ +/note/1.3/Fri Jul 21 06:41:25 2000// +D diff --git a/bin/CVS/Repository b/bin/CVS/Repository new file mode 100644 index 0000000..b54a10e --- /dev/null +++ b/bin/CVS/Repository @@ -0,0 +1 @@ +NOTE/bin diff --git a/bin/CVS/Root b/bin/CVS/Root new file mode 100644 index 0000000..9c415c0 --- /dev/null +++ b/bin/CVS/Root @@ -0,0 +1 @@ +zarahg@cvs.htnews.sourceforge.net:/cvsroot/htnews diff --git a/bin/_note b/bin/_note new file mode 100755 index 0000000..4ea2ca6 --- /dev/null +++ b/bin/_note @@ -0,0 +1,1681 @@ +#!/usr/bin/perl +# $Id: note,v 1.2 2000/07/09 22:10:03 zarahg Exp $ +# +# +# note - console notes management with database and encryption support. +# Copyright (C) 1999-2000 Thomas Linden (see README for details!) +# +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# - Thomas Linden +# +# latest version on: +# http://www.daemon.de/software.html +# ftp://www.0x49.org/pub/scip/note/ +# + +use strict; +#use Data::Dumper; +use Getopt::Long; + +# +# prototypes +# +sub usage; # print usage message for us thumb userz :-) +sub find_editor; # returns an external editor for use +sub output; # used by &list and &display +sub C; # print colourized +sub num_bereich; # returns array from "1-4" (1,2,3,4) +sub getdate; # return pretty formatted day +sub new; # crate new note +sub edit; # edit a note +sub del; # delete a note +sub display; # display one or more notes +sub list; # note-listing +sub help; # interactive help screen +sub import; # import from notedb-dump +sub display_tree; # show nice tree-view +sub tree; # build the tree +sub print_tree; # print the tree, contributed by Jens Heunemann . THX! + + +# +# globals +# +my ( + # + # commandline options + # + $opt_, $opt_i, $opt_r, $opt_e, $opt_d, + $opt_s, $opt_t, $opt_T, $opt_l, $opt_L, $opt_c, + $opt_D, $opt_I, $opt_o, $opt_h, $opt_n, $opt_v, + + # + # set from commandline (or interactive) + # + $number, $searchstring, $dump_file, $ImportType, $NewType, $Raw, + + # + # options from config file .noterc + # + $maxlen, $timelen, $TOPIC, $NOTEDB, $MAX_TIME, $PreferredEditor, + $ALWAYS_INT, $KEEP_TIMESTAMP, $COLOR, $ALWAYS_EDIT, $HOME, $FormatText, + $BORDER_COLOR, $NOTE_COLOR, $NUM_COLOR, $TOPIC_COLOR, $MAX_NOTE, + $USE_CRYPT, $CRYPT_METHOD, $TopicSep, $DEFAULT_LIST, $TIME_COLOR, + + # + # db specifics from .noterc + # + $db, $dbname, $dbhost, $dbuser, $dbpasswd, + $table, $fnum, $fnote, $fdate, $date, $dbdriver, $libpath, + + # + # processed colors + # + $BORDERC, $_BORDERC, $NOTEC, $NUMC, $_NUMC, $_NOTEC, $TIMEC, + $_TIMEC, $TOPICC, $_TOPICC, + + # + # config presets + # + $DEFAULTDBNAME, $USER, $PATH, $CONF, + + # + # internals + # + $TYPE, $mode, $NoteKey, $TempDir, + $version, $number, $CurTopic, $CurDepth, $WantTopic, + $sizeof, %TP, $TreeType, $ListType, $SetTitle, + @ArgTopics, $key, $typedef, @NumBlock, $has_nothing, + ); + + +# +# DEFAULTS, allows one to use note without a config +# don't change them, instead use the config file! +# +$maxlen = 30; +$timelen = 22; +$date = &getdate; +$USER = getlogin || getpwuid($<); +chomp $USER; +$HOME = $ENV{'HOME'}; +$CONF = $HOME . "/.noterc"; +$dbdriver = "binary"; +$libpath = "/usr/local/lib"; +$NOTEDB = $HOME . "/.notedb"; +$MAX_NOTE = 4096; +$MAX_TIME = 64; +$COLOR = "YES"; +$BORDER_COLOR = "BLACK"; +$NUM_COLOR = "blue"; +$NOTE_COLOR = "green"; +$TIME_COLOR = "black"; +$TOPIC_COLOR = "BLACK"; +$TOPIC = 1; +$TopicSep = '/'; +$version = "1.0.8"; +if($TOPIC) +{ + $CurDepth = 1; # the current depth inside the topic "directory" structure... +} +$USE_CRYPT = "NO"; +$TempDir = "/tmp"; + + + +# +# process command line args +# +if($ARGV[0] eq "") +{ + $mode = "new"; +} +elsif($#ARGV == 0 && $ARGV[0] eq "-") { + $mode = "new"; + $NewType = 1; # read from STDIN until EOF + shift; + undef $has_nothing; +} +else +{ + Getopt::Long::Configure( qw(no_ignore_case)); + GetOptions ( + "interactive|i!" => \$opt_i, # no arg + "config|c=s" => \$opt_c, # string, required + "raw|r!" => \$opt_r, # no arg + "edit|e=i" => \$opt_e, # integer, required + "delete|d=s" => \$opt_d, # integer, required + "search|s=s" => \$opt_s, # string, required + "tree|topic|t!" => \$opt_t, # no arg + "longtopic|T!" => \$opt_T, # no arg + "list|l:s" => \$opt_l, # string, optional + "longlist|L:s" => \$opt_L, # string, optional + "dump||Dump|D:s" => \$opt_D, # string, optional + "import|Import|I:s" => \$opt_I, # string, optional + "overwrite|o!" => \$opt_o, # no arg + "help|h|?!" => \$opt_h, # no arg + "version|v!" => \$opt_v # no arg + ); + $opt_n = shift; # after that @ARGV contains eventually + # a note-number + # $opt_ is a single dash, in case of existence! + # + # determine mode + # + if($opt_i) { + $mode = "interactive"; + } + elsif(defined $opt_l || defined $opt_L) { + $mode = "list"; + if(defined $opt_l) { + @ArgTopics = split /$TopicSep/, $opt_l; + } + else { + $ListType = "LONG"; + @ArgTopics = split /$TopicSep/, $opt_L; + } + $CurDepth += $#ArgTopics + 1 if($opt_l || $opt_L); + $CurTopic = $ArgTopics[$#ArgTopics]; # use the last element everytime... + } + elsif($opt_t || $opt_T) { + $mode = "tree"; + $TreeType = "LONG" if($opt_T); + } + elsif(defined $opt_s) { + $mode = "search"; + $searchstring = $opt_s; + } + elsif($opt_e) { + $mode = "edit"; + $number = $opt_e; + } + elsif($opt_d) { + $mode = "delete"; + $number = $opt_d; + } + elsif(defined $opt_D) { + $mode = "dump"; + if(!$opt_) { + if($opt_D ne "") { + $dump_file = $opt_D; + } + else { + $dump_file = "note.dump.$$"; + print "no dumpfile specified, using $dump_file.\n"; + } + } + else { + $dump_file = "-"; # use STDIN + } + } + elsif(defined $opt_I) { + $mode = "import"; + if(!$opt_) { + if($opt_I ne "") { + $dump_file = $opt_I; + } + else { + print "Import-error! No dump_file specified!\n"; + exit(1); + } + } + else { + $dump_file = "-"; + } + } + elsif($opt_v) { + print "This is note $version by Thomas Linden .\n"; + exit(0); + } + elsif($opt_h) { + &usage; + } + else { + if($opt_c && $mode eq "" && !$opt_n) { + $mode = "new"; + } + elsif($opt_c && $mode eq "") { + $mode = ""; # huh?! + } + else { + $has_nothing = 1; + } + } + ### determine generic options + if($opt_n =~ /^[\d+\-?\,*]+$/) { + # first arg is a digit! + if($mode eq "") { + $number = $opt_n; + $mode = "display"; + undef $has_nothing; + } + else { + print "mode <$mode> does not take a numerical argument!\n"; + exit(1); + } + } + elsif($opt_n ne "") { + print "Unknown option: $opt_n\n"; + &usage; + } + if($opt_r) { + $Raw = 1; + } + if($opt_o) { + $ImportType = "overwrite"; + if(!$opt_I) { + print "--overwrite is only suitable for use with --import!\n"; + exit(1); + } + } + ##### +} +if($has_nothing && $mode eq "") +{ + &usage; +} + + +# read the configfile. +$CONF = $opt_c if($opt_c); # if given by commandline, use this. +if(-e $CONF) +{ + &getconfig($CONF); +} +elsif($opt_c) { + # only wrong, if specified by commandline! else use default values! + print STDERR "Could not open \"$CONF\": file does not exist or permission denied!\n"; + exit(1); +} + + +# Always interactive? +if($ALWAYS_INT eq "YES" && $mode ne "dump" && $mode ne "import") +{ + $mode = "interactive"; +} + +# OK ... Long-Listing shall be default ... You wanted it!!! +if($DEFAULT_LIST eq "LONG") +{ + # takes only precedence in commandline mode + $ListType="LONG"; +} + + + +# *if* loading of the config was successful, try to load the +# configured database backend. Currently supported: mysql and binary. +push @INC, $libpath; +if($dbdriver eq "binary") { + eval { + require NOTEDB::binary; + $db = new NOTEDB($dbdriver, $NOTEDB, $MAX_NOTE, $MAX_TIME, $dbdriver); + } +} +else { + eval { + require "NOTEDB/$dbdriver.pm"; + $db = new NOTEDB($dbdriver, $dbname, $dbhost, $dbuser, $dbpasswd, $table, $fnum, $fnote, $fdate); + }; +} +if($@) { + print "Unsupported database backend: NOTEDB::$dbdriver!\n"; + print "The following error has occured:\n------------------------\n" . $@ . "\n------------------------\n"; + exit 1; +} + +# add the backend version to the note version: +$version .= " " . $db->version(); + +# calculate some constants... +$BORDERC = "<$BORDER_COLOR>"; +$_BORDERC = ""; +$NUMC = "<$NUM_COLOR>"; +$_NUMC = ""; +$NOTEC = "<$NOTE_COLOR>"; +$_NOTEC = ""; +$TIMEC = "<$TIME_COLOR>"; +$_TIMEC = ""; +$TOPICC = "<$TOPIC_COLOR>"; +$_TOPICC = ""; + +$NoteKey = $TopicSep . "notes" . $TopicSep; + +# default permissions on new files (tmp) +umask 077; + +# check if the user wants to use encryption: +if($USE_CRYPT eq "YES" && $NOTEDB::crypt_supported == 1) { + if($CRYPT_METHOD eq "") { + $CRYPT_METHOD = "Crypt::IDEA"; + } + if(!exists $ENV{'NOTE_PASSWD'}) { + print "password: "; + eval { + local($|) = 1; + local(*TTY); + open(TTY,"/dev/tty"); + system ("stty -echo ); + print STDERR "\r\n"; + system ("stty echo ; + } + } + else { + $key = $ENV{'NOTE_PASSWD'}; + } + chomp $key; + $db->use_crypt($key,$CRYPT_METHOD); + undef $key; + # verify correctness of passwd + my ($cnote, $cdate) = $db->get_single(1); + if($cdate ne "") { + if($cdate !~ /^\d+\.\d+?/) { + print "access denied.\n"; # decrypted $date is not a number! + exit(1); + } + } #else empty! +} +else { + $db->no_crypt; + # does: NOTEDB::crypt_supported = 0; + my ($cnote, $cdate) = $db->get_single(1); + if($cdate ne "") { + if($cdate !~ /^\d+\.\d+?/) { + print "$NOTEDB seems to be encrypted!\n"; + exit(1); + } + } +} + +# main loop: ############### +if($mode eq "display") +{ + &display; +} +elsif($mode eq "search") +{ + &search; +} +elsif($mode eq "list") +{ + &list; +} +elsif($mode eq "tree") +{ + &display_tree; +} +elsif($mode eq "new") +{ + &new; +} +elsif($mode eq "delete") +{ + del; +} +elsif($mode eq "edit") +{ + &edit; +} +elsif($mode eq "dump") +{ + &dump; +} +elsif($mode eq "import") +{ + &import; +} +elsif($mode eq "interactive") +{ + &interactive; +} +else +{ + #undefined :-( +} + + +exit(0); +################## EOP ################ + + + +############################### DISPLAY ################################## +sub display +{ + my($N,$match,$note,$date,$num); + # display a certain note + print "\n"; + &num_bereich; # get @NumBlock from $numer + foreach $N (@NumBlock) + { + ($note, $date) = $db->get_single($N); + if($note) + { + if($Raw) { + print "$N\n$date\n$note\n\n"; + } + else { + output($N, $note, $date, "SINGLE"); + print "\n"; + } + $match = 1; + } + } + if(!$match) + { + print "no note with that number found!\n"; + } +} +############################### SEARCH ################################## +sub search +{ + my($n,$match,$note,$date,$num,%res); + if($searchstring eq "") + { + print "No searchstring specified!\n"; + } + else { + print "searching the database $dbname for \"$searchstring\"...\n\n"; + + %res = $db->get_search($searchstring); + + foreach $num (sort { $a <=> $b } keys %res) + { + output($num, $res{$num}->{'note'}, $res{$num}->{'date'}); + $match = 1; + } + if(!$match) + { + print "no matching note found!\n"; + } + print "\n"; + } +} + + +############################### LIST ################################## +sub list +{ + my(@topic,@RealTopic, $i,$t,$n,$num,@CurItem,$top,$in,%res); + if($mode ne "interactive" && !$Raw) + { + print "\nList of all existing notes:\n\n"; + } + else { + print "\n"; + } + + # list all available notes (number and firstline) + %res = $db->get_all(); + + if($TOPIC) + { + undef %TP; + } + + foreach $num (sort { $a <=> $b } keys %res) + { + $n = $res{$num}->{'note'}; + $t = $res{$num}->{'date'}; + if($TOPIC) + { + # this allows us to have multiple topics (subtopics!) + my ($firstline,$dummy) = split /\n/, $n, 2; + if($firstline =~ /^($TopicSep)/) + { + @topic = split(/$TopicSep/,$firstline); + } + else + { + @topic = (); + } + # looks like: "\topic\" + # collect a list of topics under the current topic + if($topic[$CurDepth-1] eq $CurTopic && $topic[$CurDepth] ne "") + { + if(exists $TP{$topic[$CurDepth]}) + { + $TP{$topic[$CurDepth]}++; + } + else + { + # only if the next item *is* a topic! + $TP{$topic[$CurDepth]} = 1 if(($CurDepth) <= $#topic); + } + } + elsif($topic[$CurDepth-1] eq $CurTopic || ($topic[$CurDepth] eq "" && $CurDepth ==1)) + { + # cut the topic off the note-text + if($n =~ /^($TopicSep)/) + { + $CurItem[$i]->{'note'} = $dummy; + } + else + { + $CurItem[$i]->{'note'} = $n; + } + # save for later output() call + $CurItem[$i]->{'num'} = $num; + $CurItem[$i]->{'time'} = $t; + $i++; + # use this note for building the $PATH! + if($RealTopic[0] eq "") + { + @RealTopic = @topic; + } + } + } + else + { + output($num, $n, $t); + } + } + if($TOPIC) + { + if($CurTopic ne "") + { + undef $PATH; + foreach (@RealTopic) + { + $PATH .= $_ . $TopicSep; + last if($_ eq $CurTopic); + } + } + else + { + $PATH = $TopicSep; + } + + # we are at top level, print a list of topics... + foreach $top (sort(keys %TP)) + { + output("-", " => ". $top . "$TopicSep ($TP{$top} notes)", + " Sub Topic "); + } + #print Dumper(@CurItem); + for($in=0;$in<$i;$in++) + { + output( $CurItem[$in]->{'num'}, + $CurItem[$in]->{'note'}, + $CurItem[$in]->{'time'} ); + } + } + + print "\n"; +} + +############################### NEW ################################## +sub new +{ + my($TEMP,$editor, $date, $note, $WARN, $c, $line, $num, @topic); + $date = &getdate; + if($ALWAYS_EDIT eq "YES") + { + $TEMP = &gettemp; + # let the user edit it... + $editor = &find_editor; + if($editor) + { + system "touch", $TEMP and die $!; + system "chattr", "+s", $TEMP; # ignore errors, since only on ext2 supported! + system $editor, $TEMP; + } + else + { + print "Could not find an editor to use!\n"; + exit(0); + } + # read it in ($note) + $note = ""; + open E, "<$TEMP" or $WARN = 1; + if($WARN) + { + print "...edit process interupted! No note has been saved.\n"; + undef $WARN; + return; + } + $c = 0; + while() + { + $note = $note . $_; + } + chomp $note; + close E; + # privacy! + unlink $TEMP; + } + else + { + $note = ""; + $line = ""; + # create a new note + if($NewType) + { + # be silent! read from STDIN until EOF. + while () { $note .= $_; } + } + else + { + print "enter the text of the note, end with .\n"; + do + { + $line = ; + $note = $note . $line; + } until $line eq ".\n"; + # remove the . ! + chop $note; + chop $note; + } + } + + # since we have not number, look for the next available: + $number = $db->get_nextnum(); + if($TOPIC && $CurTopic ne "") + { + @topic = split(/$TopicSep/,$note); + if($topic[1] eq "") + { + $note = $PATH . "\n$note"; + } + } + + + $db->set_new($number,$note,$date); + + # everything ok until here! + print "note stored. it has been assigned the number $number.\n\n"; +} + + +############################### DELETE ################################## +sub del +{ + my($i,@count, $setnum, $pos, $ERR); + # delete a note + &num_bereich; # get @NumBlock from $number + foreach $_ (@NumBlock) + { + $ERR = $db->set_del($_); + if($ERR) + { + print "no note with number $_ found!\n"; + } + else + { + print "note number $_ has been deleted.\n"; + } + } + # recount the notenumbers: + $db->set_recountnums(); + + @NumBlock = (); +} + +############################### EDIT ################################## +sub edit +{ + my($keeptime, $date, $editor, $TEMP, $note, $t, $num, $match); + # edit a note + $date = &getdate; + ($note, $keeptime) = $db->get_single($number); + if($keeptime eq "") + { + print "no note with that number found!\n\n"; + exit(0) if($mode ne "interactive"); + } + $TEMP = &gettemp; + open NOTE,">$TEMP" or die "Could not open $TEMP\n"; + select NOTE; + + system "chattr", "+s", $TEMP; # ignore errors, like in new() + + print $note; + close NOTE; + select STDOUT; + $editor = &find_editor; + if($editor) + { + system $editor, $TEMP; + } + else + { + print "Could not find an editor to use!\n"; + exit(0); + } + $note = ""; + open NOTE,"<$TEMP" or die "Could not open $TEMP\n"; + + while() + { + $note = $note . $_; + } + chomp $note; + close NOTE; + + unlink $TEMP || die $!; + + if($KEEP_TIMESTAMP eq "YES") + { + $t = $keeptime; + } + else + { + $t = $date; + } + + # we got it, now save to db + $db->set_edit($number, $note, $t); + + print "note number $number has been changed.\n"; +} + + +sub dump +{ + my(%res, $num, $DUMP); + # $dump_file + if($dump_file eq "-") { + $DUMP = *STDOUT; + } + else { + open (DUMPFILE, ">$dump_file") or die "could not open $dump_file\n"; + $DUMP = *DUMPFILE; + } + select $DUMP; + %res = $db->get_all(); + foreach $num (sort { $a <=> $b } keys %res) + { + print STDOUT "dumping note number $num to $dump_file\n" if($dump_file ne "-"); + print "Number: $num\n" + ."Timestamp: $res{$num}->{'date'}\n" + ."$res{$num}->{'note'}\n"; + } + print "\n"; + close(DUMP); + select STDOUT; +} + +sub import +{ + my($num, $start, $complete, $dummi, $note, $date, $time, $number, $stdin, $DUMP); + # open $dump_file and import it into the notedb + $stdin = 1 if($dump_file eq "-"); + if($stdin) { + $DUMP = *STDIN; + } + else { + open (DUMPFILE, "<$dump_file") or die "could not open $dump_file\n"; + $DUMP = *DUMPFILE; + } + $db->set_del_all() if($ImportType ne ""); + $complete=0; + $start = 0; + while(<$DUMP>) + { + chomp $_; + if($_ =~ /^Number:\s\d+/) + { + if($start == 0) + { + # we have no previous record + ($dummi,$number) = split(/\s/,$_); + $start = 1; + } + else + { + # we got a complete record, save it! + $number = $db->get_nextnum(); + $db->set_new($number,$note, $date); + print "note number $number from $dump_file inserted into notedb.\n" if(!$stdin); + $complete = 0; + $note = ""; + $date = ""; + ($dummi,$number) = split(/\s/,$_); + } + } + elsif($_ =~ /^Timestamp:\s\d+/ && $complete == 0) + { + ($dummi,$date,$time) = split(/\s/,$_); + $date = "$date $time"; + $complete = 1; + } + else + { + $note .= $_ . "\n"; + } + } + if($note ne "" && $date ne "") + { + # the last record, if existent + $number = $db->get_nextnum(); + $db->set_new($number,$note, $date); + print "note number $number from $dump_file inserted into notedb.\n" if(!$stdin); + } +} + + + +sub interactive +{ + my($B, $BB, $menu, $char, @LastTopic, $Channel); + $Channel = $|; + # create menu: + $B = ""; + $BB = ""; + $menu = "[" . $B . "L" . $BB . "-List "; + if($TOPIC) { + $menu .= $B . "T" . $BB . "-Topics "; + } + $menu .= $B . "N" . $BB . "-New " + . $B . "D" . $BB . "-Delete " + . $B . "S" . $BB . "-Search " + . $B . "E" . $BB . "-Edit " + . $B . "?" . $BB . "-Help " + . $B . "Q" . $BB . "-Quit] "; # $CurTopic will be empty if $TOPIC is off! + # per default let's list all the stuff: + # Initially do a list command! + $ListType = ($DEFAULT_LIST eq "LONG") ? "LONG" : ""; + &list; + + for(;;) + { + $ListType = ($DEFAULT_LIST eq "LONG") ? "LONG" : ""; + undef $SetTitle; + if($CurDepth > 2) + { + print C $menu . $TOPICC . "../" . $CurTopic . $_TOPICC . ">"; + } + else + { + print C $menu . $TOPICC . $CurTopic . $_TOPICC . ">"; + } + + # endless until user press "Q" or "q"! + $char = ; + #$char = $term->readline(''); + chomp $char; + if($char =~ /^\d+\s*[\di*?,*?\-*?]*$/) + { + $ListType = ""; #overrun + # display notes + $number = $char; + &display; + } + elsif($char =~ /^n$/i) + { + # create a new one + &new; + } + elsif($char =~ /^$/) + { + &list; + } + elsif($char =~ /^l$/) + { + $ListType = ""; + &list; + } + elsif($char =~ /^L$/) + { + $ListType = "LONG"; + &list; + undef $SetTitle; + } + elsif($char =~ /^h$/i || $char =~ /^\?/) + { + # zu dumm der Mensch ;-) + &help; + } + elsif($char =~ /^d\s+([\d*?,*?\-*?]*)$/i) + { + # delete one! + $number = $1; + &del; + } + elsif($char =~ /^d$/i) + { + # we have to ask her: + print "enter number(s) of note(s) you want to delete: "; + $char = ; + chomp $char; + $number = $char; + &del; + } + elsif($char =~ /^e\s+(\d+\-*\,*\d*)/i) + { + # edit one! + $number = $1; + &edit; + } + elsif($char =~ /^e$/i) + { + # we have to ask her: + print "enter number of the note you want to edit: "; + $char = ; + chomp $char; + $number = $char; + &edit; + } + elsif($char =~ /^s\s+/i) + { + # she want's to search + $searchstring = $'; + chomp $searchstring; + &search; + } + elsif($char =~ /^s$/i) + { + # we have to ask her: + print "enter the string you want to search for: "; + $char = ; + chomp $char; + $char =~ s/^\n//; + $searchstring = $char; + &search; + } + elsif($char =~ /^q$/i) + { + # schade!!! + $| = $Channel; + print "\n\ngood bye!\n"; + exit(0); + } + elsif($char =~ /^t$/) + { + $TreeType = ""; + &display_tree; + } + elsif($char =~ /^T$/) + { + $TreeType = "LONG"; + &display_tree; + $TreeType = ""; + } + elsif($char =~ /^\.\.$/ || $char =~ /^cd\s*\.\.$/) + { + $CurDepth-- if ($CurDepth > 1); + $CurTopic = $LastTopic[$CurDepth]; + &list; + } + elsif($char =~ /^l\s+(\w+)$/) + { + # list + $WantTopic = $1; + if(exists $TP{$WantTopic}) + { + my %SaveTP = %TP; + $LastTopic[$CurDepth] = $CurTopic; + $CurTopic = $1; + $CurDepth++; + + &list; + + $CurTopic = $LastTopic[$CurDepth]; + $CurDepth--; + %TP = %SaveTP; + } + else + { + print "\nunknown command!\n"; + } + } + else + { + # unknown + my $unchar = $char; + $unchar =~ s/^cd //; # you may use cd now! + if(exists $TP{$char} || exists $TP{$unchar}) + { + $char = $unchar if(exists $TP{$unchar}); + $LastTopic[$CurDepth] = $CurTopic; + $CurTopic = $char; + $CurDepth++; + &list; + } + else + { + print "\nunknown command!\n"; + } + undef $unchar; + } + } +} + + + +sub usage +{ +print qq~This is the program note $version by Thomas Linden (c) 1999-2000. +It comes with absolutely NO WARRANTY. It is distributed under the +terms of the GNU General Public License. Use it at your own risk :-) +Usage: note [ options ] [ number [,number...]] +Options: +-h --help displays this help screen +-v --version displays the version number +-c --config use another config file than the default \~/.noterc +-l --list [] lists all existing notes If no topic were specified, + it will display a list of all existing topics. +-L --longlist [] the same as -l but prints also the timestamp +-t --topic prints a list of all topics as a tree. +-T --longtopc prints the topic-tree with the notes under each topic +-s --search searches for trough the notes database +-e --edit edit note with +-d --delete delete note with +-D --Dump [ | -] dumps the notes to the textfile . if is simply + a "-" it will printed out to standard output. +-I --Import | - imports a previously dumped textfile into the + note-database. Data will be appended by default. + You can also specify a dash "note -I -" instead of a , + which causes note, silently to read in a dump from STDIN. +-o --overwrite only suitable for use with --Import. Overwrites an + existing notedb. +-r --raw raw mode, output will not be formatted. Works not in interactive + mode, only on cmd-line for list and display. +-i --interactive interactive mode +- if you run note only with one dash: "note -", then it will + read in a new note from STDIN until EOF, this makes it + possible to pipe text into a new note. + + o if you specify only a number (i.e. "note 4"), then the note with that + number will be displayed. + o you can specify more then one number for delete and display, for example: + "note -d 3,4" deletes #3 and #4. "note 5-7" displays #5, #6 and #7. + o if you run note without any parameter and if "AlwaysInteractive" in the config + set off, then note will create a new note and prompt you for new text. + o If it finds \~/.noterc, it will process it. Refer to the manpage for more + informations about the configuration. + o In interactive mode you can get help at any time by typing "?" or "h" at + the prompt. + o If encryption support is turned on, note will ask you for a passphrase every + time it runs. You can avoid this behavior by setting the environment-variable + \$NOTE_PASSWD. You will need this for example, if you call note from a script. +~; + #my ($package, $filename, $line) = caller; + #print "called from line $line\n"; + exit 1; +} + +sub find_editor { + return $PreferredEditor || $ENV{"VISUAL"} || $ENV{"EDITOR"} || "vim" || "vi" || "pico"; +} + +#/ + +sub format { + # make text bold/underlined/inverse using current $NOTEC + # s/\[([^]]*)\]/$param{$1}/g; + my($note) = @_; + if($FormatText) { + my $BN = uc($NOTEC); + my $_BN = uc($_NOTEC); + my $UN = $NOTEC; + $UN =~ s/<(.*)>/<$1_>/; + my $_UN = $UN; + $_UN =~ s/<(.*)>/<\/$1>/; + my $IN = $NOTEC; my $_IN = $_NOTEC; + $IN =~ s/<(.*)>/<$1I>/; + $_IN =~ s/<(.*)>/<$1I>/; + #$note =~ s/ (\*)(.+)(\*) / $BN$2$_BN /g; + #$note =~ s/ (_)(.+)(_) / $UN$2$_UN /g; + #$note =~ s/ (\/)(.+)(\/) / $IN$2$_IN /g; + $note =~ s/\*\*([^\*^\*]*)\*\*/$BN$1$_BN/g; + $note =~ s/__([^_^_]*)__/$UN$1$_UN/g; + $note =~ s/{{([^}^}]*)}}/$IN$1$_IN/g; + } + $note =~ s/(<\/.*>)/$1$NOTEC/g; + $note; +} + +sub output +{ + my($SSS, $LINE, $num, $note, $time, $TYPE, $L, $LONGSPC, $R, $PathLen, $SP, $title, $CUTSPACE, + $len, $diff, $Space, $nlen, $txtlen); + ($num, $note, $time, $TYPE) = @_; + $txtlen = ($ListType eq "LONG") ? $maxlen : $timelen + $maxlen; + + $note = &format($note); + + $SSS = "-" x ($maxlen + 31); + + $nlen = length("$num"); + $LINE = "$BORDERC $SSS $_BORDERC\n"; + $L = $BORDERC . "[" . $_BORDERC; + $LONGSPC = " " x (26 - $nlen); + $R = $BORDERC . "]" . $_BORDERC; + $PathLen = length($PATH); # will be ZERO, if not in TOPIC mode! + if($TYPE ne "SINGLE") + { + if(!$SetTitle) + { + $SP = ""; + # print only if it is the first line! + $SP = " " x ($maxlen - 2 - $PathLen); + if(!$Raw) { + # no title in raw-mode! + print C $LINE; + + print C "$L $NUMC#$_NUMC "; + if($ListType eq "LONG") + { + print C " $TIMEC" . "creation date$_TIMEC "; + } + else + { + print $LONGSPC; + } + if($TOPIC) + { + print C $TOPICC . "$PATH $_TOPICC$SP$R\n"; + } + else + { + print C $NOTEC . "note$_NOTEC$SP$R\n"; + } + + print C $LINE; + } + $SetTitle = 1; + } + $title = ""; + $CUTSPACE = " " x $txtlen; + $note =~ s/\n/$CUTSPACE/g; + $len = length($note); + if($len < ($txtlen - 2 - $nlen)) + { + $diff = $txtlen - $len; + $Space = " " x $diff; + if(!$Raw) { + if($num eq "-") + { + $title = $BORDERC . $TOPICC . "\"" . $note . "\"" . $_TOPICC . $Space . "$_BORDERC"; + } + else + { + $title = $BORDERC . $NOTEC . "\"" . $note . "\"" . $_NOTEC . $Space . "$_BORDERC"; + } + } + else { + $title = $note; + } + } + else + { + $title = substr($note,0,($txtlen - 2 - $nlen)); + if(!$Raw) { + $title = $BORDERC . $NOTEC . "\"" . $title . "...\"$_NOTEC$_BORDERC"; + } + } + if($Raw) { + print "$num "; + print "$time " if($ListType eq "LONG"); + if($title =~ /^ => (.*)$TopicSep (.*)$/) { + $title = "$1$TopicSep $2"; # seems to be a topic! + } + print "$title\n"; + } + else { + # $title should now look as: "A sample note " + print C "$L $NUMC$num$_NUMC $R"; + if($ListType eq "LONG") + { + print C "$L$TIMEC" . $time . " $_TIMEC$R"; + } + print C "$L $NOTEC" . $title . "$_NOTEC $R\n"; + print C $LINE; + } + } + else + { + # we will not reach this in raw-mode, therefore no decision here! + chomp $note; + $Space = " " x (($maxlen + $timelen) - 16); + print C $LINE; + print C "$L $NUMC$num$_NUMC $R$L$TIMEC$time$_TIMEC $Space$R\n"; + print C $LINE; + print C $NOTEC . $note . $_NOTEC . "\n"; + print C $LINE; + } + +} + + + +sub C +{ + my(%Color, $default, $S, $Col, $NC, $T); + # \033[1m%30s\033[0m + %Color = ( 'black' => '0;30', + 'red' => '0;31', + 'green' => '0;32', + 'yellow' => '0;33', + 'blue' => '0;34', + 'magenta' => '0;35', + 'cyan' => '0;36', + 'white' => '0;37', + 'B' => '1;30', + 'BLACK' => '1;30', + 'RED' => '1;31', + 'GREEN' => '1;32', + 'YELLOW' => '1;33', + 'BLUE' => '1;34', + 'MAGENTA' => '1;35', + 'CYAN' => '1;36', + 'WHITE' => '1;37', + 'black_' => '4;30', + 'red_' => '4;31', + 'green_' => '4;32', + 'yellow_' => '4;33', + 'blue_' => '4;34', + 'magenta_' => '4;35', + 'cyan_' => '4;36', + 'white_' => '4;37', + 'blackI' => '7;30', + 'redI' => '7;31', + 'greenI' => '7;32', + 'yellowI' => '7;33', + 'blueI' => '7;34', + 'magentaI' => '7;35', + 'cyanI' => '7;36', + 'whiteI' => '7;37' + ); + $default = "\033[0m"; + $S = $_[0]; + foreach $Col (%Color) + { + if ($S =~ /<$Col>/g) + { + if($COLOR ne "NO") + { + $NC = "\033[" . $Color{$Col} . "m"; + $S =~ s/<$Col>/$NC/g; + $S =~ s/<\/$Col>/$default/g; + } + else + { + $S =~ s/<$Col>//g; + $S =~ s/<\/$Col>//g; + } + } + } + return $S; +} + + + +sub num_bereich +{ + my($m,@LR,@Sorted_LR,$i); + # $number is the one we want to delete! + # But does it contain kommas? + @NumBlock = (); #reset + $m = 0; + if($number =~ /\,/) + { + # accept -d 3,4,7 + @NumBlock = split(/\,/,$number); + } + elsif($number =~ /^\d+\-\d+$/) + { + # accept -d 3-9 + @LR = split(/\-/,$number); + @Sorted_LR = (); + + if($LR[0] > $LR[1]) + { + @Sorted_LR = ($LR[1], $LR[0]); + } + elsif($LR[0] == $LR[1]) + { + # 0 and 1 are the same + @Sorted_LR = ($LR[0], $LR[1]); + } + else + { + @Sorted_LR = ($LR[0], $LR[1]); + } + + for($i=$Sorted_LR[0]; $i<=$Sorted_LR[1]; $i++) + { + # from 3-6 create @NumBlock (3,4,5,6) + $NumBlock[$m] = $i; + $m++; + } + } + else + { + @NumBlock = ($number); + } + +} + +sub getdate +{ + my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); + $year += 1900; + $mon += 1; + $mon =~ s/^(\d)$/0$1/; + $hour =~ s/^(\d)$/0$1/; + $min =~ s/^(\d)$/0$1/; + $sec =~ s/^(\d)$/0$1/; + $mday =~ s/^(\d)$/0$1/; + return "$mday.$mon.$year $hour:$min:$sec"; +} + + +sub gettemp +{ + my($random, @range); + @range=('0'..'9','a'..'z','A'..'Z'); + srand(time||$$); + for (0..10) { + $random .= $range[rand(int($#range)+1)]; + } + my $tempfile = $TempDir . "/" . $USER . "." . $random; + if (-e $tempfile) { + # avoid race conditions! + unlink $tempfile; + } + return $tempfile; +} + + + +sub help +{ +my $B = ""; +my $BB = ""; +my($S, $L, $T, $Q, $H, $N, $D, $E); +$L = $B . "L" . $BB . $NOTEC; +$T = $B . "T" . $BB . $NOTEC; +$Q = $B . "Q" . $BB . $NOTEC; +$H = $B . "?" . $BB . $NOTEC; +$N = $B . "N" . $BB . $NOTEC; +$D = $B . "D" . $BB . $NOTEC; +$E = $B . "E" . $BB . $NOTEC; +$S = $B . "S" . $BB . $NOTEC; + +print C qq~$BORDERC +----------------------------------------------------------------------$_BORDERC $TOPICC +HELP for interactive note $version +$_TOPICC $NOTEC +The following commands are available: +$L List notes. L=long, with timestamp and l=short without timestamp. + You can also just hit for short list. + If you specify a subtopic, then list will display it's contents, + i.e.: "l mytopic" will dislpay notes under mytopic. +$N Create a new note. +$D Delete a note. You can either hit "d 1" or "d 1-4" or just hit "d". + If you don't specify a number, you will be asked for. +$S Search trough the notes database. Usage is similar to Delete, use + a string instead of a number to search for. +$E Edit a note. Usage is similar to Delete but you can only edit note + a time. +$H This help screen. +$Q Exit the program.~; +if($TOPIC) +{ +print C qq~ +$T print a list of all existing topics as a tree. T prints the tree + with all notes under each topic. + + You can change the actual topic by simply typing it's name or by using + the command "cd", i.e. "cd mytopic". You can create a new topic by creating + a new note, the first line must be the topic borderd by slashes, i.e.: + "/newtopic/". The slash is the default topic-sepearator, but you can over- + ride this in the config! If you type just ".." instead of a topic, you will + go one step back in your topic-structure. +~; +} +print C qq~ +$NOTEC +All commands except the List and Topic commands are case insensitive. $_NOTEC $BORDERC +----------------------------------------------------------------------$_BORDERC +~; +} + + +sub display_tree { + # displays a tree of all topics + my(%TREE, %res, $n, $t, $num, @nodes, $firstline, $text, $untext); + %res = $db->get_all(); + foreach $num (keys %res) + { + $n = $res{$num}->{'note'}; + $t = $res{$num}->{'date'}; + # this allows us to have multiple topics (subtopics!) + my ($firstline,$text,$untext) = split /\n/, $n, 3; + if($firstline =~ /^($TopicSep)/) + { + $firstline =~ s/($TopicSep)*$//; #remove TopicSepatator + @nodes = split(/$TopicSep/,$firstline); + } + else + { + @nodes = ();("$TopicSep"); + $text = $firstline; + } + &tree($num, $text, \%TREE, @nodes); + } + #return if ($num == 0); + # now that we have build our tree (in %TREE) go on t display it: + print C $BORDERC . "\n[" . $TopicSep . $BORDERC . "]\n"; + &print_tree(\%{$TREE{''}},"") if(%TREE); + print C $BORDERC . $_BORDERC . "\n"; +} + + +sub tree { + my($num, $text, $LocalTree, $node, @nodes) = @_; + if(@nodes) { + if(! exists $LocalTree->{$node}->{$NoteKey}) { + $LocalTree->{$node}->{$NoteKey} = []; + } + &tree($num, $text, $LocalTree->{$node}, @nodes); + } + else { + if(length($text) > ($maxlen - 5)) { + $text = substr($text, 0, ($maxlen -5)); + } + $text = $text . " (" . $NUMC . "#" . $num . $_NUMC . $NOTEC . ")" . $_NOTEC if($text ne ""); + push @{$LocalTree->{$node}->{$NoteKey}}, $text; + } +} + + +sub print_tree { + # thanks to Jens for his hints and this sub! + my $hashref=shift; + my $prefix=shift; + my @notes=@{$hashref->{$NoteKey}}; + my @subnotes=sort grep { ! /^$NoteKey$/ } keys %$hashref; + if($TreeType eq "LONG") { + for my $note (@notes) { + if($note ne "") { + print C $BORDERC ;# . $prefix. "|\n"; + print C "$prefix+---<" . $NOTEC . $note . $BORDERC . ">" . $_NOTEC . "\n"; + } + } + } + for my $index (0..$#subnotes) { + print C $BORDERC . $prefix. "|\n"; + print C "$prefix+---[" . $TOPICC . $subnotes[$index] . $BORDERC . "]\n"; + &print_tree($hashref->{$subnotes[$index]},($index == $#subnotes?"$prefix ":"$prefix| ")); + } +} + + +sub getconfig +{ + my($configfile) = @_; + my ($home, $value, $option); + # checks are already done, so trust myself and just open it! + open CONFIG, "<$configfile" || die $!; + while() { + chomp; + next if(/^\s*$/ || /^\s*#/); + my ($option,$value) = split /\s\s*=?\s*/, $_, 2; + $value =~ s/\s*$//; + $home = $value if (/^Home/); + $libpath = $value if (/^LibPath/); + $dbdriver = $value if (/^DbDriver/); + $dbhost = $value if (/^DbHost/); + $dbuser = $value if (/^DbUser/); + $dbpasswd = $value if (/^DbPasswd/); + $dbname = $value if (/^DbName/); + $table = $value if (/^DbTable/); + $fnum = $value if (/^FieldNumber/); + $fnote = $value if (/^FieldNote/); + $fdate = $value if (/^FieldDate/); + $NOTEDB = $value if (/^NoteDb/); + $MAX_NOTE = $value if (/^MaxNoteByte/); + $MAX_TIME = $value if (/^MaxTimeByte/); + $CRYPT_METHOD = $value if (/^CryptMethod/); + $USE_CRYPT = "YES" if (/^UseEncryption/ && $value == 1); + $USE_CRYPT = undef if (/^UseEncryption/ && $value == 0); + $ALWAYS_INT = "YES" if (/^AlwaysInteractive/ && $value == 1); + $ALWAYS_INT = undef if (/^AlwaysInteractive/ && $value == 0); + $DEFAULT_LIST = "LONG" if (/^DefaultLong/ && $value == 1); + $DEFAULT_LIST = undef if (/^DefaultLong/ && $value == 0); + $ALWAYS_EDIT = "YES" if (/^AlwaysEditor/ && $value == 1); + $ALWAYS_EDIT = undef if (/^AlwaysEditor/ && $value == 0); + $KEEP_TIMESTAMP = "YES" if (/^KeepTimeStamp/ && $value == 1); + $KEEP_TIMESTAMP = undef if (/^KeepTimeStamp/ && $value == 0); + $COLOR = "YES" if (/^UseColors/ && $value == 1); + $COLOR = "NO" if (/^UseColors/ && $value == 0); + $TopicSep = $value if (/^TopicSeparator/); + $maxlen = $value if (/^MaxLen/); + $BORDER_COLOR = $value if (/^BorderColor/); + $NUM_COLOR = $value if (/^NumberColor/); + $NOTE_COLOR = $value if(/^NoteColor/); + $TIME_COLOR = $value if (/^TimeColor/); + $TOPIC_COLOR = $value if (/^TopicColor/); + $PreferredEditor = $value if (/^PreferredEditor/); + $FormatText = $value if (/^FormatText/); + $TempDir = $value if (/^TempDirectory/); + } + chomp $home; + $home =~ s/\/*$//; # cut eventually / at the end + $HOME = eval($home); + if($NOTEDB =~ /^(~\/)(.*)$/) { + $NOTEDB = "/home/" . $USER . "/" . $2; + } + $libpath =~ s/\/*$//; + + close CONFIG; +} + + + + +__END__ +# +# $Log: note,v $ +# Revision 1.2 2000/07/09 22:10:03 zarahg +# tempfile management more secure now. new option TempDirectory. thx to Donald. +# +# Revision 1.30 2000/07/09 21:59:48 scip +# secure temp files +# +# Revision 1.29 2000/06/25 20:13:23 scip +# *** empty log message *** +# +# Revision 1.28 2000/06/25 19:51:51 scip +# changed pattern matching of seraching(\@ ... \E) +# added --config option +# +# Revision 1.27 2000/05/16 23:51:35 thomas +# fixed many option-parsing related bugd! +# +# Revision 1.26 2000/05/13 01:05:17 thomas +# changed config format and fixed some bugs +# as well as some other additions... +# +# Revision 1.25 2000/05/11 23:42:43 thomas +# --tree changed to --topic +# +# Revision 1.24 2000/05/10 22:59:44 thomas +# updated usage to reflect --raw and build it into output +# and display subs. +# +# Revision 1.23 2000/05/10 22:19:04 thomas +# changed to Getopt::Long, added --raw +# +# Revision 1.22 2000/05/01 18:51:40 thomas +# added "-" to sub dump +# +# Revision 1.21 2000/05/01 00:17:27 thomas +# *** empty log message *** +# +# Revision 1.20 2000/04/30 23:31:38 thomas +# added -o and coloured sub help. +# +# Revision 1.19 2000/04/30 16:07:23 thomas +# *** empty log message *** +# +# Revision 1.18 2000/04/30 14:58:21 thomas +# updated the usage and help subs +# +# Revision 1.17 2000/04/30 14:44:38 thomas +# added colors to the tree functions +# +# Revision 1.16 2000/04/30 14:28:38 thomas +# added the t command, which displays a topic-tree. +# and enhanced the list command in interactive mode +# +# Revision 1.15 2000/03/19 23:41:04 thomas +# changed set_del, now no extra TEMP file is required! +# instead I get it from $this->get_all() ! +# Revision 1.14 2000/03/19 22:51:49 thomas +# Bug in NOTEDB::binary fixed, recount of nubers was +# incorrect. +# +# Revision 1.13 2000/03/19 11:53:32 thomas +# edit bug fixed (ude => uen) +# +# Revision 1.12 2000/03/19 03:06:51 thomas +# backend support completed. +# mysql and binary backends now excluded in separate files +# +# Revision 1.11 2000/03/18 00:16:47 thomas +# added NOTEDB::mysql and changed note to work with that. +# thus, from now on there is only one script to maintain and +# it is possible to provide more bacjends as well as making +# additional scripts upon them, i.e. cgi script... +# +# Revision 1.8 2000/03/13 22:48:43 thomas +# small width bug fixed +# +# Revision 1.7 2000/03/08 23:11:19 tom +# added cd +# +# Revision 1.6 2000/03/08 22:50:41 tom +# Added the $KEEP_TIMESTAMP option and fixed a bug regarding topic names +# and invalid resolution of them in case it started with "1 name". +# +# Revision 1.5 2000/02/25 20:59:30 tom +# corrected small timestamp problem in &edit and &new +# +# Revision 1.4 2000/02/25 13:24:11 tom +# fixed a small bug, that caused to use the last line for a note title instead the 2nd. +# +# Revision 1.3 2000/02/25 11:28:53 tom +# all changes from bin version applied to sql version diff --git a/bin/note b/bin/note index de90eb6..9aa51ee 100755 --- a/bin/note +++ b/bin/note @@ -1,15 +1,15 @@ #!/usr/bin/perl -# $Id: note,v 1.2 2000/07/09 22:10:03 zarahg Exp $ -# +# $Id: note,v 1.3 2000/07/21 06:41:25 zarahg Exp $ +# # # note - console notes management with database and encryption support. # Copyright (C) 1999-2000 Thomas Linden (see README for details!) -# +# # 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 @@ -22,7 +22,7 @@ # - Thomas Linden # # latest version on: -# http://www.daemon.de/software.html +# http://www.daemon.de/software.html # ftp://www.0x49.org/pub/scip/note/ # @@ -32,73 +32,74 @@ use Getopt::Long; # # prototypes -# -sub usage; # print usage message for us thumb userz :-) -sub find_editor; # returns an external editor for use -sub output; # used by &list and &display -sub C; # print colourized -sub num_bereich; # returns array from "1-4" (1,2,3,4) -sub getdate; # return pretty formatted day -sub new; # crate new note -sub edit; # edit a note -sub del; # delete a note -sub display; # display one or more notes -sub list; # note-listing -sub help; # interactive help screen -sub import; # import from notedb-dump -sub display_tree; # show nice tree-view -sub tree; # build the tree -sub print_tree; # print the tree, contributed by Jens Heunemann . THX! +# +sub usage; # print usage message for us thumb userz :-) +sub find_editor; # returns an external editor for use +sub output; # used by &list and &display +sub C; # print colourized +sub num_bereich; # returns array from "1-4" (1,2,3,4) +sub getdate; # return pretty formatted day +sub new; # crate new note +sub edit; # edit a note +sub del; # delete a note +sub display; # display one or more notes +sub list; # note-listing +sub help; # interactive help screen +sub import; # import from notedb-dump +sub display_tree; # show nice tree-view +sub tree; # build the tree +sub print_tree; # print the tree, contributed by Jens Heunemann . THX! # # globals # my ( - # - # commandline options - # - $opt_, $opt_i, $opt_r, $opt_e, $opt_d, - $opt_s, $opt_t, $opt_T, $opt_l, $opt_L, $opt_c, - $opt_D, $opt_I, $opt_o, $opt_h, $opt_n, $opt_v, + # + # commandline options + # + $opt_, $opt_i, $opt_r, $opt_e, $opt_d, $opt_enc, + $opt_s, $opt_t, $opt_T, $opt_l, $opt_L, $opt_c, + $opt_D, $opt_I, $opt_o, $opt_h, $opt_n, $opt_v, - # - # set from commandline (or interactive) - # - $number, $searchstring, $dump_file, $ImportType, $NewType, $Raw, - - # - # options from config file .noterc - # - $maxlen, $timelen, $TOPIC, $NOTEDB, $MAX_TIME, $PreferredEditor, - $ALWAYS_INT, $KEEP_TIMESTAMP, $COLOR, $ALWAYS_EDIT, $HOME, $FormatText, - $BORDER_COLOR, $NOTE_COLOR, $NUM_COLOR, $TOPIC_COLOR, $MAX_NOTE, - $USE_CRYPT, $CRYPT_METHOD, $TopicSep, $DEFAULT_LIST, $TIME_COLOR, + # + # set from commandline (or interactive) + # + $number, $searchstring, $dump_file, $ImportType, $NewType, $Raw, - # - # db specifics from .noterc - # - $db, $dbname, $dbhost, $dbuser, $dbpasswd, - $table, $fnum, $fnote, $fdate, $date, $dbdriver, $libpath, + # + # options from config file .noterc + # + $maxlen, $timelen, $TOPIC, $NOTEDB, $MAX_TIME, $PreferredEditor, + $ALWAYS_INT, $KEEP_TIMESTAMP, $COLOR, $ALWAYS_EDIT, $HOME, $FormatText, + $BORDER_COLOR, $NOTE_COLOR, $NUM_COLOR, $TOPIC_COLOR, $MAX_NOTE, + $USE_CRYPT, $CRYPT_METHOD, $TopicSep, $DEFAULT_LIST, $TIME_COLOR, $SHORT_CD, + $USE_CACHE, - # - # processed colors - # - $BORDERC, $_BORDERC, $NOTEC, $NUMC, $_NUMC, $_NOTEC, $TIMEC, - $_TIMEC, $TOPICC, $_TOPICC, - - # - # config presets - # - $DEFAULTDBNAME, $USER, $PATH, $CONF, - - # - # internals - # - $TYPE, $mode, $NoteKey, $TempDir, - $version, $number, $CurTopic, $CurDepth, $WantTopic, - $sizeof, %TP, $TreeType, $ListType, $SetTitle, - @ArgTopics, $key, $typedef, @NumBlock, $has_nothing, + # + # db specifics from .noterc + # + $db, $dbname, $dbhost, $dbuser, $dbpasswd, $encrypt_passwd, $clearstring, + $table, $fnum, $fnote, $fdate, $date, $dbdriver, $libpath, + + # + # processed colors + # + $BORDERC, $_BORDERC, $NOTEC, $NUMC, $_NUMC, $_NOTEC, $TIMEC, + $_TIMEC, $TOPICC, $_TOPICC, + + # + # config presets + # + $DEFAULTDBNAME, $USER, $PATH, $CONF, + + # + # internals + # + $TYPE, $mode, $NoteKey, $TempDir, + $version, $CurTopic, $CurDepth, $WantTopic, + $sizeof, %TP, $TreeType, $ListType, $SetTitle, + @ArgTopics, $key, $typedef, @NumBlock, $has_nothing, ); @@ -126,10 +127,9 @@ $TIME_COLOR = "black"; $TOPIC_COLOR = "BLACK"; $TOPIC = 1; $TopicSep = '/'; -$version = "1.0.8"; -if($TOPIC) -{ - $CurDepth = 1; # the current depth inside the topic "directory" structure... +$version = "1.0.9"; +if ($TOPIC) { + $CurDepth = 1; # the current depth inside the topic "directory" structure... } $USE_CRYPT = "NO"; $TempDir = "/tmp"; @@ -139,207 +139,213 @@ $TempDir = "/tmp"; # # process command line args # -if($ARGV[0] eq "") -{ - $mode = "new"; +if ($ARGV[0] eq "") { + $mode = "new"; } -elsif($#ARGV == 0 && $ARGV[0] eq "-") { - $mode = "new"; - $NewType = 1; # read from STDIN until EOF - shift; - undef $has_nothing; +elsif ($#ARGV == 0 && $ARGV[0] eq "-") { + $mode = "new"; + $NewType = 1; # read from STDIN until EOF + shift; + undef $has_nothing; } -else -{ - Getopt::Long::Configure( qw(no_ignore_case)); - GetOptions ( - "interactive|i!" => \$opt_i, # no arg - "config|c=s" => \$opt_c, # string, required - "raw|r!" => \$opt_r, # no arg - "edit|e=i" => \$opt_e, # integer, required - "delete|d=s" => \$opt_d, # integer, required - "search|s=s" => \$opt_s, # string, required - "tree|topic|t!" => \$opt_t, # no arg - "longtopic|T!" => \$opt_T, # no arg - "list|l:s" => \$opt_l, # string, optional - "longlist|L:s" => \$opt_L, # string, optional - "dump||Dump|D:s" => \$opt_D, # string, optional - "import|Import|I:s" => \$opt_I, # string, optional - "overwrite|o!" => \$opt_o, # no arg - "help|h|?!" => \$opt_h, # no arg - "version|v!" => \$opt_v # no arg - ); - $opt_n = shift; # after that @ARGV contains eventually - # a note-number - # $opt_ is a single dash, in case of existence! - # - # determine mode - # - if($opt_i) { - $mode = "interactive"; - } - elsif(defined $opt_l || defined $opt_L) { - $mode = "list"; - if(defined $opt_l) { - @ArgTopics = split /$TopicSep/, $opt_l; - } - else { - $ListType = "LONG"; - @ArgTopics = split /$TopicSep/, $opt_L; - } - $CurDepth += $#ArgTopics + 1 if($opt_l || $opt_L); - $CurTopic = $ArgTopics[$#ArgTopics]; # use the last element everytime... - } - elsif($opt_t || $opt_T) { - $mode = "tree"; - $TreeType = "LONG" if($opt_T); - } - elsif(defined $opt_s) { - $mode = "search"; - $searchstring = $opt_s; - } - elsif($opt_e) { - $mode = "edit"; - $number = $opt_e; - } - elsif($opt_d) { - $mode = "delete"; - $number = $opt_d; - } - elsif(defined $opt_D) { - $mode = "dump"; - if(!$opt_) { - if($opt_D ne "") { - $dump_file = $opt_D; - } - else { - $dump_file = "note.dump.$$"; - print "no dumpfile specified, using $dump_file.\n"; - } - } - else { - $dump_file = "-"; # use STDIN - } - } - elsif(defined $opt_I) { - $mode = "import"; - if(!$opt_) { - if($opt_I ne "") { - $dump_file = $opt_I; - } - else { - print "Import-error! No dump_file specified!\n"; - exit(1); - } - } - else { - $dump_file = "-"; - } - } - elsif($opt_v) { - print "This is note $version by Thomas Linden .\n"; - exit(0); - } - elsif($opt_h) { - &usage; - } - else { - if($opt_c && $mode eq "" && !$opt_n) { - $mode = "new"; - } - elsif($opt_c && $mode eq "") { - $mode = ""; # huh?! - } - else { - $has_nothing = 1; - } - } - ### determine generic options - if($opt_n =~ /^[\d+\-?\,*]+$/) { - # first arg is a digit! - if($mode eq "") { - $number = $opt_n; - $mode = "display"; - undef $has_nothing; - } - else { - print "mode <$mode> does not take a numerical argument!\n"; - exit(1); - } - } - elsif($opt_n ne "") { - print "Unknown option: $opt_n\n"; - &usage; - } - if($opt_r) { - $Raw = 1; - } - if($opt_o) { - $ImportType = "overwrite"; - if(!$opt_I) { - print "--overwrite is only suitable for use with --import!\n"; - exit(1); - } - } - ##### +else { + Getopt::Long::Configure( qw(no_ignore_case)); + GetOptions ( + "interactive|i!" => \$opt_i, # no arg + "config|c=s" => \$opt_c, # string, required + "raw|r!" => \$opt_r, # no arg + "edit|e=i" => \$opt_e, # integer, required + "delete|d=s" => \$opt_d, # integer, required + "search|s=s" => \$opt_s, # string, required + "tree|topic|t!" => \$opt_t, # no arg + "longtopic|T!" => \$opt_T, # no arg + "list|l:s" => \$opt_l, # string, optional + "longlist|L:s" => \$opt_L, # string, optional + "dump||Dump|D:s" => \$opt_D, # string, optional + "import|Import|I:s" => \$opt_I, # string, optional + "overwrite|o!" => \$opt_o, # no arg + "help|h|?!" => \$opt_h, # no arg + "version|v!" => \$opt_v, # no arg + "encrypt=s" => \$opt_enc, # string, required + ); + $opt_n = shift; # after that @ARGV contains eventually + # a note-number + # $opt_ is a single dash, in case of existence! + # + # determine mode + # + if ($opt_i) { + $mode = "interactive"; + } + elsif (defined $opt_l || defined $opt_L) { + $mode = "list"; + if (defined $opt_l) { + @ArgTopics = split /$TopicSep/, $opt_l; + } + else { + $ListType = "LONG"; + @ArgTopics = split /$TopicSep/, $opt_L; + } + $CurDepth += $#ArgTopics + 1 if($opt_l || $opt_L); + $CurTopic = $ArgTopics[$#ArgTopics]; # use the last element everytime... + } + elsif ($opt_t || $opt_T) { + $mode = "tree"; + $TreeType = "LONG" if($opt_T); + } + elsif (defined $opt_s) { + $mode = "search"; + $searchstring = $opt_s; + } + elsif ($opt_e) { + $mode = "edit"; + $number = $opt_e; + } + elsif ($opt_d) { + $mode = "delete"; + $number = $opt_d; + } + elsif ($opt_enc) { + $mode = "encrypt_passwd"; + $clearstring = $opt_enc; + } + elsif (defined $opt_D) { + $mode = "dump"; + if (!$opt_) { + if ($opt_D ne "") { + $dump_file = $opt_D; + } + else { + $dump_file = "note.dump.$$"; + print "no dumpfile specified, using $dump_file.\n"; + } + } + else { + $dump_file = "-"; # use STDIN + } + } + elsif (defined $opt_I) { + $mode = "import"; + if (!$opt_) { + if ($opt_I ne "") { + $dump_file = $opt_I; + } + else { + print "Import-error! No dump_file specified!\n"; + exit(1); + } + } + else { + $dump_file = "-"; + } + } + elsif ($opt_v) { + print "This is note $version by Thomas Linden .\n"; + exit(0); + } + elsif ($opt_h) { + &usage; + } + else { + if ($opt_c && $mode eq "" && !$opt_n) { + $mode = "new"; + } + elsif ($opt_c && $mode eq "") { + $mode = ""; # huh?! + } + else { + $has_nothing = 1; + } + } + ### determine generic options + if ($opt_n =~ /^[\d+\-?\,*]+$/) { + # first arg is a digit! + if ($mode eq "") { + $number = $opt_n; + $mode = "display"; + undef $has_nothing; + } + else { + print "mode <$mode> does not take a numerical argument!\n"; + exit(1); + } + } + elsif ($opt_n ne "") { + print "Unknown option: $opt_n\n"; + &usage; + } + if ($opt_r) { + $Raw = 1; + } + if ($opt_o) { + $ImportType = "overwrite"; + if (!$opt_I) { + print "--overwrite is only suitable for use with --import!\n"; + exit(1); + } + } + ##### } -if($has_nothing && $mode eq "") -{ - &usage; +if ($has_nothing && $mode eq "") { + &usage; } # read the configfile. -$CONF = $opt_c if($opt_c); # if given by commandline, use this. -if(-e $CONF) -{ - &getconfig($CONF); +$CONF = $opt_c if($opt_c); # if given by commandline, use this. +if (-e $CONF) { + &getconfig($CONF); } -elsif($opt_c) { - # only wrong, if specified by commandline! else use default values! - print STDERR "Could not open \"$CONF\": file does not exist or permission denied!\n"; - exit(1); +elsif ($opt_c) { + # only wrong, if specified by commandline! else use default values! + print STDERR "Could not open \"$CONF\": file does not exist or permission denied!\n"; + exit(1); } # Always interactive? -if($ALWAYS_INT eq "YES" && $mode ne "dump" && $mode ne "import") -{ - $mode = "interactive"; +if ($ALWAYS_INT eq "YES" && $mode ne "dump" && $mode ne "import") { + $mode = "interactive"; } # OK ... Long-Listing shall be default ... You wanted it!!! -if($DEFAULT_LIST eq "LONG") -{ - # takes only precedence in commandline mode - $ListType="LONG"; +if ($DEFAULT_LIST eq "LONG") { + # takes only precedence in commandline mode + $ListType="LONG"; } # *if* loading of the config was successful, try to load the -# configured database backend. Currently supported: mysql and binary. -push @INC, $libpath; -if($dbdriver eq "binary") { - eval { - require NOTEDB::binary; - $db = new NOTEDB($dbdriver, $NOTEDB, $MAX_NOTE, $MAX_TIME, $dbdriver); - } +# configured database backend. Currently supported: +# mysql, dbm and binary. +unshift @INC, $libpath; + +if ($dbdriver eq "binary") { + eval { + require NOTEDB::binary; + $db = new NOTEDB($dbdriver, $NOTEDB, $MAX_NOTE, $MAX_TIME, $dbdriver); + } +} +elsif ($dbdriver eq "mysql") { + # do the new() later because of the encrypted password! + eval { + require "NOTEDB/mysql.pm"; + #$db = new NOTEDB($dbdriver, $dbname, $dbhost, $dbuser, $dbpasswd, $table, $fnum, $fnote, $fdate); + }; } else { - eval { - require "NOTEDB/$dbdriver.pm"; - $db = new NOTEDB($dbdriver, $dbname, $dbhost, $dbuser, $dbpasswd, $table, $fnum, $fnote, $fdate); - }; + eval { + require "NOTEDB/$dbdriver.pm"; + $db = new NOTEDB($dbdriver, $dbname, $dbhost, $dbuser, $dbpasswd, $table, $fnum, $fnote, $fdate); + }; } -if($@) { - print "Unsupported database backend: NOTEDB::$dbdriver!\n"; - print "The following error has occured:\n------------------------\n" . $@ . "\n------------------------\n"; - exit 1; +if ($@) { + print "Unsupported database backend: NOTEDB::$dbdriver!\n"; + print "The following error has occured:\n------------------------\n" . $@ . "\n------------------------\n"; + exit 1; } -# add the backend version to the note version: -$version .= " " . $db->version(); # calculate some constants... $BORDERC = "<$BORDER_COLOR>"; @@ -359,97 +365,110 @@ $NoteKey = $TopicSep . "notes" . $TopicSep; umask 077; # check if the user wants to use encryption: -if($USE_CRYPT eq "YES" && $NOTEDB::crypt_supported == 1) { - if($CRYPT_METHOD eq "") { - $CRYPT_METHOD = "Crypt::IDEA"; - } - if(!exists $ENV{'NOTE_PASSWD'}) { - print "password: "; - eval { - local($|) = 1; - local(*TTY); - open(TTY,"/dev/tty"); - system ("stty -echo ); - print STDERR "\r\n"; - system ("stty echo ; - } - } - else { - $key = $ENV{'NOTE_PASSWD'}; - } - chomp $key; - $db->use_crypt($key,$CRYPT_METHOD); - undef $key; - # verify correctness of passwd - my ($cnote, $cdate) = $db->get_single(1); - if($cdate ne "") { - if($cdate !~ /^\d+\.\d+?/) { - print "access denied.\n"; # decrypted $date is not a number! - exit(1); - } - } #else empty! +if ($USE_CRYPT eq "YES" && $NOTEDB::crypt_supported == 1) { + if ($CRYPT_METHOD eq "") { + $CRYPT_METHOD = "Crypt::IDEA"; + } + if (!exists $ENV{'NOTE_PASSWD'}) { + print "password: "; + eval { + local($|) = 1; + local(*TTY); + open(TTY,"/dev/tty"); + system ("stty -echo ); + print STDERR "\r\n"; + system ("stty echo ; + } + } + else { + $key = $ENV{'NOTE_PASSWD'}; + } + chomp $key; + if ($dbdriver eq "mysql") { + eval { + require Crypt::CBC; + my $cipher = new Crypt::CBC($key, $CRYPT_METHOD); + # decrypt the dbpasswd, if it's encrypted! + my $dbpasswd = $cipher->decrypt(unpack("u",$dbpasswd)) if($encrypt_passwd); + $db = new NOTEDB($dbdriver, $dbname, $dbhost, $dbuser, $dbpasswd, $table, $fnum, $fnote, $fdate); + }; + die "Could not connect do db: $@!\n" if($@); + } + $db->use_crypt($key,$CRYPT_METHOD); + undef $key; + # verify correctness of passwd + my ($cnote, $cdate) = $db->get_single(1); + if ($cdate ne "") { + if ($cdate !~ /^\d+\.\d+?/) { + print "access denied.\n"; # decrypted $date is not a number! + exit(1); + } + } #else empty! } else { - $db->no_crypt; - # does: NOTEDB::crypt_supported = 0; - my ($cnote, $cdate) = $db->get_single(1); - if($cdate ne "") { - if($cdate !~ /^\d+\.\d+?/) { - print "$NOTEDB seems to be encrypted!\n"; - exit(1); - } - } + $db->no_crypt; + # does: NOTEDB::crypt_supported = 0; + my ($cnote, $cdate) = $db->get_single(1); + if ($cdate ne "") { + if ($cdate !~ /^\d+\.\d+?/) { + print "$NOTEDB seems to be encrypted!\n"; + exit(1); + } + } } + +# do we use the db cache? +if ($USE_CACHE) { + $db->use_cache(); +} + + +# add the backend version to the note version: +$version .= " " . $db->version(); + + # main loop: ############### -if($mode eq "display") -{ - &display; +if ($mode eq "display") { + &display; } -elsif($mode eq "search") -{ - &search; +elsif ($mode eq "search") { + &search; } -elsif($mode eq "list") -{ - &list; +elsif ($mode eq "list") { + &list; } -elsif($mode eq "tree") -{ - &display_tree; +elsif ($mode eq "tree") { + &display_tree; } -elsif($mode eq "new") -{ - &new; +elsif ($mode eq "new") { + &new; } -elsif($mode eq "delete") -{ - del; +elsif ($mode eq "delete") { + del; } -elsif($mode eq "edit") -{ - &edit; +elsif ($mode eq "edit") { + &edit; } -elsif($mode eq "dump") -{ - &dump; +elsif ($mode eq "dump") { + &dump; } -elsif($mode eq "import") -{ - &import; +elsif ($mode eq "import") { + &import; } -elsif($mode eq "interactive") -{ - &interactive; +elsif ($mode eq "interactive") { + &interactive; } -else -{ - #undefined :-( +elsif ($mode eq "encrypt_passwd") { + &encrypt_passwd; +} +else { + #undefined :-( } @@ -457,963 +476,872 @@ exit(0); ################## EOP ################ +############ encrypt a given password ############## +sub encrypt_passwd { + my($key, $crypt_string); + print "password: "; + eval { + local($|) = 1; + local(*TTY); + open(TTY,"/dev/tty"); + system ("stty -echo ); + print STDERR "\r\n"; + system ("stty echo ; + } + chomp $key; + eval { + require Crypt::CBC; + my $cipher = new Crypt::CBC($key, $CRYPT_METHOD); + $crypt_string = pack("u", $cipher->encrypt($clearstring)); + }; + if ($@) { + print "Something went wrong: $@\n"; + exit 1; + } else { + print "Encrypted password:\n$crypt_string\n"; + } +} + ############################### DISPLAY ################################## sub display -{ + { my($N,$match,$note,$date,$num); - # display a certain note - print "\n"; - &num_bereich; # get @NumBlock from $numer - foreach $N (@NumBlock) - { - ($note, $date) = $db->get_single($N); - if($note) - { - if($Raw) { - print "$N\n$date\n$note\n\n"; - } - else { - output($N, $note, $date, "SINGLE"); - print "\n"; - } - $match = 1; - } - } - if(!$match) - { - print "no note with that number found!\n"; - } -} -############################### SEARCH ################################## -sub search -{ - my($n,$match,$note,$date,$num,%res); - if($searchstring eq "") - { - print "No searchstring specified!\n"; + # display a certain note + print "\n"; + &num_bereich; # get @NumBlock from $numer + foreach $N (@NumBlock) { + ($note, $date) = $db->get_single($N); + if ($note) { + if ($Raw) { + print "$N\n$date\n$note\n\n"; } else { - print "searching the database $dbname for \"$searchstring\"...\n\n"; - - %res = $db->get_search($searchstring); - - foreach $num (sort { $a <=> $b } keys %res) - { - output($num, $res{$num}->{'note'}, $res{$num}->{'date'}); - $match = 1; - } - if(!$match) - { - print "no matching note found!\n"; - } - print "\n"; + output($N, $note, $date, "SINGLE"); + print "\n"; } -} + $match = 1; + } + } + if (!$match) { + print "no note with that number found!\n"; + } + } + +############################### SEARCH ################################## +sub search + { + my($n,$match,$note,$date,$num,%res); + if ($searchstring eq "") { + print "No searchstring specified!\n"; + } + else { + print "searching the database $dbname for \"$searchstring\"...\n\n"; + + %res = $db->get_search($searchstring); + + foreach $num (sort { $a <=> $b } keys %res) { + output($num, $res{$num}->{'note'}, $res{$num}->{'date'}, "search"); + $match = 1; + } + if (!$match) { + print "no matching note found!\n"; + } + print "\n"; + } + } ############################### LIST ################################## sub list -{ - my(@topic,@RealTopic, $i,$t,$n,$num,@CurItem,$top,$in,%res); - if($mode ne "interactive" && !$Raw) - { - print "\nList of all existing notes:\n\n"; - } - else { - print "\n"; + { + my(@topic,@RealTopic, $i,$t,$n,$num,@CurItem,$top,$in,%res); + if ($mode ne "interactive" && !$Raw) { + print "\nList of all existing notes:\n\n"; + } + else { + print "\n"; + } + + # list all available notes (number and firstline) + %res = $db->get_all(); + + if ($TOPIC) { + undef %TP; + } + + foreach $num (sort { $a <=> $b } keys %res) { + $n = $res{$num}->{'note'}; + $t = $res{$num}->{'date'}; + if ($TOPIC) { + # this allows us to have multiple topics (subtopics!) + my ($firstline,$dummy) = split /\n/, $n, 2; + if ($firstline =~ /^($TopicSep)/) { + @topic = split(/$TopicSep/,$firstline); } - - # list all available notes (number and firstline) - %res = $db->get_all(); - - if($TOPIC) - { - undef %TP; - } - - foreach $num (sort { $a <=> $b } keys %res) - { - $n = $res{$num}->{'note'}; - $t = $res{$num}->{'date'}; - if($TOPIC) - { - # this allows us to have multiple topics (subtopics!) - my ($firstline,$dummy) = split /\n/, $n, 2; - if($firstline =~ /^($TopicSep)/) - { - @topic = split(/$TopicSep/,$firstline); - } - else - { - @topic = (); - } - # looks like: "\topic\" - # collect a list of topics under the current topic - if($topic[$CurDepth-1] eq $CurTopic && $topic[$CurDepth] ne "") - { - if(exists $TP{$topic[$CurDepth]}) - { - $TP{$topic[$CurDepth]}++; - } - else - { - # only if the next item *is* a topic! - $TP{$topic[$CurDepth]} = 1 if(($CurDepth) <= $#topic); - } - } - elsif($topic[$CurDepth-1] eq $CurTopic || ($topic[$CurDepth] eq "" && $CurDepth ==1)) - { + else { + @topic = (); + } + # looks like: "\topic\" + # collect a list of topics under the current topic + if ($topic[$CurDepth-1] eq $CurTopic && $topic[$CurDepth] ne "") { + if (exists $TP{$topic[$CurDepth]}) { + $TP{$topic[$CurDepth]}++; + } + else { + # only if the next item *is* a topic! + $TP{$topic[$CurDepth]} = 1 if(($CurDepth) <= $#topic); + } + } + elsif ($topic[$CurDepth-1] eq $CurTopic || ($topic[$CurDepth] eq "" && $CurDepth ==1)) { # cut the topic off the note-text - if($n =~ /^($TopicSep)/) - { - $CurItem[$i]->{'note'} = $dummy; - } - else - { - $CurItem[$i]->{'note'} = $n; - } + if ($n =~ /^($TopicSep)/) { + $CurItem[$i]->{'note'} = $dummy; + } + else { + $CurItem[$i]->{'note'} = $n; + } # save for later output() call - $CurItem[$i]->{'num'} = $num; - $CurItem[$i]->{'time'} = $t; - $i++; + $CurItem[$i]->{'num'} = $num; + $CurItem[$i]->{'time'} = $t; + $i++; # use this note for building the $PATH! - if($RealTopic[0] eq "") - { - @RealTopic = @topic; - } - } - } - else - { - output($num, $n, $t); - } - } - if($TOPIC) - { - if($CurTopic ne "") - { - undef $PATH; - foreach (@RealTopic) - { - $PATH .= $_ . $TopicSep; - last if($_ eq $CurTopic); - } - } - else - { - $PATH = $TopicSep; - } + if ($RealTopic[0] eq "") { + @RealTopic = @topic; + } + } + } + else { + output($num, $n, $t); + } + } + if ($TOPIC) { + if ($CurTopic ne "") { + undef $PATH; + foreach (@RealTopic) { + $PATH .= $_ . $TopicSep; + last if($_ eq $CurTopic); + } + } + else { + $PATH = $TopicSep; + } - # we are at top level, print a list of topics... - foreach $top (sort(keys %TP)) - { - output("-", " => ". $top . "$TopicSep ($TP{$top} notes)", - " Sub Topic "); - } - #print Dumper(@CurItem); - for($in=0;$in<$i;$in++) - { - output( $CurItem[$in]->{'num'}, - $CurItem[$in]->{'note'}, - $CurItem[$in]->{'time'} ); - } - } - - print "\n"; -} + # we are at top level, print a list of topics... + foreach $top (sort(keys %TP)) { + output("-", " => ". $top . "$TopicSep ($TP{$top} notes)", + " Sub Topic "); + } + #print Dumper(@CurItem); + for ($in=0;$in<$i;$in++) { + output( $CurItem[$in]->{'num'}, + $CurItem[$in]->{'note'}, + $CurItem[$in]->{'time'} ); + } + } + + print "\n"; + } ############################### NEW ################################## sub new -{ + { my($TEMP,$editor, $date, $note, $WARN, $c, $line, $num, @topic); - $date = &getdate; - if($ALWAYS_EDIT eq "YES") - { - $TEMP = &gettemp; - # let the user edit it... - $editor = &find_editor; - if($editor) - { - system "touch", $TEMP && die $!; - system "chattr", "+s", $TEMP; # ignore errors, since only on ext2 supported! - system $editor, $TEMP; - } - else - { - print "Could not find an editor to use!\n"; - exit(0); - } - # read it in ($note) - $note = ""; - open E, "<$TEMP" or $WARN = 1; - if($WARN) - { - print "...edit process interupted! No note has been saved.\n"; - undef $WARN; - return; - } - $c = 0; - while() - { - $note = $note . $_; - } - chomp $note; - close E; - # privacy! - unlink $TEMP; + $date = &getdate; + if ($ALWAYS_EDIT eq "YES") { + $TEMP = &gettemp; + # let the user edit it... + $editor = &find_editor; + if ($editor) { + # create the temp file + open NEW, "> $TEMP" or die $!; + close NEW; + system "chattr", "+s", $TEMP; # ignore errors, since only on ext2 supported! + system $editor, $TEMP; + } + else { + print "Could not find an editor to use!\n"; + exit(0); + } + # read it in ($note) + $note = ""; + open E, "<$TEMP" or $WARN = 1; + if ($WARN) { + print "...edit process interupted! No note has been saved.\n"; + undef $WARN; + return; + } + $c = 0; + while () { + $note = $note . $_; + } + chomp $note; + close E; + # privacy! + unlink $TEMP; + } + else { + $note = ""; + $line = ""; + # create a new note + if ($NewType) { + # be silent! read from STDIN until EOF. + while () { + $note .= $_; } - else - { - $note = ""; - $line = ""; - # create a new note - if($NewType) - { - # be silent! read from STDIN until EOF. - while () { $note .= $_; } - } - else - { - print "enter the text of the note, end with .\n"; - do - { - $line = ; - $note = $note . $line; - } until $line eq ".\n"; - # remove the . ! - chop $note; - chop $note; - } - } - - # since we have not number, look for the next available: - $number = $db->get_nextnum(); - if($TOPIC && $CurTopic ne "") - { - @topic = split(/$TopicSep/,$note); - if($topic[1] eq "") - { - $note = $PATH . "\n$note"; - } - } + } + else { + print "enter the text of the note, end with .\n"; + do + { + $line = ; + $note = $note . $line; + } until $line eq ".\n"; + # remove the . ! + chop $note; + chop $note; + } + } + + # since we have not number, look for the next available: + $number = $db->get_nextnum(); + if ($TOPIC && $CurTopic ne "") { + @topic = split(/$TopicSep/,$note); + if ($topic[1] eq "") { + $note = $PATH . "\n$note"; + } + } - $db->set_new($number,$note,$date); + $db->set_new($number,$note,$date); - # everything ok until here! - print "note stored. it has been assigned the number $number.\n\n"; -} + # everything ok until here! + print "note stored. it has been assigned the number $number.\n\n"; + } ############################### DELETE ################################## sub del -{ - my($i,@count, $setnum, $pos, $ERR); - # delete a note - &num_bereich; # get @NumBlock from $number - foreach $_ (@NumBlock) - { - $ERR = $db->set_del($_); - if($ERR) - { - print "no note with number $_ found!\n"; - } - else - { - print "note number $_ has been deleted.\n"; - } - } - # recount the notenumbers: - $db->set_recountnums(); + { + my($i,@count, $setnum, $pos, $ERR); + # delete a note + &num_bereich; # get @NumBlock from $number + foreach $_ (@NumBlock) { + $ERR = $db->set_del($_); + if ($ERR) { + print "no note with number $_ found!\n"; + } + else { + print "note number $_ has been deleted.\n"; + } + } + # recount the notenumbers: + $db->set_recountnums(); - @NumBlock = (); -} + @NumBlock = (); + } ############################### EDIT ################################## sub edit -{ + { my($keeptime, $date, $editor, $TEMP, $note, $t, $num, $match); - # edit a note - $date = &getdate; - ($note, $keeptime) = $db->get_single($number); - if($keeptime eq "") - { - print "no note with that number found!\n\n"; - exit(0) if($mode ne "interactive"); - } - $TEMP = &gettemp; - open NOTE,">$TEMP" or die "Could not open $TEMP\n"; - select NOTE; - - system "chattr", "+s", $TEMP; # ignore errors, like in new() - - print $note; - close NOTE; - select STDOUT; - $editor = &find_editor; - if($editor) - { - system $editor, $TEMP; - } - else - { - print "Could not find an editor to use!\n"; - exit(0); - } - $note = ""; - open NOTE,"<$TEMP" or die "Could not open $TEMP\n"; - - while() - { - $note = $note . $_; - } - chomp $note; - close NOTE; + # edit a note + $date = &getdate; + ($note, $keeptime) = $db->get_single($number); + if ($keeptime eq "") { + print "no note with that number found!\n\n"; + exit(0) if($mode ne "interactive"); + } + $TEMP = &gettemp; + open NOTE,">$TEMP" or die "Could not open $TEMP\n"; + select NOTE; - unlink $TEMP || die $!; + system "chattr", "+s", $TEMP; # ignore errors, like in new() - if($KEEP_TIMESTAMP eq "YES") - { - $t = $keeptime; - } - else - { - $t = $date; - } - - # we got it, now save to db - $db->set_edit($number, $note, $t); + print $note; + close NOTE; + select STDOUT; + $editor = &find_editor; + if ($editor) { + system $editor, $TEMP; + } + else { + print "Could not find an editor to use!\n"; + exit(0); + } + $note = ""; + open NOTE,"<$TEMP" or die "Could not open $TEMP\n"; - print "note number $number has been changed.\n"; -} + while () { + $note = $note . $_; + } + chomp $note; + close NOTE; + + unlink $TEMP || die $!; + + if ($KEEP_TIMESTAMP eq "YES") { + $t = $keeptime; + } + else { + $t = $date; + } + # we got it, now save to db + $db->set_edit($number, $note, $t); + + print "note number $number has been changed.\n"; + } sub dump -{ + { my(%res, $num, $DUMP); - # $dump_file - if($dump_file eq "-") { - $DUMP = *STDOUT; - } - else { - open (DUMPFILE, ">$dump_file") or die "could not open $dump_file\n"; - $DUMP = *DUMPFILE; - } - select $DUMP; - %res = $db->get_all(); - foreach $num (sort { $a <=> $b } keys %res) - { - print STDOUT "dumping note number $num to $dump_file\n" if($dump_file ne "-"); - print "Number: $num\n" - ."Timestamp: $res{$num}->{'date'}\n" - ."$res{$num}->{'note'}\n"; - } - print "\n"; - close(DUMP); - select STDOUT; -} + # $dump_file + if ($dump_file eq "-") { + $DUMP = *STDOUT; + } + else { + open (DUMPFILE, ">$dump_file") or die "could not open $dump_file\n"; + $DUMP = *DUMPFILE; + } + select $DUMP; + %res = $db->get_all(); + foreach $num (sort { $a <=> $b } keys %res) { + print STDOUT "dumping note number $num to $dump_file\n" if($dump_file ne "-"); + print "Number: $num\n" + ."Timestamp: $res{$num}->{'date'}\n" + ."$res{$num}->{'note'}\n"; + } + print "\n"; + close(DUMPFILE); + select STDOUT; + } sub import -{ + { my($num, $start, $complete, $dummi, $note, $date, $time, $number, $stdin, $DUMP); - # open $dump_file and import it into the notedb - $stdin = 1 if($dump_file eq "-"); - if($stdin) { - $DUMP = *STDIN; + # open $dump_file and import it into the notedb + $stdin = 1 if($dump_file eq "-"); + if ($stdin) { + $DUMP = *STDIN; + } + else { + open (DUMPFILE, "<$dump_file") or die "could not open $dump_file\n"; + $DUMP = *DUMPFILE; + } + $db->set_del_all() if($ImportType ne ""); + $complete=0; + $start = 0; + while (<$DUMP>) { + chomp $_; + if ($_ =~ /^Number:\s\d+/) { + if ($start == 0) { + # we have no previous record + ($dummi,$number) = split(/\s/,$_); + $start = 1; } else { - open (DUMPFILE, "<$dump_file") or die "could not open $dump_file\n"; - $DUMP = *DUMPFILE; + # we got a complete record, save it! + $number = $db->get_nextnum(); + $db->set_new($number,$note, $date); + print "note number $number from $dump_file inserted into notedb.\n" if(!$stdin); + $complete = 0; + $note = ""; + $date = ""; + ($dummi,$number) = split(/\s/,$_); } - $db->set_del_all() if($ImportType ne ""); - $complete=0; - $start = 0; - while(<$DUMP>) - { - chomp $_; - if($_ =~ /^Number:\s\d+/) - { - if($start == 0) - { - # we have no previous record - ($dummi,$number) = split(/\s/,$_); - $start = 1; - } - else - { - # we got a complete record, save it! - $number = $db->get_nextnum(); - $db->set_new($number,$note, $date); - print "note number $number from $dump_file inserted into notedb.\n" if(!$stdin); - $complete = 0; - $note = ""; - $date = ""; - ($dummi,$number) = split(/\s/,$_); - } - } - elsif($_ =~ /^Timestamp:\s\d+/ && $complete == 0) - { - ($dummi,$date,$time) = split(/\s/,$_); - $date = "$date $time"; - $complete = 1; - } - else - { - $note .= $_ . "\n"; - } - } - if($note ne "" && $date ne "") - { - # the last record, if existent - $number = $db->get_nextnum(); - $db->set_new($number,$note, $date); - print "note number $number from $dump_file inserted into notedb.\n" if(!$stdin); - } -} + } + elsif ($_ =~ /^Timestamp:\s\d+/ && $complete == 0) { + ($dummi,$date,$time) = split(/\s/,$_); + $date = "$date $time"; + $complete = 1; + } + else { + $note .= $_ . "\n"; + } + } + if ($note ne "" && $date ne "") { + # the last record, if existent + $number = $db->get_nextnum(); + $db->set_new($number,$note, $date); + print "note number $number from $dump_file inserted into notedb.\n" if(!$stdin); + } + } sub interactive -{ - my($B, $BB, $menu, $char, @LastTopic, $Channel); - $Channel = $|; - # create menu: - $B = ""; - $BB = ""; - $menu = "[" . $B . "L" . $BB . "-List "; - if($TOPIC) { - $menu .= $B . "T" . $BB . "-Topics "; - } - $menu .= $B . "N" . $BB . "-New " - . $B . "D" . $BB . "-Delete " - . $B . "S" . $BB . "-Search " - . $B . "E" . $BB . "-Edit " - . $B . "?" . $BB . "-Help " - . $B . "Q" . $BB . "-Quit] "; # $CurTopic will be empty if $TOPIC is off! - # per default let's list all the stuff: - # Initially do a list command! - $ListType = ($DEFAULT_LIST eq "LONG") ? "LONG" : ""; - &list; - - for(;;) - { - $ListType = ($DEFAULT_LIST eq "LONG") ? "LONG" : ""; - undef $SetTitle; - if($CurDepth > 2) - { - print C $menu . $TOPICC . "../" . $CurTopic . $_TOPICC . ">"; - } - else - { - print C $menu . $TOPICC . $CurTopic . $_TOPICC . ">"; - } - - # endless until user press "Q" or "q"! - $char = ; - #$char = $term->readline(''); - chomp $char; - if($char =~ /^\d+\s*[\di*?,*?\-*?]*$/) - { - $ListType = ""; #overrun - # display notes - $number = $char; - &display; - } - elsif($char =~ /^n$/i) - { - # create a new one - &new; - } - elsif($char =~ /^$/) - { - &list; - } - elsif($char =~ /^l$/) - { - $ListType = ""; - &list; - } - elsif($char =~ /^L$/) - { - $ListType = "LONG"; - &list; - undef $SetTitle; - } - elsif($char =~ /^h$/i || $char =~ /^\?/) - { - # zu dumm der Mensch ;-) - &help; - } - elsif($char =~ /^d\s+([\d*?,*?\-*?]*)$/i) - { - # delete one! - $number = $1; - &del; - } - elsif($char =~ /^d$/i) - { - # we have to ask her: - print "enter number(s) of note(s) you want to delete: "; - $char = ; - chomp $char; - $number = $char; - &del; - } - elsif($char =~ /^e\s+(\d+\-*\,*\d*)/i) - { - # edit one! - $number = $1; - &edit; - } - elsif($char =~ /^e$/i) - { - # we have to ask her: - print "enter number of the note you want to edit: "; - $char = ; - chomp $char; - $number = $char; - &edit; - } - elsif($char =~ /^s\s+/i) - { - # she want's to search - $searchstring = $'; - chomp $searchstring; - &search; - } - elsif($char =~ /^s$/i) - { - # we have to ask her: - print "enter the string you want to search for: "; - $char = ; - chomp $char; - $char =~ s/^\n//; - $searchstring = $char; - &search; - } - elsif($char =~ /^q$/i) - { - # schade!!! - $| = $Channel; - print "\n\ngood bye!\n"; - exit(0); - } - elsif($char =~ /^t$/) - { - $TreeType = ""; - &display_tree; - } - elsif($char =~ /^T$/) - { - $TreeType = "LONG"; - &display_tree; - $TreeType = ""; - } - elsif($char =~ /^\.\.$/ || $char =~ /^cd\s*\.\.$/) - { - $CurDepth-- if ($CurDepth > 1); - $CurTopic = $LastTopic[$CurDepth]; - &list; - } - elsif($char =~ /^l\s+(\w+)$/) - { - # list - $WantTopic = $1; - if(exists $TP{$WantTopic}) - { - my %SaveTP = %TP; - $LastTopic[$CurDepth] = $CurTopic; - $CurTopic = $1; - $CurDepth++; - - &list; - - $CurTopic = $LastTopic[$CurDepth]; - $CurDepth--; - %TP = %SaveTP; - } - else - { - print "\nunknown command!\n"; - } - } - else - { - # unknown - my $unchar = $char; - $unchar =~ s/^cd //; # you may use cd now! - if(exists $TP{$char} || exists $TP{$unchar}) - { - $char = $unchar if(exists $TP{$unchar}); - $LastTopic[$CurDepth] = $CurTopic; - $CurTopic = $char; - $CurDepth++; - &list; - } - else - { - print "\nunknown command!\n"; - } - undef $unchar; - } - } -} + { + my($B, $BB, $menu, $char, @LastTopic, $Channel); + $Channel = $|; + # create menu: + $B = ""; + $BB = ""; + $menu = "[" . $B . "L" . $BB . "-List "; + if ($TOPIC) { + $menu .= $B . "T" . $BB . "-Topics "; + } + $menu .= $B . "N" . $BB . "-New " + . $B . "D" . $BB . "-Delete " + . $B . "S" . $BB . "-Search " + . $B . "E" . $BB . "-Edit " + . $B . "?" . $BB . "-Help " + . $B . "Q" . $BB . "-Quit] "; # $CurTopic will be empty if $TOPIC is off! + # per default let's list all the stuff: + # Initially do a list command! + $ListType = ($DEFAULT_LIST eq "LONG") ? "LONG" : ""; + &list; + for (;;) { + $ListType = ($DEFAULT_LIST eq "LONG") ? "LONG" : ""; + undef $SetTitle; + if ($CurDepth > 2) { + print C $menu . $TOPICC . "../" . $CurTopic . $_TOPICC . ">"; + } + else { + print C $menu . $TOPICC . $CurTopic . $_TOPICC . ">"; + } + # endless until user press "Q" or "q"! + $char = ; + #$char = $term->readline(''); + chomp $char; + if ($char =~ /^\d+\s*[\di*?,*?\-*?]*$/) { + $ListType = ""; #overrun + # display notes + $number = $char; + &display; + } + elsif ($char =~ /^n$/i) { + # create a new one + &new; + } + elsif ($char =~ /^$/) { + &list; + } + elsif ($char =~ /^l$/) { + $ListType = ""; + &list; + } + elsif ($char =~ /^L$/) { + $ListType = "LONG"; + &list; + undef $SetTitle; + } + elsif ($char =~ /^h$/i || $char =~ /^\?/) { + # zu dumm der Mensch ;-) + &help; + } + elsif ($char =~ /^d\s+([\d*?,*?\-*?]*)$/i) { + # delete one! + $number = $1; + &del; + } + elsif ($char =~ /^d$/i) { + # we have to ask her: + print "enter number(s) of note(s) you want to delete: "; + $char = ; + chomp $char; + $number = $char; + &del; + } + elsif ($char =~ /^e\s+(\d+\-*\,*\d*)/i) { + # edit one! + $number = $1; + &edit; + } + elsif ($char =~ /^e$/i) { + # we have to ask her: + print "enter number of the note you want to edit: "; + $char = ; + chomp $char; + $number = $char; + &edit; + } + elsif ($char =~ /^s\s+/i) { + # she want's to search + $searchstring = $'; + chomp $searchstring; + &search; + } + elsif ($char =~ /^s$/i) { + # we have to ask her: + print "enter the string you want to search for: "; + $char = ; + chomp $char; + $char =~ s/^\n//; + $searchstring = $char; + &search; + } + elsif ($char =~ /^q$/i) { + # schade!!! + $| = $Channel; + print "\n\ngood bye!\n"; + exit(0); + } + elsif ($char =~ /^t$/) { + $TreeType = ""; + &display_tree; + } + elsif ($char =~ /^T$/) { + $TreeType = "LONG"; + &display_tree; + $TreeType = ""; + } + elsif ($char =~ /^\.\.$/ || $char =~ /^cd\s*\.\.$/) { + $CurDepth-- if ($CurDepth > 1); + $CurTopic = $LastTopic[$CurDepth]; + &list; + } + elsif ($char =~ /^l\s+(\w+)$/) { + # list + $WantTopic = $1; + if (exists $TP{$WantTopic}) { + my %SaveTP = %TP; + $LastTopic[$CurDepth] = $CurTopic; + $CurTopic = $1; + $CurDepth++; + &list; + $CurTopic = $LastTopic[$CurDepth]; + $CurDepth--; + %TP = %SaveTP; + } + else { + print "\nunknown command!\n"; + } + } + else { + # unknown + my $unchar = $char; + $unchar =~ s/^cd //; # you may use cd now! + if ($unchar =~ /^\d+?$/ && $SHORT_CD) { + # just a number! + my @topic; + my ($cnote, $cdate) = $db->get_single($unchar); + my ($firstline,$dummy) = split /\n/, $cnote, 2; + if ($firstline =~ /^($TopicSep)/) { + @topic = split(/$TopicSep/,$firstline); + } + else { + @topic = (); + } + if (@topic) { + # only jump, if, and only if there were at least one topic! + push @LastTopic, "", @topic; + $CurDepth = $#topic + 1; + $CurTopic = pop @topic; + } + &list; + } + elsif ($unchar eq $TopicSep) { + # cd / + $CurDepth = 1; + $CurTopic = ""; + &list; + } + elsif (exists $TP{$char} || exists $TP{$unchar}) { + $char = $unchar if(exists $TP{$unchar}); + $LastTopic[$CurDepth] = $CurTopic; + $CurTopic = $char; + $CurDepth++; + &list; + } + else { + print "\nunknown command!\n"; + } + undef $unchar; + } + } + } sub usage -{ -print qq~This is the program note $version by Thomas Linden (c) 1999-2000. + { + print qq~This is the program note $version by Thomas Linden (c) 1999-2000. It comes with absolutely NO WARRANTY. It is distributed under the terms of the GNU General Public License. Use it at your own risk :-) -Usage: note [ options ] [ number [,number...]] -Options: --h --help displays this help screen --v --version displays the version number --c --config use another config file than the default \~/.noterc --l --list [] lists all existing notes If no topic were specified, - it will display a list of all existing topics. --L --longlist [] the same as -l but prints also the timestamp --t --topic prints a list of all topics as a tree. --T --longtopc prints the topic-tree with the notes under each topic --s --search searches for trough the notes database --e --edit edit note with --d --delete delete note with --D --Dump [ | -] dumps the notes to the textfile . if is simply - a "-" it will printed out to standard output. --I --Import | - imports a previously dumped textfile into the - note-database. Data will be appended by default. - You can also specify a dash "note -I -" instead of a , - which causes note, silently to read in a dump from STDIN. --o --overwrite only suitable for use with --Import. Overwrites an - existing notedb. --r --raw raw mode, output will not be formatted. Works not in interactive - mode, only on cmd-line for list and display. --i --interactive interactive mode -- if you run note only with one dash: "note -", then it will - read in a new note from STDIN until EOF, this makes it - possible to pipe text into a new note. - o if you specify only a number (i.e. "note 4"), then the note with that - number will be displayed. - o you can specify more then one number for delete and display, for example: - "note -d 3,4" deletes #3 and #4. "note 5-7" displays #5, #6 and #7. - o if you run note without any parameter and if "AlwaysInteractive" in the config - set off, then note will create a new note and prompt you for new text. - o If it finds \~/.noterc, it will process it. Refer to the manpage for more - informations about the configuration. - o In interactive mode you can get help at any time by typing "?" or "h" at - the prompt. - o If encryption support is turned on, note will ask you for a passphrase every - time it runs. You can avoid this behavior by setting the environment-variable - \$NOTE_PASSWD. You will need this for example, if you call note from a script. +Usage: note [ options ] [ number [,number...]] +Read the note(1) manpage for more details. ~; - #my ($package, $filename, $line) = caller; - #print "called from line $line\n"; - exit 1; -} + exit 1; + } sub find_editor { - return $PreferredEditor || $ENV{"VISUAL"} || $ENV{"EDITOR"} || "vim" || "vi" || "pico"; + return $PreferredEditor || $ENV{"VISUAL"} || $ENV{"EDITOR"} || "vim" || "vi" || "pico"; } #/ sub format { - # make text bold/underlined/inverse using current $NOTEC - # s/\[([^]]*)\]/$param{$1}/g; - my($note) = @_; - if($FormatText) { - my $BN = uc($NOTEC); - my $_BN = uc($_NOTEC); - my $UN = $NOTEC; - $UN =~ s/<(.*)>/<$1_>/; - my $_UN = $UN; - $_UN =~ s/<(.*)>/<\/$1>/; - my $IN = $NOTEC; my $_IN = $_NOTEC; - $IN =~ s/<(.*)>/<$1I>/; - $_IN =~ s/<(.*)>/<$1I>/; - #$note =~ s/ (\*)(.+)(\*) / $BN$2$_BN /g; - #$note =~ s/ (_)(.+)(_) / $UN$2$_UN /g; - #$note =~ s/ (\/)(.+)(\/) / $IN$2$_IN /g; - $note =~ s/\*\*([^\*^\*]*)\*\*/$BN$1$_BN/g; - $note =~ s/__([^_^_]*)__/$UN$1$_UN/g; - $note =~ s/{{([^}^}]*)}}/$IN$1$_IN/g; - } - $note =~ s/(<\/.*>)/$1$NOTEC/g; - $note; + # make text bold/underlined/inverse using current $NOTEC + my($note) = @_; + if ($FormatText) { + my $BN = uc($NOTEC); + my $_BN = uc($_NOTEC); + my $UN = $NOTEC; + $UN =~ s/<(.*)>/<$1_>/; + my $_UN = $UN; + $_UN =~ s/<(.*)>/<\/$1>/; + my $IN = $NOTEC; my $_IN = $_NOTEC; + $IN =~ s/<(.*)>/<$1I>/; + $_IN =~ s/<(.*)>/<$1I>/; + $note =~ s/\*\*([^\*^\*]*)\*\*/$BN$1$_BN/g; + $note =~ s/__([^_^_]*)__/$UN$1$_UN/g; + $note =~ s/{{([^}^}]*)}}/$IN$1$_IN/g; + } + $note =~ s/(<\/.*>)/$1$NOTEC/g; + $note; } sub output -{ - my($SSS, $LINE, $num, $note, $time, $TYPE, $L, $LONGSPC, $R, $PathLen, $SP, $title, $CUTSPACE, - $len, $diff, $Space, $nlen, $txtlen); - ($num, $note, $time, $TYPE) = @_; - $txtlen = ($ListType eq "LONG") ? $maxlen : $timelen + $maxlen; - - $note = &format($note); + { + my($SSS, $LINE, $num, $note, $time, $TYPE, $L, $LONGSPC, $R, $PathLen, $SP, $title, $CUTSPACE, + $len, $diff, $Space, $nlen, $txtlen); + ($num, $note, $time, $TYPE) = @_; + $txtlen = ($ListType eq "LONG") ? $maxlen : $timelen + $maxlen; + $note = &format($note); - $SSS = "-" x ($maxlen + 31); - - $nlen = length("$num"); - $LINE = "$BORDERC $SSS $_BORDERC\n"; - $L = $BORDERC . "[" . $_BORDERC; - $LONGSPC = " " x (26 - $nlen); - $R = $BORDERC . "]" . $_BORDERC; - $PathLen = length($PATH); # will be ZERO, if not in TOPIC mode! - if($TYPE ne "SINGLE") - { - if(!$SetTitle) - { - $SP = ""; - # print only if it is the first line! - $SP = " " x ($maxlen - 2 - $PathLen); - if(!$Raw) { + $SSS = "-" x ($maxlen + 31); + $nlen = length("$num"); + $LINE = "$BORDERC $SSS $_BORDERC\n"; + $L = $BORDERC . "[" . $_BORDERC; + $LONGSPC = " " x (26 - $nlen); + $R = $BORDERC . "]" . $_BORDERC; + $PathLen = length($PATH); # will be ZERO, if not in TOPIC mode! + if ($TYPE ne "SINGLE") { + if (!$SetTitle) { + $SP = ""; + # print only if it is the first line! + $SP = " " x ($maxlen - 2 - $PathLen); + if (!$Raw) { # no title in raw-mode! - print C $LINE; - - print C "$L $NUMC#$_NUMC "; - if($ListType eq "LONG") - { - print C " $TIMEC" . "creation date$_TIMEC "; - } - else - { - print $LONGSPC; - } - if($TOPIC) - { - print C $TOPICC . "$PATH $_TOPICC$SP$R\n"; - } - else - { - print C $NOTEC . "note$_NOTEC$SP$R\n"; - } - - print C $LINE; - } - $SetTitle = 1; - } - $title = ""; - $CUTSPACE = " " x $txtlen; - $note =~ s/\n/$CUTSPACE/g; - $len = length($note); - if($len < ($txtlen - 2 - $nlen)) - { - $diff = $txtlen - $len; - $Space = " " x $diff; - if(!$Raw) { - if($num eq "-") - { - $title = $BORDERC . $TOPICC . "\"" . $note . "\"" . $_TOPICC . $Space . "$_BORDERC"; - } - else - { - $title = $BORDERC . $NOTEC . "\"" . $note . "\"" . $_NOTEC . $Space . "$_BORDERC"; - } - } - else { - $title = $note; - } - } - else - { - $title = substr($note,0,($txtlen - 2 - $nlen)); - if(!$Raw) { - $title = $BORDERC . $NOTEC . "\"" . $title . "...\"$_NOTEC$_BORDERC"; - } - } - if($Raw) { - print "$num "; - print "$time " if($ListType eq "LONG"); - if($title =~ /^ => (.*)$TopicSep (.*)$/) { - $title = "$1$TopicSep $2"; # seems to be a topic! - } - print "$title\n"; - } - else { - # $title should now look as: "A sample note " - print C "$L $NUMC$num$_NUMC $R"; - if($ListType eq "LONG") - { - print C "$L$TIMEC" . $time . " $_TIMEC$R"; - } - print C "$L $NOTEC" . $title . "$_NOTEC $R\n"; - print C $LINE; - } + print C $LINE; + print C "$L $NUMC#$_NUMC "; + if ($ListType eq "LONG") { + print C " $TIMEC" . "creation date$_TIMEC "; + } + else { + print $LONGSPC; + } + if ($TOPIC) { + print C $TOPICC . "$PATH $_TOPICC$SP$R\n"; + } + else { + print C $NOTEC . "note$_NOTEC$SP$R\n"; + } + print C $LINE; } - else - { - # we will not reach this in raw-mode, therefore no decision here! - chomp $note; - $Space = " " x (($maxlen + $timelen) - 16); - print C $LINE; - print C "$L $NUMC$num$_NUMC $R$L$TIMEC$time$_TIMEC $Space$R\n"; - print C $LINE; - print C $NOTEC . $note . $_NOTEC . "\n"; - print C $LINE; + $SetTitle = 1; + } + $title = ""; + $CUTSPACE = " " x $txtlen; + if ($TYPE eq "search") { + $note =~ s/^\Q$TopicSep\E.+?\Q$TopicSep\E\n//; + } + $note =~ s/\n/$CUTSPACE/g; + $len = length($note); + if ($len < ($txtlen - 2 - $nlen)) { + $diff = $txtlen - $len; + $Space = " " x $diff; + if (!$Raw) { + if ($num eq "-") { + $title = $BORDERC . $TOPICC . "\"" . $note . "\"" . $_TOPICC . $Space . "$_BORDERC"; + } + else { + $title = $BORDERC . $NOTEC . "\"" . $note . "\"" . $_NOTEC . $Space . "$_BORDERC"; + } } - -} + else { + $title = $note; + } + } + else { + $title = substr($note,0,($txtlen - 2 - $nlen)); + if (!$Raw) { + $title = $BORDERC . $NOTEC . "\"" . $title . "...\"$_NOTEC$_BORDERC"; + } + } + if ($Raw) { + print "$num "; + print "$time " if($ListType eq "LONG"); + if ($title =~ /^ => (.*)$TopicSep (.*)$/) { + $title = "$1$TopicSep $2"; # seems to be a topic! + } + print "$title\n"; + } + else { + # $title should now look as: "A sample note " + print C "$L $NUMC$num$_NUMC $R"; + if ($ListType eq "LONG") { + print C "$L$TIMEC" . $time . " $_TIMEC$R"; + } + print C "$L $NOTEC" . $title . "$_NOTEC $R\n"; + print C $LINE; + } + } + else { + # we will not reach this in raw-mode, therefore no decision here! + chomp $note; + $Space = " " x (($maxlen + $timelen) - 16); + print C $LINE; + print C "$L $NUMC$num$_NUMC $R$L$TIMEC$time$_TIMEC $Space$R\n"; + print C $LINE; + print C $NOTEC . $note . $_NOTEC . "\n"; + print C $LINE; + } + } sub C -{ + { my(%Color, $default, $S, $Col, $NC, $T); - # \033[1m%30s\033[0m - %Color = ( 'black' => '0;30', - 'red' => '0;31', - 'green' => '0;32', - 'yellow' => '0;33', - 'blue' => '0;34', - 'magenta' => '0;35', - 'cyan' => '0;36', - 'white' => '0;37', - 'B' => '1;30', - 'BLACK' => '1;30', - 'RED' => '1;31', - 'GREEN' => '1;32', - 'YELLOW' => '1;33', - 'BLUE' => '1;34', - 'MAGENTA' => '1;35', - 'CYAN' => '1;36', - 'WHITE' => '1;37', - 'black_' => '4;30', - 'red_' => '4;31', - 'green_' => '4;32', - 'yellow_' => '4;33', - 'blue_' => '4;34', - 'magenta_' => '4;35', - 'cyan_' => '4;36', - 'white_' => '4;37', - 'blackI' => '7;30', - 'redI' => '7;31', - 'greenI' => '7;32', - 'yellowI' => '7;33', - 'blueI' => '7;34', - 'magentaI' => '7;35', - 'cyanI' => '7;36', - 'whiteI' => '7;37' - ); - $default = "\033[0m"; - $S = $_[0]; - foreach $Col (%Color) - { - if ($S =~ /<$Col>/g) - { - if($COLOR ne "NO") - { - $NC = "\033[" . $Color{$Col} . "m"; - $S =~ s/<$Col>/$NC/g; - $S =~ s/<\/$Col>/$default/g; - } - else - { - $S =~ s/<$Col>//g; - $S =~ s/<\/$Col>//g; - } - } - } - return $S; -} + # \033[1m%30s\033[0m + %Color = ( 'black' => '0;30', + 'red' => '0;31', + 'green' => '0;32', + 'yellow' => '0;33', + 'blue' => '0;34', + 'magenta' => '0;35', + 'cyan' => '0;36', + 'white' => '0;37', + 'B' => '1;30', + 'BLACK' => '1;30', + 'RED' => '1;31', + 'GREEN' => '1;32', + 'YELLOW' => '1;33', + 'BLUE' => '1;34', + 'MAGENTA' => '1;35', + 'CYAN' => '1;36', + 'WHITE' => '1;37', + 'black_' => '4;30', + 'red_' => '4;31', + 'green_' => '4;32', + 'yellow_' => '4;33', + 'blue_' => '4;34', + 'magenta_' => '4;35', + 'cyan_' => '4;36', + 'white_' => '4;37', + 'blackI' => '7;30', + 'redI' => '7;31', + 'greenI' => '7;32', + 'yellowI' => '7;33', + 'blueI' => '7;34', + 'magentaI' => '7;35', + 'cyanI' => '7;36', + 'whiteI' => '7;37' + ); + $default = "\033[0m"; + $S = $_[0]; + foreach $Col (%Color) { + if ($S =~ /<$Col>/g) { + if ($COLOR ne "NO") { + $NC = "\033[" . $Color{$Col} . "m"; + $S =~ s/<$Col>/$NC/g; + $S =~ s/<\/$Col>/$default/g; + } + else { + $S =~ s/<$Col>//g; + $S =~ s/<\/$Col>//g; + } + } + } + return $S; + } sub num_bereich -{ + { my($m,@LR,@Sorted_LR,$i); # $number is the one we want to delete! # But does it contain kommas? - @NumBlock = (); #reset + @NumBlock = (); #reset $m = 0; - if($number =~ /\,/) - { - # accept -d 3,4,7 - @NumBlock = split(/\,/,$number); + if ($number =~ /\,/) { + # accept -d 3,4,7 + @NumBlock = split(/\,/,$number); } - elsif($number =~ /^\d+\-\d+$/) - { - # accept -d 3-9 - @LR = split(/\-/,$number); - @Sorted_LR = (); + elsif ($number =~ /^\d+\-\d+$/) { + # accept -d 3-9 + @LR = split(/\-/,$number); + @Sorted_LR = (); - if($LR[0] > $LR[1]) - { - @Sorted_LR = ($LR[1], $LR[0]); - } - elsif($LR[0] == $LR[1]) - { - # 0 and 1 are the same - @Sorted_LR = ($LR[0], $LR[1]); - } - else - { - @Sorted_LR = ($LR[0], $LR[1]); - } + if ($LR[0] > $LR[1]) { + @Sorted_LR = ($LR[1], $LR[0]); + } + elsif ($LR[0] == $LR[1]) { + # 0 and 1 are the same + @Sorted_LR = ($LR[0], $LR[1]); + } + else { + @Sorted_LR = ($LR[0], $LR[1]); + } - for($i=$Sorted_LR[0]; $i<=$Sorted_LR[1]; $i++) - { - # from 3-6 create @NumBlock (3,4,5,6) - $NumBlock[$m] = $i; - $m++; - } + for ($i=$Sorted_LR[0]; $i<=$Sorted_LR[1]; $i++) { + # from 3-6 create @NumBlock (3,4,5,6) + $NumBlock[$m] = $i; + $m++; + } } - else - { - @NumBlock = ($number); + else { + @NumBlock = ($number); } -} + } sub getdate -{ + { my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; - $mon += 1; - $mon =~ s/^(\d)$/0$1/; + $mon += 1; + $mon =~ s/^(\d)$/0$1/; $hour =~ s/^(\d)$/0$1/; - $min =~ s/^(\d)$/0$1/; - $sec =~ s/^(\d)$/0$1/; + $min =~ s/^(\d)$/0$1/; + $sec =~ s/^(\d)$/0$1/; $mday =~ s/^(\d)$/0$1/; return "$mday.$mon.$year $hour:$min:$sec"; -} + } sub gettemp -{ - my($random, @range); - @range=('0'..'9','a'..'z','A'..'Z'); - srand(time||$$); - for (0..10) { - $random .= $range[rand(int($#range)+1)]; + { + my($random, @range); + @range=('0'..'9','a'..'z','A'..'Z'); + srand(time||$$); + for (0..10) { + $random .= $range[rand(int($#range)+1)]; + } + my $tempfile = $TempDir . "/" . $USER . "." . $random; + if (-e $tempfile) { + # avoid race conditions! + unlink $tempfile; + } + return $tempfile; } - my $tempfile = $TempDir . "/" . $USER . "." . $random; - if (-e $tempfile) { - # avoid race conditions! - unlink $tempfile; - } - return $tempfile; -} sub help -{ -my $B = ""; -my $BB = ""; -my($S, $L, $T, $Q, $H, $N, $D, $E); -$L = $B . "L" . $BB . $NOTEC; -$T = $B . "T" . $BB . $NOTEC; -$Q = $B . "Q" . $BB . $NOTEC; -$H = $B . "?" . $BB . $NOTEC; -$N = $B . "N" . $BB . $NOTEC; -$D = $B . "D" . $BB . $NOTEC; -$E = $B . "E" . $BB . $NOTEC; -$S = $B . "S" . $BB . $NOTEC; + { + my $B = ""; + my $BB = ""; + my($S, $L, $T, $Q, $H, $N, $D, $E); + $L = $B . "L" . $BB . $NOTEC; + $T = $B . "T" . $BB . $NOTEC; + $Q = $B . "Q" . $BB . $NOTEC; + $H = $B . "?" . $BB . $NOTEC; + $N = $B . "N" . $BB . $NOTEC; + $D = $B . "D" . $BB . $NOTEC; + $E = $B . "E" . $BB . $NOTEC; + $S = $B . "S" . $BB . $NOTEC; -print C qq~$BORDERC + print C qq~$BORDERC ----------------------------------------------------------------------$_BORDERC $TOPICC HELP for interactive note $version $_TOPICC $NOTEC @@ -1431,73 +1359,61 @@ $E Edit a note. Usage is similar to Delete but you can only edit note a time. $H This help screen. $Q Exit the program.~; -if($TOPIC) -{ -print C qq~ + if ($TOPIC) { + print C qq~ $T print a list of all existing topics as a tree. T prints the tree - with all notes under each topic. + with all notes under each topic.~; + } + print C qq~ - You can change the actual topic by simply typing it's name or by using - the command "cd", i.e. "cd mytopic". You can create a new topic by creating - a new note, the first line must be the topic borderd by slashes, i.e.: - "/newtopic/". The slash is the default topic-sepearator, but you can over- - ride this in the config! If you type just ".." instead of a topic, you will - go one step back in your topic-structure. -~; -} -print C qq~ -$NOTEC -All commands except the List and Topic commands are case insensitive. $_NOTEC $BORDERC +All commands except the List and Topic commands are case insensitive. +Read the note(1) manpage for more details.$BORDERC ----------------------------------------------------------------------$_BORDERC ~; -} + } sub display_tree { - # displays a tree of all topics - my(%TREE, %res, $n, $t, $num, @nodes, $firstline, $text, $untext); - %res = $db->get_all(); - foreach $num (keys %res) - { - $n = $res{$num}->{'note'}; - $t = $res{$num}->{'date'}; - # this allows us to have multiple topics (subtopics!) - my ($firstline,$text,$untext) = split /\n/, $n, 3; - if($firstline =~ /^($TopicSep)/) - { - $firstline =~ s/($TopicSep)*$//; #remove TopicSepatator - @nodes = split(/$TopicSep/,$firstline); - } - else - { - @nodes = ();("$TopicSep"); - $text = $firstline; - } - &tree($num, $text, \%TREE, @nodes); - } - #return if ($num == 0); - # now that we have build our tree (in %TREE) go on t display it: - print C $BORDERC . "\n[" . $TopicSep . $BORDERC . "]\n"; - &print_tree(\%{$TREE{''}},"") if(%TREE); - print C $BORDERC . $_BORDERC . "\n"; + # displays a tree of all topics + my(%TREE, %res, $n, $t, $num, @nodes, $firstline, $text, $untext); + %res = $db->get_all(); + foreach $num (keys %res) { + $n = $res{$num}->{'note'}; + $t = $res{$num}->{'date'}; + # this allows us to have multiple topics (subtopics!) + my ($firstline,$text,$untext) = split /\n/, $n, 3; + if ($firstline =~ /^($TopicSep)/) { + $firstline =~ s/($TopicSep)*$//; #remove TopicSepatator + @nodes = split(/$TopicSep/,$firstline); + } + else { + @nodes = (); #("$TopicSep"); + $text = $firstline; + } + &tree($num, $text, \%TREE, @nodes); + } + #return if ($num == 0); + # now that we have build our tree (in %TREE) go on t display it: + print C $BORDERC . "\n[" . $TopicSep . $BORDERC . "]\n"; + &print_tree(\%{$TREE{''}},"") if(%TREE); + print C $BORDERC . $_BORDERC . "\n"; } sub tree { - my($num, $text, $LocalTree, $node, @nodes) = @_; - if(@nodes) { - if(! exists $LocalTree->{$node}->{$NoteKey}) { - $LocalTree->{$node}->{$NoteKey} = []; - } - &tree($num, $text, $LocalTree->{$node}, @nodes); + my($num, $text, $LocalTree, $node, @nodes) = @_; + if (@nodes) { + if (! exists $LocalTree->{$node}->{$NoteKey}) { + $LocalTree->{$node}->{$NoteKey} = []; } - else { - if(length($text) > ($maxlen - 5)) { - $text = substr($text, 0, ($maxlen -5)); - } - $text = $text . " (" . $NUMC . "#" . $num . $_NUMC . $NOTEC . ")" . $_NOTEC if($text ne ""); - push @{$LocalTree->{$node}->{$NoteKey}}, $text; + &tree($num, $text, $LocalTree->{$node}, @nodes); + } else { + if (length($text) > ($maxlen - 5)) { + $text = substr($text, 0, ($maxlen -5)); } + $text = $text . " (" . $NUMC . "#" . $num . $_NUMC . $NOTEC . ")" . $_NOTEC if($text ne ""); + push @{$LocalTree->{$node}->{$NoteKey}}, $text; + } } @@ -1507,13 +1423,13 @@ sub print_tree { my $prefix=shift; my @notes=@{$hashref->{$NoteKey}}; my @subnotes=sort grep { ! /^$NoteKey$/ } keys %$hashref; - if($TreeType eq "LONG") { - for my $note (@notes) { - if($note ne "") { - print C $BORDERC ;# . $prefix. "|\n"; - print C "$prefix+---<" . $NOTEC . $note . $BORDERC . ">" . $_NOTEC . "\n"; - } - } + if ($TreeType eq "LONG") { + for my $note (@notes) { + if ($note ne "") { + print C $BORDERC ; # . $prefix. "|\n"; + print C "$prefix+---<" . $NOTEC . $note . $BORDERC . ">" . $_NOTEC . "\n"; + } + } } for my $index (0..$#subnotes) { print C $BORDERC . $prefix. "|\n"; @@ -1524,64 +1440,67 @@ sub print_tree { sub getconfig -{ - my($configfile) = @_; - my ($home, $value, $option); - # checks are already done, so trust myself and just open it! - open CONFIG, "<$configfile" || die $!; - while() { - chomp; - next if(/^\s*$/ || /^\s*#/); - my ($option,$value) = split /\s\s*=?\s*/, $_, 2; - $value =~ s/\s*$//; - $home = $value if (/^Home/); - $libpath = $value if (/^LibPath/); - $dbdriver = $value if (/^DbDriver/); - $dbhost = $value if (/^DbHost/); - $dbuser = $value if (/^DbUser/); - $dbpasswd = $value if (/^DbPasswd/); - $dbname = $value if (/^DbName/); - $table = $value if (/^DbTable/); - $fnum = $value if (/^FieldNumber/); - $fnote = $value if (/^FieldNote/); - $fdate = $value if (/^FieldDate/); - $NOTEDB = $value if (/^NoteDb/); - $MAX_NOTE = $value if (/^MaxNoteByte/); - $MAX_TIME = $value if (/^MaxTimeByte/); - $CRYPT_METHOD = $value if (/^CryptMethod/); - $USE_CRYPT = "YES" if (/^UseEncryption/ && $value == 1); - $USE_CRYPT = undef if (/^UseEncryption/ && $value == 0); - $ALWAYS_INT = "YES" if (/^AlwaysInteractive/ && $value == 1); - $ALWAYS_INT = undef if (/^AlwaysInteractive/ && $value == 0); - $DEFAULT_LIST = "LONG" if (/^DefaultLong/ && $value == 1); - $DEFAULT_LIST = undef if (/^DefaultLong/ && $value == 0); - $ALWAYS_EDIT = "YES" if (/^AlwaysEditor/ && $value == 1); - $ALWAYS_EDIT = undef if (/^AlwaysEditor/ && $value == 0); - $KEEP_TIMESTAMP = "YES" if (/^KeepTimeStamp/ && $value == 1); - $KEEP_TIMESTAMP = undef if (/^KeepTimeStamp/ && $value == 0); - $COLOR = "YES" if (/^UseColors/ && $value == 1); - $COLOR = "NO" if (/^UseColors/ && $value == 0); - $TopicSep = $value if (/^TopicSeparator/); - $maxlen = $value if (/^MaxLen/); - $BORDER_COLOR = $value if (/^BorderColor/); - $NUM_COLOR = $value if (/^NumberColor/); - $NOTE_COLOR = $value if(/^NoteColor/); - $TIME_COLOR = $value if (/^TimeColor/); - $TOPIC_COLOR = $value if (/^TopicColor/); - $PreferredEditor = $value if (/^PreferredEditor/); - $FormatText = $value if (/^FormatText/); - $TempDir = $value if (/^TempDirectory/); - } - chomp $home; - $home =~ s/\/*$//; # cut eventually / at the end - $HOME = eval($home); - if($NOTEDB =~ /^(~\/)(.*)$/) { - $NOTEDB = "/home/" . $USER . "/" . $2; - } - $libpath =~ s/\/*$//; + { + my($configfile) = @_; + my ($home, $value, $option); + # checks are already done, so trust myself and just open it! + open CONFIG, "<$configfile" || die $!; + while () { + chomp; + next if(/^\s*$/ || /^\s*#/); + my ($option,$value) = split /\s\s*=?\s*/, $_, 2; + $value =~ s/\s*$//; + $home = $value if (/^Home/); + $libpath = $value if (/^LibPath/); + $dbdriver = $value if (/^DbDriver/); + $dbhost = $value if (/^DbHost/); + $dbuser = $value if (/^DbUser/); + $dbpasswd = $value if (/^DbPasswd/); + $encrypt_passwd = $value if (/^encrypt_passwd/); + $dbname = $value if (/^DbName/); + $table = $value if (/^DbTable/); + $fnum = $value if (/^FieldNumber/); + $fnote = $value if (/^FieldNote/); + $fdate = $value if (/^FieldDate/); + $SHORT_CD = $value if (/^ShortCd/); + $NOTEDB = $value if (/^NoteDb/); + $MAX_NOTE = $value if (/^MaxNoteByte/); + $MAX_TIME = $value if (/^MaxTimeByte/); + $CRYPT_METHOD = $value if (/^CryptMethod/); + $USE_CRYPT = "YES" if (/^UseEncryption/ && $value == 1); + $USE_CRYPT = undef if (/^UseEncryption/ && $value == 0); + $ALWAYS_INT = "YES" if (/^AlwaysInteractive/ && $value == 1); + $ALWAYS_INT = undef if (/^AlwaysInteractive/ && $value == 0); + $DEFAULT_LIST = "LONG" if (/^DefaultLong/ && $value == 1); + $DEFAULT_LIST = undef if (/^DefaultLong/ && $value == 0); + $ALWAYS_EDIT = "YES" if (/^AlwaysEditor/ && $value == 1); + $ALWAYS_EDIT = undef if (/^AlwaysEditor/ && $value == 0); + $KEEP_TIMESTAMP = "YES" if (/^KeepTimeStamp/ && $value == 1); + $KEEP_TIMESTAMP = undef if (/^KeepTimeStamp/ && $value == 0); + $COLOR = "YES" if (/^UseColors/ && $value == 1); + $COLOR = "NO" if (/^UseColors/ && $value == 0); + $TopicSep = $value if (/^TopicSeparator/); + $maxlen = $value if (/^MaxLen/); + $BORDER_COLOR = $value if (/^BorderColor/); + $NUM_COLOR = $value if (/^NumberColor/); + $NOTE_COLOR = $value if (/^NoteColor/); + $TIME_COLOR = $value if (/^TimeColor/); + $TOPIC_COLOR = $value if (/^TopicColor/); + $PreferredEditor = $value if (/^PreferredEditor/); + $FormatText = $value if (/^FormatText/); + $TempDir = $value if (/^TempDirectory/); + $USE_CACHE = $value if (/^Cache/); + } + chomp $home; + $home =~ s/\/*$//; # cut eventually / at the end + $HOME = eval($home); + if ($NOTEDB =~ /^(~\/)(.*)$/) { + $NOTEDB = "/home/" . $USER . "/" . $2; + } + $libpath =~ s/\/*$//; - close CONFIG; -} + close CONFIG; + } @@ -1589,6 +1508,9 @@ sub getconfig __END__ # # $Log: note,v $ +# Revision 1.3 2000/07/21 06:41:25 zarahg +# 638: precedence bug fixed +# # Revision 1.2 2000/07/09 22:10:03 zarahg # tempfile management more secure now. new option TempDirectory. thx to Donald. # diff --git a/bin/system_and.patch b/bin/system_and.patch new file mode 100644 index 0000000..d3e669a --- /dev/null +++ b/bin/system_and.patch @@ -0,0 +1,19 @@ +*** note Mon Jul 10 00:10:03 2000 +--- _note Fri Jul 21 08:38:22 2000 +*************** +*** 635,641 **** + $editor = &find_editor; + if($editor) + { +! system "touch", $TEMP && die $!; + system "chattr", "+s", $TEMP; # ignore errors, since only on ext2 supported! + system $editor, $TEMP; + } +--- 635,641 ---- + $editor = &find_editor; + if($editor) + { +! system "touch", $TEMP and die $!; + system "chattr", "+s", $TEMP; # ignore errors, since only on ext2 supported! + system $editor, $TEMP; + } diff --git a/config/CVS/Entries b/config/CVS/Entries new file mode 100644 index 0000000..1155b76 --- /dev/null +++ b/config/CVS/Entries @@ -0,0 +1,2 @@ +/noterc/1.3/Sun Jul 9 22:37:15 2000// +D diff --git a/config/CVS/Repository b/config/CVS/Repository new file mode 100644 index 0000000..5fac8d5 --- /dev/null +++ b/config/CVS/Repository @@ -0,0 +1 @@ +NOTE/config diff --git a/config/CVS/Root b/config/CVS/Root new file mode 100644 index 0000000..9c415c0 --- /dev/null +++ b/config/CVS/Root @@ -0,0 +1 @@ +zarahg@cvs.htnews.sourceforge.net:/cvsroot/htnews diff --git a/config/noterc b/config/noterc index ee85127..dcf1adb 100644 --- a/config/noterc +++ b/config/noterc @@ -42,6 +42,8 @@ DbDriver binary #FieldNumber number #FieldNote note #FieldDate date +# uncomment for using an encrypted password, generate it with note "--encrypt" +#encrypt_passwd 1 #### specific end ### @@ -152,7 +154,16 @@ TempDirectory /home/you/tmp +# You can jump to a topic by typing "cd 13" in interactive mode. +# You need to set thi soption to 1 if you want to use this feature. +ShortCd 0 + + +# note can use a cached copy of the note database for list/tree/search +# this is currently only supported by the binary and the mysql backends +# set it to 1 to turn it on, the default is 0 (off) +Cache 0 # That's all about it for now. # If you still have any questiosn, please feel free to contact # me by email: Thomas Linden diff --git a/config/rc b/config/rc new file mode 100644 index 0000000..4e1f7c0 --- /dev/null +++ b/config/rc @@ -0,0 +1,154 @@ +comments start with #, empty lines will be ignored. +1 turns an option on, 0 turns it off. +An option consists of an atribute-value pair separated +by minimum one space (more spaces and/or tabs are allowed) + + +Your home directory, better do not change it! +can be an environment variable or a path +Home $ENV{'HOME'} + + +specify the path, where the NOTEDB lib directory +resides. This will only used if it is not +installed inside the perl-lib directory structure! +LibPath /usr/local/lib + + +you need to decide which database backend you want +to use. Please refer to the corresponding documentation +for closer information about the certain backend! +Currently supported types: "binary", "dbm" or "mysql". +You must also edit/uncomment one section below for the +backend you want to use! +DbDriver binary + + +backend specific settings for sql backend +DbHost localhost +DbUser you +DbPasswd +DbName mynotes +DbTable note +FieldNumber number +FieldNote note +FieldDate date +use an encrypted password, generate it with note "--encrypt_passwd" +encrypt_passwd 1 +#### specific end ### + + +backend specific settings for binary(default) backend +NoteDb ~/.notedb +Define the maximum bytes fields can have in a +note-entry. Do not change MaxTimeByte to less than 64! + +MaxNoteByte 4096 +MaxTimeByte 64 +#### specific end ### + + +backend specific settings for DBM backend +this must be an existing directory! +#DbName /home/you/.notedbm +#### specific end ### + +You can use encryption with note, that means notes and +timestamps will be stored encrypted. This is supported +by every db-backend. +Set to 1 to turn it on. The Default is 0 (off) +UseEncryption 0 + +Specify the encryption protocol. The appropriate perl +module needs to be installed. Possible velues are +IDEA, DES or Blowfish, the default is IDEA. +CryptMethod IDEA + + +You can run note always in interactive mode by simply +typing "note". Set this option to 1 to turn it on. +The default is 0 (off). +AlwaysInteractive 0 + + +In interactive mode, note issues a list command if you +simply hit enter. By turning this on, it will issue a +longlist command instead if you hit just enter. +The default is 0 (off) +DefaultLong 0 + + + +You can use an external editor everytime from note instead +of STDIN for creating new notes. Set to 1 to turn it on. +The default is 0 (off). +AlwaysEditor 0 + + +uncomment and edit it, if you want to use another +editor than the default $EDITOR or as fallback vi. +#PreferredEditor emacs + + +If you dont prefer that note updates the timestamp of a +note after editing, turn this on. It will +keep the original timestamp if this option is set. +The default is 0(off), to turn it on set to 1. +KeepTimeStamp 0 + + +You can specify your own topic separator here. +the default topic separator is a normal slash: "/" +see README for details about topics! +TopicSeparator / + + +The maximum width for displaying a note, in CHARS. +Depends on your screen-size. You can set it to +"auto", if you wish that note sould determine the +available size, but it experimental, be aware! +MaxLen 30 + + +note can use colors for output, set this option to +1, if you don't want it, or if your terminal does +not support it, set to 0. The default is 1 (on). +UseColors 1 + + +Color-definitions of the various items. Will only +take effect, if "UseColors" is turned on! +BorderColor BLACK +NumberColor blue +NoteColor green +TimeColor black +TopicColor BLACK +The following colors are available: +black, red, green, yellow, blue, magenta, cyan and white. +for bold color write it uppercase (BLACK will be bold black) +for underlined color append an underscore (blue_ will be underlined blue) +for inverted color append an "I" (greenI will be inverted green) + + +Additional to colors, you can also do a little bit of formatting your +notes (bold, underlined, italic), see README! +You need to set this Option to 1, if you decide to make use of this +capabily +FormatText 1 + + +You might specify your own directory for temporary files. +note needs to create some temp files during editing of notes. +You could protect this directory using the command: chmod 700 directory. +The default is /tmp +TempDirectory /home/you/tmp + + + +You can jump to a topic by typing "cd 13" in interactive mode. +You need to set thi soption to 1 if you want to use this feature. +ShortCd 0 + +That's all about it for now. +If you still have any questiosn, please feel free to contact +me by email: Thomas Linden diff --git a/mysql/CVS/Entries b/mysql/CVS/Entries new file mode 100644 index 0000000..f1d9103 --- /dev/null +++ b/mysql/CVS/Entries @@ -0,0 +1,5 @@ +/README/1.1.1.1/Sat Jul 1 14:40:52 2000// +/install.sh/1.1.1.1/Sat Jul 1 14:40:52 2000// +/permissions/1.1.1.1/Sat Jul 1 14:40:52 2000// +/sql/1.1.1.1/Sat Jul 1 14:40:52 2000// +D diff --git a/mysql/CVS/Repository b/mysql/CVS/Repository new file mode 100644 index 0000000..7e689e0 --- /dev/null +++ b/mysql/CVS/Repository @@ -0,0 +1 @@ +NOTE/mysql diff --git a/mysql/CVS/Root b/mysql/CVS/Root new file mode 100644 index 0000000..9c415c0 --- /dev/null +++ b/mysql/CVS/Root @@ -0,0 +1 @@ +zarahg@cvs.htnews.sourceforge.net:/cvsroot/htnews diff --git a/note b/note index db622a5..5107e58 100755 --- a/note +++ b/note @@ -1,5 +1,5 @@ #!/usr/bin/perl -# $Id: note,v 1.27 2000/05/16 23:51:35 thomas Exp thomas $ +# $Id: note,v 1.1.1.1 2000/07/01 14:40:50 zarahg Exp $ # # # note - console notes management with database and encryption support. @@ -1560,6 +1560,9 @@ sub getconfig __END__ # # $Log: note,v $ +# Revision 1.1.1.1 2000/07/01 14:40:50 zarahg +# initial import +# # Revision 1.27 2000/05/16 23:51:35 thomas # fixed many option-parsing related bugd! # diff --git a/note.1 b/note.1 new file mode 100644 index 0000000..0c3d567 --- /dev/null +++ b/note.1 @@ -0,0 +1,636 @@ +.rn '' }` +''' $RCSfile$$Revision$$Date$ +''' +''' $Log$ +''' +.de Sh +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp +.if t .sp .5v +.if n .sp +.. +.de Ip +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.de Vb +.ft CW +.nf +.ne \\$1 +.. +.de Ve +.ft R + +.fi +.. +''' +''' +''' Set up \*(-- to give an unbreakable dash; +''' string Tr holds user defined translation string. +''' Bell System Logo is used as a dummy character. +''' +.tr \(*W-|\(bv\*(Tr +.ie n \{\ +.ds -- \(*W- +.ds PI pi +.if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +.if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +.ds L" "" +.ds R" "" +''' \*(M", \*(S", \*(N" and \*(T" are the equivalent of +''' \*(L" and \*(R", except that they are used on ".xx" lines, +''' such as .IP and .SH, which do another additional levels of +''' double-quote interpretation +.ds M" """ +.ds S" """ +.ds N" """"" +.ds T" """"" +.ds L' ' +.ds R' ' +.ds M' ' +.ds S' ' +.ds N' ' +.ds T' ' +'br\} +.el\{\ +.ds -- \(em\| +.tr \*(Tr +.ds L" `` +.ds R" '' +.ds M" `` +.ds S" '' +.ds N" `` +.ds T" '' +.ds L' ` +.ds R' ' +.ds M' ` +.ds S' ' +.ds N' ` +.ds T' ' +.ds PI \(*p +'br\} +.\" If the F register is turned on, we'll generate +.\" index entries out stderr for the following things: +.\" TH Title +.\" SH Header +.\" Sh Subsection +.\" Ip Item +.\" X<> Xref (embedded +.\" Of course, you have to process the output yourself +.\" in some meaninful fashion. +.if \nF \{ +.de IX +.tm Index:\\$1\t\\n%\t"\\$2" +.. +.nr % 0 +.rr F +.\} +.TH note 1 "note version 1.1.0" "10/Aug/2000" "Documentation" +.UC +.if n .hy 0 +.if n .na +.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +.de CQ \" put $1 in typewriter font +.ft CW +'if n "\c +'if t \\&\\$1\c +'if n \\&\\$1\c +'if n \&" +\\&\\$2 \\$3 \\$4 \\$5 \\$6 \\$7 +'.ft R +.. +.\" @(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2 +. \" AM - accent mark definitions +.bd B 3 +. \" fudge factors for nroff and troff +.if n \{\ +. ds #H 0 +. ds #V .8m +. ds #F .3m +. ds #[ \f1 +. ds #] \fP +.\} +.if t \{\ +. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +. ds #V .6m +. ds #F 0 +. ds #[ \& +. ds #] \& +.\} +. \" simple accents for nroff and troff +.if n \{\ +. ds ' \& +. ds ` \& +. ds ^ \& +. ds , \& +. ds ~ ~ +. ds ? ? +. ds ! ! +. ds / +. ds q +.\} +.if t \{\ +. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +. ds ? \s-2c\h'-\w'c'u*7/10'\u\h'\*(#H'\zi\d\s+2\h'\w'c'u*8/10' +. ds ! \s-2\(or\s+2\h'-\w'\(or'u'\v'-.8m'.\v'.8m' +. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +. ds q o\h'-\w'o'u*8/10'\s-4\v'.4m'\z\(*i\v'-.4m'\s+4\h'\w'o'u*8/10' +.\} +. \" troff and (daisy-wheel) nroff accents +.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +.ds v \\k:\h'-(\\n(.wu*9/10-\*(#H)'\v'-\*(#V'\*(#[\s-4v\s0\v'\*(#V'\h'|\\n:u'\*(#] +.ds _ \\k:\h'-(\\n(.wu*9/10-\*(#H+(\*(#F*2/3))'\v'-.4m'\z\(hy\v'.4m'\h'|\\n:u' +.ds . \\k:\h'-(\\n(.wu*8/10)'\v'\*(#V*4/10'\z.\v'-\*(#V*4/10'\h'|\\n:u' +.ds 3 \*(#[\v'.2m'\s-2\&3\s0\v'-.2m'\*(#] +.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +.ds ae a\h'-(\w'a'u*4/10)'e +.ds Ae A\h'-(\w'A'u*4/10)'E +.ds oe o\h'-(\w'o'u*4/10)'e +.ds Oe O\h'-(\w'O'u*4/10)'E +. \" corrections for vroff +.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +. \" for low resolution devices (crt and lpr) +.if \n(.H>23 .if \n(.V>19 \ +\{\ +. ds : e +. ds 8 ss +. ds v \h'-1'\o'\(aa\(ga' +. ds _ \h'-1'^ +. ds . \h'-1'. +. ds 3 3 +. ds o a +. ds d- d\h'-1'\(ga +. ds D- D\h'-1'\(hy +. ds th \o'bp' +. ds Th \o'LP' +. ds ae ae +. ds Ae AE +. ds oe oe +. ds Oe OE +.\} +.rm #[ #] #H #V #F C +.SH "NAME" +note \- a perl script for maintaining notes. +.SH "SYNPOPSIS" +note [options] [ number [,number...]] +.SH "DESCRIPTION" +\fBnote\fR is a small console program written in perl, which allows +you to manage notes similar to programs like \*(L"knotes\*(R" but from +the commandline. Note can use different database-backends for +notes-storage. It ships with a DBI\-based mysql-\fImodule\fR\|(which +can also be used for other by DBI supported DBMS), another +module, which uses a binary file for storage and a DBM module. +Note supports since version 1.0.0 \fIencryption\fR\|(IDEA or DES)! +.SH "OPTIONS" +.Ip "\fI\-c, --config file\fR" 5 +Use another config file than the default ~/.noterc. +.Ip "\fI\-l, --list [topic]\fR" 5 +Lists all existing notes. If no topic were specified, +it will display a list of all existing topics. +See the section \fI\s-1TOPICS\s0\fR for details about topics. +.Ip "\fI\-L, --longlist [topic]\fR" 5 +The same as \fI\-l\fR but prints also the timestamp of the notes. +.Ip "\fI\-t, --topic\fR" 5 +Prints a list of all topics as a tree. +.Ip "\fI\-T, --longtopic\fR" 5 +Prints the topic-tree with the notes under each topic. +.Ip "\fI\-s, --search string\fR" 5 +Searches for trough the notes database. See the section +\fI\s-1SEARCHING\s0\fR for details about the search engine. +.Ip "\fI\-e, --edit number\fR" 5 +Edit the note with the number using your default editor +or the one you specified in the config file. +.Ip "\fI\-d, --delete number\fR" 5 +Delete the note with the number . You can delete multiple notes +with one command. \*(L"1-4\*(R" deletes the notes 1,2,3,4. And \*(L"1,5,7\*(R" deletes +the specified ones. +.Ip "\fI\-D, --Dump [file | \-]\fR" 5 +Dumps all notes to the textfile . If is a \*(L"\-\*(R" it will +be printed out to standard output (\s-1STDOUT\s0). +.Ip "\fI\-I, --Import file | \-\fR" 5 +Imports a previously dumped textfile into the +note database. Data will be appended by default. +You can also specify a dash \fInote \-I \-\fR instead of a , +which causes note, silently to read in a dump from \s-1STDIN\s0. +.Ip "\fI\-o, --overwrite\fR" 5 +Only suitable for use with --Import. Overwrites an +existing notedb. Use with care. +.Ip "\fI\-r, --raw\fR" 5 +Raw mode, output will not be formatted. Works not in interactive +mode, only on cmd-line for list and display. That means, no colors +will be used and no lines or titles. +.Ip "\fI\-i, --interactive\fR" 5 +Start note in interactive mode. See the section \fI\s-1INTERACTIVE\s0 \s-1MODE\s0\fR +for details on this mode. + +.Ip "\fI--encrypt cleartext\fR" 5 +Encrypt the given clear text string. You would need that if you want to +store the mysql password not in cleartext in the \fIconfig\fR\|(if you are using +the mysql backend!). +.Ip "\fI\-h, --help\fR" 5 +Display this help screen. +.Ip "\fI\-v, --version\fR" 5 +Display the version number. +.Ip "\fB\-\fR" 5 +If you run note just with one dash: \fBnote \-\fR, then it will read in a new +note from \s-1STDIN\s0 until \s-1EOF\s0. This makes it possible to pipe text into a new note, i.e.: +.Sp +.Vb 1 +\& cat sometextfile | note - +.Ve +.SH "USAGE" +.Sh "\s-1GENERAL\s0 \s-1USAGE\s0" +If you don't know, how to run note, try \*(L"note \-h\*(R" first. +It will tell you all available commandline options. +.PP +To create a new note, simply run \*(L"note\*(R". You can enter +the note (the length is by default limited to 4096 bytes, +which you can change from your config file if you are using +the binary backend, therwise there is no limitation). +End by typing a . on a line itself. note will tell you the +number of the note. +.PP +If you want to view the note, type \*(L"note 1\*(R", if the notenumber +was 1. +.PP +If you want to get an overview of all notes, type \*(L"note \-l\*(R". +You will get a list of all notes, containing the number, +the first line and the creation date. If topic-support is +turned on (which is by default), then all subtopics under the +current topic will be displayed first. +If you want to get a listing of all +If you want to see the timestamps, use \*(L"\-L\*(R" instead of \*(L"\-l\*(R". +Read more about topics below in the section \*(L"Topics\*(R". +You can also specify the topic which notes you want to see: +\*(L"\-l mytopic\*(R" does the trick. +Additional, you might want to get an overview of your topic- +strcture. You can use the command \*(L"\-t\*(R" in this case, which +will display a tree-view of your tpic-structure. You can +use the command \*(L"\-T\*(R" if you want to see the notes under each +topic too. \*(L"\-T\*(R" will also show the number of each note. +.PP +To edit a certain note, type \*(L"note \-e 1\*(R". It will invoke your +editor (vi or pico). You can edit it, after saving, note +will store the changed note to the database. +.PP +Of course you can drop a certain note: \*(L"note \-d 1\*(R" deletes +note number 1. If a note in the middle or the beginning of +the database will be deleted, note will recount the other +existent notes. For example there are 3 notes, number 1, 2 +and 3. If you delete number 2, then number 3 will become +number 2. +You can also make use of the extended delete-syntax: +To delete note 1 and 2, use \*(L"\-d 1,2\*(R" +To delete note 1,2 and 3, use \*(L"\-d 1-3\*(R". +.Sh "\s-1SEARCHING\s0" +If you cannot remember, which note you are looking for, you +can use the search capability of note: \*(L"note \-s \*(R". +note will search the whole note database case insensitive for +an occurence of this string and tell you the number and first- +line it has. +.PP +You can extend the searchstring using \fB\s-1AND\s0\fR, \fB\s-1OR\s0\fR ( and ) and +shell-like wildcards: +.PP +.Vb 1 +\& $ note -s "moses AND lenin" +.Ve +or: +.PP +.Vb 1 +\& $ note -s "(mike OR arnold) AND (jackson OR schwarzenegger)" +.Ve +If note finds a note, which first line is a topic, then it will +display it's second line. +.PP +These rules apply for the interactive search too. +.Sh "\s-1TOPICS\s0" +If topic-support is turned on (which is by default), the various +notes are sorted under various topics. There is no special database +field for the topic. Instead the topic will be stored right in the +note. +If the first line of your note contains some text bordered by slashes +(or whatever you prefer, set \*(L"TopicSeparator\*(R" in your config! default +is slash), then note will consider it as the topic of this certain +note. For examle: +.PP +.Vb 1 +\& B +.Ve +If you are using topics, no data after the topic is allowed, if there +is any text, note will consider it as a subtopic! Therefore, don't for- +get to put a newline after the topic-line. +.PP +The list-command will only show you notes under this topic. If you +create a new note, it will automagically inserted under the current +topic (note will prepend the string \*(L"/topicname/\*(R" to the text of your +note). +.PP +You can create at any time from any point a new topic. Just create a new +note and type the name of the new topic bordered by slashes (or +TopicSeparator) at the first line of this note. After saving, there +will be available a new topic with one note in it. +.PP +You can create as many subtopics as you like, the format is similar to +a filesystem-path. An example, say, you want to create such a +structure: +.PP +.Vb 10 +\& (root - top level) +\& | +\& |----test +\& | |----subtopic +\& | | |--note 1 +\& | | |--note 2 +\& | | +\& | |--note 4 +\& | +\& |--note 3 +.Ve +Then you may create those 4 new notes: +.PP +.Vb 12 +\& --- snip --- +\& /test/subtopic/ +\& note 1 +\& --- snip --- +\& /test/subtopic/ +\& note 2 +\& --- snip --- +\& note 3 +\& --- snip --- +\& /test/ +\& note 4 +\& --- snip --- +.Ve +I hope, you got the point ;\-) +.PP +If a note does not contain the \*(L"magic\*(R" /topic/ construction on the first +line, it will be listed under the \*(L"root\*(R" of note, that is the point +you are at the startup of note. +.PP +You can subsequently move a note without a topic to a certain topic. +Simply edit it and insert at the first line the above mentioned +construction. +.PP +Note: Please don't forget the prepending and appending a slash of a +topic. You will get strange results without it! +.Sh "\s-1INTERACTIVE\s0 \s-1MODE\s0" +If you start note with the commandline flag \fB\-i\fR, then it starts +with an interactive interface. +It will start with a listing under the default top-topic ("/"). +You can enter the name of a topic to change to that topic. This works +similar to a filesystem structure. The current topic will be +displayed on the top of the screen. +.PP +The following commands are available: +.Ip "\fBL [topic]\fR" 5 +This command lists all notes with a timestamp. If you specify a topic, it +will only list the notes under this topic. If you are under a certain subtopic, +then it will only display the notes under this topic. +.Ip "\fBl [topic]\fR" 5 +This commands behaves similar to \fBL\fR but it does not display the timestamp. +You can achieve the same result by simply pressing enter at any time. +.Ip "\fBN\fR" 5 +You can create a new note by simply pressing \fBN\fR or \fBn\fR. You favorite +editor will be started and you can enter your note text. If you are already +under a topic then this new note will automatically go to this topic. +note adds an aditional line to the top of the note with the topic. But +you can of course specify your own topic. +.Sp +Note will tell you which number it has assigned to the newly created note. +.Ip "\fBE number\fR" 5 +By entering \fBE\fR or \fBe\fR and a note-number you can edit an existing note +using your favorite editor. This way you can also move an existing note +from one topic to another one by editing the first line of the note. +.Ip "\fBD number\fR" 5 +\fBE\fR or \fBe\fR deletes one or more existing \fInote\fR\|(s). It requires a note number +or a set of note numbers. 1-5 and 1,7,9 are possible values. +After one or more notes has been deleted note will recount all remaining notes. +Say if you delete 1 and 2, then 3 will become 1, 4 will become 5 and so forth. +.Ip "\fBS [expression]\fR" 5 +You can search for the occurence of a text in your notes-database with the +command \fBS\fR or \fBs\fR. If you omit an expression note will ask you for one. +.Ip "\fBT\fR" 5 +This prints a tree-view of your topic-structure. \fBT\fR displays the tree with +notes, \fBt\fR displays just the topics without notes. +.Ip "\fBcd topic\fR" 5 +Change the actual topic under which you are. This works identical like just +entering the topic but it has some advantages. You can enter \fBcd ..\fR if +you want to go one level up in the topic-structure. And you can enter \fBcd /\fR +to go to the top of the structure. +Additional it is possible to enter a note-number instead of a topic name. +For this feature to be active you need to set the config option \fBShortCd\fR +to \fB1\fR or \fByes\fR. If you use a number and the note with this number is +under a certain topic then you will \*(L"cd\*(R" to this topic. This allows you +to do kind of jumps over multiple levels of topics. +.Ip "\fB? or h\fR" 5 +Display a short help screen. +.Ip "\fBQ\fR" 5 +Quit note. +.Sh "\s-1BACKUP\s0" +You can also dump the contents of your note-database into a +\s-1ASCII\s0\-\fItextfile\fR\|(\fI\-D\fR). You can use this file later to import it into +your note-\fIdatabase\fR\|(\-I). This is usefull, if you want quickly trans- +fer your notes from one host to another (i.e. you could mail +your note-dump form your office to home and import it there +for further use). +.PP +The dumps from the two versions of note are in the same format. +Using dumps it is also possible to reinitialize your database. You +can use the \*(L"\-o\*(R" switch whcih causes note to overwrite your existing +database. This is very handy if you changed heavily your config. And +it is required, if you changed: encryption, db-driver, (binary-format) +and the password. You can use the following command for reinitializing: +.PP +.Vb 1 +\& $ note -D - | note -o -I - +.Ve +What the hell, does this do?! Step by step: +.Ip "\(bu" 5 +\fBnote \-D \-\fR creates a note-database dump and prints it out +to stantdard output. +.Ip "\(bu" 5 +\fB|\fR this is the shell's pipe command. It takes the output +of the left program and gives it to the right program as +standard input. +.Ip "\(bu" 5 +\fBnote \-o \-I \-\fR imports a note-database dump from standard +input and overwrites an existing database. +.PP +Before you use the \fB\-o\fR switch, I consider you to make a backup! +.Sh "\s-1FORMATING\s0" +Another very nice feature is the possibility to format the note-text +(as much as shell allows it). First, you can use the note-internal +\*(L"magic-strings\*(R" for colorizing. Those strings looks much like \s-1HTML\s0: +\*(L"here is a green line of text no more green.\*(R" +As you see, the beginning of another color starts with a \fItag\fR\|(kinda) of +the color and ens with an end tag . +.PP +The following colors are available: +black, red, green, yellow, blue, magenta, cyan and white. +.PP +Beside colorizing text, you can also create bold or underlined text! If +you decide to use this (additional) feature, you need to set the +Config-Option \*(L"FormatNotes\*(R" to 1 which turns it on. +Usage is very straightforward, if a word (a word is defined as some +text with at least one space surrounded) is between a magic mark- +character. Here are the available things, you can do: +.PP +.Vb 3 +\& bold: **word** +\& underlined:__word__ +\& inverse:{{word}} +.Ve +The text will be formatted using the actually note-color. +.SH "ENCRYPTION" +You can turn on encryption from the config file. +Simply set UseEncryption to 1. Please note, that you need +to decide, if you want to use encryption before the first use +of note! If have already a note database and want to \*(L"migrate\*(R" +to encryption, I suggest you to follow the directions in the +file UPGRADE! +.PP +You can choose from different encryption algorythms. The default +is IDEA, but DES or BLOWFISH is also possible. You need to have +installed the following additional perl-modules on your system: +MD5 +Crypt::IDEA +Crypt::DES +Crypt::CBC +.PP +After turning on encryption, note will ask you for a passphrase +everytime it runs! It will *not* store this passphrase! +So, don't forget it! Be careful! +.SH "CONFIGURATION" +You can use a configuration file with note but it is not required. +Note will use default values if there is no config. +.PP +The default config file is \fB~/.noterc\fR. You may specify another +one with the commandline flag \fI--config\fR. +.PP +Comments start with #, empty lines will be ignored. +1 turns an option on, 0 turns it off. +An option consists of an atribute-value pair separated +by minimum one space (more spaces and/or tabs are allowed). +.PP +For a detailed explanation of each possible parameter take a look +at the supplied sample configuration file in \fBconfig/noterc\fR. +.SH "SEE ALSO" +See the usage guide in the README or visit the note website: +http://www.0x49.org. +.SH "AUTHOR" +Thomas Linden + +.rn }` '' +.IX Title "NOTE 1" +.IX Name "note - a perl script for maintaining notes." + +.IX Header "NAME" + +.IX Header "SYNPOPSIS" + +.IX Header "DESCRIPTION" + +.IX Header "OPTIONS" + +.IX Item "\fI\-c, --config file\fR" + +.IX Item "\fI\-l, --list [topic]\fR" + +.IX Item "\fI\-L, --longlist [topic]\fR" + +.IX Item "\fI\-t, --topic\fR" + +.IX Item "\fI\-T, --longtopic\fR" + +.IX Item "\fI\-s, --search string\fR" + +.IX Item "\fI\-e, --edit number\fR" + +.IX Item "\fI\-d, --delete number\fR" + +.IX Item "\fI\-D, --Dump [file | \-]\fR" + +.IX Item "\fI\-I, --Import file | \-\fR" + +.IX Item "\fI\-o, --overwrite\fR" + +.IX Item "\fI\-r, --raw\fR" + +.IX Item "\fI\-i, --interactive\fR" + +.IX Item "\fI--encrypt cleartext\fR" + +.IX Item "\fI\-h, --help\fR" + +.IX Item "\fI\-v, --version\fR" + +.IX Item "\fB\-\fR" + +.IX Header "USAGE" + +.IX Subsection "\s-1GENERAL\s0 \s-1USAGE\s0" + +.IX Subsection "\s-1SEARCHING\s0" + +.IX Subsection "\s-1TOPICS\s0" + +.IX Subsection "\s-1INTERACTIVE\s0 \s-1MODE\s0" + +.IX Item "\fBL [topic]\fR" + +.IX Item "\fBl [topic]\fR" + +.IX Item "\fBN\fR" + +.IX Item "\fBE number\fR" + +.IX Item "\fBD number\fR" + +.IX Item "\fBS [expression]\fR" + +.IX Item "\fBT\fR" + +.IX Item "\fBcd topic\fR" + +.IX Item "\fB? or h\fR" + +.IX Item "\fBQ\fR" + +.IX Subsection "\s-1BACKUP\s0" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Item "\(bu" + +.IX Subsection "\s-1FORMATING\s0" + +.IX Header "ENCRYPTION" + +.IX Header "CONFIGURATION" + +.IX Header "SEE ALSO" + +.IX Header "AUTHOR" + diff --git a/note.pod b/note.pod new file mode 100644 index 0000000..1054309 --- /dev/null +++ b/note.pod @@ -0,0 +1,501 @@ +=head1 NAME + +note - a perl script for maintaining notes. + + +=head1 SYNPOPSIS + +note [options] [ number [,number...]] + + +=head1 DESCRIPTION + +B is a small console program written in perl, which allows +you to manage notes similar to programs like "knotes" but from +the commandline. Note can use different database-backends for +notes-storage. It ships with a DBI-based mysql-module(which +can also be used for other by DBI supported DBMS), another +module, which uses a binary file for storage and a DBM module. +Note supports since version 1.0.0 encryption(IDEA or DES)! + + +=head1 OPTIONS + + +=over + +=item I<-c, --config file> + +Use another config file than the default ~/.noterc. + + +=item I<-l, --list [topic]> + +Lists all existing notes. If no topic were specified, +it will display a list of all existing topics. +See the section I for details about topics. + +=item I<-L, --longlist [topic]> + +The same as I<-l> but prints also the timestamp of the notes. + + +=item I<-t, --topic> + +Prints a list of all topics as a tree. + + +=item I<-T, --longtopic> + +Prints the topic-tree with the notes under each topic. + + +=item I<-s, --search string> + +Searches for trough the notes database. See the section +I for details about the search engine. + + +=item I<-e, --edit number> + +Edit the note with the number using your default editor +or the one you specified in the config file. + + +=item I<-d, --delete number> + +Delete the note with the number . You can delete multiple notes +with one command. "1-4" deletes the notes 1,2,3,4. And "1,5,7" deletes +the specified ones. + + +=item I<-D, --Dump [file | -]> + +Dumps all notes to the textfile . If is a "-" it will +be printed out to standard output (STDOUT). + + +=item I<-I, --Import file | -> + +Imports a previously dumped textfile into the +note database. Data will be appended by default. +You can also specify a dash I instead of a , +which causes note, silently to read in a dump from STDIN. + + +=item I<-o, --overwrite> + +Only suitable for use with --Import. Overwrites an +existing notedb. Use with care. + + +=item I<-r, --raw> + +Raw mode, output will not be formatted. Works not in interactive +mode, only on cmd-line for list and display. That means, no colors +will be used and no lines or titles. + + +=item I<-i, --interactive> + +Start note in interactive mode. See the section I +for details on this mode. + + +=item I<--encrypt cleartext> + +Encrypt the given clear text string. You would need that if you want to +store the mysql password not in cleartext in the config(if you are using +the mysql backend!). + + +=item I<-h, --help> + +Display this help screen. + + +=item I<-v, --version> + +Display the version number. + + +=item B<-> + +If you run note just with one dash: B, then it will read in a new +note from STDIN until EOF. This makes it possible to pipe text into a new note, i.e.: + + cat sometextfile | note - + + +=back + + + + +=head1 USAGE + +=head2 GENERAL USAGE + +If you don't know, how to run note, try "note -h" first. +It will tell you all available commandline options. + +To create a new note, simply run "note". You can enter +the note (the length is by default limited to 4096 bytes, +which you can change from your config file if you are using +the binary backend, therwise there is no limitation). +End by typing a . on a line itself. note will tell you the +number of the note. + +If you want to view the note, type "note 1", if the notenumber +was 1. + +If you want to get an overview of all notes, type "note -l". +You will get a list of all notes, containing the number, +the first line and the creation date. If topic-support is +turned on (which is by default), then all subtopics under the +current topic will be displayed first. +If you want to get a listing of all +If you want to see the timestamps, use "-L" instead of "-l". +Read more about topics below in the section "Topics". +You can also specify the topic which notes you want to see: +"-l mytopic" does the trick. +Additional, you might want to get an overview of your topic- +strcture. You can use the command "-t" in this case, which +will display a tree-view of your tpic-structure. You can +use the command "-T" if you want to see the notes under each +topic too. "-T" will also show the number of each note. + +To edit a certain note, type "note -e 1". It will invoke your +editor (vi or pico). You can edit it, after saving, note +will store the changed note to the database. + +Of course you can drop a certain note: "note -d 1" deletes +note number 1. If a note in the middle or the beginning of +the database will be deleted, note will recount the other +existent notes. For example there are 3 notes, number 1, 2 +and 3. If you delete number 2, then number 3 will become +number 2. +You can also make use of the extended delete-syntax: +To delete note 1 and 2, use "-d 1,2" +To delete note 1,2 and 3, use "-d 1-3". + + + +=head2 SEARCHING + +If you cannot remember, which note you are looking for, you +can use the search capability of note: "note -s ". +note will search the whole note database case insensitive for +an occurence of this string and tell you the number and first- +line it has. + +You can extend the searchstring using B, B ( and ) and +shell-like wildcards: + + $ note -s "moses AND lenin" + +or: + + $ note -s "(mike OR arnold) AND (jackson OR schwarzenegger)" + +If note finds a note, which first line is a topic, then it will +display it's second line. + +These rules apply for the interactive search too. + + + + +=head2 TOPICS + +If topic-support is turned on (which is by default), the various +notes are sorted under various topics. There is no special database +field for the topic. Instead the topic will be stored right in the +note. +If the first line of your note contains some text bordered by slashes +(or whatever you prefer, set "TopicSeparator" in your config! default +is slash), then note will consider it as the topic of this certain +note. For examle: + + B + +If you are using topics, no data after the topic is allowed, if there +is any text, note will consider it as a subtopic! Therefore, don't for- +get to put a newline after the topic-line. + +The list-command will only show you notes under this topic. If you +create a new note, it will automagically inserted under the current +topic (note will prepend the string "/topicname/" to the text of your +note). + +You can create at any time from any point a new topic. Just create a new +note and type the name of the new topic bordered by slashes (or +TopicSeparator) at the first line of this note. After saving, there +will be available a new topic with one note in it. + +You can create as many subtopics as you like, the format is similar to +a filesystem-path. An example, say, you want to create such a +structure: + + (root - top level) + | + |----test + | |----subtopic + | | |--note 1 + | | |--note 2 + | | + | |--note 4 + | + |--note 3 + +Then you may create those 4 new notes: + + --- snip --- + /test/subtopic/ + note 1 + --- snip --- + /test/subtopic/ + note 2 + --- snip --- + note 3 + --- snip --- + /test/ + note 4 + --- snip --- + +I hope, you got the point ;-) + +If a note does not contain the "magic" /topic/ construction on the first +line, it will be listed under the "root" of note, that is the point +you are at the startup of note. + +You can subsequently move a note without a topic to a certain topic. +Simply edit it and insert at the first line the above mentioned +construction. + +Note: Please don't forget the prepending and appending a slash of a +topic. You will get strange results without it! + + + + +=head2 INTERACTIVE MODE + +If you start note with the commandline flag B<-i>, then it starts +with an interactive interface. +It will start with a listing under the default top-topic ("/"). +You can enter the name of a topic to change to that topic. This works +similar to a filesystem structure. The current topic will be +displayed on the top of the screen. + +The following commands are available: + +=over + +=item B + +This command lists all notes with a timestamp. If you specify a topic, it +will only list the notes under this topic. If you are under a certain subtopic, +then it will only display the notes under this topic. + +=item B + +This commands behaves similar to B but it does not display the timestamp. +You can achieve the same result by simply pressing enter at any time. + + +=item B + +You can create a new note by simply pressing B or B. You favorite +editor will be started and you can enter your note text. If you are already +under a topic then this new note will automatically go to this topic. +note adds an aditional line to the top of the note with the topic. But +you can of course specify your own topic. + +Note will tell you which number it has assigned to the newly created note. + +=item B + +By entering B or B and a note-number you can edit an existing note +using your favorite editor. This way you can also move an existing note +from one topic to another one by editing the first line of the note. + + +=item B + +B or B deletes one or more existing note(s). It requires a note number +or a set of note numbers. 1-5 and 1,7,9 are possible values. +After one or more notes has been deleted note will recount all remaining notes. +Say if you delete 1 and 2, then 3 will become 1, 4 will become 5 and so forth. + + +=item B + +You can search for the occurence of a text in your notes-database with the +command B or B. If you omit an expression note will ask you for one. + + +=item B + +This prints a tree-view of your topic-structure. B displays the tree with +notes, B displays just the topics without notes. + + +=item B + +Change the actual topic under which you are. This works identical like just +entering the topic but it has some advantages. You can enter B if +you want to go one level up in the topic-structure. And you can enter B +to go to the top of the structure. +Additional it is possible to enter a note-number instead of a topic name. +For this feature to be active you need to set the config option B +to B<1> or B. If you use a number and the note with this number is +under a certain topic then you will "cd" to this topic. This allows you +to do kind of jumps over multiple levels of topics. + +=item B + +Display a short help screen. + + +=item B + +Quit note. + +=back + + + + + +=head2 BACKUP + +You can also dump the contents of your note-database into a +ASCII-textfile(I<-D>). You can use this file later to import it into +your note-database(-I). This is usefull, if you want quickly trans- +fer your notes from one host to another (i.e. you could mail +your note-dump form your office to home and import it there +for further use). + +The dumps from the two versions of note are in the same format. +Using dumps it is also possible to reinitialize your database. You +can use the "-o" switch whcih causes note to overwrite your existing +database. This is very handy if you changed heavily your config. And +it is required, if you changed: encryption, db-driver, (binary-format) +and the password. You can use the following command for reinitializing: + + $ note -D - | note -o -I - + +What the hell, does this do?! Step by step: + +=over + +=item * + +B creates a note-database dump and prints it out +to stantdard output. + +=item * + +B<|> this is the shell's pipe command. It takes the output +of the left program and gives it to the right program as +standard input. + +=item * + +B imports a note-database dump from standard +input and overwrites an existing database. + +=back + +Before you use the B<-o> switch, I consider you to make a backup! + + + + + +=head2 FORMATING + +Another very nice feature is the possibility to format the note-text +(as much as shell allows it). First, you can use the note-internal +"magic-strings" for colorizing. Those strings looks much like HTML: +"here is a green line of text no more green." +As you see, the beginning of another color starts with a tag(kinda) of +the color and ens with an end tag . + +The following colors are available: +black, red, green, yellow, blue, magenta, cyan and white. + +Beside colorizing text, you can also create bold or underlined text! If +you decide to use this (additional) feature, you need to set the +Config-Option "FormatNotes" to 1 which turns it on. +Usage is very straightforward, if a word (a word is defined as some +text with at least one space surrounded) is between a magic mark- +character. Here are the available things, you can do: + + bold: **word** + underlined:__word__ + inverse:{{word}} + +The text will be formatted using the actually note-color. + + + +=head1 ENCRYPTION + +You can turn on encryption from the config file. +Simply set UseEncryption to 1. Please note, that you need +to decide, if you want to use encryption before the first use +of note! If have already a note database and want to "migrate" +to encryption, I suggest you to follow the directions in the +file UPGRADE! + +You can choose from different encryption algorythms. The default +is IDEA, but DES or BLOWFISH is also possible. You need to have +installed the following additional perl-modules on your system: +MD5 +Crypt::IDEA +Crypt::DES +Crypt::CBC + +After turning on encryption, note will ask you for a passphrase +everytime it runs! It will *not* store this passphrase! +So, don't forget it! Be careful! + + + + +=head1 CONFIGURATION + +You can use a configuration file with note but it is not required. +Note will use default values if there is no config. + +The default config file is B<~/.noterc>. You may specify another +one with the commandline flag I<--config>. + +Comments start with #, empty lines will be ignored. +1 turns an option on, 0 turns it off. +An option consists of an atribute-value pair separated +by minimum one space (more spaces and/or tabs are allowed). + +For a detailed explanation of each possible parameter take a look +at the supplied sample configuration file in B. + + + + +=head1 SEE ALSO + +See the usage guide in the README or visit the note website: +http://www.0x49.org. + + + +=head1 AUTHOR + +Thomas Linden + + + + +=cut \ No newline at end of file