diff --git a/epydoc-pdf.conf b/epydoc-pdf.conf deleted file mode 100644 index 03ed6d104d..0000000000 --- a/epydoc-pdf.conf +++ /dev/null @@ -1,50 +0,0 @@ -[epydoc] # Epydoc section marker (required by ConfigParser) - -# Information about the project. -name: calibre -url: http://calibre.kovidgoyal.net - -# The list of modules to document. Modules can be named using -# dotted names, module filenames, or package directory names. -# This option may be repeated. -modules: calibre.devices, calibre.ebooks.lrf.web.profiles - -output: pdf -target: docs/pdf - -frames: no - -# graph -# The list of graph types that should be automatically included -# in the output. Graphs are generated using the Graphviz "dot" -# executable. Graph types include: "classtree", "callgraph", -# "umlclass". Use "all" to include all graph types -graph: classtree - -# css -# The CSS stylesheet for HTML output. Can be the name of a builtin -# stylesheet, or the name of a file. -css: white - -# link -# HTML code for the project link in the navigation bar. If left -# unspecified, the project link will be generated based on the -# project's name and URL. -#link: My Cool Project - -# top -# The "top" page for the documentation. Can be a URL, the name -# of a module or class, or one of the special names "trees.html", -# "indices.html", or "help.html" -# top: calibre - -# verbosity -# An integer indicating how verbose epydoc should be. The default -# value is 0; negative values will supress warnings and errors; -# positive values will give more verbose output. -#verbosity: 0 - -# separate-classes -# Whether each class should be listed in its own section when -# generating LaTeX or PDF output. -#separate-classes: no diff --git a/epydoc.conf b/epydoc.conf deleted file mode 100644 index 3259623054..0000000000 --- a/epydoc.conf +++ /dev/null @@ -1,51 +0,0 @@ -[epydoc] # Epydoc section marker (required by ConfigParser) - -# Information about the project. -name: calibre - API documentation -url: http://calibre.kovidgoyal.net - -# The list of modules to document. Modules can be named using -# dotted names, module filenames, or package directory names. -# This option may be repeated. -modules: calibre.devices, calibre.ebooks.lrf.web.profiles - -# Write html output to the directory "docs" -output: html -target: docs/html - -frames: no - -# graph -# The list of graph types that should be automatically included -# in the output. Graphs are generated using the Graphviz "dot" -# executable. Graph types include: "classtree", "callgraph", -# "umlclass". Use "all" to include all graph types -graph: classtree - -# css -# The CSS stylesheet for HTML output. Can be the name of a builtin -# stylesheet, or the name of a file. -css: white - -# link -# HTML code for the project link in the navigation bar. If left -# unspecified, the project link will be generated based on the -# project's name and URL. -link: calibre - -# top -# The "top" page for the documentation. Can be a URL, the name -# of a module or class, or one of the special names "trees.html", -# "indices.html", or "help.html" -#top: - -# verbosity -# An integer indicating how verbose epydoc should be. The default -# value is 0; negative values will supress warnings and errors; -# positive values will give more verbose output. -#verbosity: 0 - -# separate-classes -# Whether each class should be listed in its own section when -# generating LaTeX or PDF output. -#separate-classes: no diff --git a/pylint.conf b/pylint.conf deleted file mode 100644 index 3eec91c1ce..0000000000 --- a/pylint.conf +++ /dev/null @@ -1,602 +0,0 @@ -# lint Python modules using external checkers. - -# - -# This is the main checker controling the other ones and the reports - -# generation. It is itself both a raw checker and an astng checker in order - -# to: - -# * handle message activation / deactivation at the module level - -# * handle some basic but necessary stats'data (number of classes, methods...) - -# - -[MASTER] - - - -# Specify a configuration file. - -#rcfile= - - - -# Profiled execution. - -profile=no - - - -# Add to the black list. It should be a base name, not a - -# path. You may set this option multiple times. - -ignore=CVS - - - -# Pickle collected data for later comparisons. - -persistent=yes - - - -# Set the cache size for astng objects. - -cache-size=500 - - - -# List of plugins (as comma separated values of python modules names) to load, - -# usually to register additional checkers. - -load-plugins= - - - - - -[MESSAGES CONTROL] - - - -# Enable only checker(s) with the given id(s). This option conflict with the - -# disable-checker option - -#enable-checker= - - - -# Enable all checker(s) except those with the given id(s). This option conflict - -# with the disable-checker option - -#disable-checker= - - - -# Enable all messages in the listed categories. - -#enable-msg-cat= - - - -# Disable all messages in the listed categories. - -#disable-msg-cat= - - - -# Enable the message(s) with the given id(s). - -#enable-msg= - - - -# Disable the message(s) with the given id(s). - -#disable-msg= - - - - - -[REPORTS] - - - -# set the output format. Available formats are text, parseable, colorized and - -# html - -output-format=colorized - - - -# Include message's id in output - -include-ids=no - - - -# Put messages in a separate file for each module / package specified on the - -# command line instead of printing them on stdout. Reports (if any) will be - -# written in a file name "pylint_global.[txt|html]". - -files-output=no - - - -# Tells wether to display a full report or only the messages - -reports=yes - - - -# Python expression which should return a note less than 10 (10 is the highest - -# note).You have access to the variables errors warning, statement which - -# respectivly contain the number of errors / warnings messages and the total - -# number of statements analyzed. This is used by the global evaluation report - -# (R0004). - -evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) - - - -# Add a comment according to your evaluation note. This is used by the global - -# evaluation report (R0004). - -comment=no - - - -# Enable the report(s) with the given id(s). - -#enable-report= - - - -# Disable the report(s) with the given id(s). - -#disable-report= - - - - - -# checks for - -# * unused variables / imports - -# * undefined variables - -# * redefinition of variable from builtins or from an outer scope - -# * use of variable before assigment - -# - -[VARIABLES] - - - -# Tells wether we should check for unused import in __init__ files. - -init-import=no - - - -# A regular expression matching names used for dummy variables (i.e. not used). - -dummy-variables-rgx=_|dummy - - - -# List of additional names supposed to be defined in builtins. Remember that - -# you should avoid to define new builtins when possible. - -additional-builtins= - - - - - -# try to find bugs in the code using type inference - -# - -[TYPECHECK] - - - -# Tells wether missing members accessed in mixin class should be ignored. A - -# mixin class is detected if its name ends with "mixin" (case insensitive). - -ignore-mixin-members=yes - - - -# When zope mode is activated, consider the acquired-members option to ignore - -# access to some undefined attributes. - -zope=no - - - -# List of members which are usually get through zope's acquisition mecanism and - -# so shouldn't trigger E0201 when accessed (need zope=yes to be considered). - -acquired-members=REQUEST,acl_users,aq_parent - - - - - -# checks for : - -# * doc strings - -# * modules / classes / functions / methods / arguments / variables name - -# * number of arguments, local variables, branchs, returns and statements in - -# functions, methods - -# * required module attributes - -# * dangerous default values as arguments - -# * redefinition of function / method / class - -# * uses of the global statement - -# - -[BASIC] - - - -# Required attributes for module, separated by a comma - -required-attributes= - - - -# Regular expression which should only match functions or classes name which do - -# not require a docstring - -no-docstring-rgx=__.*__ - - - -# Regular expression which should only match correct module names - -module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ - - - -# Regular expression which should only match correct module level names - -const-rgx=(([A-Z_][A-Z1-9_]*)|(__.*__))$ - - - -# Regular expression which should only match correct class names - -class-rgx=[A-Z_][a-zA-Z0-9]+$ - - - -# Regular expression which should only match correct function names - -function-rgx=[a-z_][a-z0-9_]{2,30}$ - - - -# Regular expression which should only match correct method names - -method-rgx=[a-z_][a-z0-9_]{2,30}$ - - - -# Regular expression which should only match correct instance attribute names - -attr-rgx=[a-z_][a-z0-9_]{2,30}$ - - - -# Regular expression which should only match correct argument names - -argument-rgx=[a-z_][a-z0-9_]{2,30}$ - - - -# Regular expression which should only match correct variable names - -variable-rgx=[a-z_][a-z0-9_]{2,30}$ - - - -# Regular expression which should only match correct list comprehension / - -# generator expression variable names - -inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ - - - -# Good variable names which should always be accepted, separated by a comma - -good-names=i,j,k,ex,Run,_ - - - -# Bad variable names which should always be refused, separated by a comma - -bad-names=foo,bar,baz,toto,tutu,tata - - - -# List of builtins function names that should not be used, separated by a comma - -bad-functions=map,filter,apply,input - - - - - -# checks for sign of poor/misdesign: - -# * number of methods, attributes, local variables... - -# * size, complexity of functions, methods - -# - -[DESIGN] - - - -# Maximum number of arguments for function / method - -max-args=5 - - - -# Maximum number of locals for function / method body - -max-locals=15 - - - -# Maximum number of return / yield for function / method body - -max-returns=6 - - - -# Maximum number of branch for function / method body - -max-branchs=12 - - - -# Maximum number of statements in function / method body - -max-statements=50 - - - -# Maximum number of parents for a class (see R0901). - -max-parents=7 - - - -# Maximum number of attributes for a class (see R0902). - -max-attributes=7 - - - -# Minimum number of public methods for a class (see R0903). - -min-public-methods=2 - - - -# Maximum number of public methods for a class (see R0904). - -max-public-methods=20 - - - - - -# checks for - -# * external modules dependencies - -# * relative / wildcard imports - -# * cyclic imports - -# * uses of deprecated modules - -# - -[IMPORTS] - - - -# Deprecated modules which should not be used, separated by a comma - -deprecated-modules=regsub,string,TERMIOS,Bastion,rexec - - - -# Create a graph of every (i.e. internal and external) dependencies in the - -# given file (report R0402 must not be disabled) - -import-graph= - - - -# Create a graph of external dependencies in the given file (report R0402 must - -# not be disabled) - -ext-import-graph= - - - -# Create a graph of internal dependencies in the given file (report R0402 must - -# not be disabled) - -int-import-graph= - - - - - -# checks for : - -# * methods without self as first argument - -# * overridden methods signature - -# * access only to existant members via self - -# * attributes not defined in the __init__ method - -# * supported interfaces implementation - -# * unreachable code - -# - -[CLASSES] - - - -# List of interface methods to ignore, separated by a comma. This is used for - -# instance to not check methods defines in Zope's Interface base class. - -ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by - - - -# List of method names used to declare (i.e. assign) instance attributes. - -defining-attr-methods=__init__,__new__,setUp - - - - - -# checks for similarities and duplicated code. This computation may be - -# memory / CPU intensive, so you should disable it if you experiments some - -# problems. - -# - -[SIMILARITIES] - - - -# Minimum lines number of a similarity. - -min-similarity-lines=4 - - - -# Ignore comments when computing similarities. - -ignore-comments=yes - - - -# Ignore docstrings when computing similarities. - -ignore-docstrings=yes - - - - - -# checks for: - -# * warning notes in the code like FIXME, XXX - -# * PEP 263: source code with non ascii character but no encoding declaration - -# - -[MISCELLANEOUS] - - - -# List of note tags to take in consideration, separated by a comma. - -notes=FIXME,XXX,TODO - - - - - -# checks for : - -# * unauthorized constructions - -# * strict indentation - -# * line length - -# * use of <> instead of != - -# - -[FORMAT] - - - -# Maximum number of characters on a single line. - -max-line-length=80 - - - -# Maximum number of lines in a module - -max-module-lines=1000 - - - -# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 - -# tab). - -indent-string=' ' - diff --git a/src/calibre/__init__.py b/src/calibre/__init__.py index 65998a2928..706391f1a7 100644 --- a/src/calibre/__init__.py +++ b/src/calibre/__init__.py @@ -446,7 +446,3 @@ if isosx: except: import traceback traceback.print_exc() - -# Migrate from QSettings based config system -from calibre.utils.config import migrate -migrate() diff --git a/src/calibre/constants.py b/src/calibre/constants.py index d9d5ee0cfc..369e92a6aa 100644 --- a/src/calibre/constants.py +++ b/src/calibre/constants.py @@ -2,7 +2,7 @@ __license__ = 'GPL v3' __copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' __docformat__ = 'restructuredtext en' __appname__ = 'calibre' -__version__ = '0.4.141' +__version__ = '0.4.142' __author__ = "Kovid Goyal " ''' Various run time constants. diff --git a/src/calibre/devices/__init__.py b/src/calibre/devices/__init__.py index ed16dba14b..a673d3fe09 100644 --- a/src/calibre/devices/__init__.py +++ b/src/calibre/devices/__init__.py @@ -12,7 +12,8 @@ def devices(): from calibre.devices.cybookg3.driver import CYBOOKG3 from calibre.devices.kindle.driver import KINDLE from calibre.devices.kindle.driver import KINDLE2 - return (PRS500, PRS505, PRS700, CYBOOKG3, KINDLE, KINDLE2) + from calibre.devices.blackberry.driver import BLACKBERRY + return (PRS500, PRS505, PRS700, CYBOOKG3, KINDLE, KINDLE2, BLACKBERRY) import time diff --git a/src/calibre/devices/blackberry/__init__.py b/src/calibre/devices/blackberry/__init__.py new file mode 100644 index 0000000000..c8c1a8f015 --- /dev/null +++ b/src/calibre/devices/blackberry/__init__.py @@ -0,0 +1,6 @@ +from __future__ import with_statement +__license__ = 'GPL 3' +__copyright__ = '2009, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + + diff --git a/src/calibre/devices/blackberry/driver.py b/src/calibre/devices/blackberry/driver.py new file mode 100644 index 0000000000..f6c615b0de --- /dev/null +++ b/src/calibre/devices/blackberry/driver.py @@ -0,0 +1,30 @@ +from __future__ import with_statement +__license__ = 'GPL 3' +__copyright__ = '2009, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + + +from calibre.devices.usbms.driver import USBMS + +class BLACKBERRY(USBMS): + # Ordered list of supported formats + FORMATS = ['mobi', 'prc'] + + VENDOR_ID = [0x0fca] + PRODUCT_ID = [0x8004] + BCD = [0x0200] + + VENDOR_NAME = 'RIM' + WINDOWS_MAIN_MEM = 'BLACKBERRY_SD' + #WINDOWS_CARD_MEM = 'CARD_STORAGE' + + #OSX_MAIN_MEM = 'Kindle Internal Storage Media' + #OSX_CARD_MEM = 'Kindle Card Storage Media' + + MAIN_MEMORY_VOLUME_LABEL = 'Blackberry Main Memory' + #STORAGE_CARD_VOLUME_LABEL = 'Kindle Storage Card' + + EBOOK_DIR_MAIN = 'ebooks' + #EBOOK_DIR_CARD = "documents" + SUPPORTS_SUB_DIRS = True + diff --git a/src/calibre/devices/usbms/driver.py b/src/calibre/devices/usbms/driver.py index 3b9e8c0715..abdf2f0d81 100644 --- a/src/calibre/devices/usbms/driver.py +++ b/src/calibre/devices/usbms/driver.py @@ -1,3 +1,4 @@ +from __future__ import with_statement __license__ = 'GPL v3' __copyright__ = '2009, John Schember ' ''' @@ -165,9 +166,14 @@ class USBMS(Device): def get_file(self, path, outfile, end_session=True): path = self.munge_path(path) +<<<<<<< TREE src = open(path, 'rb') shutil.copyfileobj(src, outfile, 10*1024*1024) src.close() +======= + with open(path, 'rb') as src: + shutil.copyfileobj(src, outfile, 10*1024*1024) +>>>>>>> MERGE-SOURCE def put_file(self, infile, path, replace_file=False, end_session=True): path = self.munge_path(path) diff --git a/src/calibre/ebooks/chardet/__init__.py b/src/calibre/ebooks/chardet/__init__.py index 8ad41c524f..af6d724883 100644 --- a/src/calibre/ebooks/chardet/__init__.py +++ b/src/calibre/ebooks/chardet/__init__.py @@ -30,12 +30,50 @@ def detect(aBuf): # Added by Kovid ENCODING_PATS = [ - re.compile(r'<\?[^<>]+encoding=[\'"](.*?)[\'"][^<>]*>', re.IGNORECASE), - re.compile(r'', re.IGNORECASE) + re.compile(r'<\?[^<>]+encoding=[\'"](.*?)[\'"][^<>]*>', + re.IGNORECASE), + re.compile(r'', + re.IGNORECASE) ] ENTITY_PATTERN = re.compile(r'&(\S+?);') -def xml_to_unicode(raw, verbose=False, strip_encoding_pats=False, resolve_entities=False): +def strip_encoding_declarations(raw): + for pat in ENCODING_PATS: + raw = pat.sub('', raw) + return raw + +def substitute_entites(raw): + from calibre import entity_to_unicode + from functools import partial + f = partial(entity_to_unicode, exceptions= + ['amp', 'apos', 'quot', 'lt', 'gt']) + return ENTITY_PATTERN.sub(f, raw) + +_CHARSET_ALIASES = { "macintosh" : "mac-roman", + "x-sjis" : "shift-jis" } + + +def force_encoding(raw, verbose): + from calibre.constants import preferred_encoding + try: + chardet = detect(raw) + except: + chardet = {'encoding':preferred_encoding, 'confidence':0} + encoding = chardet['encoding'] + if chardet['confidence'] < 1 and verbose: + print 'WARNING: Encoding detection confidence %d%%'%(chardet['confidence']*100) + if not encoding: + encoding = preferred_encoding + encoding = encoding.lower() + if _CHARSET_ALIASES.has_key(encoding): + encoding = _CHARSET_ALIASES[encoding] + if encoding == 'ascii': + encoding = 'utf-8' + return encoding + + +def xml_to_unicode(raw, verbose=False, strip_encoding_pats=False, + resolve_entities=False): ''' Force conversion of byte string to unicode. Tries to look for XML/HTML encoding declaration first, if not found uses the chardet library and @@ -45,44 +83,27 @@ def xml_to_unicode(raw, verbose=False, strip_encoding_pats=False, resolve_entiti encoding = None if not raw: return u'', encoding - if isinstance(raw, unicode): - return raw, encoding - for pat in ENCODING_PATS: - match = pat.search(raw) - if match: - encoding = match.group(1) - break - if strip_encoding_pats: + if not isinstance(raw, unicode): + if raw.startswith('\xff\xfe'): + raw, encoding = raw.decode('utf-16-le')[1:], 'utf-16-le' + elif raw.startswith('\xfe\xff'): + raw, encoding = raw.decode('utf-16-be')[1:], 'utf-16-be' + if not isinstance(raw, unicode): for pat in ENCODING_PATS: - raw = pat.sub('', raw) - if encoding is None: + match = pat.search(raw) + if match: + encoding = match.group(1) + break + if encoding is None: + encoding = force_encoding(raw, verbose) try: - chardet = detect(raw) - except: - chardet = {'encoding':'utf-8', 'confidence':0} - encoding = chardet['encoding'] - if chardet['confidence'] < 1 and verbose: - print 'WARNING: Encoding detection confidence %d%%'%(chardet['confidence']*100) - CHARSET_ALIASES = { "macintosh" : "mac-roman", - "x-sjis" : "shift-jis" } - if not encoding: - from calibre import preferred_encoding - encoding = preferred_encoding - if encoding: - encoding = encoding.lower() - if CHARSET_ALIASES.has_key(encoding): - encoding = CHARSET_ALIASES[encoding] - if encoding == 'ascii': - encoding = 'utf-8' + raw = raw.decode(encoding, 'replace') + except LookupError: + raw = raw.decode('utf-8', 'replace') - try: - raw = raw.decode(encoding, 'replace') - except LookupError: - raw = raw.decode('utf-8', 'replace') + if strip_encoding_pats: + raw = strip_encoding_declarations(raw) if resolve_entities: - from calibre import entity_to_unicode - from functools import partial - f = partial(entity_to_unicode, exceptions=['amp', 'apos', 'quot', 'lt', 'gt']) - raw = ENTITY_PATTERN.sub(f, raw) - + raw = substitute_entites(raw) + return raw, encoding diff --git a/src/calibre/ebooks/html.py b/src/calibre/ebooks/html.py index 1f1e6b94b1..f6f5f62720 100644 --- a/src/calibre/ebooks/html.py +++ b/src/calibre/ebooks/html.py @@ -273,7 +273,12 @@ def traverse(path_to_html_file, max_levels=sys.maxint, verbose=0, encoding=None) hf.links.remove(link) next_level = list(nl) - return flat, list(depth_first(flat[0], flat)) + orec = sys.getrecursionlimit() + sys.setrecursionlimit(500000) + try: + return flat, list(depth_first(flat[0], flat)) + finally: + sys.setrecursionlimit(orec) def opf_traverse(opf_reader, verbose=0, encoding=None): diff --git a/src/calibre/ebooks/lit/reader.py b/src/calibre/ebooks/lit/reader.py index 407aedae1f..fd0853f38b 100644 --- a/src/calibre/ebooks/lit/reader.py +++ b/src/calibre/ebooks/lit/reader.py @@ -115,10 +115,12 @@ class UnBinary(object): OPEN_ANGLE_RE = re.compile(r'<<(?![!]--)') CLOSE_ANGLE_RE = re.compile(r'(?