diff --git a/Makefile b/Makefile
deleted file mode 100644
index a1598a5..0000000
--- a/Makefile
+++ /dev/null
@@ -1,782 +0,0 @@
-# This Makefile is for the NOTEDB extension to perl.
-#
-# It was generated automatically by MakeMaker version
-# 6.17 (Revision: 1.133) from the contents of
-# Makefile.PL. Don't edit this file, edit Makefile.PL instead.
-#
-# ANY CHANGES MADE HERE WILL BE LOST!
-#
-# MakeMaker ARGV: ()
-#
-# MakeMaker Parameters:
-
-# EXE_FILES => [q[bin/note]]
-# NAME => q[NOTEDB]
-# VERSION_FROM => q[NOTEDB.pm]
-
-# --- MakeMaker post_initialize section:
-
-
-# --- MakeMaker const_config section:
-
-# These definitions are from config.sh (via /usr/lib/perl/5.8/Config.pm)
-
-# They may have been overridden via Makefile.PL or on the command line
-AR = ar
-CC = cc
-CCCDLFLAGS = -fPIC
-CCDLFLAGS = -Wl,-E
-DLEXT = so
-DLSRC = dl_dlopen.xs
-LD = cc
-LDDLFLAGS = -shared -L/usr/local/lib
-LDFLAGS = -L/usr/local/lib
-LIBC = /lib/libc-2.3.2.so
-LIB_EXT = .a
-OBJ_EXT = .o
-OSNAME = linux
-OSVERS = 2.4.27-ti1211
-RANLIB = :
-SITELIBEXP = /usr/local/share/perl/5.8.4
-SITEARCHEXP = /usr/local/lib/perl/5.8.4
-SO = so
-EXE_EXT =
-FULL_AR = /usr/bin/ar
-VENDORARCHEXP = /usr/lib/perl5
-VENDORLIBEXP = /usr/share/perl5
-
-
-# --- MakeMaker constants section:
-AR_STATIC_ARGS = cr
-DIRFILESEP = /
-NAME = NOTEDB
-NAME_SYM = NOTEDB
-VERSION = 1.31
-VERSION_MACRO = VERSION
-VERSION_SYM = 1_31
-DEFINE_VERSION = -D$(VERSION_MACRO)=\"$(VERSION)\"
-XS_VERSION = 1.31
-XS_VERSION_MACRO = XS_VERSION
-XS_DEFINE_VERSION = -D$(XS_VERSION_MACRO)=\"$(XS_VERSION)\"
-INST_ARCHLIB = blib/arch
-INST_SCRIPT = blib/script
-INST_BIN = blib/bin
-INST_LIB = blib/lib
-INST_MAN1DIR = blib/man1
-INST_MAN3DIR = blib/man3
-MAN1EXT = 1p
-MAN3EXT = 3pm
-INSTALLDIRS = site
-DESTDIR =
-PREFIX = /usr
-PERLPREFIX = $(PREFIX)
-SITEPREFIX = $(PREFIX)/local
-VENDORPREFIX = $(PREFIX)
-INSTALLPRIVLIB = $(PERLPREFIX)/share/perl/5.8
-DESTINSTALLPRIVLIB = $(DESTDIR)$(INSTALLPRIVLIB)
-INSTALLSITELIB = $(SITEPREFIX)/share/perl/5.8.4
-DESTINSTALLSITELIB = $(DESTDIR)$(INSTALLSITELIB)
-INSTALLVENDORLIB = $(VENDORPREFIX)/share/perl5
-DESTINSTALLVENDORLIB = $(DESTDIR)$(INSTALLVENDORLIB)
-INSTALLARCHLIB = $(PERLPREFIX)/lib/perl/5.8
-DESTINSTALLARCHLIB = $(DESTDIR)$(INSTALLARCHLIB)
-INSTALLSITEARCH = $(SITEPREFIX)/lib/perl/5.8.4
-DESTINSTALLSITEARCH = $(DESTDIR)$(INSTALLSITEARCH)
-INSTALLVENDORARCH = $(VENDORPREFIX)/lib/perl5
-DESTINSTALLVENDORARCH = $(DESTDIR)$(INSTALLVENDORARCH)
-INSTALLBIN = $(PERLPREFIX)/bin
-DESTINSTALLBIN = $(DESTDIR)$(INSTALLBIN)
-INSTALLSITEBIN = $(SITEPREFIX)/bin
-DESTINSTALLSITEBIN = $(DESTDIR)$(INSTALLSITEBIN)
-INSTALLVENDORBIN = $(VENDORPREFIX)/bin
-DESTINSTALLVENDORBIN = $(DESTDIR)$(INSTALLVENDORBIN)
-INSTALLSCRIPT = $(PERLPREFIX)/bin
-DESTINSTALLSCRIPT = $(DESTDIR)$(INSTALLSCRIPT)
-INSTALLMAN1DIR = $(PERLPREFIX)/share/man/man1
-DESTINSTALLMAN1DIR = $(DESTDIR)$(INSTALLMAN1DIR)
-INSTALLSITEMAN1DIR = $(SITEPREFIX)/man/man1
-DESTINSTALLSITEMAN1DIR = $(DESTDIR)$(INSTALLSITEMAN1DIR)
-INSTALLVENDORMAN1DIR = $(VENDORPREFIX)/share/man/man1
-DESTINSTALLVENDORMAN1DIR = $(DESTDIR)$(INSTALLVENDORMAN1DIR)
-INSTALLMAN3DIR = $(PERLPREFIX)/share/man/man3
-DESTINSTALLMAN3DIR = $(DESTDIR)$(INSTALLMAN3DIR)
-INSTALLSITEMAN3DIR = $(SITEPREFIX)/man/man3
-DESTINSTALLSITEMAN3DIR = $(DESTDIR)$(INSTALLSITEMAN3DIR)
-INSTALLVENDORMAN3DIR = $(VENDORPREFIX)/share/man/man3
-DESTINSTALLVENDORMAN3DIR = $(DESTDIR)$(INSTALLVENDORMAN3DIR)
-PERL_LIB = /usr/share/perl/5.8
-PERL_ARCHLIB = /usr/lib/perl/5.8
-LIBPERL_A = libperl.a
-FIRST_MAKEFILE = Makefile
-MAKEFILE_OLD = $(FIRST_MAKEFILE).old
-MAKE_APERL_FILE = $(FIRST_MAKEFILE).aperl
-PERLMAINCC = $(CC)
-PERL_INC = /usr/lib/perl/5.8/CORE
-PERL = /usr/bin/perl
-FULLPERL = /usr/bin/perl
-ABSPERL = $(PERL)
-PERLRUN = $(PERL)
-FULLPERLRUN = $(FULLPERL)
-ABSPERLRUN = $(ABSPERL)
-PERLRUNINST = $(PERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"
-FULLPERLRUNINST = $(FULLPERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"
-ABSPERLRUNINST = $(ABSPERLRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"
-PERL_CORE = 0
-PERM_RW = 644
-PERM_RWX = 755
-
-MAKEMAKER = /usr/share/perl/5.8/ExtUtils/MakeMaker.pm
-MM_VERSION = 6.17
-MM_REVISION = 1.133
-
-# FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
-# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
-# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
-# DLBASE = Basename part of dynamic library. May be just equal BASEEXT.
-FULLEXT = NOTEDB
-BASEEXT = NOTEDB
-PARENT_NAME =
-DLBASE = $(BASEEXT)
-VERSION_FROM = NOTEDB.pm
-OBJECT =
-LDFROM = $(OBJECT)
-LINKTYPE = dynamic
-
-# Handy lists of source code files:
-XS_FILES =
-C_FILES =
-O_FILES =
-H_FILES =
-MAN1PODS =
-MAN3PODS = NOTEDB/binary.pm \
- NOTEDB/dbm.pm \
- NOTEDB/dumper.pm \
- NOTEDB/general.pm \
- NOTEDB/mysql.pm \
- NOTEDB/text.pm \
- note.pod
-
-# Where is the Config information that we are using/depend on
-CONFIGDEP = $(PERL_ARCHLIB)$(DIRFILESEP)Config.pm $(PERL_INC)$(DIRFILESEP)config.h
-
-# Where to build things
-INST_LIBDIR = $(INST_LIB)
-INST_ARCHLIBDIR = $(INST_ARCHLIB)
-
-INST_AUTODIR = $(INST_LIB)/auto/$(FULLEXT)
-INST_ARCHAUTODIR = $(INST_ARCHLIB)/auto/$(FULLEXT)
-
-INST_STATIC =
-INST_DYNAMIC =
-INST_BOOT =
-
-# Extra linker info
-EXPORT_LIST =
-PERL_ARCHIVE =
-PERL_ARCHIVE_AFTER =
-
-
-TO_INST_PM = NOTEDB.pm \
- NOTEDB/README \
- NOTEDB/binary.pm \
- NOTEDB/dbm.pm \
- NOTEDB/dumper.pm \
- NOTEDB/general.pm \
- NOTEDB/mysql.pm \
- NOTEDB/text.pm \
- note.pod
-
-PM_TO_BLIB = NOTEDB/general.pm \
- $(INST_LIB)/NOTEDB/general.pm \
- NOTEDB/dbm.pm \
- $(INST_LIB)/NOTEDB/dbm.pm \
- NOTEDB/README \
- $(INST_LIB)/NOTEDB/README \
- NOTEDB.pm \
- $(INST_LIB)/NOTEDB.pm \
- NOTEDB/text.pm \
- $(INST_LIB)/NOTEDB/text.pm \
- NOTEDB/mysql.pm \
- $(INST_LIB)/NOTEDB/mysql.pm \
- NOTEDB/binary.pm \
- $(INST_LIB)/NOTEDB/binary.pm \
- NOTEDB/dumper.pm \
- $(INST_LIB)/NOTEDB/dumper.pm \
- note.pod \
- $(INST_LIB)/note.pod
-
-
-# --- MakeMaker platform_constants section:
-MM_Unix_VERSION = 1.42
-PERL_MALLOC_DEF = -DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc -Dfree=Perl_mfree -Drealloc=Perl_realloc -Dcalloc=Perl_calloc
-
-
-# --- MakeMaker tool_autosplit section:
-# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
-AUTOSPLITFILE = $(PERLRUN) -e 'use AutoSplit; autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1)'
-
-
-
-# --- MakeMaker tool_xsubpp section:
-
-
-# --- MakeMaker tools_other section:
-SHELL = /bin/sh
-CHMOD = chmod
-CP = cp
-MV = mv
-NOOP = $(SHELL) -c true
-NOECHO = @
-RM_F = rm -f
-RM_RF = rm -rf
-TEST_F = test -f
-TOUCH = touch
-UMASK_NULL = umask 0
-DEV_NULL = > /dev/null 2>&1
-MKPATH = $(PERLRUN) "-MExtUtils::Command" -e mkpath
-EQUALIZE_TIMESTAMP = $(PERLRUN) "-MExtUtils::Command" -e eqtime
-ECHO = echo
-ECHO_N = echo -n
-UNINST = 0
-VERBINST = 0
-MOD_INSTALL = $(PERLRUN) -MExtUtils::Install -e 'install({@ARGV}, '\''$(VERBINST)'\'', 0, '\''$(UNINST)'\'');'
-DOC_INSTALL = $(PERLRUN) "-MExtUtils::Command::MM" -e perllocal_install
-UNINSTALL = $(PERLRUN) "-MExtUtils::Command::MM" -e uninstall
-WARN_IF_OLD_PACKLIST = $(PERLRUN) "-MExtUtils::Command::MM" -e warn_if_old_packlist
-
-
-# --- MakeMaker makemakerdflt section:
-makemakerdflt: all
- $(NOECHO) $(NOOP)
-
-
-# --- MakeMaker dist section:
-TAR = tar
-TARFLAGS = cvf
-ZIP = zip
-ZIPFLAGS = -r
-COMPRESS = gzip --best
-SUFFIX = .gz
-SHAR = shar
-PREOP = $(NOECHO) $(NOOP)
-POSTOP = $(NOECHO) $(NOOP)
-TO_UNIX = $(NOECHO) $(NOOP)
-CI = ci -u
-RCS_LABEL = rcs -Nv$(VERSION_SYM): -q
-DIST_CP = best
-DIST_DEFAULT = tardist
-DISTNAME = NOTEDB
-DISTVNAME = NOTEDB-1.31
-
-
-# --- MakeMaker macro section:
-
-
-# --- MakeMaker depend section:
-
-
-# --- MakeMaker cflags section:
-
-
-# --- MakeMaker const_loadlibs section:
-
-
-# --- MakeMaker const_cccmd section:
-
-
-# --- MakeMaker post_constants section:
-
-
-# --- MakeMaker pasthru section:
-
-PASTHRU = LIB="$(LIB)"\
- LIBPERL_A="$(LIBPERL_A)"\
- LINKTYPE="$(LINKTYPE)"\
- PREFIX="$(PREFIX)"\
- OPTIMIZE="$(OPTIMIZE)"\
- PASTHRU_DEFINE="$(PASTHRU_DEFINE)"\
- PASTHRU_INC="$(PASTHRU_INC)"
-
-
-# --- MakeMaker special_targets section:
-.SUFFIXES: .xs .c .C .cpp .i .s .cxx .cc $(OBJ_EXT)
-
-.PHONY: all config static dynamic test linkext manifest
-
-
-
-# --- MakeMaker c_o section:
-
-
-# --- MakeMaker xs_c section:
-
-
-# --- MakeMaker xs_o section:
-
-
-# --- MakeMaker top_targets section:
-all :: pure_all manifypods
- $(NOECHO) $(NOOP)
-
-
-pure_all :: config pm_to_blib subdirs linkext
- $(NOECHO) $(NOOP)
-
-subdirs :: $(MYEXTLIB)
- $(NOECHO) $(NOOP)
-
-config :: $(FIRST_MAKEFILE) $(INST_LIBDIR)$(DIRFILESEP).exists
- $(NOECHO) $(NOOP)
-
-config :: $(INST_ARCHAUTODIR)$(DIRFILESEP).exists
- $(NOECHO) $(NOOP)
-
-config :: $(INST_AUTODIR)$(DIRFILESEP).exists
- $(NOECHO) $(NOOP)
-
-$(INST_AUTODIR)/.exists :: /usr/lib/perl/5.8/CORE/perl.h
- $(NOECHO) $(MKPATH) $(INST_AUTODIR)
- $(NOECHO) $(EQUALIZE_TIMESTAMP) /usr/lib/perl/5.8/CORE/perl.h $(INST_AUTODIR)/.exists
-
- -$(NOECHO) $(CHMOD) $(PERM_RWX) $(INST_AUTODIR)
-
-$(INST_LIBDIR)/.exists :: /usr/lib/perl/5.8/CORE/perl.h
- $(NOECHO) $(MKPATH) $(INST_LIBDIR)
- $(NOECHO) $(EQUALIZE_TIMESTAMP) /usr/lib/perl/5.8/CORE/perl.h $(INST_LIBDIR)/.exists
-
- -$(NOECHO) $(CHMOD) $(PERM_RWX) $(INST_LIBDIR)
-
-$(INST_ARCHAUTODIR)/.exists :: /usr/lib/perl/5.8/CORE/perl.h
- $(NOECHO) $(MKPATH) $(INST_ARCHAUTODIR)
- $(NOECHO) $(EQUALIZE_TIMESTAMP) /usr/lib/perl/5.8/CORE/perl.h $(INST_ARCHAUTODIR)/.exists
-
- -$(NOECHO) $(CHMOD) $(PERM_RWX) $(INST_ARCHAUTODIR)
-
-config :: $(INST_MAN3DIR)$(DIRFILESEP).exists
- $(NOECHO) $(NOOP)
-
-
-$(INST_MAN3DIR)/.exists :: /usr/lib/perl/5.8/CORE/perl.h
- $(NOECHO) $(MKPATH) $(INST_MAN3DIR)
- $(NOECHO) $(EQUALIZE_TIMESTAMP) /usr/lib/perl/5.8/CORE/perl.h $(INST_MAN3DIR)/.exists
-
- -$(NOECHO) $(CHMOD) $(PERM_RWX) $(INST_MAN3DIR)
-
-help:
- perldoc ExtUtils::MakeMaker
-
-
-# --- MakeMaker linkext section:
-
-linkext :: $(LINKTYPE)
- $(NOECHO) $(NOOP)
-
-
-# --- MakeMaker dlsyms section:
-
-
-# --- MakeMaker dynamic section:
-
-dynamic :: $(FIRST_MAKEFILE) $(INST_DYNAMIC) $(INST_BOOT)
- $(NOECHO) $(NOOP)
-
-
-# --- MakeMaker dynamic_bs section:
-
-BOOTSTRAP =
-
-
-# --- MakeMaker dynamic_lib section:
-
-
-# --- MakeMaker static section:
-
-## $(INST_PM) has been moved to the all: target.
-## It remains here for awhile to allow for old usage: "make static"
-static :: $(FIRST_MAKEFILE) $(INST_STATIC)
- $(NOECHO) $(NOOP)
-
-
-# --- MakeMaker static_lib section:
-
-
-# --- MakeMaker manifypods section:
-
-POD2MAN_EXE = $(PERLRUN) "-MExtUtils::Command::MM" -e pod2man "--"
-POD2MAN = $(POD2MAN_EXE)
-
-
-manifypods : pure_all \
- NOTEDB/general.pm \
- NOTEDB/text.pm \
- NOTEDB/dbm.pm \
- NOTEDB/mysql.pm \
- NOTEDB/binary.pm \
- NOTEDB/dumper.pm \
- note.pod \
- NOTEDB/general.pm \
- NOTEDB/text.pm \
- NOTEDB/dbm.pm \
- NOTEDB/mysql.pm \
- NOTEDB/binary.pm \
- NOTEDB/dumper.pm \
- note.pod
- $(NOECHO) $(POD2MAN) --section=$(MAN3EXT) --perm_rw=$(PERM_RW)\
- NOTEDB/general.pm $(INST_MAN3DIR)/NOTEDB::general.$(MAN3EXT) \
- NOTEDB/text.pm $(INST_MAN3DIR)/NOTEDB::text.$(MAN3EXT) \
- NOTEDB/dbm.pm $(INST_MAN3DIR)/NOTEDB::dbm.$(MAN3EXT) \
- NOTEDB/mysql.pm $(INST_MAN3DIR)/NOTEDB::mysql.$(MAN3EXT) \
- NOTEDB/binary.pm $(INST_MAN3DIR)/NOTEDB::binary.$(MAN3EXT) \
- NOTEDB/dumper.pm $(INST_MAN3DIR)/NOTEDB::dumper.$(MAN3EXT) \
- note.pod $(INST_MAN3DIR)/note.$(MAN3EXT)
-
-
-
-
-# --- MakeMaker processPL section:
-
-
-# --- MakeMaker installbin section:
-
-$(INST_SCRIPT)/.exists :: /usr/lib/perl/5.8/CORE/perl.h
- $(NOECHO) $(MKPATH) $(INST_SCRIPT)
- $(NOECHO) $(EQUALIZE_TIMESTAMP) /usr/lib/perl/5.8/CORE/perl.h $(INST_SCRIPT)/.exists
-
- -$(NOECHO) $(CHMOD) $(PERM_RWX) $(INST_SCRIPT)
-
-EXE_FILES = bin/note
-
-FIXIN = $(PERLRUN) "-MExtUtils::MY" -e "MY->fixin(shift)"
-
-pure_all :: $(INST_SCRIPT)/note
- $(NOECHO) $(NOOP)
-
-realclean ::
- $(RM_F) $(INST_SCRIPT)/note
-
-$(INST_SCRIPT)/note: bin/note $(FIRST_MAKEFILE) $(INST_SCRIPT)/.exists
- $(NOECHO) $(RM_F) $(INST_SCRIPT)/note
- $(CP) bin/note $(INST_SCRIPT)/note
- $(FIXIN) $(INST_SCRIPT)/note
- -$(NOECHO) $(CHMOD) $(PERM_RWX) $(INST_SCRIPT)/note
-
-
-# --- MakeMaker subdirs section:
-
-# none
-
-# --- MakeMaker clean_subdirs section:
-clean_subdirs :
- $(NOECHO) $(NOOP)
-
-
-# --- MakeMaker clean section:
-
-# Delete temporary files but do not touch installed files. We don't delete
-# the Makefile here so a later make realclean still has a makefile to use.
-
-clean :: clean_subdirs
- -$(RM_RF) ./blib $(MAKE_APERL_FILE) $(INST_ARCHAUTODIR)/extralibs.all $(INST_ARCHAUTODIR)/extralibs.ld perlmain.c tmon.out mon.out so_locations pm_to_blib *$(OBJ_EXT) *$(LIB_EXT) perl.exe perl perl$(EXE_EXT) $(BOOTSTRAP) $(BASEEXT).bso $(BASEEXT).def lib$(BASEEXT).def $(BASEEXT).exp $(BASEEXT).x core core.*perl.*.? *perl.core core.[0-9] core.[0-9][0-9] core.[0-9][0-9][0-9] core.[0-9][0-9][0-9][0-9] core.[0-9][0-9][0-9][0-9][0-9]
- -$(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) $(DEV_NULL)
-
-
-# --- MakeMaker realclean_subdirs section:
-realclean_subdirs :
- $(NOECHO) $(NOOP)
-
-
-# --- MakeMaker realclean section:
-
-# Delete temporary files (via clean) and also delete installed files
-realclean purge :: clean realclean_subdirs
- $(RM_RF) $(INST_AUTODIR) $(INST_ARCHAUTODIR)
- $(RM_RF) $(DISTVNAME)
- $(RM_F) $(INST_LIB)/NOTEDB/dumper.pm $(INST_LIB)/NOTEDB/mysql.pm $(INST_LIB)/NOTEDB/binary.pm $(MAKEFILE_OLD) $(INST_LIB)/NOTEDB/text.pm $(INST_LIB)/NOTEDB/general.pm $(INST_LIB)/NOTEDB.pm
- $(RM_F) $(INST_LIB)/note.pod $(INST_LIB)/NOTEDB/dbm.pm $(INST_LIB)/NOTEDB/README $(FIRST_MAKEFILE)
-
-
-# --- MakeMaker metafile section:
-metafile :
- $(NOECHO) $(ECHO) '# http://module-build.sourceforge.net/META-spec.html' > META.yml
- $(NOECHO) $(ECHO) '#XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX#' >> META.yml
- $(NOECHO) $(ECHO) 'name: NOTEDB' >> META.yml
- $(NOECHO) $(ECHO) 'version: 1.31' >> META.yml
- $(NOECHO) $(ECHO) 'version_from: NOTEDB.pm' >> META.yml
- $(NOECHO) $(ECHO) 'installdirs: site' >> META.yml
- $(NOECHO) $(ECHO) 'requires:' >> META.yml
- $(NOECHO) $(ECHO) '' >> META.yml
- $(NOECHO) $(ECHO) 'distribution_type: module' >> META.yml
- $(NOECHO) $(ECHO) 'generated_by: ExtUtils::MakeMaker version 6.17' >> META.yml
-
-
-# --- MakeMaker metafile_addtomanifest section:
-metafile_addtomanifest:
- $(NOECHO) $(PERLRUN) -MExtUtils::Manifest=maniadd -e 'eval { maniadd({q{META.yml} => q{Module meta-data (added by MakeMaker)}}) } ' \
- -e ' or print "Could not add META.yml to MANIFEST: $${'\''@'\''}\n"'
-
-
-# --- MakeMaker dist_basics section:
-distclean :: realclean distcheck
- $(NOECHO) $(NOOP)
-
-distcheck :
- $(PERLRUN) "-MExtUtils::Manifest=fullcheck" -e fullcheck
-
-skipcheck :
- $(PERLRUN) "-MExtUtils::Manifest=skipcheck" -e skipcheck
-
-manifest :
- $(PERLRUN) "-MExtUtils::Manifest=mkmanifest" -e mkmanifest
-
-veryclean : realclean
- $(RM_F) *~ *.orig */*~ */*.orig
-
-
-
-# --- MakeMaker dist_core section:
-
-dist : $(DIST_DEFAULT) $(FIRST_MAKEFILE)
- $(NOECHO) $(PERLRUN) -l -e 'print '\''Warning: Makefile possibly out of date with $(VERSION_FROM)'\''' \
- -e ' if -e '\''$(VERSION_FROM)'\'' and -M '\''$(VERSION_FROM)'\'' < -M '\''$(FIRST_MAKEFILE)'\'';'
-
-tardist : $(DISTVNAME).tar$(SUFFIX)
- $(NOECHO) $(NOOP)
-
-uutardist : $(DISTVNAME).tar$(SUFFIX)
- uuencode $(DISTVNAME).tar$(SUFFIX) $(DISTVNAME).tar$(SUFFIX) > $(DISTVNAME).tar$(SUFFIX)_uu
-
-$(DISTVNAME).tar$(SUFFIX) : distdir
- $(PREOP)
- $(TO_UNIX)
- $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME)
- $(RM_RF) $(DISTVNAME)
- $(COMPRESS) $(DISTVNAME).tar
- $(POSTOP)
-
-zipdist : $(DISTVNAME).zip
- $(NOECHO) $(NOOP)
-
-$(DISTVNAME).zip : distdir
- $(PREOP)
- $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME)
- $(RM_RF) $(DISTVNAME)
- $(POSTOP)
-
-shdist : distdir
- $(PREOP)
- $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar
- $(RM_RF) $(DISTVNAME)
- $(POSTOP)
-
-
-# --- MakeMaker distdir section:
-distdir : metafile metafile_addtomanifest
- $(RM_RF) $(DISTVNAME)
- $(PERLRUN) "-MExtUtils::Manifest=manicopy,maniread" \
- -e "manicopy(maniread(),'$(DISTVNAME)', '$(DIST_CP)');"
-
-
-
-# --- MakeMaker dist_test section:
-
-disttest : distdir
- cd $(DISTVNAME) && $(ABSPERLRUN) Makefile.PL
- cd $(DISTVNAME) && $(MAKE) $(PASTHRU)
- cd $(DISTVNAME) && $(MAKE) test $(PASTHRU)
-
-
-# --- MakeMaker dist_ci section:
-
-ci :
- $(PERLRUN) "-MExtUtils::Manifest=maniread" \
- -e "@all = keys %{ maniread() };" \
- -e "print(qq{Executing $(CI) @all\n}); system(qq{$(CI) @all});" \
- -e "print(qq{Executing $(RCS_LABEL) ...\n}); system(qq{$(RCS_LABEL) @all});"
-
-
-# --- MakeMaker install section:
-
-install :: all pure_install doc_install
-
-install_perl :: all pure_perl_install doc_perl_install
-
-install_site :: all pure_site_install doc_site_install
-
-install_vendor :: all pure_vendor_install doc_vendor_install
-
-pure_install :: pure_$(INSTALLDIRS)_install
-
-doc_install :: doc_$(INSTALLDIRS)_install
-
-pure__install : pure_site_install
- $(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
-
-doc__install : doc_site_install
- $(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
-
-pure_perl_install ::
- $(NOECHO) umask 022; $(MOD_INSTALL) \
- $(INST_LIB) $(DESTINSTALLPRIVLIB) \
- $(INST_ARCHLIB) $(DESTINSTALLARCHLIB) \
- $(INST_BIN) $(DESTINSTALLBIN) \
- $(INST_SCRIPT) $(DESTINSTALLSCRIPT) \
- $(INST_MAN1DIR) $(DESTINSTALLMAN1DIR) \
- $(INST_MAN3DIR) $(DESTINSTALLMAN3DIR)
- $(NOECHO) $(WARN_IF_OLD_PACKLIST) \
- $(SITEARCHEXP)/auto/$(FULLEXT)
-
-
-pure_site_install ::
- $(NOECHO) umask 02; $(MOD_INSTALL) \
- read $(SITEARCHEXP)/auto/$(FULLEXT)/.packlist \
- write $(DESTINSTALLSITEARCH)/auto/$(FULLEXT)/.packlist \
- $(INST_LIB) $(DESTINSTALLSITELIB) \
- $(INST_ARCHLIB) $(DESTINSTALLSITEARCH) \
- $(INST_BIN) $(DESTINSTALLSITEBIN) \
- $(INST_SCRIPT) $(DESTINSTALLSCRIPT) \
- $(INST_MAN1DIR) $(DESTINSTALLSITEMAN1DIR) \
- $(INST_MAN3DIR) $(DESTINSTALLSITEMAN3DIR)
- $(NOECHO) $(WARN_IF_OLD_PACKLIST) \
- $(PERL_ARCHLIB)/auto/$(FULLEXT)
-
-pure_vendor_install ::
- $(NOECHO) umask 022; $(MOD_INSTALL) \
- $(INST_LIB) $(DESTINSTALLVENDORLIB) \
- $(INST_ARCHLIB) $(DESTINSTALLVENDORARCH) \
- $(INST_BIN) $(DESTINSTALLVENDORBIN) \
- $(INST_SCRIPT) $(DESTINSTALLSCRIPT) \
- $(INST_MAN1DIR) $(DESTINSTALLVENDORMAN1DIR) \
- $(INST_MAN3DIR) $(DESTINSTALLVENDORMAN3DIR)
-
-doc_perl_install ::
-
-doc_site_install ::
- $(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLSITEARCH)/perllocal.pod
- -$(NOECHO) umask 02; $(MKPATH) $(DESTINSTALLSITEARCH)
- -$(NOECHO) umask 02; $(DOC_INSTALL) \
- "Module" "$(NAME)" \
- "installed into" "$(INSTALLSITELIB)" \
- LINKTYPE "$(LINKTYPE)" \
- VERSION "$(VERSION)" \
- EXE_FILES "$(EXE_FILES)" \
- >> $(DESTINSTALLSITEARCH)/perllocal.pod
-
-doc_vendor_install ::
-
-
-uninstall :: uninstall_from_$(INSTALLDIRS)dirs
-
-uninstall_from_perldirs ::
- $(NOECHO) $(UNINSTALL) $(PERL_ARCHLIB)/auto/$(FULLEXT)/.packlist
-
-uninstall_from_sitedirs ::
- $(NOECHO) $(UNINSTALL) $(SITEARCHEXP)/auto/$(FULLEXT)/.packlist
-
-uninstall_from_vendordirs ::
- $(NOECHO) $(UNINSTALL) $(VENDORARCHEXP)/auto/$(FULLEXT)/.packlist
-
-
-# --- MakeMaker force section:
-# Phony target to force checking subdirectories.
-FORCE:
- $(NOECHO) $(NOOP)
-
-
-# --- MakeMaker perldepend section:
-
-
-# --- MakeMaker makefile section:
-
-# We take a very conservative approach here, but it's worth it.
-# We move Makefile to Makefile.old here to avoid gnu make looping.
-$(FIRST_MAKEFILE) : Makefile.PL $(CONFIGDEP)
- $(NOECHO) $(ECHO) "Makefile out-of-date with respect to $?"
- $(NOECHO) $(ECHO) "Cleaning current config before rebuilding Makefile..."
- $(NOECHO) $(RM_F) $(MAKEFILE_OLD)
- $(NOECHO) $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD)
- -$(MAKE) -f $(MAKEFILE_OLD) clean $(DEV_NULL) || $(NOOP)
- $(PERLRUN) Makefile.PL
- $(NOECHO) $(ECHO) "==> Your Makefile has been rebuilt. <=="
- $(NOECHO) $(ECHO) "==> Please rerun the make command. <=="
- false
-
-
-
-# --- MakeMaker staticmake section:
-
-# --- MakeMaker makeaperl section ---
-MAP_TARGET = perl
-FULLPERL = /usr/bin/perl
-
-$(MAP_TARGET) :: static $(MAKE_APERL_FILE)
- $(MAKE) -f $(MAKE_APERL_FILE) $@
-
-$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
- $(NOECHO) $(ECHO) Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET)
- $(NOECHO) $(PERLRUNINST) \
- Makefile.PL DIR= \
- MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
- MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=
-
-
-# --- MakeMaker test section:
-
-TEST_VERBOSE=0
-TEST_TYPE=test_$(LINKTYPE)
-TEST_FILE = test.pl
-TEST_FILES =
-TESTDB_SW = -d
-
-testdb :: testdb_$(LINKTYPE)
-
-test :: $(TEST_TYPE)
- $(NOECHO) $(ECHO) 'No tests defined for $(NAME) extension.'
-
-test_dynamic :: pure_all
-
-testdb_dynamic :: pure_all
- PERL_DL_NONLAZY=1 $(FULLPERLRUN) $(TESTDB_SW) "-I$(INST_LIB)" "-I$(INST_ARCHLIB)" $(TEST_FILE)
-
-test_ : test_dynamic
-
-test_static :: test_dynamic
-testdb_static :: testdb_dynamic
-
-
-# --- MakeMaker ppd section:
-# Creates a PPD (Perl Package Description) for a binary distribution.
-ppd:
- $(NOECHO) $(ECHO) '' > $(DISTNAME).ppd
- $(NOECHO) $(ECHO) ' $(DISTNAME)' >> $(DISTNAME).ppd
- $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd
- $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd
- $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd
- $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd
- $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd
- $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd
- $(NOECHO) $(ECHO) ' ' >> $(DISTNAME).ppd
- $(NOECHO) $(ECHO) '' >> $(DISTNAME).ppd
-
-
-# --- MakeMaker pm_to_blib section:
-
-pm_to_blib: $(TO_INST_PM)
- $(NOECHO) $(PERLRUN) -MExtUtils::Install -e 'pm_to_blib({@ARGV}, '\''$(INST_LIB)/auto'\'', '\''$(PM_FILTER)'\'')'\
- NOTEDB/general.pm $(INST_LIB)/NOTEDB/general.pm \
- NOTEDB/dbm.pm $(INST_LIB)/NOTEDB/dbm.pm \
- NOTEDB/README $(INST_LIB)/NOTEDB/README \
- NOTEDB.pm $(INST_LIB)/NOTEDB.pm \
- NOTEDB/text.pm $(INST_LIB)/NOTEDB/text.pm \
- NOTEDB/mysql.pm $(INST_LIB)/NOTEDB/mysql.pm \
- NOTEDB/binary.pm $(INST_LIB)/NOTEDB/binary.pm \
- NOTEDB/dumper.pm $(INST_LIB)/NOTEDB/dumper.pm \
- note.pod $(INST_LIB)/note.pod
- $(NOECHO) $(TOUCH) $@
-
-# --- MakeMaker selfdocument section:
-
-
-# --- MakeMaker postamble section:
-
-
-# End.
diff --git a/Tools.pm b/Tools.pm
deleted file mode 100644
index d84681a..0000000
--- a/Tools.pm
+++ /dev/null
@@ -1,330 +0,0 @@
-#!/usr/bin/perl -w
-#
-# generic tool functions
-#
-# Copyright (c) 2000 ConSol* GmbH, Munich.
-# All Rights Reserved. Unauthorized use forbidden.
-#
-# $Id: Tools.pm,v 1.11 2000/08/04 17:41:40 tom Exp $
-package Consol::Util::Tools;
-
-use Exporter ();
-use strict;
-use Carp qw(cluck);
-use FileHandle ();
-use Date::Manip;
-use Data::Dumper;
-use vars qw(@ISA @EXPORT @EXPORT_OK @EXPORT_TAGS $DEBUG);
-
-@ISA=qw(Exporter);
-# auto export subs
-@EXPORT=qw(getyesterdate debug generate_regex crypt_data);
-@EXPORT_OK=qw();
-@EXPORT_TAGS=();
-
-
-=head1 NAME
-
-Tools - general utilitiy package, no OOP.
-
-=head1 SYNOPSIS
-
-use Tools qw (getyesterdate debug);
-
-
-=head1 SUB getyesterdate
-
- my $onedayago = getyesterdate();
-
-returns the date one day ago in the following format: YYYYMMDD
-
-=cut
-
-sub getyesterdate
-{
- my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
- my($lastmonth, $lastyear);
- $year += 1900;
- $mon += 1;
-
- if ($mon == 1) {
- $lastmonth = 12;
- $lastyear = $year - 1;
- }
- else {
- $lastmonth = $mon - 1;
- $lastyear = $year;
- }
- my @DAYS_IN_MONTH = qw(0 31 28 31 30 31 30 31 31 30 31 30 31);
- my ($day,@days);
- if ((($year % 4) == 0) && ((($year % 100) != 0) || (($year % 400) == 0))) {
- $DAYS_IN_MONTH[2]++;
- }
-
- if ($mday == 1) {
- $mday = $DAYS_IN_MONTH[$lastmonth];
- $year = $lastyear;
- $mon = $lastmonth;
- }
- else {
- $mday--;
- }
- $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 "$year$mon$mday";
-}
-
-
-=head1 SUB debug
-
- BEGIN { $DEBUG = 1; }
- debug("some odd errors occured");
-
-prints the given message to STDERR if $DEBUG is true (1).
-It adds the packagename and the linenumber of the caller to the output.
-
-=cut
-
-sub debug {
- my(@msg) = @_;
- return if(!$DEBUG);
- my($package, $filename, $line) = caller;
- print "$package $line: @msg\n";
-}
-
-
-
-
-
-=head1 SUB generate_regex
-
-This subroutine generates valid perlcode based on userinput
-for further validation using B. You can catch exceptions
-using the B<$@> variable. A user supplied expression an contain
-AND, OR, brackets (), wildcards (* for any characters, ? for one character),
-or even valid perl regex(in this special case, it will not transformed
-in any way). See below for example usage!
-
- $code = generate_regex(
- -string => "(max AND moritz) OR (tina AND ute)",
- -case => 1,
- -if => 1,
- );
-
-If you set B<-if> to B<1> the following output will be created:
-
- $match = 1 if( (/max/i and /moritz/i ) or (/tina/i and /ute/i ) );
-
-otherwise you will only get a code fragment:
-
- (/max/i and /moritz/i ) or (/tina/i and /ute/i )
-
-If you set B<-case> to B<1>, the code will search case sensitive.
-
-If B<-string> is empty, "/^/" will be returned.
-
-Sample usage:
-
- #!/usr/bin/perl
- use Tools qw(generate_regex);
- my $match = undef;
- my $input = <>;
- chomp $input;
- my $regex = generate_regex(-string => $input, -if => 1);
- eval $regex;
- if ($@) {
- die "invalid expression: $@\n";
- }
- open FILE, ") {
- eval $regex;
- if ($match) {
- print "$. matched the expression \"$input\"\n";
- }
- }
- close FILE;
-
-Allowed expressions:
-
- "Hans Wurst" # exact match
- max AND moritz # AND
- max OR moritz # OR
- (max AND moritz) OR tina # combined with ()
- ((max AND moritz) AND tina) OR (hans AND mike) # more complicated with ()
- (*aol.com OR *gmx.de) AND (*free* OR *money*) # slightly more complicated with wildcards
- /^[a-zA-Z]+?.*\d{4}$/ # yes, a user can also supply a regex!
-
-=cut
-
-
-sub generate_regex {
- #
- # interface sub for generate_search()
- #
- my %params = @_;
- my($result);
- $result = &generate_search($params{-string}, $params{-case});
- if ($params{-if}) {
- $result = qq(\$match = 1 if($result););
- }
- return $result;
-}
-
-
-
-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 = $_ if(/ann\.a/i or /eg...on/i and /u.*do\$/i );
- #
- my($string,$case) = @_;
-
- if ($string =~ /^\/.+?\/$/) {
- return $string;
- }
- elsif (!$string) {
- return "/^/";
- }
-
- # per default case sensitive
- $case = ($case ? "" : "i");
-
- # we will get a / in front of the first word too!
- $string = " " . $string . " ";
-
- # check for apostrophs
- $string =~ s/(?<=\s)(\(??)("[^"]+"|\S+)(\)??)(?=\s)/$1 . &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/(? '.*',
- '?' => '.',
- '[' => '[',
- ']' => ']',
- '+' => '\+',
- '.' => '\.',
- '$' => '\$',
- '@' => '\@',
- );
-
- # 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;
-}
-
-
-
-
-
-
-
-
-sub crypt_data {
- #
- # enrypt a passwd
- #
- my($cleartext) = @_;
- debug("\"$cleartext\"");
- return if(!$cleartext);
-
- # create a random salt
- my @range=('0'..'9','a'..'z','A'..'Z');
-
- my $salt=$range[rand(int($#range)+1)] . $range[rand(int($#range)+1)];
-
- return crypt($cleartext, "$salt");
-}
-
-
-
-=head1 AUTHOR
-
-Thomas Linden
-
-=cut
-
-1;
-
-# Local Variables: ***
-# perl-master-file: ../../webmin/index.pl ***
-# End: ***
diff --git a/VERSION~ b/VERSION~
deleted file mode 100644
index e8ea05d..0000000
--- a/VERSION~
+++ /dev/null
@@ -1 +0,0 @@
-1.2.4
diff --git a/bin/_note b/bin/_note
deleted file mode 100755
index 4ea2ca6..0000000
--- a/bin/_note
+++ /dev/null
@@ -1,1681 +0,0 @@
-#!/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 = "$BORDER_COLOR>";
-$NUMC = "<$NUM_COLOR>";
-$_NUMC = "$NUM_COLOR>";
-$NOTEC = "<$NOTE_COLOR>";
-$_NOTEC = "$NOTE_COLOR>";
-$TIMEC = "<$TIME_COLOR>";
-$_TIMEC = "$TIME_COLOR>";
-$TOPICC = "<$TOPIC_COLOR>";
-$_TOPICC = "$TOPIC_COLOR>";
-
-$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/rc b/bin/rc
deleted file mode 100644
index 5696f7d..0000000
--- a/bin/rc
+++ /dev/null
@@ -1,172 +0,0 @@
-# 1.2.7 -*- sh -*-
-# This is a sample config for the note script
-# There are useful defaults set in note itself.
-#
-# Copy it to your $HOME as .noterc
-#
-# note is Copyright (c) 1999-2000 Thomas Linden.
-# You can contact me per email:
-#
-# 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 ..
-
-
-# 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 general
-
-
-
-# backend specific settings for binary(default) backend
-NoteDb /home/tlin/dev/note-1.2.7/bin/notedb.txt
-# Define the maximum bytes fields can have in a
-
-MaxNoteByte 32768
-MaxTimeByte 64
-
-
-
-# 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 1
-
-# Specify the encryption protocol. The appropriate perl
-# module needs to be installed. Possible velues are
-# IDEA, DES or Blowfish, the default is IDEA.
-CryptMethod Blowfish
-
-
-# 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 1
-
-
-# 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 auto
-
-
-# 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 RED
-NoteColor blue
-TimeColor green
-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/tlin/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 1
-
-
-
-# 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
-
-
-
-# you can define your very own time format for time stamps
-# YY - the last 2 digits of a year
-# YYYY - year
-# MM - month
-# DD - day
-# hh - hours
-# mm - minutes
-# ss - seconds
-# This is the default: (18.10.2000 21:32:08)
-TimeFormat DD.MM.YYYY hh:mm:ss
-
-
-
-AutoClear = 0
-
-
-# That's all about it for now.
-# If you still have any questiosn, please feel free to contact
-# me by email: Thomas Linden
-
\ No newline at end of file
diff --git a/bin/system_and.patch b/bin/system_and.patch
deleted file mode 100644
index d3e669a..0000000
--- a/bin/system_and.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-*** 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/note b/note
deleted file mode 100755
index 8b1b3aa..0000000
--- a/note
+++ /dev/null
@@ -1,1817 +0,0 @@
-#!/usr/bin/perl
-#
-# note - console notes management with database and encryption support.
-# Copyright (C) 1999-2012 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/note/
-#
-
-use lib qw(.);
-
-BEGIN {
- # works on unix or cygwin only!
- my $path = $0;
- $path =~ s#/[^/]*$##;
- unshift @INC, "$path/..";
-}
-
-use strict;
-no strict 'refs';
-use Getopt::Long;
-use FileHandle;
-use File::Spec;
-use Data::Dumper;
-use YAML;
-
-#
-# 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 ticket; # return a random string which is used as ticket number for new note entries
-
-#
-# globals
-#
-my (
- #
- # 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, $TOPIC,
-
- #
- # configuration options
- %conf, %driver,
-
- #
- # processed colors
- #
- $BORDERC, $_BORDERC, $NOTEC, $NUMC, $_NUMC, $_NOTEC, $TIMEC,
- $_TIMEC, $TOPICC, $_TOPICC,
-
- #
- # config presets
- #
- $DEFAULTDBNAME, $USER, $PATH, $CONF,
-
- #
- # internals
- #
- $TYPE, $mode, $NoteKey, %Color, @LastTopic, $timelen, $maxlen,
- $version, $CurTopic, $CurDepth, $WantTopic, $db,
- $sizeof, %TP, $TreeType, $ListType, $SetTitle, $clearstring,
- @ArgTopics, $key, $typedef, @NumBlock, $has_nothing, @completion_topics, @completion_notes,
- @randomlist, $hardparams
- );
-
-
-#
-# DEFAULTS, allows one to use note without a config
-# don't change them, instead use the config file!
-#
-
-%conf = (
- 'numbercolor' => 'blue',
- 'bordercolor' => 'black',
- 'timecolor' => 'black',
- 'topiccolor' => 'black',
- 'notecolor' => 'green',
- 'alwaysinteractive' => 1,
- 'keeptimestamp' => 0,
- 'readonly' => 0,
- 'shortcd' => 1,
- 'autoclear' => 0,
- 'maxlen' => 'auto',
- 'defaultlong' => 0,
- 'dbdriver' => 'binary',
- 'timeformat' => 'DD.MM.YYYY hh:mm:ss',
- 'usecolors' => 0,
- 'addticket' => 0,
- 'formattext' => 0,
- 'alwayseditor' => 1,
- 'useencryption' => 0,
- 'tempdirectory' => File::Spec->tmpdir(),
- 'topicseparator' => '/',
- 'printlines' => 0,
- 'cache' => 0,
- 'preferrededitor' => ''
-);
-
-# these are not customizable at runtime!
-$hardparams = "(readonly|maxlen|dbdriver|useencryption|cryptmethod)";
-
-$CONF = File::Spec->catfile($ENV{HOME}, ".noterc");
-$USER = getlogin || getpwuid($<);
-chomp $USER;
-$TOPIC = 1;
-$version = "1.3.8";
-$CurDepth = 1; # the current depth inside the topic "directory" structure...
-$maxlen = "auto";
-$timelen = 22;
-
-@randomlist = ('a'..'z', 0..9, 'A'..'Z');
-
-# colors available
-# \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',
- 'white_black' => '40;37;01',
- 'bold' => ';01',
- 'hide' => '44;34'
- );
-
-#
-# 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
- "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 /$conf{topicseparator}/, $opt_l;
- }
- else {
- $ListType = "LONG";
- @ArgTopics = split /$conf{topicseparator}/, $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";
- $mode = "display_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 = "del";
- $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;
-}
-
-
-# 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);
-}
-
-# directly jump to encrypt, 'cause this sub does
-# not require a database connection
-if ($mode eq "encrypt_passwd") {
- &encrypt_passwd;
- exit;
-}
-
-# Always interactive?
-if ($conf{alwaysinteractive} && $mode ne "dump" && $mode ne "import") {
- $mode = "interactive";
-}
-
-# OK ... Long-Listing shall be default ... You wanted it!!!
-if ($conf{defaultlong}) {
- # takes only precedence in commandline mode
- $ListType="LONG";
-}
-
-
-
-
-# calculate some constants...
-$BORDERC = "<$conf{bordercolor}>";
-$_BORDERC = "$conf{bordercolor}>";
-$NUMC = "<$conf{numbercolor}>";
-$_NUMC = "$conf{numbercolor}>";
-$NOTEC = "<$conf{notecolor}>";
-$_NOTEC = "$conf{notecolor}>";
-$TIMEC = "<$conf{timecolor}>";
-$_TIMEC = "$conf{timecolor}>";
-$TOPICC = "<$conf{topiccolor}>";
-$_TOPICC = "$conf{topiccolor}>";
-
-$NoteKey = $conf{topicseparator} . "notes" . $conf{topicseparator};
-
-
-
-
-# default permissions on new files (tmp)
-umask 077;
-
-
-# load the parent module
-&load_driver(1);
-
-# check wether the user wants to use encryption:
-if ($conf{useencryption} && $NOTEDB::crypt_supported == 1) {
- if ($conf{cryptmethod} eq "") {
- $conf{cryptmethod} = "Crypt::IDEA";
- }
- if (!exists $ENV{'NOTE_PASSWD'}) {
- print "password: ";
- eval {
- local($|) = 1;
- local(*TTY);
- open(TTY,"/dev/tty") or die "No /dev/tty!";
- system ("stty -echo );
- print STDERR "\r\n";
- system ("stty echo ;
- }
- }
- else {
- $key = $ENV{'NOTE_PASSWD'};
- }
- chomp $key;
- if ($conf{dbdriver} eq "mysql") {
- eval {
- require Crypt::CBC;
- my $cipher = new Crypt::CBC($key, $conf{cryptmethod});
- # decrypt the dbpasswd, if it's encrypted!
- $driver{mysql}->{dbpasswd} =
- $cipher->decrypt(unpack("u", $driver{mysql}->{dbpasswd})) if($driver{mysql}->{encrypt_passwd});
- &load_driver();
- };
- die "Could not connect to db: $@!\n" if($@);
- }
- else {
- &load_driver();
- }
- $db->use_crypt($key,$conf{cryptmethod});
- 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 database!
-}
-elsif ($conf{useencryption} && $NOTEDB::crypt_supported == 0) {
- print STDERR "WARNING: You enabled database encryption but neither Crypt::CBC\n";
- print STDERR "WARNING: or Crypt::$conf{cryptmethod} are installed! Please turn\n";
- print STDERR "WARNING: off encryption or install the desired modules! Thanks!\n";
- exit 1;
-}
-else {
- # as of 1.3.5 we do not fall back to cleartext anymore
- # I consider this as unsecure, if you don't, fix your installation!
-
- &load_driver();
- $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 ($conf{cache}) {
- $db->use_cache();
-}
-
-
-# add the backend version to the note version:
-$version .= ", " . $conf{dbdriver} . " " . $db->version();
-
-
-# main loop: ###############
-&$mode;
-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") or die "No /dev/tty!";
- system ("stty -echo );
- print STDERR "\r\n";
- system ("stty echo ;
- }
- chomp $key;
- eval {
- require Crypt::CBC;
- my $cipher = new Crypt::CBC($key, $conf{cryptmethod});
- $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
- my $count = scalar @NumBlock;
- 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", $count);
- print "\n";
- }
- $match = 1;
- }
- $count--;
- }
- 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 $conf{dbname} for \"$searchstring\"...\n\n";
-
- %res = $db->get_search($searchstring);
- my $nummatches = scalar keys %res;
- foreach $num (sort { $a <=> $b } keys %res) {
- if ($nummatches == 1) {
- output($num, $res{$num}->{'note'}, $res{$num}->{'date'}, "SINGLE");
- }
- else {
- 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";
- }
-
- # 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 =~ /^($conf{topicseparator})/) {
- @topic = split(/$conf{topicseparator}/,$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 =~ /^($conf{topicseparator})/) {
- $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 "") {
- if ($i) {
- # only if there were notes under current topic
- undef $PATH;
- foreach (@RealTopic) {
- $PATH .= $_ . $conf{topicseparator};
- last if($_ eq $CurTopic);
- }
- }
- else {
- # it is an empty topic, no notes here
- $PATH = join $conf{topicseparator}, @LastTopic;
- $PATH .= $conf{topicseparator} . $CurTopic . $conf{topicseparator};
- $PATH =~ s/^\Q$conf{topicseparator}$conf{topicseparator}\E/$conf{topicseparator}/;
- }
- }
- else {
- $PATH = $conf{topicseparator};
- }
-
- @completion_topics = ();
- @completion_notes = ();
- # we are at top level, print a list of topics...
- foreach $top (sort(keys %TP)) {
- push @completion_topics, $top;
- output("-", " => ". $top . "$conf{topicseparator} ($TP{$top} notes)",
- " Sub Topic ");
- }
- #print Dumper(@CurItem);
- for ($in=0;$in<$i;$in++) {
- push @completion_notes, $CurItem[$in]->{'num'};
- 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);
- if ($conf{readonly}) {
- print "readonly\n";
- return;
- }
- $date = &getdate;
- return if $db->lock();
- if ($conf{alwayseditor}) {
- $TEMP = &gettemp;
- # security!
- unlink $TEMP;
- # let the user edit it...
- $editor = &find_editor;
- if ($editor) {
- # create the temp file
- open NEW, "> $TEMP" or die "Could not write $TEMP: $!\n";
- 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";
- $db->unlock();
- 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;
- $db->unlock();
- 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 a single .\n";
- do
- {
- $line = ;
- $note = $note . $line;
- } until $line eq ".\n";
- # remove the . !
- chop $note;
- chop $note;
- }
- }
- # look if the note was empty, so don't store it!
- if ($note =~ /^\s*$/) {
- print "...your note was empty and will not be saved.\n";
- $db->unlock();
- return;
- }
- # since we have not a number, look for the next one available:
- $number = $db->get_nextnum();
- if ($TOPIC && $CurTopic ne "") {
- @topic = split(/$conf{topicseparator}/,$note);
- if ($topic[1] eq "") {
- $note = $PATH . "\n$note";
- }
- }
- $note = &add_ticket($note);
-
- $db->set_new($number,$note,$date);
- # everything ok until here!
- print "note stored. it has been assigned the number $number.\n\n";
- $db->unlock();
- }
-
-sub add_ticket {
- my $orignote = shift;
- if ($conf{addticket}) {
- my ($topic, $title, $rest) = split /\n/, $orignote, 3;
- my $note = "";
- if ($topic =~ /^\//) {
- # topic path, keep it
- $note .= "$topic\n";
- }
- else {
- # no topic
- $rest = "$title\n$rest";
- $title = $topic;
- }
- if ($title !~ /^\[[a-z0-9A-Z]+\]/) {
- # no ticket number, so create one
- my $ticket = &ticket();
- $title = "[" . ticket() . "] " . $title;
- }
- $note .= "$title\n$rest";
- return $note;
- }
- else {
- return $orignote;
- }
-}
-
-
-############################### DELETE ##################################
-sub del {
- my($i,@count, $setnum, $pos, $ERR);
- if ($conf{readonly}) {
- print "readonly\n";
- return;
- }
- # delete a note
- &num_bereich; # get @NumBlock from $number
-
- return if $db->lock();
-
- 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();
-
- $db->unlock();
- @NumBlock = ();
- }
-
-############################### EDIT ##################################
-sub edit {
- my($keeptime, $date, $editor, $TEMP, $note, $t, $num, $match, $backup);
- if ($conf{readonly}) {
- print "readonly\n";
- return;
- }
- # edit a note
- $date = &getdate;
-
- return if $db->lock();
-
- ($note, $keeptime) = $db->get_single($number);
- if ($keeptime eq "") {
- print "no note with that number found ($number)!\n\n";
- if($mode ne "interactive") {
- $db->unlock();
- exit(0);
- }
- else {
- $db->unlock();
- return;
- }
- }
-
- $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;
-
- $backup = $note;
-
- if ($editor) {
- system ($editor, $TEMP) and die "Could not execute $editor: $!\n";
- }
- 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 ($note ne $backup) {
- if ($conf{keeptimestamp}) {
- $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";
- }
- else {
- print "note number $number has not changed, no save done.\n";
- }
- $db->unlock();
- }
-
-
-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();
- # FIXME: prepare hashing in NOTEDB class
- foreach $num (sort { $a <=> $b } keys %res) {
- print STDOUT "dumping note number $num to $dump_file\n" if($dump_file ne "-");
- my($title, $path, $body);
- if ($res{$num}->{note} =~ /^\//) {
- ($path, $title, $body) = split /\n/, $res{$num}->{note}, 3;
- }
- else {
- ($title, $body) = split /\n/, $res{$num}->{note}, 2;
- $path = '';
- }
- my $date = $res{$num}->{date};
- $res{$num} = { body => $body, title => $title, path => $path, date => $date};
- }
- close(DUMPFILE);
- select STDOUT;
- }
-
-sub import {
- my($num, $start, $complete, $dummi, $note, $date, $time, $number, $stdin, $DUMP, %data);
- # 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;
- }
-
- my $yaml = join '', <$DUMP>;
-
- my $res = Load($yaml);
-
- foreach my $number (keys %{$res}) {
- my $note;
- if ($res->{$number}->{path}) {
- $note = "$res->{$number}->{path}\n$res->{$number}->{title}\n$res->{$number}->{body}";
- }
- else {
- $note = "$res->{$number}->{title}\n$res->{$number}->{body}";
- }
- $data{$number} = {
- date => $res->{$number}->{date},
- note => &add_ticket($note)
- };
- print "fetched note number $number from $dump_file from $res->{$number}->{date}.\n" if(!$stdin);
- $number++;
- }
-
- $db->set_del_all() if($ImportType ne "");
- $db->import_data(\%data);
-}
-
-sub OLDimport {
- my($num, $start, $complete, $dummi, $note, $date, $time, $number, $stdin, $DUMP, %data);
- # 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;
- }
-
- $complete = $start = 0;
- $number = 1;
- while (<$DUMP>) {
- chomp $_;
- if ($_ =~ /^Number:\s\d+/) {
- if ($start == 0) {
- # we have no previous record
- $start = 1;
- }
- else {
- # we got a complete record, save it!
- $data{$number} = {
- date => $date,
- note => &add_ticket($note)
- };
- print "fetched note number $number from $dump_file from $date.\n" if(!$stdin);
- $complete = 0;
- $note = "";
- $date = "";
- $number++;
- }
- }
- 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
- $data{$number} = {
- date => $date,
- note => &add_ticket($note)
- };
- print "fetched note number $number from $dump_file from $date.\n" if(!$stdin);
- }
-
- $db->set_del_all() if($ImportType ne "");
- $db->import_data(\%data);
-}
-
-sub determine_width {
- # determine terminal wide, if possible
- if ($maxlen eq "auto") {
- eval {
- my $wide = `stty -a`;
- if ($wide =~ /columns (\d+?);/) {
- $maxlen = $1 - 32; # (32 = timestamp + borders)
- }
- elsif ($wide =~ /; (\d+?) columns;/) {
- # bsd
- $maxlen = $1 - 32; # (32 = timestamp + borders)
- }
- else {
- # stty didn't work
- $maxlen = 80 - 32;
- }
- };
- }
-}
-
-sub clear {
- # first, try to determine the terminal height
- return if(!$conf{autoclear});
- my $hoch;
- eval {
- my $height = `stty -a`;
- if ($height =~ /rows (\d+?);/) {
- $hoch = $1;
- }
- elsif ($height =~ /; (\d+?) rows;/) {
- # bsd
- $hoch = $1;
- }
- };
- if (!$hoch) {
- # stty didn't work
- $hoch = 25;
- }
- print "\n" x $hoch;
-}
-
-sub interactive {
- my($B, $BB, $menu, $char, $Channel);
- $Channel = $|;
- local $| = 1;
- # 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!
- &determine_width;
- $ListType = ($conf{defaultlong}) ? "LONG" : "";
- &list;
-
- my ($term, $prompt, $attribs);
- eval { require Term::ReadLine; };
- if (!$@) {
- $term = new Term::ReadLine('');
- $attribs = $term->Attribs;
- $attribs->{completion_function} = \&complete;
- }
-
- for (;;) {
- $ListType = ($conf{defaultlong}) ? "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"!
- if ($term) {
- if (defined ($char = $term->readline(" "))) {
- $term->addhistory($char) if $char =~ /\S/;
- $char =~ s/\s*$//; # remove trailing whitespace (could come from auto-completion)
- }
- else {
- # shutdown
- $| = $Channel;
- print "\n\ngood bye!\n";
- exit(0);
- }
- }
- else {
- $char = ;
- chomp $char;
- }
-
- &determine_width;
- &clear;
-
- 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 =~ /^c\s*$/) {
- print "Missing parameter (parameter=value), available ones:\n";
- foreach my $var (sort keys %conf) {
- if ($var !~ /^$hardparams/ && $var !~ /::/) {
- printf "%20s = %s\n", $var, $conf{$var};
- }
- }
- }
- elsif ($char =~ /^c\s*(.+?)\s*=\s*(.+?)/) {
- # configure
- my $param = $1;
- my $value = $2;
- if ($param !~ /^$hardparams/ && $param !~ /::/ && exists $conf{$param}) {
- print "Changing $param from $conf{$param} to $value\n";
- $conf{$param} = $value;
- }
- else {
- print "Unknown config parameter $param!\n";
- }
- }
- elsif ($char =~ /^\.\.$/ || $char =~ /^cd\s*\.\.$/) {
- $CurDepth-- if ($CurDepth > 1);
- $CurTopic = $LastTopic[$CurDepth];
- pop @LastTopic; # remove last element
- &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+?$/ && $conf{short_cd}) {
- # just a number!
- my @topic;
- my ($cnote, $cdate) = $db->get_single($unchar);
- my ($firstline,$dummy) = split /\n/, $cnote, 2;
- if ($firstline =~ /^($conf{topicseparator})/) {
- @topic = split(/$conf{topicseparator}/,$firstline);
- }
- else {
- @topic = ();
- }
- if (@topic) {
- # only jump, if, and only if there were at least one topic!
- $CurDepth = $#topic + 1;
- $CurTopic = pop @topic;
- @LastTopic = ("");
- push @LastTopic, @topic;
- }
- &list;
- }
- elsif ($unchar eq $conf{topicseparator}) {
- # 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 {
- # try incomplete match
- my @matches;
- foreach my $topic (keys %TP) {
- if ($topic =~ /^$char/) {
- push @matches, $topic;
- }
- }
- my $nm = scalar @matches;
- if ($nm == 1) {
- # match on one incomplete topic, use this
- $LastTopic[$CurDepth] = $CurTopic;
- $CurTopic = $matches[0];
- $CurDepth++;
- &list;
- }
- elsif ($nm > 1) {
- print "available topics: " . join( "," , @matches) . "\n";
- }
- else {
- print "\nunknown command!\n";
- }
- }
- undef $unchar;
- }
- }
- }
-
-
-sub usage
- {
- print qq~This is the program note $version by Thomas Linden (c) 1999-2012.
-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...]]
-Read the note(1) manpage for more details.
-~;
- exit 1;
- }
-
-sub find_editor {
- return $conf{preferrededitor} || $ENV{"VISUAL"} || $ENV{"EDITOR"} || "vi";
-}
-
-#/
-
-sub format {
- # make text bold/underlined/inverse using current $NOTEC
- my($note) = @_;
- if ($conf{formattext}) {
- # prepare colors to be used for replacement
- 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>/;
-
- if ($conf{formattext} eq "simple") {
- $note =~ s/\*([^\*]*)\*/$BN$1$_BN/g;
- $note =~ s/_([^_]*)_/$UN$1$_UN/g;
- $note =~ s/{([^}]*)}/$IN$1$_IN/g;
- $note =~ s#(?$1#g;
- }
- else {
- $note =~ s/\*\*([^\*]{2,})\*\*/$BN$1$_BN/g;
- $note =~ s/__([^_]{2,})__/$UN$1$_UN/g;
- $note =~ s/{{([^}]{2,})}}/$IN$1$_IN/g;
- $note =~ s#//([^/]{2,})//#$1#g;
- }
-
- $note =~ s/(<\/.*>)/$1$NOTEC/g;
- }
- $note;
-}
-
-sub output {
- my($SSS, $LINE, $num, $note, $time, $TYPE, $L, $LONGSPC, $R, $PathLen, $SP, $title, $CUTSPACE,
- $VersionLen, $len, $diff, $Space, $nlen, $txtlen, $count);
- ($num, $note, $time, $TYPE, $count) = @_;
-
- $txtlen = ($ListType eq "LONG") ? $maxlen : $timelen + $maxlen;
- $note = &format($note);
-
- $SSS = "-" x ($maxlen + 30);
- $nlen = length("$num");
- $LINE = "$BORDERC $SSS $_BORDERC\n";
- $LONGSPC = " " x (25 - $nlen);
- if ($conf{printlines}) {
- $L = $BORDERC . "[" . $_BORDERC;
- $R = $BORDERC . "]" . $_BORDERC;
- }
- $PathLen = length($PATH); # will be ZERO, if not in TOPIC mode!
- $VersionLen = length($version) + 7;
-
- if ($TYPE ne "SINGLE") {
- if (!$SetTitle) {
- $SP = "";
- # print only if it is the first line!
- $SP = " " x ($maxlen - 2 - $PathLen - $VersionLen);
- if (!$Raw) {
- # no title in raw-mode!
- print C $LINE if ($conf{printlines});
- print C "$L $NUMC#$_NUMC ";
- if ($ListType eq "LONG") {
- print C " $TIMEC" . "creation date$_TIMEC ";
- }
- else {
- print $LONGSPC if ($conf{printlines});
- }
- if ($TOPIC) {
- print C $TOPICC . "$PATH $_TOPICC$SP" . " note $version $R\n";
- }
- else {
- print C $NOTEC . "note$_NOTEC$SP" . " note $version $R\n";
- }
- print C $LINE if ($conf{printlines});
- }
- $SetTitle = 1;
- }
- $title = "";
- $CUTSPACE = " " x $txtlen;
- if ($TYPE eq "search") {
- $note =~ s/^\Q$conf{topicseparator}\E.+?\Q$conf{topicseparator}\E\n//;
- }
- $note =~ s/\n/$CUTSPACE/g;
- $len = length($note);
- if ($len < ($txtlen - 2 - $nlen)) {
- $diff = $txtlen - $len;
- if (!$Raw) {
- if ($num eq "-") {
- $Space = " " x $diff;
- $title = $BORDERC . $TOPICC . $note . " " . $_TOPICC . $Space . "$_BORDERC";
- }
- else {
- $Space = " " x ($diff - ($nlen - 1));
- $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 =~ /^ => (.*)$conf{topicseparator} (.*)$/) {
- $title = "$1$conf{topicseparator} $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 if ($conf{printlines});
- }
- }
- else {
- # we will not reach this in raw-mode, therefore no decision here!
- chomp $note;
- $Space = " " x (($maxlen + $timelen) - $nlen - 16);
-
- *CHANNEL = *STDOUT;
- my $usecol = $conf{usecolors};
-
- if ($conf{less}) {
- my $less = "less";
- if ($conf{less} ne 1) {
- # use given less command line
- $less = $conf{less};
- }
- if (open LESS, "|$less") {
- *CHANNEL = *LESS;
- $conf{usecolors} = 0;
- }
- }
-
- print CHANNEL C $LINE if ($conf{printlines});
- print CHANNEL C "$L $NUMC$num$_NUMC $R$L$TIMEC$time$_TIMEC $Space$R\n";
- print CHANNEL C "\n";
- print CHANNEL C $NOTEC . $note . $_NOTEC . "\n";
- print CHANNEL C $LINE if ($count == 1 && $conf{printlines});
-
- if ($conf{less}) {
- close LESS;
- }
-
- $conf{usecolors} = $usecol;
- }
- }
-
-
-
-sub C {
- my($default, $S, $Col, $NC, $T);
- $default = "\033[0m";
- $S = $_[0];
- foreach $Col (%Color) {
- if ($S =~ /<$Col>/g) {
- if ($conf{usecolors}) {
- $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 commas?
- @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/;
- if ($conf{timeformat}) {
- my $back = $conf{timeformat};
- $back =~ s/YYYY/$year/;
- $back =~ s/YY/substr($year, 1, 2)/e;
- $back =~ s/MM/$mon/;
- $back =~ s/DD/$mday/;
- $back =~ s/mm/$min/;
- $back =~ s/hh/$hour/;
- $back =~ s/ss/$sec/;
- return $back;
- }
- 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 = File::Spec->catfile($conf{tempdirectory}, $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, $C);
- $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;
- $C = $B . "C" . $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.
-$C Change note config online. Use with care!
-$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.~;
- }
- print C qq~
-
-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 =~ /^($conf{topicseparator})/) {
- $firstline =~ s/($conf{topicseparator})*$//; #remove Topicseparator
- @nodes = split(/$conf{topicseparator}/,$firstline);
- }
- else {
- @nodes = (); #("$conf{topicseparator}");
- $text = $firstline;
- }
- &determine_width; # ensure $maxlen values for &tree in non interactive modes
- &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[" . $conf{topicseparator} . $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*$//;
- $value =~ s/\s*#.*$//;
- if ($value =~ /^(~\/)(.*)$/) {
- $value = File::Spec->catfile($ENV{HOME}, $2);
- }
-
- if ($value =~ /^(yes|on|1)$/i) {
- $value = 1;
- }
- elsif ($value =~ /^(no|off|0)$/i) {
- $value = 0;
- }
-
- $option = lc($option);
-
- if ($option =~ /^(.+)::(.*)$/) {
- # driver option
- $driver{$1}->{$2} = $value;
- }
- else {
- # other option
- $conf{$option} = $value;
- }
- }
-
- close CONFIG;
-}
-
-
-sub complete {
- my ($text, $line, $start) = @_;
-
- if ($line =~ /^\s*$/) {
- # notes or topics allowed
- return @completion_topics, @completion_notes;
- }
- if ($line =~ /^cd/) {
- # only topics allowed
- return @completion_topics, "..";
- }
- if ($line =~ /^l/i) {
- # only topics allowed
- return @completion_topics;
- }
- if ($line =~ /^[ed]/) {
- # only notes allowed
- return @completion_notes;
- }
- if ($line =~ /^[snt\?q]/i) {
- # nothing allowed
- return ();
- }
-}
-
-sub load_driver {
- my ($parent) = @_;
-
- if ($parent) {
- my $pkg = "NOTEDB";
- eval "use $pkg;";
- if ($@) {
- die "Could not load the NOTEDB module: $@\n";
- }
- }
- else {
- # load the backend driver
- my $pkg = "NOTEDB::$conf{dbdriver}";
- eval "use $pkg;";
- if ($@) {
- die "$conf{dbdriver} backend unsupported: $@\n";
- }
- else {
- $db = $pkg->new(%{$driver{$conf{dbdriver}}});
- }
- }
-}
-
-sub ticket {
- return join "", (map { $randomlist[int(rand($#randomlist))] } (0 .. 10) );
-}
-__END__
diff --git a/note.1 b/note.1
deleted file mode 100644
index 64b51e4..0000000
--- a/note.1
+++ /dev/null
@@ -1,540 +0,0 @@
-.\" Automatically generated by Pod::Man version 1.02
-.\" Sat Aug 19 15:59:14 2000
-.\"
-.\" Standard preamble:
-.\" ======================================================================
-.de Sh \" Subsection heading
-.br
-.if t .Sp
-.ne 5
-.PP
-\fB\\$1\fR
-.PP
-..
-.de Sp \" Vertical space (when we can't use .PP)
-.if t .sp .5v
-.if n .sp
-..
-.de Ip \" List item
-.br
-.ie \\n(.$>=3 .ne \\$3
-.el .ne 3
-.IP "\\$1" \\$2
-..
-.de Vb \" Begin verbatim text
-.ft CW
-.nf
-.ne \\$1
-..
-.de Ve \" End verbatim text
-.ft R
-
-.fi
-..
-.\" Set up some character translations and predefined strings. \*(-- will
-.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
-.\" double quote, and \*(R" will give a right double quote. | will give a
-.\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used
-.\" to do unbreakable dashes and therefore won't be available. \*(C` and
-.\" \*(C' expand to `' in nroff, nothing in troff, for use with C<>
-.tr \(*W-|\(bv\*(Tr
-.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
-.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" ""
-. ds C` `
-. ds C' '
-'br\}
-.el\{\
-. ds -- \|\(em\|
-. ds PI \(*p
-. ds L" ``
-. ds R" ''
-'br\}
-.\"
-.\" If the F register is turned on, we'll generate index entries on stderr
-.\" for titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and
-.\" index entries marked with X<> in POD. Of course, you'll have to process
-.\" the output yourself in some meaningful fashion.
-.if \nF \{\
-. de IX
-. tm Index:\\$1\t\\n%\t"\\$2"
-. .
-. nr % 0
-. rr F
-.\}
-.\"
-.\" For nroff, turn off justification. Always turn off hyphenation; it
-.\" makes way too many mistakes in technical documents.
-.hy 0
-.if n .na
-.\"
-.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
-.\" Fear. Run. Save yourself. No user-serviceable parts.
-.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 /
-.\}
-.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 / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
-.\}
-. \" 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 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
-. \" 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 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
-.\}
-.rm #[ #] #H #V #F C
-.\" ======================================================================
-.\"
-.IX Title "NOTE 1"
-.TH note 1 "note version 1.1.1" "20/Aug/2000" "Documentation"
-.UC
-.SH "NAME"
-note \- a perl script for maintaining notes.
-.SH "SYNPOPSIS"
-.IX Header "SYNPOPSIS"
-note [options] [ number [,number...]]
-.SH "DESCRIPTION"
-.IX Header "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-module(which
-can also be used for other by \s-1DBI\s0 supported \s-1DBMS\s0), another
-module, which uses a binary file for storage and a \s-1DBM\s0 module.
-Note supports since version 1.0.0 encryption(\s-1IDEA\s0 or \s-1DES\s0)!
-.SH "OPTIONS"
-.IX Header "OPTIONS"
-.Ip "\fI\-c, \-\-config file\fR" 4
-.IX Item "-c, --config file"
-Use another config file than the default ~/.noterc.
-.Ip "\fI\-l, \-\-list [topic]\fR" 4
-.IX Item "-l, --list [topic]"
-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" 4
-.IX Item "-L, --longlist [topic]"
-The same as \fI\-l\fR but prints also the timestamp of the notes.
-.Ip "\fI\-t, \-\-topic\fR" 4
-.IX Item "-t, --topic"
-Prints a list of all topics as a tree.
-.Ip "\fI\-T, \-\-longtopic\fR" 4
-.IX Item "-T, --longtopic"
-Prints the topic-tree with the notes under each topic.
-.Ip "\fI\-s, \-\-search string\fR" 4
-.IX Item "-s, --search string"
-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" 4
-.IX Item "-e, --edit number"
-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" 4
-.IX Item "-d, --delete number"
-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" 4
-.IX Item "-D, --Dump [file | -]"
-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" 4
-.IX Item "-I, --Import file | -"
-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" 4
-.IX Item "-o, --overwrite"
-Only suitable for use with \-\-Import. Overwrites an
-existing notedb. Use with care.
-.Ip "\fI\-r, \-\-raw\fR" 4
-.IX Item "-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.
-.Ip "\fI\-i, \-\-interactive\fR" 4
-.IX Item "-i, --interactive"
-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" 4
-.IX Item "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!).
-.Ip "\fI\-h, \-\-help\fR" 4
-.IX Item "-h, --help"
-Display this help screen.
-.Ip "\fI\-v, \-\-version\fR" 4
-.IX Item "-v, --version"
-Display the version number.
-.Ip "\fB-\fR" 4
-.IX Item "-"
-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"
-.IX Header "USAGE"
-.Sh "\s-1GENERAL\s0 \s-1USAGE\s0"
-.IX Subsection "GENERAL USAGE"
-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, otherwise 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 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-
-structure. You can use the command \*(L"\-t\*(R" in this case, which
-will display a tree-view of your topic-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"
-.IX Subsection "SEARCHING"
-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.
-.PP
-You need to know, that note searches for the expression in every
-note. In other words, \*(L"moses \s-1AND\s0 lenin\*(R" searches for an occurence
-of \*(L"moses\*(R" and \*(L"lenin\*(R" in \s-1ONE\s0 note. Or, if you are looking for
-\&\*(L"mike \s-1OR\s0 daniel\*(R", then it searches for an occurence of \*(L"mike\*(R" or
-daniel\*(L" in \s-1ONE\s0 note. Thus a note with the text \*(R"mike oldfield" will
-match that search.
-.Sh "\s-1TOPICS\s0"
-.IX Subsection "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 \*(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"
-.IX Subsection "INTERACTIVE MODE"
-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 (\*(L"/\*(R").
-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" 4
-.IX Item "L [topic]"
-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" 4
-.IX Item "l [topic]"
-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" 4
-.IX Item "N"
-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" 4
-.IX Item "E number"
-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" 4
-.IX Item "D number"
-\&\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" 4
-.IX Item "S [expression]"
-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" 4
-.IX Item "T"
-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" 4
-.IX Item "cd topic"
-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" 4
-.IX Item "? or h"
-Display a short help screen.
-.Ip "\fBQ\fR" 4
-.IX Item "Q"
-Quit note.
-.Sh "\s-1BACKUP\s0"
-.IX Subsection "BACKUP"
-You can also dump the contents of your note-database into a
-ASCII-textfile(\fI\-D\fR). 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).
-.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" 4
-\&\fBnote \-D -\fR creates a note-database dump and prints it out
-to stantdard output.
-.Ip "\(bu" 4
-\&\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" 4
-\&\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"
-.IX Subsection "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
-\&\*(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 tag(kinda) of
-the color and ends 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"
-.IX Header "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 \s-1UPGRADE\s0!
-.PP
-You can choose from different encryption algorythms. The default
-is \s-1IDEA\s0, but \s-1DES\s0 or \s-1BLOWFISH\s0 is also possible. You need to have
-installed the following additional perl-modules on your system:
-\&\s-1MD5\s0
-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"
-.IX Header "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"
-.IX Header "SEE ALSO"
-See the usage guide in the \s-1README\s0 or visit the note website:
-http://www.0x49.org.
-.SH "AUTHOR"
-.IX Header "AUTHOR"
-Thomas Linden
diff --git a/pm_to_blib b/pm_to_blib
deleted file mode 100644
index e69de29..0000000