mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Pull from driver-dev
This commit is contained in:
commit
1b52e46586
@ -67,11 +67,19 @@ class DevicePlugin(Plugin):
|
||||
For example: For devices that present themselves as USB Mass storage
|
||||
devices, this method would be responsible for mounting the device or
|
||||
if the device has been automounted, for finding out where it has been
|
||||
mounted. The driver for the PRS505 has a implementation of this function
|
||||
that should serve as a good example for USB Mass storage devices.
|
||||
mounted. The base class within USBMS device.py has a implementation of
|
||||
this function that should serve as a good example for USB Mass storage
|
||||
devices.
|
||||
'''
|
||||
raise NotImplementedError()
|
||||
|
||||
def eject(self):
|
||||
'''
|
||||
Un-mount / eject the device from the OS. This does not check if there
|
||||
are pending GUI jobs that need to communicate with the device.
|
||||
'''
|
||||
raise NotImplementedError()
|
||||
|
||||
def set_progress_reporter(self, report_progress):
|
||||
'''
|
||||
@param report_progress: Function that is called with a % progress
|
||||
|
@ -279,6 +279,9 @@ class PRS500(DeviceConfig, DevicePlugin):
|
||||
if res.code != 0:
|
||||
raise ProtocolError("Could not set time on device")
|
||||
|
||||
def eject(self):
|
||||
pass
|
||||
|
||||
def close(self):
|
||||
""" Release device interface """
|
||||
try:
|
||||
|
@ -491,3 +491,39 @@ class Device(DeviceConfig, DevicePlugin):
|
||||
time.sleep(3)
|
||||
self.open_osx()
|
||||
|
||||
def eject_windows(self):
|
||||
pass
|
||||
|
||||
def eject_osx(self):
|
||||
pass
|
||||
|
||||
def eject_linux(self):
|
||||
drives = self.find_device_nodes()
|
||||
for drive in drives:
|
||||
if drive:
|
||||
cmd = ['pumount']
|
||||
try:
|
||||
p = subprocess.Popen(cmd + [drive])
|
||||
except:
|
||||
pass
|
||||
while p.poll() is None:
|
||||
time.sleep(0.1)
|
||||
|
||||
def eject(self):
|
||||
if islinux:
|
||||
try:
|
||||
self.eject_linux()
|
||||
except:
|
||||
pass
|
||||
if iswindows:
|
||||
try:
|
||||
self.eject_windows()
|
||||
except:
|
||||
pass
|
||||
if isosx:
|
||||
try:
|
||||
self.eject_osx()
|
||||
except:
|
||||
pass
|
||||
self._main_prefix = self._card_a_prefix = self._card_b_prefix = None
|
||||
|
||||
|
@ -1,312 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
'''
|
||||
Maping of non-acii symbols and their corresponding html entity number and name
|
||||
'''
|
||||
__license__ = 'GPL v3'
|
||||
__copyright__ = '2009, John Schember <john@nachtimwald.com>'
|
||||
|
||||
# http://www.w3schools.com/tags/ref_symbols.asp
|
||||
HTML_SYMBOLS = {
|
||||
# Math Symbols
|
||||
u'∀' : ['∀', '∀'], # for all
|
||||
u'∂' : ['∂', '∂'], # part
|
||||
u'∃' : ['∃', '&exists;'], # exists
|
||||
u'∅' : ['∅', '∅'], # empty
|
||||
u'∇' : ['∇', '∇'], # nabla
|
||||
u'∈' : ['∈', '∈'], # isin
|
||||
u'∉' : ['∉', '∉'], # notin
|
||||
u'∋' : ['∋', '∋'], # ni
|
||||
u'∏' : ['∏', '∏'], # prod
|
||||
u'∑' : ['∑', '∑'], # sum
|
||||
u'−' : ['−', '−'], # minus
|
||||
u'∗' : ['∗', '∗'], # lowast
|
||||
u'√' : ['√', '√'], # square root
|
||||
u'∝' : ['∝', '∝'], # proportional to
|
||||
u'∞' : ['∞', '∞'], # infinity
|
||||
u'∠' : ['∠', '∠'], # angle
|
||||
u'∧' : ['∧', '∧'], # and
|
||||
u'∨' : ['∨', '∨'], # or
|
||||
u'∩' : ['∩', '∩'], # cap
|
||||
u'∪' : ['∪', '∪'], # cup
|
||||
u'∫' : ['∫', '∫'], # integral
|
||||
u'∴' : ['∴', '∴'], # therefore
|
||||
u'∼' : ['∼', '∼'], # simular to
|
||||
u'≅' : ['≅', '≅'], # approximately equal
|
||||
u'≈' : ['≈', '≈'], # almost equal
|
||||
u'≠' : ['≠', '≠'], # not equal
|
||||
u'≡' : ['≡', '≡'], # equivalent
|
||||
u'≤' : ['≤', '≤'], # less or equal
|
||||
u'≥' : ['≥', '≥'], # greater or equal
|
||||
u'⊂' : ['⊂', '⊂'], # subset of
|
||||
u'⊃' : ['⊃', '⊃'], # superset of
|
||||
u'⊄' : ['⊄', '⊄'], # not subset of
|
||||
u'⊆' : ['⊆', '⊆'], # subset or equal
|
||||
u'⊇' : ['⊇', '⊇'], # superset or equal
|
||||
u'⊕' : ['⊕', '⊕'], # circled plus
|
||||
u'⊗' : ['⊗', '⊗'], # cirled times
|
||||
u'⊥' : ['⊥', '⊥'], # perpendicular
|
||||
u'⋅' : ['⋅', '⋅'], # dot operator
|
||||
# Greek Letters
|
||||
u'Α' : ['Α', 'Α'], # Alpha
|
||||
u'Β' : ['Β', 'Β'], # Beta
|
||||
u'Γ' : ['Γ', 'Γ'], # Gamma
|
||||
u'Δ' : ['Δ', 'Δ'], # Delta
|
||||
u'Ε' : ['Ε', 'Ε'], # Epsilon
|
||||
u'Ζ' : ['Ζ', 'Ζ'], # Zeta
|
||||
u'Η' : ['Η', 'Η'], # Eta
|
||||
u'Θ' : ['Θ', 'Θ'], # Theta
|
||||
u'Ι' : ['Ι', 'Ι'], # Iota
|
||||
u'Κ' : ['Κ', 'Κ'], # Kappa
|
||||
u'Λ' : ['Λ', 'Λ'], # Lambda
|
||||
u'Μ' : ['Μ', 'Μ'], # Mu
|
||||
u'Ν' : ['Ν', 'Ν'], # Nu
|
||||
u'Ξ' : ['Ξ', 'Ξ'], # Xi
|
||||
u'Ο' : ['Ο', 'Ο'], # Omicron
|
||||
u'Π' : ['Π', 'Π'], # Pi
|
||||
u'Ρ' : ['Ρ', 'Ρ'], # Rho
|
||||
u'Σ' : ['Σ', 'Σ'], # Sigma
|
||||
u'Τ' : ['Τ', 'Τ'], # Tau
|
||||
u'Υ' : ['Υ', 'Υ'], # Upsilon
|
||||
u'Φ' : ['Φ', 'Φ'], # Phi
|
||||
u'Χ' : ['Χ', 'Χ'], # Chi
|
||||
u'Ψ' : ['Ψ', 'Ψ'], # Psi
|
||||
u'ω' : ['ω', 'ω'], # omega
|
||||
u'ϑ' : ['ϑ', 'ϑ'], # theta symbol
|
||||
u'ϒ' : ['ϒ', 'ϒ'], # upsilon symbol
|
||||
u'ϖ' : ['ϖ', 'ϖ'], # pi symbol
|
||||
# Other
|
||||
u'Œ' : ['Œ', 'Œ'], # capital ligature OE
|
||||
u'œ' : ['œ', 'œ'], # small ligature oe
|
||||
u'Š' : ['Š', 'Š'], # capital S with caron
|
||||
u'š' : ['š', 'š'], # small S with caron
|
||||
u'Ÿ' : ['Ÿ', 'Ÿ'], # capital Y with diaeres
|
||||
u'ƒ' : ['ƒ', 'ƒ'], # f with hook
|
||||
u'ˆ' : ['ˆ', 'ˆ'], # modifier letter circumflex accent
|
||||
u'˜' : ['˜', '˜'], # small tilde
|
||||
u'–' : ['–', '–'], # en dash
|
||||
u'—' : ['—', '—'], # em dash
|
||||
u'‘' : ['‘', '‘'], # left single quotation mark
|
||||
u'’' : ['’', '’'], # right single quotation mark
|
||||
u'‚' : ['‚', '‚'], # single low-9 quotation mark
|
||||
u'“' : ['“', '“'], # left double quotation mark
|
||||
u'”' : ['”', '”'], # right double quotation mark
|
||||
u'„' : ['„', '„'], # double low-9 quotation mark
|
||||
u'†' : ['†', '†'], # dagger
|
||||
u'‡' : ['‡', '‡'], # double dagger
|
||||
u'•' : ['•', '•'], # bullet
|
||||
u'…' : ['…', '…'], # horizontal ellipsis
|
||||
u'‰' : ['‰', '‰'], # per mille
|
||||
u'′' : ['′', '′'], # minutes
|
||||
u'″' : ['″', '″'], # seconds
|
||||
u'‹' : ['‹', '‹'], # single left angle quotation
|
||||
u'›' : ['›', '›'], # single right angle quotation
|
||||
u'‾' : ['‾', '‾'], # overline
|
||||
u'€' : ['€', '€'], # euro
|
||||
u'™' : ['™', '™'], # trademark
|
||||
u'←' : ['←', '←'], # left arrow
|
||||
u'↑' : ['↑', '↑'], # up arrow
|
||||
u'→' : ['→', '→'], # right arrow
|
||||
u'↓' : ['↓', '↓'], # down arrow
|
||||
u'↔' : ['↔', '↔'], # left right arrow
|
||||
u'↵' : ['↵', '↵'], # carriage return arrow
|
||||
u'⌈' : ['⌈', '⌈'], # left ceiling
|
||||
u'⌉' : ['⌉', '⌉'], # right ceiling
|
||||
u'⌊' : ['⌊', '⌊'], # left floor
|
||||
u'⌋' : ['⌋', '⌋'], # right floor
|
||||
u'◊' : ['◊', '◊'], # lozenge
|
||||
u'♠' : ['♠', '♠'], # spade
|
||||
u'♣' : ['♣', '♣'], # club
|
||||
u'♥' : ['♥', '♥'], # heart
|
||||
u'♦' : ['♦', '♦'], # diamond
|
||||
# Extra http://www.ascii.cl/htmlcodes.htm
|
||||
u' ' : [' '], # space
|
||||
u'!' : ['!'], # exclamation point
|
||||
u'#' : ['#'], # number sign
|
||||
u'$' : ['$'], # dollar sign
|
||||
u'%' : ['%'], # percent sign
|
||||
u'\'' : ['''], # single quote
|
||||
u'(' : ['('], # opening parenthesis
|
||||
u')' : [')'], # closing parenthesis
|
||||
u'*' : ['*'], # asterisk
|
||||
u'+' : ['+'], # plus sign
|
||||
u',' : [','], # comma
|
||||
u'-' : ['-'], # minus sign - hyphen
|
||||
u'.' : ['.'], # period
|
||||
u'/' : ['/'], # slash
|
||||
u'0' : ['0'], # zero
|
||||
u'1' : ['1'], # one
|
||||
u'2' : ['2'], # two
|
||||
u'3' : ['3'], # three
|
||||
u'4' : ['4'], # four
|
||||
u'5' : ['5'], # five
|
||||
u'6' : ['6'], # six
|
||||
u'7' : ['7'], # seven
|
||||
u'8' : ['8'], # eight
|
||||
u'9' : ['9'], # nine
|
||||
u':' : [':'], # colon
|
||||
u';' : [';'], # semicolon
|
||||
u'=' : ['='], # equal sign
|
||||
u'?' : ['?'], # question mark
|
||||
u'@' : ['@'], # at symbol
|
||||
u'A' : ['A'], #
|
||||
u'B' : ['B'], #
|
||||
u'C' : ['C'], #
|
||||
u'D' : ['D'], #
|
||||
u'E' : ['E'], #
|
||||
u'F' : ['F'], #
|
||||
u'G' : ['G'], #
|
||||
u'H' : ['H'], #
|
||||
u'I' : ['I'], #
|
||||
u'J' : ['J'], #
|
||||
u'K' : ['K'], #
|
||||
u'L' : ['L'], #
|
||||
u'M' : ['M'], #
|
||||
u'N' : ['N'], #
|
||||
u'O' : ['O'], #
|
||||
u'P' : ['P'], #
|
||||
u'Q' : ['Q'], #
|
||||
u'R' : ['R'], #
|
||||
u'S' : ['S'], #
|
||||
u'T' : ['T'], #
|
||||
u'U' : ['U'], #
|
||||
u'V' : ['V'], #
|
||||
u'W' : ['W'], #
|
||||
u'X' : ['X'], #
|
||||
u'Y' : ['Y'], #
|
||||
u'Z' : ['Z'], #
|
||||
u'[' : ['['], # opening bracket
|
||||
u'\\' : ['\'], # backslash
|
||||
u']' : [']'], # closing bracket
|
||||
u'^' : ['^'], # caret - circumflex
|
||||
u'_' : ['_'], # underscore
|
||||
u'`' : ['`'], # grave accent
|
||||
u'a' : ['a'], #
|
||||
u'b' : ['b'], #
|
||||
u'c' : ['c'], #
|
||||
u'd' : ['d'], #
|
||||
u'e' : ['e'], #
|
||||
u'f' : ['f'], #
|
||||
u'g' : ['g'], #
|
||||
u'h' : ['h'], #
|
||||
u'i' : ['i'], #
|
||||
u'j' : ['j'], #
|
||||
u'k' : ['k'], #
|
||||
u'l' : ['l'], #
|
||||
u'm' : ['m'], #
|
||||
u'n' : ['n'], #
|
||||
u'o' : ['o'], #
|
||||
u'p' : ['p'], #
|
||||
u'q' : ['q'], #
|
||||
u'r' : ['r'], #
|
||||
u's' : ['s'], #
|
||||
u't' : ['t'], #
|
||||
u'u' : ['u'], #
|
||||
u'v' : ['v'], #
|
||||
u'w' : ['w'], #
|
||||
u'x' : ['x'], #
|
||||
u'y' : ['y'], #
|
||||
u'z' : ['z'], #
|
||||
u'{' : ['{'], # opening brace
|
||||
u'|' : ['|'], # vertical bar
|
||||
u'}' : ['}'], # closing brace
|
||||
u'~' : ['~'], # equivalency sign - tilde
|
||||
u'<' : ['<', '<'], # less than sign
|
||||
u'>' : ['>', '>'], # greater than sign
|
||||
u'¡' : ['¡', '¡'], # inverted exclamation mark
|
||||
u'¢' : ['¢', '¢'], # cent sign
|
||||
u'£' : ['£', '£'], # pound sign
|
||||
u'¤' : ['¤', '¤'], # currency sign
|
||||
u'¥' : ['¥', '¥'], # yen sign
|
||||
u'¦' : ['¦', '¦'], # broken vertical bar
|
||||
u'§' : ['§', '§'], # section sign
|
||||
u'¨' : ['¨', '¨'], # spacing diaeresis - umlaut
|
||||
u'©' : ['©', '©'], # copyright sign
|
||||
u'ª' : ['ª', 'ª'], # feminine ordinal indicator
|
||||
u'«' : ['«', '«'], # left double angle quotes
|
||||
u'¬' : ['¬', '¬'], # not sign
|
||||
u'®' : ['®', '®'], # registered trade mark sign
|
||||
u'¯' : ['¯', '¯'], # spacing macron - overline
|
||||
u'°' : ['°', '°'], # degree sign
|
||||
u'±' : ['±', '±'], # plus-or-minus sign
|
||||
u'²' : ['²', '²'], # superscript two - squared
|
||||
u'³' : ['³', '³'], # superscript three - cubed
|
||||
u'´' : ['´', '´'], # acute accent - spacing acute
|
||||
u'µ' : ['µ', 'µ'], # micro sign
|
||||
u'¶' : ['¶', '¶'], # pilcrow sign - paragraph sign
|
||||
u'·' : ['·', '·'], # middle dot - Georgian comma
|
||||
u'¸' : ['¸', '¸'], # spacing cedilla
|
||||
u'¹' : ['¹', '¹'], # superscript one
|
||||
u'º' : ['º', 'º'], # masculine ordinal indicator
|
||||
u'»' : ['»', '»'], # right double angle quotes
|
||||
u'¼' : ['¼', '¼'], # fraction one quarter
|
||||
u'½' : ['½', '½'], # fraction one half
|
||||
u'¾' : ['¾', '¾'], # fraction three quarters
|
||||
u'¿' : ['¿', '¿'], # inverted question mark
|
||||
u'À' : ['À', 'À'], # latin capital letter A with grave
|
||||
u'Á' : ['Á', 'Á'], # latin capital letter A with acute
|
||||
u'Â' : ['Â', 'Â'], # latin capital letter A with circumflex
|
||||
u'Ã' : ['Ã', 'Ã'], # latin capital letter A with tilde
|
||||
u'Ä' : ['Ä', 'Ä'], # latin capital letter A with diaeresis
|
||||
u'Å' : ['Å', 'Å'], # latin capital letter A with ring above
|
||||
u'Æ' : ['Æ', 'Æ'], # latin capital letter AE
|
||||
u'Ç' : ['Ç', 'Ç'], # latin capital letter C with cedilla
|
||||
u'È' : ['È', 'È'], # latin capital letter E with grave
|
||||
u'É' : ['É', 'É'], # latin capital letter E with acute
|
||||
u'Ê' : ['Ê', 'Ê'], # latin capital letter E with circumflex
|
||||
u'Ë' : ['Ë', 'Ë'], # latin capital letter E with diaeresis
|
||||
u'Ì' : ['Ì', 'Ì'], # latin capital letter I with grave
|
||||
u'Í' : ['Í', 'Í'], # latin capital letter I with acute
|
||||
u'Î' : ['Î', 'Î'], # latin capital letter I with circumflex
|
||||
u'Ï' : ['Ï', 'Ï'], # latin capital letter I with diaeresis
|
||||
u'Ð' : ['Ð', 'Ð'], # latin capital letter ETH
|
||||
u'Ñ' : ['Ñ', 'Ñ'], # latin capital letter N with tilde
|
||||
u'Ò' : ['Ò', 'Ò'], # latin capital letter O with grave
|
||||
u'Ó' : ['Ó', 'Ó'], # latin capital letter O with acute
|
||||
u'Ô' : ['Ô', 'Ô'], # latin capital letter O with circumflex
|
||||
u'Õ' : ['Õ', 'Õ'], # latin capital letter O with tilde
|
||||
u'Ö' : ['Ö', 'Ö'], # latin capital letter O with diaeresis
|
||||
u'×' : ['×', '×'], # multiplication sign
|
||||
u'Ø' : ['Ø', 'Ø'], # latin capital letter O with slash
|
||||
u'Ù' : ['Ù', 'Ù'], # latin capital letter U with grave
|
||||
u'Ú' : ['Ú', 'Ú'], # latin capital letter U with acute
|
||||
u'Û' : ['Û', 'Û'], # latin capital letter U with circumflex
|
||||
u'Ü' : ['Ü', 'Ü'], # latin capital letter U with diaeresis
|
||||
u'Ý' : ['Ý', 'Ý'], # latin capital letter Y with acute
|
||||
u'Þ' : ['Þ', 'Þ'], # latin capital letter THORN
|
||||
u'ß' : ['ß', 'ß'], # latin small letter sharp s - ess-zed
|
||||
u'à' : ['à', 'à'], # latin small letter a with grave
|
||||
u'á' : ['á', 'á'], # latin small letter a with acute
|
||||
u'â' : ['â', 'â'], # latin small letter a with circumflex
|
||||
u'ã' : ['ã', 'ã'], # latin small letter a with tilde
|
||||
u'ä' : ['ä', 'ä'], # latin small letter a with diaeresis
|
||||
u'å' : ['å', 'å'], # latin small letter a with ring above
|
||||
u'æ' : ['æ', 'æ'], # latin small letter ae
|
||||
u'ç' : ['ç', 'ç'], # latin small letter c with cedilla
|
||||
u'è' : ['è', 'è'], # latin small letter e with grave
|
||||
u'é' : ['é', 'é'], # latin small letter e with acute
|
||||
u'ê' : ['ê', 'ê'], # latin small letter e with circumflex
|
||||
u'ë' : ['ë', 'ë'], # latin small letter e with diaeresis
|
||||
u'ì' : ['ì', 'ì'], # latin small letter i with grave
|
||||
u'í' : ['í', 'í'], # latin small letter i with acute
|
||||
u'î' : ['î', 'î'], # latin small letter i with circumflex
|
||||
u'ï' : ['ï', 'ï'], # latin small letter i with diaeresis
|
||||
u'ð' : ['ð', 'ð'], # latin small letter eth
|
||||
u'ñ' : ['ñ', 'ñ'], # latin small letter n with tilde
|
||||
u'ò' : ['ò', 'ò'], # latin small letter o with grave
|
||||
u'ó' : ['ó', 'ó'], # latin small letter o with acute
|
||||
u'ô' : ['ô', 'ô'], # latin small letter o with circumflex
|
||||
u'õ' : ['õ', 'õ'], # latin small letter o with tilde
|
||||
u'ö' : ['ö', 'ö'], # latin small letter o with diaeresis
|
||||
u'÷' : ['÷', '÷'], # division sign
|
||||
u'ø' : ['ø', 'ø'], # latin small letter o with slash
|
||||
u'ù' : ['ù', 'ù'], # latin small letter u with grave
|
||||
u'ú' : ['ú', 'ú'], # latin small letter u with acute
|
||||
u'û' : ['û', 'û'], # latin small letter u with circumflex
|
||||
u'ü' : ['ü', 'ü'], # latin small letter u with diaeresis
|
||||
u'ý' : ['ý', 'ý'], # latin small letter y with acute
|
||||
u'þ' : ['þ', 'þ'], # latin small letter thorn
|
||||
u'ÿ' : ['ÿ', 'ÿ'], # latin small letter y with diaeresis
|
||||
# More
|
||||
u' ' : [' '],
|
||||
}
|
||||
|
@ -22,6 +22,11 @@ class PDBOutput(OutputFormatPlugin):
|
||||
short_switch='f', choices=FORMAT_WRITERS.keys(),
|
||||
help=(_('Format to use inside the pdb container. Choices are:')+\
|
||||
' %s' % FORMAT_WRITERS.keys())),
|
||||
OptionRecommendation(name='output_encoding', recommended_value='cp1252',
|
||||
level=OptionRecommendation.LOW,
|
||||
help=_('Specify the character encoding of the output document. ' \
|
||||
'The default is cp1252. Note: This option is not honored by all ' \
|
||||
'formats.')),
|
||||
])
|
||||
|
||||
def convert(self, oeb_book, output_path, input_plugin, opts, log):
|
||||
|
@ -34,7 +34,7 @@ class Writer(FormatWriter):
|
||||
self.log.info('Compessing data...')
|
||||
for i in range(0, len(txt_records)):
|
||||
self.log.debug('\tCompressing record %i' % i)
|
||||
txt_records[i] = compress_doc(txt_records[i].encode('cp1252', 'replace'))
|
||||
txt_records[i] = compress_doc(txt_records[i])
|
||||
section_lengths.append(len(txt_records[i]))
|
||||
|
||||
out_stream.seek(0)
|
||||
@ -46,7 +46,7 @@ class Writer(FormatWriter):
|
||||
|
||||
def _generate_text(self, spine):
|
||||
txt_writer = TxtWriter(TxtNewlines('system').newline, self.log)
|
||||
txt = txt_writer.dump(spine)
|
||||
txt = txt_writer.dump(spine).encode(self.opts.output_encoding, 'replace')
|
||||
|
||||
txt_length = len(txt)
|
||||
|
||||
|
@ -50,7 +50,7 @@ class Writer(FormatWriter):
|
||||
|
||||
def _generate_text(self, spine):
|
||||
txt_writer = TxtWriter(TxtNewlines('system').newline, self.log)
|
||||
txt = txt_writer.dump(spine)
|
||||
txt = txt_writer.dump(spine).encode(self.opts.output_encoding, 'replace')
|
||||
|
||||
txt_length = len(txt)
|
||||
|
||||
|
@ -15,6 +15,7 @@ except ImportError:
|
||||
import cStringIO
|
||||
|
||||
from calibre.customize.conversion import OutputFormatPlugin
|
||||
from calibre.customize.conversion import OptionRecommendation
|
||||
from calibre.ptempfile import TemporaryDirectory
|
||||
from calibre.utils.zipfile import ZipFile
|
||||
from calibre.ebooks.oeb.base import OEB_IMAGES
|
||||
@ -26,12 +27,20 @@ class PMLOutput(OutputFormatPlugin):
|
||||
author = 'John Schember'
|
||||
file_type = 'pmlz'
|
||||
|
||||
options = set([
|
||||
OptionRecommendation(name='output_encoding', recommended_value='cp1252',
|
||||
level=OptionRecommendation.LOW,
|
||||
help=_('Specify the character encoding of the output document. ' \
|
||||
'The default is cp1252. Note: This option is not honored by all ' \
|
||||
'formats.')),
|
||||
])
|
||||
|
||||
def convert(self, oeb_book, output_path, input_plugin, opts, log):
|
||||
with TemporaryDirectory('_pmlz_output') as tdir:
|
||||
pmlmlizer = PMLMLizer(ignore_tables=opts.linearize_tables)
|
||||
content = pmlmlizer.extract_content(oeb_book, opts)
|
||||
with open(os.path.join(tdir, 'index.pml'), 'wb') as out:
|
||||
out.write(content.encode('utf-8'))
|
||||
out.write(content.encode(self.opts.output_encoding, 'replace'))
|
||||
|
||||
self.write_images(oeb_book.manifest, tdir)
|
||||
|
||||
|
@ -10,10 +10,9 @@ __docformat__ = 'restructuredtext en'
|
||||
|
||||
import re
|
||||
|
||||
from calibre.ebooks.pdb.ereader import image_name
|
||||
from calibre.ebooks.htmlsymbols import HTML_SYMBOLS
|
||||
from htmlentitydefs import codepoint2name
|
||||
|
||||
from BeautifulSoup import BeautifulSoup
|
||||
from calibre.ebooks.pdb.ereader import image_name
|
||||
|
||||
PML_HTML_RULES = [
|
||||
(re.compile(r'\\p'), lambda match: '<br /><br style="page-break-after: always;" />'),
|
||||
@ -71,10 +70,12 @@ def pml_to_html(pml):
|
||||
for rule in PML_HTML_RULES:
|
||||
html = rule[0].sub(rule[1], html)
|
||||
|
||||
for symbol in HTML_SYMBOLS.keys():
|
||||
if ord(symbol) > 128:
|
||||
html = html.replace(symbol, HTML_SYMBOLS[symbol][len(HTML_SYMBOLS[symbol]) - 1])
|
||||
|
||||
# Turn special characters into entities.
|
||||
cps = [ord(c) for c in set(html)]
|
||||
cps = set(cps).intersection(codepoint2name.keys()).difference([60, 62])
|
||||
for cp in cps:
|
||||
html = html.replace(unichr(cp), '&%s;' % codepoint2name[cp])
|
||||
|
||||
return html
|
||||
|
||||
def footnote_sidebar_to_html(id, pml):
|
||||
|
@ -17,13 +17,18 @@ class TXTOutput(OutputFormatPlugin):
|
||||
file_type = 'txt'
|
||||
|
||||
options = set([
|
||||
OptionRecommendation(name='newline', recommended_value='system',
|
||||
level=OptionRecommendation.LOW,
|
||||
short_switch='n', choices=TxtNewlines.NEWLINE_TYPES.keys(),
|
||||
help=_('Type of newline to use. Options are %s. Default is \'system\'. '
|
||||
'Use \'old_mac\' for compatibility with Mac OS 9 and earlier. '
|
||||
'For Mac OS X use \'unix\'. \'system\' will default to the newline '
|
||||
'type used by this OS.') % sorted(TxtNewlines.NEWLINE_TYPES.keys())),
|
||||
OptionRecommendation(name='newline', recommended_value='system',
|
||||
level=OptionRecommendation.LOW,
|
||||
short_switch='n', choices=TxtNewlines.NEWLINE_TYPES.keys(),
|
||||
help=_('Type of newline to use. Options are %s. Default is \'system\'. '
|
||||
'Use \'old_mac\' for compatibility with Mac OS 9 and earlier. '
|
||||
'For Mac OS X use \'unix\'. \'system\' will default to the newline '
|
||||
'type used by this OS.') % sorted(TxtNewlines.NEWLINE_TYPES.keys())),
|
||||
OptionRecommendation(name='output_encoding', recommended_value='utf-8',
|
||||
level=OptionRecommendation.LOW,
|
||||
help=_('Specify the character encoding of the output document. ' \
|
||||
'The default is utf-8. Note: This option is not honored by all ' \
|
||||
'formats.')),
|
||||
])
|
||||
|
||||
def convert(self, oeb_book, output_path, input_plugin, opts, log):
|
||||
@ -41,7 +46,7 @@ class TXTOutput(OutputFormatPlugin):
|
||||
|
||||
out_stream.seek(0)
|
||||
out_stream.truncate()
|
||||
out_stream.write(txt.encode('utf-8'))
|
||||
out_stream.write(txt.encode(self.opts.output_encoding, 'replace'))
|
||||
|
||||
if close:
|
||||
out_stream.close()
|
||||
|
@ -12,7 +12,6 @@ import os
|
||||
import re
|
||||
|
||||
from calibre import entity_to_unicode
|
||||
from calibre.ebooks.htmlsymbols import HTML_SYMBOLS
|
||||
|
||||
from BeautifulSoup import BeautifulSoup
|
||||
|
||||
@ -82,10 +81,6 @@ class TxtWriter(object):
|
||||
return stripped
|
||||
|
||||
def replace_html_symbols(self, content):
|
||||
for symbol in HTML_SYMBOLS:
|
||||
for code in HTML_SYMBOLS[symbol]:
|
||||
content = content.replace(code, symbol)
|
||||
|
||||
for entity in set(re.findall('&.+?;', content)):
|
||||
mo = re.search('(%s)' % entity[1:-1], content)
|
||||
content = content.replace(entity, entity_to_unicode(mo))
|
||||
|
@ -123,6 +123,10 @@ class DeviceManager(Thread):
|
||||
self.connected_slot(False)
|
||||
device[1] ^= True
|
||||
|
||||
def umount_device(self):
|
||||
self.device.eject()
|
||||
self.device = None
|
||||
|
||||
def next(self):
|
||||
if not self.jobs.empty():
|
||||
try:
|
||||
@ -852,5 +856,3 @@ class DeviceGUI(object):
|
||||
getattr(f, 'close', lambda : True)()
|
||||
if memory and memory[1]:
|
||||
self.library_view.model().delete_books_by_id(memory[1])
|
||||
|
||||
|
||||
|
281
src/calibre/gui2/images/eject.svg
Normal file
281
src/calibre/gui2/images/eject.svg
Normal file
@ -0,0 +1,281 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://web.resource.org/cc/"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="128"
|
||||
height="128"
|
||||
id="svg3186"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.45"
|
||||
version="1.0"
|
||||
sodipodi:docname="player_end.svg"
|
||||
sodipodi:docbase="/home/david/Progetti/sandbox"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||
sodipodi:modified="true">
|
||||
<defs
|
||||
id="defs3188">
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#radialGradient3163"
|
||||
id="radialGradient2197"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(4.7377213e-8,-0.1315545,0.7519296,0,12.61245,94.56941)"
|
||||
cx="80.342453"
|
||||
cy="68.340897"
|
||||
fx="80.342453"
|
||||
fy="68.340897"
|
||||
r="40.0294" />
|
||||
<radialGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.6667,0,0,0.7574,20.7214,14.064)"
|
||||
r="40.0294"
|
||||
cy="59.1865"
|
||||
cx="53.1978"
|
||||
id="radialGradient3163">
|
||||
<stop
|
||||
id="stop3165"
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="0" />
|
||||
<stop
|
||||
id="stop3175"
|
||||
style="stop-color:#666666;stop-opacity:1;"
|
||||
offset="1" />
|
||||
</radialGradient>
|
||||
<linearGradient
|
||||
id="XMLID_9_"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="11.9487"
|
||||
y1="34"
|
||||
x2="104.0518"
|
||||
y2="34"
|
||||
gradientTransform="translate(559.14286,-264.28571)">
|
||||
<stop
|
||||
offset="0"
|
||||
style="stop-color:#FFFFFF"
|
||||
id="stop56" />
|
||||
<stop
|
||||
offset="0.80000001"
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
id="stop58" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
id="XMLID_8_"
|
||||
cx="53.1978"
|
||||
cy="59.1865"
|
||||
r="40.0294"
|
||||
gradientTransform="matrix(0.6667,0,0,0.7574,20.7214,14.064)"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
offset="0"
|
||||
style="stop-color:#323232"
|
||||
id="stop41" />
|
||||
<stop
|
||||
offset="0.2083"
|
||||
style="stop-color:#363636"
|
||||
id="stop43" />
|
||||
<stop
|
||||
offset="0.4278"
|
||||
style="stop-color:#434343"
|
||||
id="stop45" />
|
||||
<stop
|
||||
offset="0.6526"
|
||||
style="stop-color:#585858"
|
||||
id="stop47" />
|
||||
<stop
|
||||
offset="0.8796"
|
||||
style="stop-color:#757575"
|
||||
id="stop49" />
|
||||
<stop
|
||||
offset="1"
|
||||
style="stop-color:#888888"
|
||||
id="stop51" />
|
||||
</radialGradient>
|
||||
<radialGradient
|
||||
id="XMLID_7_"
|
||||
cx="58"
|
||||
cy="58"
|
||||
r="48"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(559.14286,-264.28571)">
|
||||
<stop
|
||||
offset="0"
|
||||
style="stop-color:#FFFFFF"
|
||||
id="stop26" />
|
||||
<stop
|
||||
offset="0.574"
|
||||
style="stop-color:#FFFFFF"
|
||||
id="stop28" />
|
||||
<stop
|
||||
offset="0.6842"
|
||||
style="stop-color:#FBFBFB"
|
||||
id="stop30" />
|
||||
<stop
|
||||
offset="0.8001"
|
||||
style="stop-color:#EEEEEE"
|
||||
id="stop32" />
|
||||
<stop
|
||||
offset="0.9"
|
||||
style="stop-color:#DDDDDD"
|
||||
id="stop34" />
|
||||
<stop
|
||||
offset="1"
|
||||
style="stop-color:#BBBBBB"
|
||||
id="stop36" />
|
||||
</radialGradient>
|
||||
<filter
|
||||
id="AI_Sfocatura_4">
|
||||
<feGaussianBlur
|
||||
stdDeviation="4"
|
||||
id="feGaussianBlur6" />
|
||||
</filter>
|
||||
<linearGradient
|
||||
id="XMLID_6_"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="58.0005"
|
||||
y1="116"
|
||||
x2="58.0005"
|
||||
y2="4.882812e-04">
|
||||
<stop
|
||||
offset="0"
|
||||
style="stop-color:#555555"
|
||||
id="stop9" />
|
||||
<stop
|
||||
offset="0.2736"
|
||||
style="stop-color:#595959"
|
||||
id="stop11" />
|
||||
<stop
|
||||
offset="0.562"
|
||||
style="stop-color:#666666"
|
||||
id="stop13" />
|
||||
<stop
|
||||
offset="0.8561"
|
||||
style="stop-color:#7B7B7B"
|
||||
id="stop15" />
|
||||
<stop
|
||||
offset="1"
|
||||
style="stop-color:#888888"
|
||||
id="stop17" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#XMLID_9_"
|
||||
id="linearGradient3242"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(6.0000006,6.0000006)"
|
||||
x1="11.9487"
|
||||
y1="34"
|
||||
x2="104.0518"
|
||||
y2="34" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#XMLID_7_"
|
||||
id="radialGradient3246"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.0833333,0,0,1.0833333,1.1666673,1.1666673)"
|
||||
cx="58"
|
||||
cy="58"
|
||||
r="48" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#XMLID_6_"
|
||||
id="linearGradient3251"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="58.0005"
|
||||
y1="116"
|
||||
x2="58.0005"
|
||||
y2="4.882812e-04" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#radialGradient3163"
|
||||
id="radialGradient3253"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.6667,0,0,0.7574,20.7214,14.064)"
|
||||
cx="53.1978"
|
||||
cy="59.186501"
|
||||
r="40.0294" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
gridtolerance="10000"
|
||||
guidetolerance="10"
|
||||
objecttolerance="10"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="2.8284271"
|
||||
inkscape:cx="62"
|
||||
inkscape:cy="44.566099"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
width="128px"
|
||||
height="128px"
|
||||
showgrid="true"
|
||||
gridspacingx="8px"
|
||||
gridspacingy="8px"
|
||||
inkscape:window-width="792"
|
||||
inkscape:window-height="581"
|
||||
inkscape:window-x="225"
|
||||
inkscape:window-y="112" />
|
||||
<metadata
|
||||
id="metadata3191">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<circle
|
||||
cx="58"
|
||||
cy="58"
|
||||
r="58"
|
||||
id="circle19"
|
||||
style="fill:url(#linearGradient3251)"
|
||||
sodipodi:cx="58"
|
||||
sodipodi:cy="58"
|
||||
sodipodi:rx="58"
|
||||
sodipodi:ry="58"
|
||||
transform="matrix(1.1034483,0,0,1.1034483,0,-2.8e-6)" />
|
||||
<g
|
||||
id="g21"
|
||||
transform="matrix(1.0833333,0,0,1.0833333,1.1666686,1.1666686)"
|
||||
style="filter:url(#AI_Sfocatura_4);opacity:0.8">
|
||||
<path
|
||||
d="M 10,58 C 10,84.467 31.533,106 58,106 C 84.467,106 106,84.467 106,58 C 106,31.533 84.467,10 58,10 C 31.533,10 10,31.533 10,58 z "
|
||||
id="path23" />
|
||||
</g>
|
||||
<path
|
||||
d="M 12,63.999999 C 12,92.672581 35.327414,116 63.999998,116 C 92.672584,116 116,92.672581 116,63.999999 C 116,35.327415 92.672584,12 63.999998,12 C 35.327414,12 12,35.327415 12,63.999999 z "
|
||||
id="path38"
|
||||
style="fill:url(#radialGradient3246)" />
|
||||
<polygon
|
||||
points="42,26 90,58 42,90 42,26 "
|
||||
id="polygon53"
|
||||
style="fill:url(#radialGradient3253);fill-opacity:1"
|
||||
transform="matrix(0,-0.8333333,1,0,6,107)" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccc"
|
||||
id="path2195"
|
||||
d="M 40,88 L 40.38871,80 L 87.95798,80.005265 L 88,87.94911 L 40,88 z "
|
||||
style="fill:url(#radialGradient2197);fill-opacity:1" />
|
||||
<path
|
||||
d="M 63.999998,63.999999 C 81.788999,63.999999 97.967006,58.87 110.05199,50.491 C 104.19999,30.582 85.775999,16 63.999998,16 C 42.222999,16 23.798999,30.582999 17.949,50.491 C 30.032,58.87 46.209999,63.999999 63.999998,63.999999 z "
|
||||
id="path60"
|
||||
style="opacity:0.5;fill:url(#linearGradient3242)" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 8.0 KiB |
@ -176,10 +176,23 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
|
||||
SIGNAL('activated(QSystemTrayIcon::ActivationReason)'),
|
||||
self.system_tray_icon_activated)
|
||||
self.tool_bar.contextMenuEvent = self.no_op
|
||||
|
||||
####################### Start spare job server ########################
|
||||
QTimer.singleShot(1000, self.add_spare_server)
|
||||
|
||||
####################### Setup device detection ########################
|
||||
self.device_manager = DeviceManager(Dispatcher(self.device_detected),
|
||||
self.job_manager)
|
||||
self.device_manager.start()
|
||||
|
||||
|
||||
####################### Location View ########################
|
||||
QObject.connect(self.location_view,
|
||||
SIGNAL('location_selected(PyQt_PyObject)'),
|
||||
self.location_selected)
|
||||
QObject.connect(self.location_view,
|
||||
SIGNAL('umount_device()'),
|
||||
self.device_manager.umount_device)
|
||||
|
||||
####################### Vanity ########################
|
||||
self.vanity_template = _('<p>For help visit <a href="http://%s.'
|
||||
@ -462,13 +475,6 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
|
||||
|
||||
|
||||
self.setMaximumHeight(max_available_height())
|
||||
####################### Start spare job server ########################
|
||||
QTimer.singleShot(1000, self.add_spare_server)
|
||||
|
||||
####################### Setup device detection ########################
|
||||
self.device_manager = DeviceManager(Dispatcher(self.device_detected),
|
||||
self.job_manager)
|
||||
self.device_manager.start()
|
||||
|
||||
|
||||
if config['autolaunch_server']:
|
||||
|
@ -45,6 +45,9 @@
|
||||
<height>75</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="mouseTracking">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="verticalScrollBarPolicy">
|
||||
<enum>Qt::ScrollBarAlwaysOff</enum>
|
||||
</property>
|
||||
|
@ -9,7 +9,8 @@ from PyQt4.Qt import QListView, QIcon, QFont, QLabel, QListWidget, \
|
||||
QSyntaxHighlighter, QCursor, QColor, QWidget, \
|
||||
QPixmap, QMovie, QPalette, QTimer, QDialog, \
|
||||
QAbstractListModel, QVariant, Qt, SIGNAL, \
|
||||
QRegExp, QSettings, QSize, QModelIndex
|
||||
QRegExp, QSettings, QSize, QModelIndex, \
|
||||
QAbstractButton, QPainter
|
||||
|
||||
from calibre.gui2 import human_readable, NONE, TableView, \
|
||||
qstring_to_unicode, error_dialog
|
||||
@ -234,6 +235,13 @@ class LocationView(QListView):
|
||||
self.setCursor(Qt.PointingHandCursor)
|
||||
self.currentChanged = self.current_changed
|
||||
|
||||
self.eject_button = EjectButton(self)
|
||||
self.eject_button.hide()
|
||||
|
||||
self.connect(self, SIGNAL('entered(QModelIndex)'), self.show_eject)
|
||||
self.connect(self, SIGNAL('viewportEntered()'), self.hide_eject)
|
||||
self.connect(self.eject_button, SIGNAL('clicked()'), lambda: self.emit(SIGNAL('umount_device()')))
|
||||
|
||||
def count_changed(self, new_count):
|
||||
self.model().count = new_count
|
||||
self.model().reset()
|
||||
@ -249,6 +257,33 @@ class LocationView(QListView):
|
||||
if 0 <= row and row <= 3:
|
||||
self.model().location_changed(row)
|
||||
|
||||
def show_eject(self, location):
|
||||
self.eject_button.hide()
|
||||
|
||||
if location.row() == 1:
|
||||
rect = self.visualRect(location)
|
||||
|
||||
self.eject_button.resize(rect.height()/2, rect.height()/2)
|
||||
|
||||
x, y = rect.left(), rect.top()
|
||||
x = x + (rect.width() - self.eject_button.width() - 2)
|
||||
y += 6
|
||||
|
||||
self.eject_button.move(x, y)
|
||||
self.eject_button.show()
|
||||
|
||||
def hide_eject(self):
|
||||
self.eject_button.hide()
|
||||
|
||||
|
||||
class EjectButton(QAbstractButton):
|
||||
|
||||
def paintEvent(self, event):
|
||||
painter = QPainter(self)
|
||||
painter.setClipRect(event.rect());
|
||||
painter.drawPixmap(0, 0, QPixmap(':/images/eject').scaledToHeight(event.rect().height(), Qt.SmoothTransformation))
|
||||
|
||||
|
||||
class DetailView(QDialog, Ui_Dialog):
|
||||
|
||||
def __init__(self, parent, job):
|
||||
@ -617,4 +652,3 @@ class PythonHighlighter(QSyntaxHighlighter):
|
||||
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
|
||||
QSyntaxHighlighter.rehighlight(self)
|
||||
QApplication.restoreOverrideCursor()
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user