From 5e99b8856278aba1ed1ed3d00f6a2a000fd6b86c Mon Sep 17 00:00:00 2001 From: TLINDEN Date: Fri, 10 Feb 2012 20:41:09 +0100 Subject: [PATCH] initial import to github done. --- Makefile | 782 ------------------ Tools.pm | 330 -------- VERSION~ | 1 - bin/_note | 1681 -------------------------------------- bin/rc | 172 ---- bin/system_and.patch | 19 - note | 1817 ------------------------------------------ note.1 | 540 ------------- pm_to_blib | 0 9 files changed, 5342 deletions(-) delete mode 100644 Makefile delete mode 100644 Tools.pm delete mode 100644 VERSION~ delete mode 100755 bin/_note delete mode 100644 bin/rc delete mode 100644 bin/system_and.patch delete mode 100755 note delete mode 100644 note.1 delete mode 100644 pm_to_blib 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 = ""; -$NUMC = "<$NUM_COLOR>"; -$_NUMC = ""; -$NOTEC = "<$NOTE_COLOR>"; -$_NOTEC = ""; -$TIMEC = "<$TIME_COLOR>"; -$_TIMEC = ""; -$TOPICC = "<$TOPIC_COLOR>"; -$_TOPICC = ""; - -$NoteKey = $TopicSep . "notes" . $TopicSep; - -# default permissions on new files (tmp) -umask 077; - -# check if the user wants to use encryption: -if($USE_CRYPT eq "YES" && $NOTEDB::crypt_supported == 1) { - if($CRYPT_METHOD eq "") { - $CRYPT_METHOD = "Crypt::IDEA"; - } - if(!exists $ENV{'NOTE_PASSWD'}) { - print "password: "; - eval { - local($|) = 1; - local(*TTY); - open(TTY,"/dev/tty"); - system ("stty -echo ); - print STDERR "\r\n"; - system ("stty echo ; - } - } - else { - $key = $ENV{'NOTE_PASSWD'}; - } - chomp $key; - $db->use_crypt($key,$CRYPT_METHOD); - undef $key; - # verify correctness of passwd - my ($cnote, $cdate) = $db->get_single(1); - if($cdate ne "") { - if($cdate !~ /^\d+\.\d+?/) { - print "access denied.\n"; # decrypted $date is not a number! - exit(1); - } - } #else empty! -} -else { - $db->no_crypt; - # does: NOTEDB::crypt_supported = 0; - my ($cnote, $cdate) = $db->get_single(1); - if($cdate ne "") { - if($cdate !~ /^\d+\.\d+?/) { - print "$NOTEDB seems to be encrypted!\n"; - exit(1); - } - } -} - -# main loop: ############### -if($mode eq "display") -{ - &display; -} -elsif($mode eq "search") -{ - &search; -} -elsif($mode eq "list") -{ - &list; -} -elsif($mode eq "tree") -{ - &display_tree; -} -elsif($mode eq "new") -{ - &new; -} -elsif($mode eq "delete") -{ - del; -} -elsif($mode eq "edit") -{ - &edit; -} -elsif($mode eq "dump") -{ - &dump; -} -elsif($mode eq "import") -{ - &import; -} -elsif($mode eq "interactive") -{ - &interactive; -} -else -{ - #undefined :-( -} - - -exit(0); -################## EOP ################ - - - -############################### DISPLAY ################################## -sub display -{ - my($N,$match,$note,$date,$num); - # display a certain note - print "\n"; - &num_bereich; # get @NumBlock from $numer - foreach $N (@NumBlock) - { - ($note, $date) = $db->get_single($N); - if($note) - { - if($Raw) { - print "$N\n$date\n$note\n\n"; - } - else { - output($N, $note, $date, "SINGLE"); - print "\n"; - } - $match = 1; - } - } - if(!$match) - { - print "no note with that number found!\n"; - } -} -############################### SEARCH ################################## -sub search -{ - my($n,$match,$note,$date,$num,%res); - if($searchstring eq "") - { - print "No searchstring specified!\n"; - } - else { - print "searching the database $dbname for \"$searchstring\"...\n\n"; - - %res = $db->get_search($searchstring); - - foreach $num (sort { $a <=> $b } keys %res) - { - output($num, $res{$num}->{'note'}, $res{$num}->{'date'}); - $match = 1; - } - if(!$match) - { - print "no matching note found!\n"; - } - print "\n"; - } -} - - -############################### LIST ################################## -sub list -{ - my(@topic,@RealTopic, $i,$t,$n,$num,@CurItem,$top,$in,%res); - if($mode ne "interactive" && !$Raw) - { - print "\nList of all existing notes:\n\n"; - } - else { - print "\n"; - } - - # list all available notes (number and firstline) - %res = $db->get_all(); - - if($TOPIC) - { - undef %TP; - } - - foreach $num (sort { $a <=> $b } keys %res) - { - $n = $res{$num}->{'note'}; - $t = $res{$num}->{'date'}; - if($TOPIC) - { - # this allows us to have multiple topics (subtopics!) - my ($firstline,$dummy) = split /\n/, $n, 2; - if($firstline =~ /^($TopicSep)/) - { - @topic = split(/$TopicSep/,$firstline); - } - else - { - @topic = (); - } - # looks like: "\topic\" - # collect a list of topics under the current topic - if($topic[$CurDepth-1] eq $CurTopic && $topic[$CurDepth] ne "") - { - if(exists $TP{$topic[$CurDepth]}) - { - $TP{$topic[$CurDepth]}++; - } - else - { - # only if the next item *is* a topic! - $TP{$topic[$CurDepth]} = 1 if(($CurDepth) <= $#topic); - } - } - elsif($topic[$CurDepth-1] eq $CurTopic || ($topic[$CurDepth] eq "" && $CurDepth ==1)) - { - # cut the topic off the note-text - if($n =~ /^($TopicSep)/) - { - $CurItem[$i]->{'note'} = $dummy; - } - else - { - $CurItem[$i]->{'note'} = $n; - } - # save for later output() call - $CurItem[$i]->{'num'} = $num; - $CurItem[$i]->{'time'} = $t; - $i++; - # use this note for building the $PATH! - if($RealTopic[0] eq "") - { - @RealTopic = @topic; - } - } - } - else - { - output($num, $n, $t); - } - } - if($TOPIC) - { - if($CurTopic ne "") - { - undef $PATH; - foreach (@RealTopic) - { - $PATH .= $_ . $TopicSep; - last if($_ eq $CurTopic); - } - } - else - { - $PATH = $TopicSep; - } - - # we are at top level, print a list of topics... - foreach $top (sort(keys %TP)) - { - output("-", " => ". $top . "$TopicSep ($TP{$top} notes)", - " Sub Topic "); - } - #print Dumper(@CurItem); - for($in=0;$in<$i;$in++) - { - output( $CurItem[$in]->{'num'}, - $CurItem[$in]->{'note'}, - $CurItem[$in]->{'time'} ); - } - } - - print "\n"; -} - -############################### NEW ################################## -sub new -{ - my($TEMP,$editor, $date, $note, $WARN, $c, $line, $num, @topic); - $date = &getdate; - if($ALWAYS_EDIT eq "YES") - { - $TEMP = &gettemp; - # let the user edit it... - $editor = &find_editor; - if($editor) - { - system "touch", $TEMP and die $!; - system "chattr", "+s", $TEMP; # ignore errors, since only on ext2 supported! - system $editor, $TEMP; - } - else - { - print "Could not find an editor to use!\n"; - exit(0); - } - # read it in ($note) - $note = ""; - open E, "<$TEMP" or $WARN = 1; - if($WARN) - { - print "...edit process interupted! No note has been saved.\n"; - undef $WARN; - return; - } - $c = 0; - while() - { - $note = $note . $_; - } - chomp $note; - close E; - # privacy! - unlink $TEMP; - } - else - { - $note = ""; - $line = ""; - # create a new note - if($NewType) - { - # be silent! read from STDIN until EOF. - while () { $note .= $_; } - } - else - { - print "enter the text of the note, end with .\n"; - do - { - $line = ; - $note = $note . $line; - } until $line eq ".\n"; - # remove the . ! - chop $note; - chop $note; - } - } - - # since we have not number, look for the next available: - $number = $db->get_nextnum(); - if($TOPIC && $CurTopic ne "") - { - @topic = split(/$TopicSep/,$note); - if($topic[1] eq "") - { - $note = $PATH . "\n$note"; - } - } - - - $db->set_new($number,$note,$date); - - # everything ok until here! - print "note stored. it has been assigned the number $number.\n\n"; -} - - -############################### DELETE ################################## -sub del -{ - my($i,@count, $setnum, $pos, $ERR); - # delete a note - &num_bereich; # get @NumBlock from $number - foreach $_ (@NumBlock) - { - $ERR = $db->set_del($_); - if($ERR) - { - print "no note with number $_ found!\n"; - } - else - { - print "note number $_ has been deleted.\n"; - } - } - # recount the notenumbers: - $db->set_recountnums(); - - @NumBlock = (); -} - -############################### EDIT ################################## -sub edit -{ - my($keeptime, $date, $editor, $TEMP, $note, $t, $num, $match); - # edit a note - $date = &getdate; - ($note, $keeptime) = $db->get_single($number); - if($keeptime eq "") - { - print "no note with that number found!\n\n"; - exit(0) if($mode ne "interactive"); - } - $TEMP = &gettemp; - open NOTE,">$TEMP" or die "Could not open $TEMP\n"; - select NOTE; - - system "chattr", "+s", $TEMP; # ignore errors, like in new() - - print $note; - close NOTE; - select STDOUT; - $editor = &find_editor; - if($editor) - { - system $editor, $TEMP; - } - else - { - print "Could not find an editor to use!\n"; - exit(0); - } - $note = ""; - open NOTE,"<$TEMP" or die "Could not open $TEMP\n"; - - while() - { - $note = $note . $_; - } - chomp $note; - close NOTE; - - unlink $TEMP || die $!; - - if($KEEP_TIMESTAMP eq "YES") - { - $t = $keeptime; - } - else - { - $t = $date; - } - - # we got it, now save to db - $db->set_edit($number, $note, $t); - - print "note number $number has been changed.\n"; -} - - -sub dump -{ - my(%res, $num, $DUMP); - # $dump_file - if($dump_file eq "-") { - $DUMP = *STDOUT; - } - else { - open (DUMPFILE, ">$dump_file") or die "could not open $dump_file\n"; - $DUMP = *DUMPFILE; - } - select $DUMP; - %res = $db->get_all(); - foreach $num (sort { $a <=> $b } keys %res) - { - print STDOUT "dumping note number $num to $dump_file\n" if($dump_file ne "-"); - print "Number: $num\n" - ."Timestamp: $res{$num}->{'date'}\n" - ."$res{$num}->{'note'}\n"; - } - print "\n"; - close(DUMP); - select STDOUT; -} - -sub import -{ - my($num, $start, $complete, $dummi, $note, $date, $time, $number, $stdin, $DUMP); - # open $dump_file and import it into the notedb - $stdin = 1 if($dump_file eq "-"); - if($stdin) { - $DUMP = *STDIN; - } - else { - open (DUMPFILE, "<$dump_file") or die "could not open $dump_file\n"; - $DUMP = *DUMPFILE; - } - $db->set_del_all() if($ImportType ne ""); - $complete=0; - $start = 0; - while(<$DUMP>) - { - chomp $_; - if($_ =~ /^Number:\s\d+/) - { - if($start == 0) - { - # we have no previous record - ($dummi,$number) = split(/\s/,$_); - $start = 1; - } - else - { - # we got a complete record, save it! - $number = $db->get_nextnum(); - $db->set_new($number,$note, $date); - print "note number $number from $dump_file inserted into notedb.\n" if(!$stdin); - $complete = 0; - $note = ""; - $date = ""; - ($dummi,$number) = split(/\s/,$_); - } - } - elsif($_ =~ /^Timestamp:\s\d+/ && $complete == 0) - { - ($dummi,$date,$time) = split(/\s/,$_); - $date = "$date $time"; - $complete = 1; - } - else - { - $note .= $_ . "\n"; - } - } - if($note ne "" && $date ne "") - { - # the last record, if existent - $number = $db->get_nextnum(); - $db->set_new($number,$note, $date); - print "note number $number from $dump_file inserted into notedb.\n" if(!$stdin); - } -} - - - -sub interactive -{ - my($B, $BB, $menu, $char, @LastTopic, $Channel); - $Channel = $|; - # create menu: - $B = ""; - $BB = ""; - $menu = "[" . $B . "L" . $BB . "-List "; - if($TOPIC) { - $menu .= $B . "T" . $BB . "-Topics "; - } - $menu .= $B . "N" . $BB . "-New " - . $B . "D" . $BB . "-Delete " - . $B . "S" . $BB . "-Search " - . $B . "E" . $BB . "-Edit " - . $B . "?" . $BB . "-Help " - . $B . "Q" . $BB . "-Quit] "; # $CurTopic will be empty if $TOPIC is off! - # per default let's list all the stuff: - # Initially do a list command! - $ListType = ($DEFAULT_LIST eq "LONG") ? "LONG" : ""; - &list; - - for(;;) - { - $ListType = ($DEFAULT_LIST eq "LONG") ? "LONG" : ""; - undef $SetTitle; - if($CurDepth > 2) - { - print C $menu . $TOPICC . "../" . $CurTopic . $_TOPICC . ">"; - } - else - { - print C $menu . $TOPICC . $CurTopic . $_TOPICC . ">"; - } - - # endless until user press "Q" or "q"! - $char = ; - #$char = $term->readline(''); - chomp $char; - if($char =~ /^\d+\s*[\di*?,*?\-*?]*$/) - { - $ListType = ""; #overrun - # display notes - $number = $char; - &display; - } - elsif($char =~ /^n$/i) - { - # create a new one - &new; - } - elsif($char =~ /^$/) - { - &list; - } - elsif($char =~ /^l$/) - { - $ListType = ""; - &list; - } - elsif($char =~ /^L$/) - { - $ListType = "LONG"; - &list; - undef $SetTitle; - } - elsif($char =~ /^h$/i || $char =~ /^\?/) - { - # zu dumm der Mensch ;-) - &help; - } - elsif($char =~ /^d\s+([\d*?,*?\-*?]*)$/i) - { - # delete one! - $number = $1; - &del; - } - elsif($char =~ /^d$/i) - { - # we have to ask her: - print "enter number(s) of note(s) you want to delete: "; - $char = ; - chomp $char; - $number = $char; - &del; - } - elsif($char =~ /^e\s+(\d+\-*\,*\d*)/i) - { - # edit one! - $number = $1; - &edit; - } - elsif($char =~ /^e$/i) - { - # we have to ask her: - print "enter number of the note you want to edit: "; - $char = ; - chomp $char; - $number = $char; - &edit; - } - elsif($char =~ /^s\s+/i) - { - # she want's to search - $searchstring = $'; - chomp $searchstring; - &search; - } - elsif($char =~ /^s$/i) - { - # we have to ask her: - print "enter the string you want to search for: "; - $char = ; - chomp $char; - $char =~ s/^\n//; - $searchstring = $char; - &search; - } - elsif($char =~ /^q$/i) - { - # schade!!! - $| = $Channel; - print "\n\ngood bye!\n"; - exit(0); - } - elsif($char =~ /^t$/) - { - $TreeType = ""; - &display_tree; - } - elsif($char =~ /^T$/) - { - $TreeType = "LONG"; - &display_tree; - $TreeType = ""; - } - elsif($char =~ /^\.\.$/ || $char =~ /^cd\s*\.\.$/) - { - $CurDepth-- if ($CurDepth > 1); - $CurTopic = $LastTopic[$CurDepth]; - &list; - } - elsif($char =~ /^l\s+(\w+)$/) - { - # list - $WantTopic = $1; - if(exists $TP{$WantTopic}) - { - my %SaveTP = %TP; - $LastTopic[$CurDepth] = $CurTopic; - $CurTopic = $1; - $CurDepth++; - - &list; - - $CurTopic = $LastTopic[$CurDepth]; - $CurDepth--; - %TP = %SaveTP; - } - else - { - print "\nunknown command!\n"; - } - } - else - { - # unknown - my $unchar = $char; - $unchar =~ s/^cd //; # you may use cd now! - if(exists $TP{$char} || exists $TP{$unchar}) - { - $char = $unchar if(exists $TP{$unchar}); - $LastTopic[$CurDepth] = $CurTopic; - $CurTopic = $char; - $CurDepth++; - &list; - } - else - { - print "\nunknown command!\n"; - } - undef $unchar; - } - } -} - - - -sub usage -{ -print qq~This is the program note $version by Thomas Linden (c) 1999-2000. -It comes with absolutely NO WARRANTY. It is distributed under the -terms of the GNU General Public License. Use it at your own risk :-) -Usage: note [ options ] [ number [,number...]] -Options: --h --help displays this help screen --v --version displays the version number --c --config use another config file than the default \~/.noterc --l --list [] lists all existing notes If no topic were specified, - it will display a list of all existing topics. --L --longlist [] the same as -l but prints also the timestamp --t --topic prints a list of all topics as a tree. --T --longtopc prints the topic-tree with the notes under each topic --s --search searches for trough the notes database --e --edit edit note with --d --delete delete note with --D --Dump [ | -] dumps the notes to the textfile . if is simply - a "-" it will printed out to standard output. --I --Import | - imports a previously dumped textfile into the - note-database. Data will be appended by default. - You can also specify a dash "note -I -" instead of a , - which causes note, silently to read in a dump from STDIN. --o --overwrite only suitable for use with --Import. Overwrites an - existing notedb. --r --raw raw mode, output will not be formatted. Works not in interactive - mode, only on cmd-line for list and display. --i --interactive interactive mode -- if you run note only with one dash: "note -", then it will - read in a new note from STDIN until EOF, this makes it - possible to pipe text into a new note. - - o if you specify only a number (i.e. "note 4"), then the note with that - number will be displayed. - o you can specify more then one number for delete and display, for example: - "note -d 3,4" deletes #3 and #4. "note 5-7" displays #5, #6 and #7. - o if you run note without any parameter and if "AlwaysInteractive" in the config - set off, then note will create a new note and prompt you for new text. - o If it finds \~/.noterc, it will process it. Refer to the manpage for more - informations about the configuration. - o In interactive mode you can get help at any time by typing "?" or "h" at - the prompt. - o If encryption support is turned on, note will ask you for a passphrase every - time it runs. You can avoid this behavior by setting the environment-variable - \$NOTE_PASSWD. You will need this for example, if you call note from a script. -~; - #my ($package, $filename, $line) = caller; - #print "called from line $line\n"; - exit 1; -} - -sub find_editor { - return $PreferredEditor || $ENV{"VISUAL"} || $ENV{"EDITOR"} || "vim" || "vi" || "pico"; -} - -#/ - -sub format { - # make text bold/underlined/inverse using current $NOTEC - # s/\[([^]]*)\]/$param{$1}/g; - my($note) = @_; - if($FormatText) { - my $BN = uc($NOTEC); - my $_BN = uc($_NOTEC); - my $UN = $NOTEC; - $UN =~ s/<(.*)>/<$1_>/; - my $_UN = $UN; - $_UN =~ s/<(.*)>/<\/$1>/; - my $IN = $NOTEC; my $_IN = $_NOTEC; - $IN =~ s/<(.*)>/<$1I>/; - $_IN =~ s/<(.*)>/<$1I>/; - #$note =~ s/ (\*)(.+)(\*) / $BN$2$_BN /g; - #$note =~ s/ (_)(.+)(_) / $UN$2$_UN /g; - #$note =~ s/ (\/)(.+)(\/) / $IN$2$_IN /g; - $note =~ s/\*\*([^\*^\*]*)\*\*/$BN$1$_BN/g; - $note =~ s/__([^_^_]*)__/$UN$1$_UN/g; - $note =~ s/{{([^}^}]*)}}/$IN$1$_IN/g; - } - $note =~ s/(<\/.*>)/$1$NOTEC/g; - $note; -} - -sub output -{ - my($SSS, $LINE, $num, $note, $time, $TYPE, $L, $LONGSPC, $R, $PathLen, $SP, $title, $CUTSPACE, - $len, $diff, $Space, $nlen, $txtlen); - ($num, $note, $time, $TYPE) = @_; - $txtlen = ($ListType eq "LONG") ? $maxlen : $timelen + $maxlen; - - $note = &format($note); - - $SSS = "-" x ($maxlen + 31); - - $nlen = length("$num"); - $LINE = "$BORDERC $SSS $_BORDERC\n"; - $L = $BORDERC . "[" . $_BORDERC; - $LONGSPC = " " x (26 - $nlen); - $R = $BORDERC . "]" . $_BORDERC; - $PathLen = length($PATH); # will be ZERO, if not in TOPIC mode! - if($TYPE ne "SINGLE") - { - if(!$SetTitle) - { - $SP = ""; - # print only if it is the first line! - $SP = " " x ($maxlen - 2 - $PathLen); - if(!$Raw) { - # no title in raw-mode! - print C $LINE; - - print C "$L $NUMC#$_NUMC "; - if($ListType eq "LONG") - { - print C " $TIMEC" . "creation date$_TIMEC "; - } - else - { - print $LONGSPC; - } - if($TOPIC) - { - print C $TOPICC . "$PATH $_TOPICC$SP$R\n"; - } - else - { - print C $NOTEC . "note$_NOTEC$SP$R\n"; - } - - print C $LINE; - } - $SetTitle = 1; - } - $title = ""; - $CUTSPACE = " " x $txtlen; - $note =~ s/\n/$CUTSPACE/g; - $len = length($note); - if($len < ($txtlen - 2 - $nlen)) - { - $diff = $txtlen - $len; - $Space = " " x $diff; - if(!$Raw) { - if($num eq "-") - { - $title = $BORDERC . $TOPICC . "\"" . $note . "\"" . $_TOPICC . $Space . "$_BORDERC"; - } - else - { - $title = $BORDERC . $NOTEC . "\"" . $note . "\"" . $_NOTEC . $Space . "$_BORDERC"; - } - } - else { - $title = $note; - } - } - else - { - $title = substr($note,0,($txtlen - 2 - $nlen)); - if(!$Raw) { - $title = $BORDERC . $NOTEC . "\"" . $title . "...\"$_NOTEC$_BORDERC"; - } - } - if($Raw) { - print "$num "; - print "$time " if($ListType eq "LONG"); - if($title =~ /^ => (.*)$TopicSep (.*)$/) { - $title = "$1$TopicSep $2"; # seems to be a topic! - } - print "$title\n"; - } - else { - # $title should now look as: "A sample note " - print C "$L $NUMC$num$_NUMC $R"; - if($ListType eq "LONG") - { - print C "$L$TIMEC" . $time . " $_TIMEC$R"; - } - print C "$L $NOTEC" . $title . "$_NOTEC $R\n"; - print C $LINE; - } - } - else - { - # we will not reach this in raw-mode, therefore no decision here! - chomp $note; - $Space = " " x (($maxlen + $timelen) - 16); - print C $LINE; - print C "$L $NUMC$num$_NUMC $R$L$TIMEC$time$_TIMEC $Space$R\n"; - print C $LINE; - print C $NOTEC . $note . $_NOTEC . "\n"; - print C $LINE; - } - -} - - - -sub C -{ - my(%Color, $default, $S, $Col, $NC, $T); - # \033[1m%30s\033[0m - %Color = ( 'black' => '0;30', - 'red' => '0;31', - 'green' => '0;32', - 'yellow' => '0;33', - 'blue' => '0;34', - 'magenta' => '0;35', - 'cyan' => '0;36', - 'white' => '0;37', - 'B' => '1;30', - 'BLACK' => '1;30', - 'RED' => '1;31', - 'GREEN' => '1;32', - 'YELLOW' => '1;33', - 'BLUE' => '1;34', - 'MAGENTA' => '1;35', - 'CYAN' => '1;36', - 'WHITE' => '1;37', - 'black_' => '4;30', - 'red_' => '4;31', - 'green_' => '4;32', - 'yellow_' => '4;33', - 'blue_' => '4;34', - 'magenta_' => '4;35', - 'cyan_' => '4;36', - 'white_' => '4;37', - 'blackI' => '7;30', - 'redI' => '7;31', - 'greenI' => '7;32', - 'yellowI' => '7;33', - 'blueI' => '7;34', - 'magentaI' => '7;35', - 'cyanI' => '7;36', - 'whiteI' => '7;37' - ); - $default = "\033[0m"; - $S = $_[0]; - foreach $Col (%Color) - { - if ($S =~ /<$Col>/g) - { - if($COLOR ne "NO") - { - $NC = "\033[" . $Color{$Col} . "m"; - $S =~ s/<$Col>/$NC/g; - $S =~ s/<\/$Col>/$default/g; - } - else - { - $S =~ s/<$Col>//g; - $S =~ s/<\/$Col>//g; - } - } - } - return $S; -} - - - -sub num_bereich -{ - my($m,@LR,@Sorted_LR,$i); - # $number is the one we want to delete! - # But does it contain kommas? - @NumBlock = (); #reset - $m = 0; - if($number =~ /\,/) - { - # accept -d 3,4,7 - @NumBlock = split(/\,/,$number); - } - elsif($number =~ /^\d+\-\d+$/) - { - # accept -d 3-9 - @LR = split(/\-/,$number); - @Sorted_LR = (); - - if($LR[0] > $LR[1]) - { - @Sorted_LR = ($LR[1], $LR[0]); - } - elsif($LR[0] == $LR[1]) - { - # 0 and 1 are the same - @Sorted_LR = ($LR[0], $LR[1]); - } - else - { - @Sorted_LR = ($LR[0], $LR[1]); - } - - for($i=$Sorted_LR[0]; $i<=$Sorted_LR[1]; $i++) - { - # from 3-6 create @NumBlock (3,4,5,6) - $NumBlock[$m] = $i; - $m++; - } - } - else - { - @NumBlock = ($number); - } - -} - -sub getdate -{ - my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); - $year += 1900; - $mon += 1; - $mon =~ s/^(\d)$/0$1/; - $hour =~ s/^(\d)$/0$1/; - $min =~ s/^(\d)$/0$1/; - $sec =~ s/^(\d)$/0$1/; - $mday =~ s/^(\d)$/0$1/; - return "$mday.$mon.$year $hour:$min:$sec"; -} - - -sub gettemp -{ - my($random, @range); - @range=('0'..'9','a'..'z','A'..'Z'); - srand(time||$$); - for (0..10) { - $random .= $range[rand(int($#range)+1)]; - } - my $tempfile = $TempDir . "/" . $USER . "." . $random; - if (-e $tempfile) { - # avoid race conditions! - unlink $tempfile; - } - return $tempfile; -} - - - -sub help -{ -my $B = ""; -my $BB = ""; -my($S, $L, $T, $Q, $H, $N, $D, $E); -$L = $B . "L" . $BB . $NOTEC; -$T = $B . "T" . $BB . $NOTEC; -$Q = $B . "Q" . $BB . $NOTEC; -$H = $B . "?" . $BB . $NOTEC; -$N = $B . "N" . $BB . $NOTEC; -$D = $B . "D" . $BB . $NOTEC; -$E = $B . "E" . $BB . $NOTEC; -$S = $B . "S" . $BB . $NOTEC; - -print C qq~$BORDERC -----------------------------------------------------------------------$_BORDERC $TOPICC -HELP for interactive note $version -$_TOPICC $NOTEC -The following commands are available: -$L List notes. L=long, with timestamp and l=short without timestamp. - You can also just hit for short list. - If you specify a subtopic, then list will display it's contents, - i.e.: "l mytopic" will dislpay notes under mytopic. -$N Create a new note. -$D Delete a note. You can either hit "d 1" or "d 1-4" or just hit "d". - If you don't specify a number, you will be asked for. -$S Search trough the notes database. Usage is similar to Delete, use - a string instead of a number to search for. -$E Edit a note. Usage is similar to Delete but you can only edit note - a time. -$H This help screen. -$Q Exit the program.~; -if($TOPIC) -{ -print C qq~ -$T print a list of all existing topics as a tree. T prints the tree - with all notes under each topic. - - You can change the actual topic by simply typing it's name or by using - the command "cd", i.e. "cd mytopic". You can create a new topic by creating - a new note, the first line must be the topic borderd by slashes, i.e.: - "/newtopic/". The slash is the default topic-sepearator, but you can over- - ride this in the config! If you type just ".." instead of a topic, you will - go one step back in your topic-structure. -~; -} -print C qq~ -$NOTEC -All commands except the List and Topic commands are case insensitive. $_NOTEC $BORDERC -----------------------------------------------------------------------$_BORDERC -~; -} - - -sub display_tree { - # displays a tree of all topics - my(%TREE, %res, $n, $t, $num, @nodes, $firstline, $text, $untext); - %res = $db->get_all(); - foreach $num (keys %res) - { - $n = $res{$num}->{'note'}; - $t = $res{$num}->{'date'}; - # this allows us to have multiple topics (subtopics!) - my ($firstline,$text,$untext) = split /\n/, $n, 3; - if($firstline =~ /^($TopicSep)/) - { - $firstline =~ s/($TopicSep)*$//; #remove TopicSepatator - @nodes = split(/$TopicSep/,$firstline); - } - else - { - @nodes = ();("$TopicSep"); - $text = $firstline; - } - &tree($num, $text, \%TREE, @nodes); - } - #return if ($num == 0); - # now that we have build our tree (in %TREE) go on t display it: - print C $BORDERC . "\n[" . $TopicSep . $BORDERC . "]\n"; - &print_tree(\%{$TREE{''}},"") if(%TREE); - print C $BORDERC . $_BORDERC . "\n"; -} - - -sub tree { - my($num, $text, $LocalTree, $node, @nodes) = @_; - if(@nodes) { - if(! exists $LocalTree->{$node}->{$NoteKey}) { - $LocalTree->{$node}->{$NoteKey} = []; - } - &tree($num, $text, $LocalTree->{$node}, @nodes); - } - else { - if(length($text) > ($maxlen - 5)) { - $text = substr($text, 0, ($maxlen -5)); - } - $text = $text . " (" . $NUMC . "#" . $num . $_NUMC . $NOTEC . ")" . $_NOTEC if($text ne ""); - push @{$LocalTree->{$node}->{$NoteKey}}, $text; - } -} - - -sub print_tree { - # thanks to Jens for his hints and this sub! - my $hashref=shift; - my $prefix=shift; - my @notes=@{$hashref->{$NoteKey}}; - my @subnotes=sort grep { ! /^$NoteKey$/ } keys %$hashref; - if($TreeType eq "LONG") { - for my $note (@notes) { - if($note ne "") { - print C $BORDERC ;# . $prefix. "|\n"; - print C "$prefix+---<" . $NOTEC . $note . $BORDERC . ">" . $_NOTEC . "\n"; - } - } - } - for my $index (0..$#subnotes) { - print C $BORDERC . $prefix. "|\n"; - print C "$prefix+---[" . $TOPICC . $subnotes[$index] . $BORDERC . "]\n"; - &print_tree($hashref->{$subnotes[$index]},($index == $#subnotes?"$prefix ":"$prefix| ")); - } -} - - -sub getconfig -{ - my($configfile) = @_; - my ($home, $value, $option); - # checks are already done, so trust myself and just open it! - open CONFIG, "<$configfile" || die $!; - while() { - chomp; - next if(/^\s*$/ || /^\s*#/); - my ($option,$value) = split /\s\s*=?\s*/, $_, 2; - $value =~ s/\s*$//; - $home = $value if (/^Home/); - $libpath = $value if (/^LibPath/); - $dbdriver = $value if (/^DbDriver/); - $dbhost = $value if (/^DbHost/); - $dbuser = $value if (/^DbUser/); - $dbpasswd = $value if (/^DbPasswd/); - $dbname = $value if (/^DbName/); - $table = $value if (/^DbTable/); - $fnum = $value if (/^FieldNumber/); - $fnote = $value if (/^FieldNote/); - $fdate = $value if (/^FieldDate/); - $NOTEDB = $value if (/^NoteDb/); - $MAX_NOTE = $value if (/^MaxNoteByte/); - $MAX_TIME = $value if (/^MaxTimeByte/); - $CRYPT_METHOD = $value if (/^CryptMethod/); - $USE_CRYPT = "YES" if (/^UseEncryption/ && $value == 1); - $USE_CRYPT = undef if (/^UseEncryption/ && $value == 0); - $ALWAYS_INT = "YES" if (/^AlwaysInteractive/ && $value == 1); - $ALWAYS_INT = undef if (/^AlwaysInteractive/ && $value == 0); - $DEFAULT_LIST = "LONG" if (/^DefaultLong/ && $value == 1); - $DEFAULT_LIST = undef if (/^DefaultLong/ && $value == 0); - $ALWAYS_EDIT = "YES" if (/^AlwaysEditor/ && $value == 1); - $ALWAYS_EDIT = undef if (/^AlwaysEditor/ && $value == 0); - $KEEP_TIMESTAMP = "YES" if (/^KeepTimeStamp/ && $value == 1); - $KEEP_TIMESTAMP = undef if (/^KeepTimeStamp/ && $value == 0); - $COLOR = "YES" if (/^UseColors/ && $value == 1); - $COLOR = "NO" if (/^UseColors/ && $value == 0); - $TopicSep = $value if (/^TopicSeparator/); - $maxlen = $value if (/^MaxLen/); - $BORDER_COLOR = $value if (/^BorderColor/); - $NUM_COLOR = $value if (/^NumberColor/); - $NOTE_COLOR = $value if(/^NoteColor/); - $TIME_COLOR = $value if (/^TimeColor/); - $TOPIC_COLOR = $value if (/^TopicColor/); - $PreferredEditor = $value if (/^PreferredEditor/); - $FormatText = $value if (/^FormatText/); - $TempDir = $value if (/^TempDirectory/); - } - chomp $home; - $home =~ s/\/*$//; # cut eventually / at the end - $HOME = eval($home); - if($NOTEDB =~ /^(~\/)(.*)$/) { - $NOTEDB = "/home/" . $USER . "/" . $2; - } - $libpath =~ s/\/*$//; - - close CONFIG; -} - - - - -__END__ -# -# $Log: note,v $ -# Revision 1.2 2000/07/09 22:10:03 zarahg -# tempfile management more secure now. new option TempDirectory. thx to Donald. -# -# Revision 1.30 2000/07/09 21:59:48 scip -# secure temp files -# -# Revision 1.29 2000/06/25 20:13:23 scip -# *** empty log message *** -# -# Revision 1.28 2000/06/25 19:51:51 scip -# changed pattern matching of seraching(\@ ... \E) -# added --config option -# -# Revision 1.27 2000/05/16 23:51:35 thomas -# fixed many option-parsing related bugd! -# -# Revision 1.26 2000/05/13 01:05:17 thomas -# changed config format and fixed some bugs -# as well as some other additions... -# -# Revision 1.25 2000/05/11 23:42:43 thomas -# --tree changed to --topic -# -# Revision 1.24 2000/05/10 22:59:44 thomas -# updated usage to reflect --raw and build it into output -# and display subs. -# -# Revision 1.23 2000/05/10 22:19:04 thomas -# changed to Getopt::Long, added --raw -# -# Revision 1.22 2000/05/01 18:51:40 thomas -# added "-" to sub dump -# -# Revision 1.21 2000/05/01 00:17:27 thomas -# *** empty log message *** -# -# Revision 1.20 2000/04/30 23:31:38 thomas -# added -o and coloured sub help. -# -# Revision 1.19 2000/04/30 16:07:23 thomas -# *** empty log message *** -# -# Revision 1.18 2000/04/30 14:58:21 thomas -# updated the usage and help subs -# -# Revision 1.17 2000/04/30 14:44:38 thomas -# added colors to the tree functions -# -# Revision 1.16 2000/04/30 14:28:38 thomas -# added the t command, which displays a topic-tree. -# and enhanced the list command in interactive mode -# -# Revision 1.15 2000/03/19 23:41:04 thomas -# changed set_del, now no extra TEMP file is required! -# instead I get it from $this->get_all() ! -# Revision 1.14 2000/03/19 22:51:49 thomas -# Bug in NOTEDB::binary fixed, recount of nubers was -# incorrect. -# -# Revision 1.13 2000/03/19 11:53:32 thomas -# edit bug fixed (ude => uen) -# -# Revision 1.12 2000/03/19 03:06:51 thomas -# backend support completed. -# mysql and binary backends now excluded in separate files -# -# Revision 1.11 2000/03/18 00:16:47 thomas -# added NOTEDB::mysql and changed note to work with that. -# thus, from now on there is only one script to maintain and -# it is possible to provide more bacjends as well as making -# additional scripts upon them, i.e. cgi script... -# -# Revision 1.8 2000/03/13 22:48:43 thomas -# small width bug fixed -# -# Revision 1.7 2000/03/08 23:11:19 tom -# added cd -# -# Revision 1.6 2000/03/08 22:50:41 tom -# Added the $KEEP_TIMESTAMP option and fixed a bug regarding topic names -# and invalid resolution of them in case it started with "1 name". -# -# Revision 1.5 2000/02/25 20:59:30 tom -# corrected small timestamp problem in &edit and &new -# -# Revision 1.4 2000/02/25 13:24:11 tom -# fixed a small bug, that caused to use the last line for a note title instead the 2nd. -# -# Revision 1.3 2000/02/25 11:28:53 tom -# all changes from bin version applied to sql version diff --git a/bin/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 = ""; -$NUMC = "<$conf{numbercolor}>"; -$_NUMC = ""; -$NOTEC = "<$conf{notecolor}>"; -$_NOTEC = ""; -$TIMEC = "<$conf{timecolor}>"; -$_TIMEC = ""; -$TOPICC = "<$conf{topiccolor}>"; -$_TOPICC = ""; - -$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