#!/usr/bin/env python.1 """ PyBook - Project Gutenberg e-book reader. Usage: pybook.py no args run pybook -h this help message -v print version -r read last book -d debugging on -u update list of books from PG server (NOTE: must be run as root as it saves to /usr/share) Copyright (C) 2001, 2002 Andrei Kulakov License: GPL [see http://www.gnu.org/copyleft/gpl.html] """ import os import sys import time import avk_util from pybookm import * def debug(line): """Print line if DEBUG_ON is set to 1.""" if conf.debugging: print line def help(): """Help screen.""" print "\t\tPyBook help" for s, l, desc, _ in keymap.keys: if not (s or l): # divider print else: print ' '*4 + "%s, %-20s%s" % (s,l,desc) print """ Vim help Ctrl-F or Space page down Ctrl-B page up Ctrl-G print position in file / search ZZ exit :help or F1 help """ def init(): """Create dirs in ~user.""" if not os.path.exists(conf.progdir): os.mkdir(conf.progdir) if not os.path.exists(conf.local_books_path): os.mkdir(conf.local_books_path) if not os.path.exists(conf.booklist): print "Error: booklist file not found." sys.exit() if not os.path.exists(conf.vimrc): print "Error: pybook vimrc not found at this location:", conf.vimrc def quit(): """Save data, print time used and quit.""" data.save() print avk_util.ftime(time.time() - start) sys.exit() def main(): """Main ui loop.""" while 1: try: line = raw_input(conf.prompt) except EOFError: quit() if not line: pass if line in keymap.bindings.keys(): keymap.bindings[line]() else: print "Unknown command." def parse_args(): """Parse command-line arguments.""" a = sys.argv del a[0] if a: if a[0] in ("-h", "--help"): print __doc__ sys.exit() elif a[0] in ("-v", "--version"): print __version__ sys.exit() elif a[0] in ("-r", "--read"): conf.start_reading = 1 elif a[0] in ("-u", "--update"): pgdb = PGDB() pgdb.get() books = pgdb.parse(conf.pgdb_f) pgdb.save(books) sys.exit() elif a[0] in ("-d", "--debug"): conf.debug = 1 else: print "Error: Invalid argument." def license(): """Print Project Gutenberg License.""" f = open(conf.license) l = f.readlines() h = term.size()[0] n = 0 while 1: for line in l[n:n + h - 2]: print line, answer = raw_input(""" ------------------------------------------------------------------ (c)lose | (n)ever show again | Enter to page: """) if n > len(l): break if not answer: n = n+height-2 if n > len(l)-2: print break elif answer == 'c': term.clear() break elif answer == 'n': data.show_license = 0 term.clear() break class Keymap: """Key bindings.""" def init(self): """Initialize key map. Go through the list of mappings checking for duplicates and adding them to self.bindings. """ self.keys = [ # it's ok to leave '' for either short or long command # short command | long command | description | function ('a', "author", "search by author", books.find_author), ('t', "title", "search by title", books.find_title), ('r', "read", "read last book", last.read), ('l', "last", "list last read books", last.choose), ('q', "quit", "quit pybook", quit), ('', '', '', None), # separator ('b', "browse", "browse booklist", books.browse), ('B', "browse_authors", "browse authors", books.browse_authors), ('R', "random", "read a random book", books.read_random), ('d', "delete", "choose local book to delete", last.delete), ('h', "help", "this help message", help), ] self.bindings = {} for s, l, _, func in self.keys: if not (self.bindings.has_key(s) or self.bindings.has_key(l)): self.bindings[s] = func self.bindings[l] = func else: print "Duplicate key binding. Edit Keymap at the top of %s" % sys.argv[0] if __name__ == "__main__": init() term = avk_util.Term() parse_args() data = Data() data.load() if data.show_license: license() books.lst = data.booklist books.mk_authors_dict() last.lst = data.last_list keymap = Keymap() keymap.init() start = time.time() print "\t\t\tPyBook v" + conf.__version__ print " Books in db: %d." % len(books.lst) print " Random book: %s." % books.pick_random() print " 'h' for help." if conf.start_reading: last.read() main()