diff --git a/setup.py b/setup.py
index a1b4499980..0adb7d5c8a 100644
--- a/setup.py
+++ b/setup.py
@@ -20,39 +20,8 @@ VERSION = re.search(r'__version__\s+=\s+[\'"]([^\'"]+)[\'"]', src).group(1)
APPNAME = re.search(r'__appname__\s+=\s+[\'"]([^\'"]+)[\'"]', src).group(1)
print 'Setup', APPNAME, 'version:', VERSION
-entry_points = {
- 'console_scripts': [ \
- 'prs500 = libprs500.devices.prs500.cli.main:main',
- 'lrf-meta = libprs500.ebooks.lrf.meta:main',
- 'rtf-meta = libprs500.ebooks.metadata.rtf:main',
- 'pdf-meta = libprs500.ebooks.metadata.pdf:main',
- 'lit-meta = libprs500.ebooks.metadata.lit:main',
- 'opf-meta = libprs500.ebooks.metadata.opf:main',
- 'epub-meta = libprs500.ebooks.metadata.epub:main',
- 'txt2lrf = libprs500.ebooks.lrf.txt.convert_from:main',
- 'html2lrf = libprs500.ebooks.lrf.html.convert_from:main',
- 'markdown-libprs500 = libprs500.ebooks.markdown.markdown:main',
- 'lit2lrf = libprs500.ebooks.lrf.lit.convert_from:main',
- 'epub2lrf = libprs500.ebooks.lrf.epub.convert_from:main',
- 'rtf2lrf = libprs500.ebooks.lrf.rtf.convert_from:main',
- 'web2disk = libprs500.web.fetch.simple:main',
- 'web2lrf = libprs500.ebooks.lrf.web.convert_from:main',
- 'pdf2lrf = libprs500.ebooks.lrf.pdf.convert_from:main',
- 'mobi2lrf = libprs500.ebooks.lrf.mobi.convert_from:main',
- 'any2lrf = libprs500.ebooks.lrf.any.convert_from:main',
- 'lrf2lrs = libprs500.ebooks.lrf.parser:main',
- 'lrs2lrf = libprs500.ebooks.lrf.lrs.convert_from:main',
- 'pdfreflow = libprs500.ebooks.lrf.pdf.reflow:main',
- 'isbndb = libprs500.ebooks.metadata.isbndb:main',
- 'librarything = libprs500.ebooks.metadata.library_thing:main',
- 'mobi2oeb = libprs500.ebooks.mobi.reader:main',
- 'lrf2html = libprs500.ebooks.lrf.html.convert_to:main',
- ],
- 'gui_scripts' : [
- APPNAME+' = libprs500.gui2.main:main',
- 'lrfviewer = libprs500.gui2.lrf_renderer.main:main',
- ],
- }
+epsrc = re.compile(r'entry_points = (\{.*?\})', re.DOTALL).search(open('src/libprs500/linux.py', 'rb').read()).group(1)
+entry_points = eval(epsrc, {'__appname__': APPNAME})
if 'win32' in sys.platform.lower() or 'win64' in sys.platform.lower():
entry_points['console_scripts'].append('parallel = libprs500.parallel:main')
diff --git a/src/libprs500/devices/prs500/cli/main.py b/src/libprs500/devices/prs500/cli/main.py
index 28d8ca584c..7c165ec980 100755
--- a/src/libprs500/devices/prs500/cli/main.py
+++ b/src/libprs500/devices/prs500/cli/main.py
@@ -23,7 +23,7 @@ from optparse import OptionParser
from libprs500 import __version__, iswindows
from libprs500.devices.errors import PathError
-from libprs500.devices.prs500.cli.terminfo import TerminalController
+from libprs500.terminfo import TerminalController
from libprs500.devices.errors import ArgumentError, DeviceError, DeviceLocked
from libprs500.devices import devices
from libprs500.devices.scanner import DeviceScanner
diff --git a/src/libprs500/ebooks/lrf/html/convert_to.py b/src/libprs500/ebooks/lrf/html/convert_to.py
index 0ef070f722..0e42a4d5b7 100644
--- a/src/libprs500/ebooks/lrf/html/convert_to.py
+++ b/src/libprs500/ebooks/lrf/html/convert_to.py
@@ -14,7 +14,7 @@
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
import sys, logging, os
-from libprs500 import __appname__, __author__, __version__, setup_cli_handlers
+from libprs500 import setup_cli_handlers, OptionParser
from libprs500.ebooks import ConversionError
from libprs500.ebooks.lrf.meta import get_metadata
from libprs500.ebooks.lrf.parser import LRFDocument
@@ -91,9 +91,7 @@ class LRFConverter(object):
self.create_block_styles()
def option_parser():
- from optparse import OptionParser
- parser = OptionParser(usage='%prog book.lrf', epilog='Created by '+__author__,
- version=__appname__ + ' ' + __version__)
+ parser = OptionParser(usage='%prog book.lrf')
parser.add_option('--output-dir', '-o', default=None, help='Output directory in which to store created HTML files. If it does not exist, it is created. By default the current directory is used.', dest='out')
parser.add_option('--verbose', default=False, action='store_true', dest='verbose')
return parser
diff --git a/src/libprs500/ebooks/lrf/lrs/convert_from.py b/src/libprs500/ebooks/lrf/lrs/convert_from.py
index a3abb18670..d16241cb0b 100644
--- a/src/libprs500/ebooks/lrf/lrs/convert_from.py
+++ b/src/libprs500/ebooks/lrf/lrs/convert_from.py
@@ -18,7 +18,7 @@ Compile a LRS file into a LRF file.
import sys, os, logging
-from libprs500 import __author__, __appname__, __version__, setup_cli_handlers
+from libprs500 import OptionParser, setup_cli_handlers
from libprs500.ebooks.BeautifulSoup import BeautifulStoneSoup, NavigableString, \
CData, Tag
from libprs500.ebooks.lrf.pylrs.pylrs import Book, PageStyle, TextStyle, \
@@ -263,10 +263,7 @@ class LrsParser(object):
def option_parser():
- from optparse import OptionParser
- parser = OptionParser(usage='%prog [options] file.lrs',
- version=__appname__+ ' ' + __version__,
- epilog='Created by '+__author__)
+ parser = OptionParser(usage='%prog [options] file.lrs\nCompile an LRS file into an LRF file.')
parser.add_option('-o', '--output', default=None, help='Path to output file')
parser.add_option('--verbose', default=False, action='store_true',
help='Verbose processing')
diff --git a/src/libprs500/ebooks/lrf/parser.py b/src/libprs500/ebooks/lrf/parser.py
index 68a383d72a..960965bac9 100644
--- a/src/libprs500/ebooks/lrf/parser.py
+++ b/src/libprs500/ebooks/lrf/parser.py
@@ -16,7 +16,7 @@
import sys, array, os, re, codecs, logging
-from libprs500 import __author__, __appname__, __version__, setup_cli_handlers
+from libprs500 import OptionParser, setup_cli_handlers
from libprs500.ebooks.lrf.meta import LRFMetaFile
from libprs500.ebooks.lrf.objects import get_object, PageTree, StyleObject, \
Font, Text, TOCObject, BookAttr, ruby_tags
@@ -141,9 +141,7 @@ class LRFDocument(LRFMetaFile):
return '\n' + bookinfo + pages + styles + objects + ''
def option_parser():
- from optparse import OptionParser
- parser = OptionParser(usage='%prog book.lrf', epilog='Created by '+__author__,
- version=__appname__ + ' ' + __version__)
+ parser = OptionParser(usage='%prog book.lrf\nConvert an LRF file into an LRS (XML UTF-8 encoded) file')
parser.add_option('--output', '-o', default=None, help='Output LRS file', dest='out')
parser.add_option('--verbose', default=False, action='store_true', dest='verbose')
return parser
diff --git a/src/libprs500/ebooks/metadata/__init__.py b/src/libprs500/ebooks/metadata/__init__.py
index 1605ccb2f6..c264f903e8 100644
--- a/src/libprs500/ebooks/metadata/__init__.py
+++ b/src/libprs500/ebooks/metadata/__init__.py
@@ -19,13 +19,13 @@ the L{libprs500.lrf.meta} module.
__docformat__ = "epytext"
__author__ = "Kovid Goyal "
-from optparse import OptionParser
+
from libprs500 import __version__ as VERSION
+from libprs500 import OptionParser
def get_parser(extension):
''' Return an option parser with the basic metadata options already setup'''
- parser = OptionParser(version='libprs500 version: '+VERSION,
- usage='''%prog [options] myfile.'''+extension)
+ parser = OptionParser(usage='%prog [options] myfile.'+extension+'\n\nRead and write metadata from an ebook file.')
parser.add_option("-t", "--title", action="store", type="string", \
dest="title", help="Set the book title", default=None)
parser.add_option("-a", "--authors", action="store", type="string", \
diff --git a/src/libprs500/ebooks/metadata/isbndb.py b/src/libprs500/ebooks/metadata/isbndb.py
index 83d9b60673..a17954f3e8 100644
--- a/src/libprs500/ebooks/metadata/isbndb.py
+++ b/src/libprs500/ebooks/metadata/isbndb.py
@@ -18,9 +18,8 @@ Interface to isbndb.com. My key HLLXQX2A.
import sys, logging, re, socket
from urllib import urlopen, quote
-from optparse import OptionParser
-from libprs500 import __appname__, __version__, __author__, setup_cli_handlers
+from libprs500 import setup_cli_handlers, OptionParser
from libprs500.ebooks.metadata import MetaInformation
from libprs500.ebooks.BeautifulSoup import BeautifulStoneSoup
@@ -98,8 +97,7 @@ def build_combined(base_url, opts):
def option_parser():
- parser = OptionParser(epilog='Created by '+__author__, version=__appname__+' '+__version__,
- usage=\
+ parser = OptionParser(usage=\
'''
%prog [options] key
diff --git a/src/libprs500/ebooks/metadata/library_thing.py b/src/libprs500/ebooks/metadata/library_thing.py
index 49363650b3..dd5f1c2eb1 100644
--- a/src/libprs500/ebooks/metadata/library_thing.py
+++ b/src/libprs500/ebooks/metadata/library_thing.py
@@ -17,9 +17,8 @@ Fetch cover from LibraryThing.com based on ISBN number.
'''
import sys, socket, os
-from optparse import OptionParser
-from libprs500 import browser as _browser, __author__, __appname__, __version__
+from libprs500 import browser as _browser, OptionParser
from libprs500.ebooks.BeautifulSoup import BeautifulSoup
browser = None
@@ -68,9 +67,7 @@ def cover_from_isbn(isbn, timeout=5.):
socket.setdefaulttimeout(_timeout)
def option_parser():
- parser = OptionParser(epilog='Created by '+__author__,
- version=__appname__+' '+__version__,
- usage=\
+ parser = OptionParser(usage=\
'''
%prog [options] ISBN
diff --git a/src/libprs500/linux.py b/src/libprs500/linux.py
index 24b772d9b6..751f149960 100644
--- a/src/libprs500/linux.py
+++ b/src/libprs500/linux.py
@@ -14,7 +14,7 @@
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.Warning
import shutil
''' Post installation script for linux '''
-import sys, os
+import sys, os, re
from subprocess import check_call
from libprs500 import __version__, __appname__
@@ -27,6 +27,41 @@ DESTDIR = ''
if os.environ.has_key('DESTDIR'):
DESTDIR = os.environ['DESTDIR']
+entry_points = {
+ 'console_scripts': [ \
+ 'prs500 = libprs500.devices.prs500.cli.main:main',
+ 'lrf-meta = libprs500.ebooks.lrf.meta:main',
+ 'rtf-meta = libprs500.ebooks.metadata.rtf:main',
+ 'pdf-meta = libprs500.ebooks.metadata.pdf:main',
+ 'lit-meta = libprs500.ebooks.metadata.lit:main',
+ 'opf-meta = libprs500.ebooks.metadata.opf:main',
+ 'epub-meta = libprs500.ebooks.metadata.epub:main',
+ 'txt2lrf = libprs500.ebooks.lrf.txt.convert_from:main',
+ 'html2lrf = libprs500.ebooks.lrf.html.convert_from:main',
+ 'markdown-libprs500 = libprs500.ebooks.markdown.markdown:main',
+ 'lit2lrf = libprs500.ebooks.lrf.lit.convert_from:main',
+ 'epub2lrf = libprs500.ebooks.lrf.epub.convert_from:main',
+ 'rtf2lrf = libprs500.ebooks.lrf.rtf.convert_from:main',
+ 'web2disk = libprs500.web.fetch.simple:main',
+ 'web2lrf = libprs500.ebooks.lrf.web.convert_from:main',
+ 'pdf2lrf = libprs500.ebooks.lrf.pdf.convert_from:main',
+ 'mobi2lrf = libprs500.ebooks.lrf.mobi.convert_from:main',
+ 'any2lrf = libprs500.ebooks.lrf.any.convert_from:main',
+ 'lrf2lrs = libprs500.ebooks.lrf.parser:main',
+ 'lrs2lrf = libprs500.ebooks.lrf.lrs.convert_from:main',
+ 'pdfreflow = libprs500.ebooks.lrf.pdf.reflow:main',
+ 'isbndb = libprs500.ebooks.metadata.isbndb:main',
+ 'librarything = libprs500.ebooks.metadata.library_thing:main',
+ 'mobi2oeb = libprs500.ebooks.mobi.reader:main',
+ 'lrf2html = libprs500.ebooks.lrf.html.convert_to:main',
+ ],
+ 'gui_scripts' : [
+ __appname__+' = libprs500.gui2.main:main',
+ 'lrfviewer = libprs500.gui2.lrf_renderer.main:main',
+ ],
+ }
+
+
def options(option_parser):
parser = option_parser()
options = parser.option_list
@@ -79,14 +114,14 @@ complete -o filenames -F _'''%(opts,exts) + name + ' ' + name +"\n\n"
use_destdir = False
-def open_file(path):
+def open_file(path, mode='wb'):
if use_destdir:
if os.path.isabs(path):
path = path[1:]
path = os.path.join(DESTDIR, path)
- if not os.path.exists(os.path.dirname(path)):
- os.makedirs(os.path.dirname(path))
- return open(path, 'wb')
+ if not os.path.exists(os.path.dirname(path)):
+ os.makedirs(os.path.dirname(path))
+ return open(path, mode)
def setup_completion(fatal_errors):
try:
@@ -269,6 +304,32 @@ def option_parser():
dest='fatal_errors', help='If set die on errors.')
return parser
+def install_man_pages(fatal_errors):
+ from bz2 import compress
+ import subprocess
+ print 'Installing MAN pages...'
+ manpath = '/usr/share/man/man1'
+ f = open_file('/tmp/man_extra', 'wb')
+ f.write('[see also]\nhttp://%s.kovidgoyal.net\n'%__appname__)
+ f.close()
+ for src in entry_points['console_scripts']:
+ prog = src[:src.index('=')].strip()
+ if prog in ('prs500', 'pdf-meta', 'epub-meta', 'lit-meta', 'markdown-libprs500'):
+ continue
+ help2man = ('help2man', prog, '--name', 'part of %s'%__appname__,
+ '--section', '1', '--no-info', '--include',
+ f.name, '--manual', __appname__)
+ manfile = os.path.join(manpath, prog+'.1'+__appname__+'.bz2')
+ p = subprocess.Popen(help2man, stdout=subprocess.PIPE)
+ raw = re.compile(r'^\.IP\s*^([A-Z :]+)$', re.MULTILINE).sub(r'.SS\n\1', p.stdout.read())
+ if not raw.strip():
+ print 'Unable to create MAN page for', prog
+ continue
+ open_file(manfile).write(compress(raw))
+
+
+
+
def post_install():
parser = option_parser()
opts = parser.parse_args()[0]
@@ -283,6 +344,7 @@ def post_install():
setup_udev_rules(opts.group_file, not opts.dont_reload, opts.fatal_errors)
setup_completion(opts.fatal_errors)
setup_desktop_integration(opts.fatal_errors)
+ install_man_pages(opts.fatal_errors)
try:
from PyQt4 import Qt
diff --git a/src/libprs500/devices/prs500/cli/terminfo.py b/src/libprs500/terminfo.py
similarity index 100%
rename from src/libprs500/devices/prs500/cli/terminfo.py
rename to src/libprs500/terminfo.py
diff --git a/src/libprs500/web/fetch/simple.py b/src/libprs500/web/fetch/simple.py
index cd7bd98f0b..64191ce561 100644
--- a/src/libprs500/web/fetch/simple.py
+++ b/src/libprs500/web/fetch/simple.py
@@ -18,10 +18,8 @@ Fetch a webpage and its links recursively.
import sys, socket, os, urlparse, codecs, logging, re, time, copy, urllib2
from urllib import url2pathname
from httplib import responses
-from optparse import OptionParser
-from libprs500 import __version__, __appname__, __author__, setup_cli_handlers, \
- browser, sanitize_file_name
+from libprs500 import setup_cli_handlers, browser, sanitize_file_name, OptionParser
from libprs500.ebooks.BeautifulSoup import BeautifulSoup
from libprs500.ebooks.chardet import xml_to_unicode
@@ -296,8 +294,7 @@ class RecursiveFetcher(object):
socket.setdefaulttimeout(self.default_timeout)
def option_parser(usage='%prog URL\n\nWhere URL is for example http://google.com'):
- parser = OptionParser(usage=usage, version=__appname__+' '+__version__,
- epilog='Created by ' + __author__)
+ parser = OptionParser(usage=usage)
parser.add_option('-d', '--base-dir', help='Base directory into which URL is saved. Default is %default',
default='.', type='string', dest='dir')
parser.add_option('-t', '--timeout', help='Timeout in seconds to wait for a response from the server. Default: %default s',