Sync to trunk

This commit is contained in:
John Schember 2009-06-03 07:43:00 -04:00
commit f2403514e4
50 changed files with 1484 additions and 921 deletions

View File

@ -93,6 +93,8 @@ def freeze():
'dateutil', 'dns', 'email']
includes += ['calibre.web.feeds.recipes.'+r for r in recipe_modules]
includes += [x.split('/')[-1].rpartition('.')[0] for x in \
glob.glob('src/calibre/gui2/convert/*.py')]
LOADER = '/tmp/loader.py'
open(LOADER, 'wb').write('# This script is never actually used.\nimport sys')

View File

@ -254,8 +254,6 @@ _check_symlinks_prescript()
os.link(os.path.expanduser('~/pdftohtml/pdftohtml'), os.path.join(frameworks_dir, 'pdftohtml'))
os.link(os.path.expanduser('~/pdftohtml/libpoppler.4.dylib'),
os.path.join(frameworks_dir, 'libpoppler.4.dylib'))
print 'Adding plugins'
module_dir = os.path.join(resource_dir, 'lib', 'python2.6', 'lib-dynload')
print 'Adding fontconfig'
for f in glob.glob(os.path.expanduser('~/fontconfig-bundled/*')):
dest = os.path.join(frameworks_dir, os.path.basename(f))
@ -347,7 +345,7 @@ def main():
'PyQt4.QtSvg', 'PyQt4.QtWebKit', 'commands',
'mechanize', 'ClientForm', 'usbobserver',
'genshi', 'calibre.web.feeds.recipes.*',
'calibre.ebooks.lrf.any.*', 'calibre.ebooks.lrf.feeds.*',
'calibre.gui2.convert.*',
'keyword', 'codeop', 'pydoc', 'readline',
'BeautifulSoup', 'calibre.ebooks.lrf.fonts.prs500.*',
'dateutil', 'email.iterators',

View File

@ -50,6 +50,12 @@ DefaultDirectoryLocation
DefaultLanguage
English
DefaultToSystemLanguage
Yes
EnableResponseFiles
Yes
Ext
{}
@ -138,7 +144,7 @@ ProjectID
DA98A0C6-9102-73EC-2516-B147E972D3F7
ProjectVersion
1.2.7.0
1.2.13.1
SaveOnlyToplevelDirs
No
@ -206,85 +212,130 @@ test
{Testing Switch Yes No {} {run uninstaller without uninstalling any files}}
}
FileGroup ::BEF8D398-58BA-1F66-39D6-D4A63D5BEEF9 -setup Install -active Yes -platforms {AIX-ppc FreeBSD-4-x86 FreeBSD-x86 HPUX-hppa Linux-x86 Solaris-sparc Windows TarArchive ZipArchive} -name {Program Files} -parent FileGroups
FileGroup ::BEF8D398-58BA-1F66-39D6-D4A63D5BEEF9 -setup Install -active Yes -platforms {AIX-ppc FreeBSD-4-x86 FreeBSD-x86 HPUX-hppa Linux-x86 Solaris-sparc Windows TarArchive ZipArchive FreeBSD-5-x86 FreeBSD-6-x86 FreeBSD-7-x86 Linux-x86_64 Solaris-x86} -name {Program Files} -parent FileGroups
File ::8E5D85A4-7608-47A1-CF7C-309060D5FF40 -filemethod {Always overwrite files} -type dir -directory <%InstallDir%> -name /home/kovid/work/calibre/build/py2exe -parent BEF8D398-58BA-1F66-39D6-D4A63D5BEEF9
File ::FC870EE7-667B-481F-113B-B4504DFCCFA5 -type dir -name bin -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::377C588B-B324-CA09-ED49-4DB5F82A15ED -type dir -name etc -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::55DE4B9F-0881-FF51-E2BA-EC72B5D3425C -type dir -name fonts -parent 377C588B-B324-CA09-ED49-4DB5F82A15ED
File ::A27B68D9-43A6-B994-3091-E829AFBA340D -type dir -name conf.d -parent 55DE4B9F-0881-FF51-E2BA-EC72B5D3425C
File ::974ADD48-88E5-BC7A-1963-928A245F133A -type dir -name conf.avail -parent 55DE4B9F-0881-FF51-E2BA-EC72B5D3425C
File ::5E5273D8-3423-8DC8-83C4-BE000069A803 -name fonts.dtd -parent 55DE4B9F-0881-FF51-E2BA-EC72B5D3425C
File ::32D7DBE0-E0B1-5BDD-66C5-2A13D8BC8F90 -name fonts.conf -parent 55DE4B9F-0881-FF51-E2BA-EC72B5D3425C
File ::B95D03D4-EA59-F00E-59E1-BA05758879DA -type dir -name imageformats -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A624029D-AE0F-49A5-4DAC-7720CDCAB271 -name qmng4.dll -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::C53E8AB9-30FC-730C-3DA3-851C9B4838A1 -name qmng4.exp -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::36ADF34E-46AD-663F-6C3A-D45E971CB722 -name qmng4.lib -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::A1EEB0BC-ADA2-86C8-631B-E88FE03328EA -name qico4.dll -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::516069B4-FC33-F267-8C4B-95475515A853 -name qico4.exp -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::129AE39B-995D-9BE2-3FB4-69F129C4E86E -name qico4.lib -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::113DBCCE-B6CA-2742-35DB-6FB53EE75919 -name qico4.dll.manifest -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::CC7FFFF8-5DA6-3CCB-540C-A24B528B3DD6 -name qjpeg4.dll -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::9C5B362E-D06B-D92F-6B39-F9F2B5BE9E17 -name qjpeg4.exp -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::0FF52CC9-3920-A82E-0657-5B2A31CD1457 -name qjpeg4.lib -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::9DD8CFAE-2E69-CACA-B451-16683C0F168D -name qjpeg4.dll.manifest -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::5E16CADD-7269-4247-B35C-046D5B67E298 -name qtiff4.dll.manifest -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::633981BF-9A0C-589D-25D3-50866757C3B8 -name qmng4.dll.manifest -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::DB93E311-ECDF-21E0-8C5D-0B2EDAE6C424 -name qgif4.dll.manifest -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::48E4C188-4ABF-4CCD-C410-7936B4898DDF -name qsvg4.dll.manifest -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::BFF82F4E-0F3C-8F6E-381C-CCF91E220226 -name qgif4.dll -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::3FAEE4BA-C005-E833-8BE4-EC8EF7BDAF1B -name qgif4.exp -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::4AB682B9-C811-C68A-0100-5B32E0127093 -name qgif4.lib -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::6EBEF5E4-1FA0-B14A-736F-DD1068874D19 -name qtiff4.dll -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::8B2F7092-5B97-9DA8-90CD-46D191B49C28 -name qtiff4.exp -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::9D014D0C-E6F4-A713-7CE9-CD71AFCEBC61 -name qtiff4.lib -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::5EA8BF5D-76A7-023E-CF87-ED92DBCA527D -name qsvg4.dll -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::A5298D0E-A211-EB2E-6892-7045D04B264E -name qsvg4.exp -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::8A138EC0-728A-A421-A723-DE84F8DDE3EA -name qsvg4.lib -parent B95D03D4-EA59-F00E-59E1-BA05758879DA
File ::5EF561A9-E70B-8F01-A852-C36D28D1FA14 -type dir -name codecs -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::D60D391E-2AA1-900B-DB5A-348EFC529375 -name qkrcodecs4.dll -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::4B320138-FB4B-DBD2-81BC-9D1413CF7ED6 -name qkrcodecs4.exp -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::38BE74BB-3CFA-7131-0467-BB1C4AE76512 -name qkrcodecs4.lib -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::49F00491-8056-0B75-7FC5-87761A3C6161 -name qcncodecs4.dll -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::CE567CBA-06A4-6D8E-E389-560CAC84E168 -name qcncodecs4.exp -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::2546B812-DBD7-3EDF-5CB2-B5F6B62639AB -name qcncodecs4.lib -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::12148DF6-6953-C6D3-6CDA-0ACED6F7D7FA -name qjpcodecs4.dll.manifest -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::E4C54E9A-D1E4-DCC9-C43E-FC3A5FD7F8C7 -name qcncodecs4.dll.manifest -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::1A86AC76-87FD-5EA9-0F23-2F21CA22F0CE -name qjpcodecs4.dll -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::FEB0CF93-169B-D996-2363-3AE057322EA6 -name qjpcodecs4.exp -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::0C8E6656-F734-B2B5-F0F7-6F5BDB5C6885 -name qjpcodecs4.lib -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::F95B9748-FC4E-4AF3-C037-8493AD7BE0DA -name qtwcodecs4.dll.manifest -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::2C3B2B03-3911-E7A8-035A-33E25A510F27 -name qtwcodecs4.dll -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::BD1A8C7A-D485-9272-4B9A-05EE511A59CF -name qtwcodecs4.exp -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::7EC5EFFB-7AA7-AEB1-46AD-4234DEE6A377 -name qtwcodecs4.lib -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::CEE6F2FE-EEBA-8973-AAA5-DCAAAD279B72 -name qkrcodecs4.dll.manifest -parent 5EF561A9-E70B-8F01-A852-C36D28D1FA14
File ::48EA1D8C-F4C8-3D34-229D-B501057802F3 -type dir -name driver -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::596DAFDA-23D2-26B3-1535-3D4BF36C9AD9 -name libusb0.dll -parent 48EA1D8C-F4C8-3D34-229D-B501057802F3
File ::E6B997AB-A35F-1142-14AB-6B9513D98C40 -name libusb0.sys -parent 48EA1D8C-F4C8-3D34-229D-B501057802F3
File ::20557983-9D6C-4AB5-D2DF-BE418BEE6BA3 -name libusb0_x64.dll -parent 48EA1D8C-F4C8-3D34-229D-B501057802F3
File ::CFCED8FB-FE60-07EC-690D-4C47C2C786F6 -name libusb0_x64.sys -parent 48EA1D8C-F4C8-3D34-229D-B501057802F3
File ::6D2B03D1-8449-045C-298A-9E65C168F64A -name prs500_x64.cat -parent 48EA1D8C-F4C8-3D34-229D-B501057802F3
File ::8147A9D4-D17C-55EB-CAA5-CC0C04EDC0D2 -name prs500.cat -parent 48EA1D8C-F4C8-3D34-229D-B501057802F3
File ::1085BEED-C76A-5FF4-209A-E03CFB697462 -name prs500.inf -parent 48EA1D8C-F4C8-3D34-229D-B501057802F3
File ::0AC00D67-8452-CABB-6843-FE6A464E9AE9 -type dir -name plugins -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::540FEFD3-9B1B-00E6-B8A5-EA8EB959428E -name podofo.pyd -parent 0AC00D67-8452-CABB-6843-FE6A464E9AE9
File ::87BCFAF5-FAEB-219C-BA28-1DFD1B2A7743 -name podofo.pyd.manifest -parent 0AC00D67-8452-CABB-6843-FE6A464E9AE9
File ::0C77BC18-CE53-35EF-A667-C25B81C43E64 -name pictureflow.pyd -parent 0AC00D67-8452-CABB-6843-FE6A464E9AE9
File ::9F15B633-412B-51ED-2B7D-4EB0A0847740 -name winutil.pyd.manifest -parent 0AC00D67-8452-CABB-6843-FE6A464E9AE9
File ::9E3D908E-B119-30AE-391D-D16CA6BEE7AC -name msdes.pyd.manifest -parent 0AC00D67-8452-CABB-6843-FE6A464E9AE9
File ::F1D1D581-9194-D12F-6139-F920EEC1B14E -name winutil.pyd -parent 0AC00D67-8452-CABB-6843-FE6A464E9AE9
File ::A94E4D31-5F8C-A363-AE61-A8F2E3A7B756 -name lzx.pyd -parent 0AC00D67-8452-CABB-6843-FE6A464E9AE9
File ::34C430AE-BC1B-8352-1713-50C89C176C77 -name lzx.pyd.manifest -parent 0AC00D67-8452-CABB-6843-FE6A464E9AE9
File ::2C88788E-B9FB-729D-442B-600ED97096A0 -name cPalmdoc.pyd -parent 0AC00D67-8452-CABB-6843-FE6A464E9AE9
File ::8A15A76F-105D-3B6C-6E54-A01F8EA16CE3 -name cPalmdoc.pyd.manifest -parent 0AC00D67-8452-CABB-6843-FE6A464E9AE9
File ::26503DDE-8C5F-102F-B689-C6A17B2D6C93 -name msdes.pyd -parent 0AC00D67-8452-CABB-6843-FE6A464E9AE9
File ::01034EB7-C79C-42B9-6FF0-E06C72EF2623 -type dir -name iconengines -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::8ADB07A0-6B9E-8F53-34DF-2035C7C343F1 -name qsvgicon4.dll -parent 01034EB7-C79C-42B9-6FF0-E06C72EF2623
File ::41F512E3-9F39-68C6-BB7F-58F572755D35 -name qsvgicon4.exp -parent 01034EB7-C79C-42B9-6FF0-E06C72EF2623
File ::7EE2621C-0EAE-B516-505A-6CE11A8F8951 -name qsvgicon4.lib -parent 01034EB7-C79C-42B9-6FF0-E06C72EF2623
File ::99A56CA8-60A5-CC90-1F6F-0A393722F9D2 -name qsvgicon4.dll.manifest -parent 01034EB7-C79C-42B9-6FF0-E06C72EF2623
File ::7FC7557D-E1AF-082B-7286-24939CD5EE76 -name IM_MOD_RL_sfw_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::EF383C5E-5939-F73E-5F9C-26009B469ADA -name feeds2mobi.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::71A18B69-E38B-AB9F-3B81-BECFD4454D38 -name PyQt4.QtNetwork.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::E1BF1A4F-2942-73DB-1770-1ECB02CA9799 -name comic2lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::EEC00227-DED5-B9BF-A36D-24239AEDE932 -name rtf-meta.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::F6C99732-1835-1C2A-02F9-F2BB631BEC81 -name dde.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::3334C5D8-8513-326D-A96C-C86D1C325EBB -name pdf2lrf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::20079501-EBD5-FEFD-8E49-2CF6A63E83E0 -name IM_MOD_RL_rle_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::D98A0557-D988-24A1-9F32-67F3E9A5A123 -name opf-meta.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::470243F6-C8E4-DB45-678F-6A314747097E -name sqlite3.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::4AA221F6-EBE3-997E-AECF-DD8E03265385 -name html2epub.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::0213D597-D9C7-F155-EE44-1BD9E19520E3 -name IM_MOD_RL_tiff_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::F782E3D0-C2CA-481C-70C4-2257FEF52EAF -name CORE_RL_libxml_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::414CB1DC-A13E-CE54-60A9-157381D4DDC4 -name oeb2lit.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::9306B7C1-11DE-7B54-1AFB-67AFF82B8013 -name _sqlite3.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::4D6B4FC9-F900-E0AD-5258-8918CBFEB9AD -name lrs2lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::05329209-3CCE-90C0-FFEA-BECEBA6A6AB4 -name lit2lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A2AF7001-960E-F5EA-AA09-025E35FD09BC -name IM_MOD_RL_sun_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::C472ABCF-2160-C218-41CA-0DDE625AAEC6 -name IM_MOD_RL_msl_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::DC7D8C3A-81C2-7FC5-4AC0-8CDC4069FC97 -name IM_MOD_RL_jp2_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::555AF3FA-9A08-CCFF-4028-3F8891A6D212 -name CORE_RL_ttf_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::92F06FE6-C2C5-FF23-0A9B-884AB21D8221 -name PIL._imagingft.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::DA2ABF54-3BC2-87E4-BA86-24C8B2915AC0 -name txt2lrf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::C3B86C9F-1A59-9573-DCA2-A2747E7C3B4F -name odt2oeb.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::ED8542BE-DDE4-72B2-B05A-A09D00818994 -name web2disk.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A2154B84-F146-FD50-1DA9-1DB374A5439E -name IM_MOD_RL_exr_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A442B5C3-724F-6542-816D-30C3D3EDD1E3 -name CORE_RL_Magick++_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A18318B3-88EF-11EB-4E14-B02CBD4F0E5E -name calibre-parallel.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::E26C9A86-F12B-7F1E-F2E8-8A42C0436321 -name IM_MOD_RL_dib_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::2E94EBE2-F588-C484-009C-48C0DA7D1932 -name IM_MOD_RL_preview_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::9D75046B-57DC-872C-39F1-4C6E44337227 -name html2lrf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::7294280B-8324-B1A0-A054-92F330874F48 -name numpy.fft.fftpack_lite.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::5322B2EC-82CF-9446-964E-38CB7C688C1B -name oeb2mobi.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::74DC3F8D-5C56-8FB8-F59A-0C4C5ECB70A0 -name CORE_RL_magick_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::1638722F-A861-F762-1514-5649B2AD08FF -name IM_MOD_RL_svg_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::D345F98D-EDB4-53D0-95A6-82968E47E080 -name IM_MOD_RL_mpeg_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::91CA5392-5F4E-12F7-C670-939B1500616B -name ebook-viewer.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::4706580D-D101-13EA-DED0-2593D7FBADE8 -name LICENSE -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::63F996B0-07D9-EA5B-2176-F02D9851EAE4 -name feeds2disk.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::89CAC9B2-DA65-DBF2-6295-757553882213 -name numpy.core.umath.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::2F90282D-B59F-B6BA-090B-45858AF7F3B2 -name IM_MOD_RL_clipboard_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::B512D139-B295-D7C3-F0B4-43775849CF58 -name numpy.core._sort.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A999B024-1024-E709-07C1-22BA67A850BB -name feeds2mobi.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A2C063AC-2F12-9260-501A-0E8BD0B8A932 -name calibre.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::439B6D05-7DE6-061D-4BCC-3F04F4FA2FA2 -name IM_MOD_RL_png_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::BA464D11-BBCE-DEDA-C354-0C7BE60FAA05 -name IM_MOD_RL_braille_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::8F9FF823-AF6D-A288-8AE6-7D74F55DCE29 -name CORE_RL_bzlib_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::ABAEA510-B003-29CB-6ADE-F6E1826DD501 -name web2lrf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::57A3F5D5-BFC8-CB38-5A57-548EE0DB033B -name QtNetwork4.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::4DB7E8DE-905A-822A-AF14-17BD5ACEF915 -name IM_MOD_RL_wmf_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::559057ED-0FEA-62A1-68C2-023116B5636C -name win32ui.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::83F3AC3F-A485-B791-D4F0-6E67135FF19D -name IM_MOD_RL_txt_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::FABA7768-743B-08F7-B871-ED5E9082DF38 -name win32gui.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A8D10C63-CDFB-0809-CA84-4CB7A0A451FC -name fb2-meta.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::C49805D2-C0B8-01C4-DF6F-674D9C0BFD15 -name IM_MOD_RL_viff_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::1B9F2F00-20A5-B207-5A80-8F75470286AD -name txt2lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::826F1915-9F97-59DD-6637-3EEC0744A79C -name IM_MOD_RL_ps2_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::519A6618-8A1F-93A5-93B4-6EEF5A4A3DE9 -name comic2pdf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A5F23791-BCDC-A997-4941-5D1F2F227E6D -name type.xml -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::0A1C107A-C0AA-3ED6-4F37-A6894386DCBE -name IM_MOD_RL_ps3_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::EEBA64E7-6509-EBAF-3E23-1A203216F39A -name epub2lrf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::2655F4FC-F682-46D8-B75C-6AF322323EF5 -name IM_MOD_RL_dot_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::176456BB-237C-9EBE-60E1-D8F78AAFFEC8 -name IM_MOD_RL_xwd_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::9AE8498B-C89C-8B12-B8A1-35E1B6650469 -name lxml.objectify.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::EA37C1C2-57BB-4E7A-C004-0010D79142C2 -name IM_MOD_RL_fits_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::05F5C10D-6988-F1F4-A486-86C96DB20302 -name pywintypes26.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::0137A2B1-EB94-EB26-7295-0C7CD941A1DF -name IM_MOD_RL_histogram_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::7F199A1F-4FA4-2ABA-DED3-36ECF3C089CA -name epub2lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::CF6398D8-2140-53CF-1DA6-421A82E92621 -name any2epub.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::8DFA6C69-360D-FA63-7FF9-860E3DB00B19 -name any2lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::5BB7579D-9183-412C-81F8-B411B07C57B3 -name IM_MOD_RL_pnm_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::97B8BB83-7772-D87B-C8D1-5215E324AF2C -name library.ico -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::DF1361A2-2580-EFBF-65D2-156AD9919DE1 -name library.zip -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
@ -293,7 +344,6 @@ File ::E658FBE0-5860-D041-12D3-76ADD18F804B -name servicemanager.pyd -parent 8E5
File ::C98A6FC4-E341-7FD4-005C-DA2B384E11D8 -name win32api.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::ADA36EEA-7DE1-447C-B1AB-A4908E65E2CD -name IM_MOD_RL_ipl_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::53C2EC15-850F-8F49-6425-C228FB6E6D0E -name libfontconfig-1.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::2BCD9281-2CBC-CF0D-0E12-2CE11F6ED758 -name comic2epub.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::EDE6F457-C83F-C5FA-9AF4-38FDFF17D929 -name PIL._imagingtk.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::09D0906E-3611-3DB7-32CF-A140585694A7 -name win32pdh.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::4C84F0DC-7157-0C90-2062-180139B03E25 -name IM_MOD_RL_rgb_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
@ -302,71 +352,48 @@ File ::69072379-7D16-B9F7-9F39-3E6403C48267 -name IM_MOD_RL_xbm_.dll -parent 8E5
File ::FBD11D98-D1E7-5DD9-BF02-01CE92518859 -name IM_MOD_RL_otb_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::8D0CFD32-2B7F-2BB3-8FA0-760A8DB24B52 -name win32service.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::C7F9AB12-AAF7-2954-3DB6-F2C84F41655B -name win32clipboard.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::76676624-68A9-D9D9-6EC7-40CF201520A4 -name pdfreflow.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::62CD997A-A5C7-D71B-A8F7-54567B36A071 -name msvcp90.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::7D76BBE6-FD20-1290-4DBA-93D14FC45B81 -name sip.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::17D27485-128E-E247-14CE-9C3B6988E182 -name pdfreflow.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::BF2007D6-5AFE-6D04-4DB0-36A3644D988D -name pdf-meta.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::D4354621-69ED-DFCB-068A-0812DB1C09C3 -name IM_MOD_RL_avi_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::109FBE61-82CD-D5AB-AA9D-F9D52947DD22 -name rtf-meta.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::9BA20E46-014F-DA6A-DEF3-D78E2AEFDD47 -name odt-meta.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::EAFAC6D5-A7E8-1843-6D98-6663D899BB11 -name PyQt4.QtCore.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::155505A4-F0D8-05B2-10AD-149E178976A4 -name calibredb.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::39D5114E-1E70-5402-7E19-D86490678506 -name CORE_RL_lcms_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::75C3F298-B07C-DA98-38B2-40FFD39C32ED -name oeb2lit.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::388E0308-35A8-69B9-6837-383FD72E99E9 -name IM_MOD_RL_xpm_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::3DB88954-1B0D-FDBC-CE29-EFCC01D4121E -name epub-meta.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::43C0DE14-A935-2139-6690-256C49C461C4 -name IM_MOD_RL_xcf_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::E185A35A-93DB-61BB-E7EE-2C2222FD4939 -name win32security.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::498CCC26-383A-87CA-30C0-626D52555B37 -name librarything.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::404A98F1-84FD-B6D0-B130-354EECD9253C -name IM_MOD_RL_emf_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::17034C34-403E-B405-99C1-F80B7F00E27C -name log.xml -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::34E63A2C-65C5-0A84-ACF1-BD6A844D4579 -name pythoncom26.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::CE737360-1B73-DEC3-E511-3FAEC61F5292 -name epub-meta.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::2F20484B-53B8-B08E-B691-C5B2D49A9CB4 -name QtWebKit4.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::8AF134C8-9189-3F9A-A081-9143FFD44C45 -name freetype6.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::E8A4442D-D0D3-31CD-997A-3CEB641CF5B7 -name IM_MOD_RL_mtv_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::56B7883F-B4FE-BE25-BCBA-4AF17CC84C93 -name fb22lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::0CA87D0B-5A04-1439-AEE8-C97072D47BA7 -name CORE_RL_tiff_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::AC24F520-88D4-D1CF-5797-27C715CE8ACA -name pyexpat.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::16848F38-71CD-55B8-4D96-1537F6773744 -name IM_MOD_RL_dps_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::33A46CC5-BAC4-5863-C83D-303DCCA0CAA1 -name tk85.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::39E11D64-CC0C-E565-B3CC-882A5AA9F4AF -name html2oeb.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::81116DD3-1715-AA87-472F-544FC616EDAF -name IM_MOD_RL_dcm_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A6EF7DB0-FC94-8794-1F15-394432CD283D -name imp-meta.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::335A4CFB-5C2D-44E4-C438-7018E8244C3D -name ebook-viewer.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::62A16C3B-ED9C-5187-2807-58857DF3A990 -name calibre-debug.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::2B8B1DCD-AA68-7612-80A5-C20CAAF06019 -name any2lit.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::55ECA7B7-279A-F51D-81C2-C8DC44CF0E22 -name select.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A6AF5ECC-A981-4CBD-DBEE-303A9340C603 -name IM_MOD_RL_xps_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::5BCBF71F-18E7-5C52-E3F5-7D7F3028AD46 -name locale.xml -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::2EDE0641-B5DF-220F-9FF3-486E5A081EFC -name rb-meta.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::5C9FA94C-B8B0-A94B-548D-1D24FDEA5770 -name CORE_RL_wand_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::E39E60BE-DE77-AB8C-42C6-5A7D7DC073E3 -name IM_MOD_RL_ttf_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::8F1AF028-E819-4ED6-8B69-704183C3BD1D -name pdf-meta.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::D8F566FB-93DA-3128-5DBD-DF1068B3E3ED -name IM_MOD_RL_dpx_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::FFE5F178-A1A4-3691-9C88-E5109D144437 -name IM_MOD_RL_jpeg_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::0C9C97F6-5622-D4B5-E7CD-B4E5E9A8634C -name odt-meta.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::C05AD359-A7A5-9760-A4C8-310074353C89 -name feeds2lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::03665A74-B895-EB3D-EBA0-2D2B6D26DDDA -name PIL._imagingmath.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::81AED538-B97F-6272-5C6E-9B27D7285B35 -name IM_MOD_RL_fax_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::BDCCAEC0-4847-B8D8-50B1-1B434B73A01F -name IM_MOD_RL_avs_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::727B9BD6-B55E-386E-D3B9-D99D0D9ADBB1 -name QtGui4.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::1C7421A2-1BA7-7807-EB41-67578E0302E8 -name IM_MOD_RL_mvg_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::C3466B70-23C3-31C9-3B4F-1B3B56E4D013 -name markdown-calibre.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A190F216-F7F7-A425-5F9D-F6B5C35D3A8F -name lrf-meta.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::6ED1C675-C4D5-6BFF-7C8A-9AB4BF39D00C -name _hashlib.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::21F7F333-3063-71E3-85F5-5C88584B15CC -name IM_MOD_RL_tga_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::738CADE4-6C0A-5155-A1BE-8F789C1D92E7 -name feeds2lrf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::26741B21-C241-E100-8BB1-8B679BC3E662 -name configure.xml -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::7D491E89-C6D3-1E6E-F4BD-8E55260FE33E -name libexpat.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A4910EB3-0F1C-F6F0-CD2D-16A64BBAA92B -name calibre-fontconfig.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::8711327A-716D-B162-6AC6-2FB4AD071266 -name fb22lrf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::476CB977-5155-D56F-26CA-EB243AEBBA99 -name unrar.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::2DA1CC8D-AF5C-3B03-2060-301DFE0356CC -name mobi2oeb.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::2E2A9EDA-5386-444E-8479-557386794552 -name IM_MOD_RL_uil_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::4530C4C8-BCFA-E461-5F72-0EF5B553C7F5 -name pdf2lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::29582E09-00E0-B2F9-475C-8C6D2E4BF7E8 -name any2lrf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::D3301E15-1B1A-E2AB-1B04-30A601B3FB44 -name IM_MOD_RL_cut_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::181B28B9-CF13-0C28-8380-B39DF6E7397D -name markdown-calibre.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::BC1D2D23-48ED-ECFF-2180-37C83554FDED -name Xext.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
@ -379,7 +406,6 @@ File ::DE476170-B65E-B429-A23C-F822E4190FFC -name IM_MOD_RL_thumbnail_.dll -pare
File ::31E46936-560D-1E88-8FC1-F8E590D2FD02 -name IM_MOD_RL_mpc_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::0C04692E-5DCF-864F-6640-2FF5BF12BA91 -name IM_MOD_RL_cmyk_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A620FEB9-39FE-B102-6963-FEDA25EBF2F1 -name IM_MOD_RL_pcd_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::0A4D27B3-157D-357A-6A86-32D8EB5B30D7 -name lit2lrf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::80D1F9CA-D7DA-578E-CE25-4E0EE988D280 -name IM_MOD_RL_sct_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::C85307C1-5F11-01EF-2193-95F37CB49822 -name IM_MOD_RL_pict_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::3ECF2FC0-91AA-9573-42B3-4BD784FA5BC9 -name IM_MOD_RL_gradient_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
@ -389,46 +415,29 @@ File ::CBF83E89-39E0-D7C3-7902-A4A0ADCDEF48 -name IM_MOD_RL_jbig_.dll -parent 8E
File ::FFF32C7F-BB57-4BB3-A52D-4E4F3496B967 -name calibre-debug.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::80A3C65A-553D-EA27-FAED-4F831578F4F8 -name magic.xml -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::E2DF0DC3-3372-3CDF-5177-5B3F3BF84E66 -name IM_MOD_RL_mat_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::955B176E-5F6A-FFFA-9387-893E38C23E33 -name prs500.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::4D938678-59AF-F5F6-697B-E3A5BE76B43B -name QtXml4.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::FCAEFF6A-1E96-FA23-C8AC-0F5F3297B14A -name rtf2lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::0A5A70A8-39EC-B733-E807-9C358E5EA7A3 -name IM_MOD_RL_meta_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::E6419523-253A-3052-B9B4-0EA792EF4A64 -name pdftohtml.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::EF062C24-09D8-1DC8-891A-F9563BBA57C2 -name IM_MOD_RL_gray_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::E1D4796B-733B-F45A-2ECC-D498A1AC4EAD -name opf-meta.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::0E21E0B1-C2D4-3F6D-E788-9EEB821128C3 -name web2disk.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::12DE2886-5926-F8AD-77C4-EAAC5DD9413C -name rtf2lrf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::E96D95C6-2D53-A67B-C704-06BD213BBC86 -name mobi-meta.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A4D76085-EFC7-A237-7BB7-AA8A33BFB849 -name html2epub.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::27127583-9DC6-4397-3E86-052A515ED051 -name lrfviewer.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::7229472A-2A5A-2685-0223-2DF2CED0C9D4 -name comic2epub.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::396B4F78-FB45-C0B2-ACB3-97769CF5CD5D -name msvcr90.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::1DE767EE-4891-4E54-422D-67A4DFF8C3B5 -name lrfviewer.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::AFFEC28A-615C-E3E6-0026-CCE2594A6D25 -name calibre-server.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::2C64F86B-9366-B52D-F7B2-5BBD51F6982A -name IM_MOD_RL_pwp_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::187D965E-40CE-18AB-5684-18C31A7FD8D4 -name any2epub.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::F4B2EF9C-EB18-B865-6E99-75CFB9B60D87 -name IM_MOD_RL_dds_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::9D0CC46C-E254-7F11-4B64-A6E8E16CF6FB -name mobi2lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::72769321-EF4D-C796-5E76-3D5807772233 -name any2mobi.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::38770D87-6CA9-9E3E-FBA1-A8CCFCD88FB5 -name IM_MOD_RL_fpx_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A31CA43B-4456-BB26-A8EE-73C4C4B1F6FC -name pdftrim.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::BE2D7BC3-D294-AF3F-65E7-3B372DEFDE36 -name PIL._imaging.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::200B9AEC-809F-75B7-DC12-A51BFC2A6F93 -name PyQt4.QtSvg.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::3A424677-A66A-CAA0-4FD2-4FE8086DBBA6 -name comic2mobi.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::52132A31-D3AE-C617-7568-BF2AF46B5D74 -name IM_MOD_RL_pcl_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::F94472C3-C8D0-950F-5ED9-1611D1CE30E5 -name IM_MOD_RL_inline_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::794E99A2-79AB-BABB-97A1-9E3482002EA8 -name imp-meta.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::055ADB4B-20C5-E071-442F-4DA0A8D6F3C5 -name english.xml -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::DE4F9AD0-3D79-865A-2DD9-4A4CB6886AFC -name lit-meta.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::B10B6B91-0C03-642D-90D8-37B607B164AD -name IM_MOD_RL_wpg_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::BFBB144B-1794-8304-9772-F103A42F2CA4 -name IM_MOD_RL_pdb_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::EAED9280-84D7-9768-9F89-CEC61CE549DF -name mobi-meta.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::2FE2FF56-5CF5-15B7-2BD8-32100DF421DC -name _ssl.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::AE47BDA8-A1E5-2E84-28D7-DF8A84B18202 -name Microsoft.VC90.CRT.manifest -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A6B1C213-DC68-B7C3-8EDE-806286829899 -name w9xpopen.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::D3E03CFA-4AF0-93FB-E04B-B282926099E0 -name IM_MOD_RL_label_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::6F40E97B-430C-08FE-30CA-9E6622EE29EB -name feeds2epub.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::345C74B8-B45D-A370-27F3-78CEA9EAB1E1 -name prs500.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::662783C0-3826-9869-8EB8-326B363D3686 -name IM_MOD_RL_clip_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::442D92A7-97B1-74BC-F150-A9992A925356 -name numpy.core.multiarray.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::54991918-D11F-EEAD-F7E3-0EE28F22249E -name IM_MOD_RL_pix_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
@ -440,41 +449,26 @@ File ::5CB76241-5682-AE44-82D3-A6C8C66B88D6 -name IM_MOD_RL_bmp_.dll -parent 8E5
File ::A843E4DA-8671-C4F7-BA61-998AA1D278C8 -name numpy.linalg.lapack_lite.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::908EA762-5568-17BE-D77D-5DE5551895D0 -name IM_MOD_RL_raw_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::CC186E15-8751-A4AA-B2A7-D2E522F1F9DF -name lrf2lrs.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::36135E27-30B6-A0E9-5423-FDDFBCBD4FA2 -name feeds2disk.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A99CACD7-FE57-8A5E-BAA1-2D8B41925593 -name IM_MOD_RL_cip_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::782BE25A-B08E-D914-73F5-D92430823BE1 -name mobi2lrf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::C4649D7A-9312-8984-E7CD-A0AB794C5A8E -name IM_MOD_RL_pdf_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::B50467F0-07D0-B634-EB43-C4B721798A84 -name analyze.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::5531BA1B-8FDA-01B2-7DEE-6E9A116F7AB3 -name lrf-meta.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::47658BFB-7389-6866-359E-7517C18E768D -name IM_MOD_RL_mpr_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::673BD772-ACE7-1695-EAAC-EDD1A3EA0425 -name pdftrim.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::3F6735E8-D4E6-A6F9-C9F8-4219E6BBC827 -name CORE_RL_jpeg_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::918BE500-1E97-90C0-3FB3-4056FE8D0E15 -name IM_MOD_RL_wbmp_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::D59F7D54-24A7-774D-79EB-423A64E8CB21 -name IM_MOD_RL_stegano_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::BB8BCD59-9EBA-3D9B-D802-79D9C384AADB -name fb2-meta.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::17F9A868-E52D-F961-9DB7-8AC69BA702EA -name CORE_RL_jp2_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::2ABAD420-B987-612E-C654-10BDB18DE638 -name html2oeb.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::81715796-F363-675F-998E-EEEF890009A2 -name calibre-fontconfig.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::5CA62422-C207-8C9C-79EB-45260E3DB37B -name odt2oeb.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::878003DC-9B1D-7C58-29F8-14D4565ABA64 -name IM_MOD_RL_yuv_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::602B3244-CF6C-F934-E86C-8161800DB150 -name coder.xml -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::C23261F0-19EA-2216-A8D6-45FCC4ECBECE -name win32file.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::100103F9-C269-9B03-A133-7D046DCC5B30 -name IM_MOD_RL_null_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::D0461A63-6890-CC43-23D1-48E938BF1E6D -name oeb2mobi.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::F3996144-7BA7-6038-FBB2-C210721BD20E -name lit-meta.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::9BEE3580-3674-F4AE-C1F3-B8623E0E4FC8 -name IM_MOD_RL_pattern_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::AC4AE65E-78A4-28C0-1C1B-B99239D0A0EC -name rb-meta.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::C025F962-60EE-E4EF-6428-93755DD24F7D -name web2lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::6A41C4F0-802D-9999-2F7D-AF86466BC420 -name feeds2epub.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::58F70BF7-491E-38D1-B836-1BBF340AA602 -name IM_MOD_RL_plasma_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::4B6C22CD-D139-FCAB-45FB-E9B7DADFFFED -name win32process.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::4F391A40-8D34-DFEA-2CEB-97A45FF5D234 -name lit2oeb.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::9698339D-6A1E-7CBC-A772-C9C4B10418BC -name librarything.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::A3F1DC1C-BEF6-CB6B-F7AC-39F34F4DFABD -name IM_MOD_RL_pcx_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::BE44B72D-2ED1-4983-F652-DE8814401946 -name CORE_RL_xlib_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::EC5B5C55-8347-0A8C-E9B5-28E45680E2F2 -name IM_MOD_RL_caption_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::519BA66E-0CD3-00EA-0932-8D225C4C7EC8 -name calibredb.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::EF7BD102-32B6-EEAB-1C3F-AC4059EFEB1E -name comic2lrf.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::B7E13F99-C8D3-F2FB-1E5F-E8530A77BB71 -name IM_MOD_RL_url_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::D0762C72-29E8-85CC-8550-6AC9E9AE39E9 -name _win32sysloader.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::4921649D-06BD-A568-3879-BD2D94423FCB -name pdftohtml.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
@ -499,10 +493,8 @@ File ::80EC4265-6F3B-7F74-F995-4FA85E87A877 -name IM_MOD_RL_vicar_.dll -parent 8
File ::4CDC2DC5-5A3D-B773-A338-3E12E8C5BB9D -name IM_MOD_RL_psd_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::4AF4C7B2-8926-4581-2896-C6436460C81F -name IM_MOD_RL_uyvy_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::BF71D048-1137-4453-960C-9267CB790EAD -name IM_MOD_RL_art_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::1BB40D21-9061-9B38-E653-26D808F7DEEA -name html2lrf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::D9B6371C-332C-45FB-DAEE-1A247130F704 -name calibre-customize.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::605E727F-DE13-27FE-75C0-34567C468B18 -name calibre-parallel.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::61F250E4-BAA0-5AF3-F597-E53ADEC19877 -name comic2pdf.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::37306B68-BABB-418C-A2CA-BAF4E439D3F1 -name viewer.ico -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::6092C5A2-8740-2769-DB77-E0B664CD19EC -name PyQt4.QtWebKit.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::73C82473-A35A-23B8-067C-AA3120D1CEE2 -name win32pipe.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
@ -521,14 +513,9 @@ File ::29022F2B-4E69-8624-2B2C-98A40E12DC0A -name calibre-server.exe -parent 8E5
File ::7592A236-4835-6A9D-56B1-78985267D9AD -name win32console.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::05F4A6BD-A7C3-5108-4708-1524EB0628D9 -name calibre.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::DEB8E703-365E-A7BB-2315-6306B2E5C978 -name win32evtlog.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::6C90CF50-4894-7672-BB1B-F7EE5EB631E3 -name lit2oeb.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::AB44B44C-E258-A5AB-9511-8D0FBB456EE8 -name IM_MOD_RL_gif_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::5D5F2AAD-6668-5E14-B84C-5D80C4CCC968 -name calibre-customize.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::5A0DA3BB-2659-F5AA-A305-C4810FA28D89 -name mobi2oeb.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::9A0C05D0-26E3-72C5-1F04-76F76ABB180F -name numpy.core.scalarmath.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::42616D6D-2797-559B-7E96-2685599993DF -name any2lit.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::CB47F917-A45E-B7DE-645C-CA33F005D1BD -name any2mobi.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::16AF75CF-CA5E-F533-6C28-7CF167B1215C -name comic2mobi.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::0888A744-B049-01E8-6AC8-ECC3EE2CEFE6 -name IM_MOD_RL_sgi_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::4AEEBBED-E749-15A9-E1F7-9F6BE2A2C3D0 -name _socket.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::35B19292-0C50-4AEE-0A79-B2F3BC34B529 -name w9xpopen.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
@ -544,8 +531,27 @@ File ::6F5D62F3-5E63-0753-364C-01CAAF1002E0 -name IM_MOD_RL_magick_.dll -parent
File ::9FDAC308-5D4F-A865-A09A-9FBF48162A47 -name IM_MOD_RL_djvu_.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::5D748040-5973-EFF1-41FC-B424636C642E -name fetch-ebook-metadata.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::8B8655B8-3823-AA02-1CDA-02F5AD4677C0 -name fetch-ebook-metadata.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
Component ::F6829AB7-9F66-4CEE-CA0E-21F54C6D3609 -setup Install -active Yes -platforms {AIX-ppc FreeBSD-4-x86 FreeBSD-x86 HPUX-hppa Linux-x86 Solaris-sparc Windows} -name Main -parent Components
SetupType ::D9ADE41C-B744-690C-2CED-CF826BF03D2E -setup Install -active Yes -platforms {AIX-ppc FreeBSD-4-x86 FreeBSD-x86 HPUX-hppa Linux-x86 Solaris-sparc Windows} -name Typical -parent SetupTypes
File ::8FC3D58A-F3FA-A2D1-711F-F4C3128620CE -name podofo.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::88034147-A376-B759-D48C-5F17A47E8CC3 -name ebook-meta.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::6E6F2A97-6614-F2A6-1751-95C099B909FD -name pdfmanipulate.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::AC456A9A-6653-5852-D1F7-B04E2C1AA481 -name isbndb.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::94580010-4CE4-8EC0-3834-9A2BCCB28C70 -name isbndb.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::BA087530-7CF4-5460-C9AA-DE4A796C9AEB -name pdfmanipulate.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::6AF80BFC-A813-074D-897A-856744A91949 -name ebook-convert.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::F8C59A30-9E90-0861-5604-95E7C69C3C80 -name ebook-convert.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::9389D511-7BF3-4D72-C78E-4F98DCE8F723 -name calibre-smtp.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::36E9023D-CCBC-9C59-CDA3-71A4D3203B25 -name ebook-meta.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::B757AEB8-74A7-1EA8-AC7C-C2B5F690B539 -name ebook-device.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::CD137106-C058-6035-57F3-420F9540386E -name _multiprocessing.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::7930C2FB-1C6F-3CFB-D8C6-BC677D96045F -name zlib1.dll -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::7FDFCBEF-0687-FDA5-F5B7-632966E87BD3 -name calibre-complete.exe -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::0450D3E0-07EB-F81F-DA39-038494E4C8FE -name win32com.shell.shell.pyd -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::8D7A36A6-4517-E995-E989-2E522E7A1438 -name calibre-smtp.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::9E4E5E8F-30C0-E631-9516-2AE01A5CA0E9 -name ebook-device.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::7BE6B538-70D5-A7EB-5F91-E14CE57B394B -name calibre-complete.exe.local -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
File ::F54BC3BB-5F21-3D81-043E-603D53754CFC -name pdftohtml.exe.manifest -parent 8E5D85A4-7608-47A1-CF7C-309060D5FF40
Component ::F6829AB7-9F66-4CEE-CA0E-21F54C6D3609 -setup Install -active Yes -platforms {AIX-ppc FreeBSD-4-x86 FreeBSD-x86 HPUX-hppa Linux-x86 Solaris-sparc Windows FreeBSD-5-x86 FreeBSD-6-x86 FreeBSD-7-x86 Linux-x86_64 Solaris-x86} -name Main -parent Components
SetupType ::D9ADE41C-B744-690C-2CED-CF826BF03D2E -setup Install -active Yes -platforms {AIX-ppc FreeBSD-4-x86 FreeBSD-x86 HPUX-hppa Linux-x86 Solaris-sparc Windows FreeBSD-5-x86 FreeBSD-6-x86 FreeBSD-7-x86 Linux-x86_64 Solaris-x86} -name Typical -parent SetupTypes
InstallComponent 3EA07B17-04D8-6508-B535-96CC7173B49A -setup Install -type pane -conditions D7F585DB-0DEC-A94E-DAB0-94D558D82764 -title {Welcome Screen} -component Welcome -command insert -active Yes -parent StandardInstall
Condition D7F585DB-0DEC-A94E-DAB0-94D558D82764 -active Yes -parent 3EA07B17-04D8-6508-B535-96CC7173B49A -title {Execute Script Condition} -component ExecuteScriptCondition -TreeObject::id D7F585DB-0DEC-A94E-DAB0-94D558D82764
@ -1871,6 +1877,168 @@ No
FreeBSD-4-x86,RootInstallDir
/usr/local/<%ShortAppName%>
FreeBSD-5-x86,Active
No
FreeBSD-5-x86,BuildSeparateArchives
No
FreeBSD-5-x86,DefaultDirectoryPermission
0755
FreeBSD-5-x86,DefaultFilePermission
0755
FreeBSD-5-x86,Executable
<%AppName%>-<%Version%>-<%Platform%>-Install<%Ext%>
FreeBSD-5-x86,FallBackToConsole
Yes
FreeBSD-5-x86,InstallDir
<%Home%>/<%ShortAppName%>
FreeBSD-5-x86,InstallMode
Standard
FreeBSD-5-x86,InstallType
Typical
FreeBSD-5-x86,ProgramExecutable
{}
FreeBSD-5-x86,ProgramFolderAllUsers
No
FreeBSD-5-x86,ProgramFolderName
<%AppName%>
FreeBSD-5-x86,ProgramLicense
<%InstallDir%>/LICENSE.txt
FreeBSD-5-x86,ProgramName
{}
FreeBSD-5-x86,ProgramReadme
<%InstallDir%>/README.txt
FreeBSD-5-x86,PromptForRoot
Yes
FreeBSD-5-x86,RequireRoot
No
FreeBSD-5-x86,RootInstallDir
/usr/local/<%ShortAppName%>
FreeBSD-6-x86,Active
No
FreeBSD-6-x86,BuildSeparateArchives
No
FreeBSD-6-x86,DefaultDirectoryPermission
0755
FreeBSD-6-x86,DefaultFilePermission
0755
FreeBSD-6-x86,Executable
<%AppName%>-<%Version%>-<%Platform%>-Install<%Ext%>
FreeBSD-6-x86,FallBackToConsole
Yes
FreeBSD-6-x86,InstallDir
<%Home%>/<%ShortAppName%>
FreeBSD-6-x86,InstallMode
Standard
FreeBSD-6-x86,InstallType
Typical
FreeBSD-6-x86,ProgramExecutable
{}
FreeBSD-6-x86,ProgramFolderAllUsers
No
FreeBSD-6-x86,ProgramFolderName
<%AppName%>
FreeBSD-6-x86,ProgramLicense
<%InstallDir%>/LICENSE.txt
FreeBSD-6-x86,ProgramName
{}
FreeBSD-6-x86,ProgramReadme
<%InstallDir%>/README.txt
FreeBSD-6-x86,PromptForRoot
Yes
FreeBSD-6-x86,RequireRoot
No
FreeBSD-6-x86,RootInstallDir
/usr/local/<%ShortAppName%>
FreeBSD-7-x86,Active
No
FreeBSD-7-x86,BuildSeparateArchives
No
FreeBSD-7-x86,DefaultDirectoryPermission
0755
FreeBSD-7-x86,DefaultFilePermission
0755
FreeBSD-7-x86,Executable
<%AppName%>-<%Version%>-<%Platform%>-Install<%Ext%>
FreeBSD-7-x86,FallBackToConsole
Yes
FreeBSD-7-x86,InstallDir
<%Home%>/<%ShortAppName%>
FreeBSD-7-x86,InstallMode
Standard
FreeBSD-7-x86,InstallType
Typical
FreeBSD-7-x86,ProgramExecutable
{}
FreeBSD-7-x86,ProgramFolderAllUsers
No
FreeBSD-7-x86,ProgramFolderName
<%AppName%>
FreeBSD-7-x86,ProgramLicense
<%InstallDir%>/LICENSE.txt
FreeBSD-7-x86,ProgramName
{}
FreeBSD-7-x86,ProgramReadme
<%InstallDir%>/README.txt
FreeBSD-7-x86,PromptForRoot
Yes
FreeBSD-7-x86,RequireRoot
No
FreeBSD-7-x86,RootInstallDir
/usr/local/<%ShortAppName%>
FreeBSD-x86,Active
No
@ -2033,6 +2201,60 @@ Yes
Linux-x86,RootInstallDir
/opt/<%ShortAppName%>
Linux-x86_64,Active
No
Linux-x86_64,BuildSeparateArchives
No
Linux-x86_64,DefaultDirectoryPermission
0755
Linux-x86_64,DefaultFilePermission
0755
Linux-x86_64,Executable
<%AppName%>-<%Version%>-<%Platform%>-Install<%Ext%>
Linux-x86_64,FallBackToConsole
Yes
Linux-x86_64,InstallDir
<%Home%>/<%ShortAppName%>
Linux-x86_64,InstallMode
Standard
Linux-x86_64,InstallType
Typical
Linux-x86_64,ProgramExecutable
{}
Linux-x86_64,ProgramFolderAllUsers
No
Linux-x86_64,ProgramFolderName
<%AppName%>
Linux-x86_64,ProgramLicense
<%InstallDir%>/LICENSE.txt
Linux-x86_64,ProgramName
{}
Linux-x86_64,ProgramReadme
<%InstallDir%>/README.txt
Linux-x86_64,PromptForRoot
Yes
Linux-x86_64,RequireRoot
No
Linux-x86_64,RootInstallDir
/usr/local/<%ShortAppName%>
Solaris-sparc,Active
No
@ -2087,6 +2309,60 @@ No
Solaris-sparc,RootInstallDir
/usr/local/<%ShortAppName%>
Solaris-x86,Active
No
Solaris-x86,BuildSeparateArchives
No
Solaris-x86,DefaultDirectoryPermission
0755
Solaris-x86,DefaultFilePermission
0755
Solaris-x86,Executable
<%AppName%>-<%Version%>-<%Platform%>-Install<%Ext%>
Solaris-x86,FallBackToConsole
Yes
Solaris-x86,InstallDir
<%Home%>/<%ShortAppName%>
Solaris-x86,InstallMode
Standard
Solaris-x86,InstallType
Typical
Solaris-x86,ProgramExecutable
{}
Solaris-x86,ProgramFolderAllUsers
No
Solaris-x86,ProgramFolderName
<%AppName%>
Solaris-x86,ProgramLicense
<%InstallDir%>/LICENSE.txt
Solaris-x86,ProgramName
{}
Solaris-x86,ProgramReadme
<%InstallDir%>/README.txt
Solaris-x86,PromptForRoot
Yes
Solaris-x86,RequireRoot
No
Solaris-x86,RootInstallDir
/usr/local/<%ShortAppName%>
TarArchive,Active
No

View File

@ -175,6 +175,7 @@ def main(args=sys.argv):
'BeautifulSoup', 'pyreadline',
'pydoc', 'IPython.Extensions.*',
'calibre.web.feeds.recipes.*',
'calibre.gui2.convert.*',
'calibre.ebooks.lrf.fonts.prs500.*',
'PyQt4.QtWebKit', 'PyQt4.QtNetwork',
],

View File

@ -53,7 +53,7 @@ if __name__ == '__main__':
tag_release, upload_demo, build_linux, build_windows, \
build_osx, upload_installers, upload_user_manual, \
upload_to_pypi, stage3, stage2, stage1, upload, \
upload_rss
upload_rss, betas
entry_points['console_scripts'].append(
'calibre_postinstall = calibre.linux:post_install')
@ -76,8 +76,21 @@ if __name__ == '__main__':
print 'WARNING: PoDoFo not found on your system. Various PDF related',
print 'functionality will not work.'
fc_inc = '/usr/include/fontconfig' if islinux else \
r'C:\cygwin\home\kovid\fontconfig\include\fontconfig' if iswindows else \
'/Users/kovid/fontconfig/include/fontconfig'
fc_lib = '/usr/lib' if islinux else \
r'C:\cygwin\home\kovid\fontconfig\lib' if iswindows else \
'/Users/kovid/fontconfig/lib'
ext_modules = optional + [
Extension('calibre.plugins.fontconfig',
sources = ['src/calibre/utils/fonts/fontconfig.c'],
include_dirs = [os.environ.get('FC_INC_DIR', fc_inc)],
libraries=['fontconfig'],
library_dirs=[os.environ.get('FC_LIB_DIR', fc_lib)]),
Extension('calibre.plugins.lzx',
sources=['src/calibre/utils/lzx/lzxmodule.c',
'src/calibre/utils/lzx/compressor.c',
@ -199,6 +212,7 @@ if __name__ == '__main__':
'stage2' : stage2,
'stage1' : stage1,
'publish' : upload,
'betas' : betas,
},
)

View File

@ -284,39 +284,7 @@ def launch(path_or_url):
path_or_url = 'file:'+path_or_url
QDesktopServices.openUrl(QUrl(path_or_url))
def relpath(target, base=os.curdir):
"""
Return a relative path to the target from either the current dir or an optional base dir.
Base can be a directory specified either as absolute or relative to current dir.
"""
#if not os.path.exists(target):
# raise OSError, 'Target does not exist: '+target
if target == base:
raise ValueError('target and base are both: %s'%target)
if not os.path.isdir(base):
raise OSError, 'Base is not a directory or does not exist: '+base
base_list = (os.path.abspath(base)).split(os.sep)
target_list = (os.path.abspath(target)).split(os.sep)
# On the windows platform the target may be on a completely different drive from the base.
if iswindows and base_list[0].upper() != target_list[0].upper():
raise OSError, 'Target is on a different drive to base. Target: '+repr(target)+', base: '+repr(base)
# Starting from the filepath root, work out how much of the filepath is
# shared by base and target.
for i in range(min(len(base_list), len(target_list))):
if base_list[i] != target_list[i]: break
else:
# If we broke out of the loop, i is pointing to the first differing path elements.
# If we didn't break out of the loop, i is pointing to identical path elements.
# Increment i so that in all cases it points to the first differing path elements.
i+=1
rel_list = [os.pardir] * (len(base_list)-i) + target_list[i:]
return os.path.join(*rel_list)
relpath = os.path.relpath
_spat = re.compile(r'^the\s+|^a\s+|^an\s+', re.IGNORECASE)
def english_sort(x, y):
'''

View File

@ -59,7 +59,8 @@ if plugins is None:
plugin_path = getattr(pkg_resources, 'resource_filename')('calibre', 'plugins')
sys.path.insert(0, plugin_path)
for plugin in ['pictureflow', 'lzx', 'msdes', 'podofo', 'cPalmdoc'] + \
for plugin in ['pictureflow', 'lzx', 'msdes', 'podofo', 'cPalmdoc',
'fontconfig'] + \
(['winutil'] if iswindows else []) + \
(['usbobserver'] if isosx else []):
try:

View File

@ -235,7 +235,22 @@ class KindleOutput(OutputProfile):
def tags_to_string(cls, tags):
return 'ttt '.join(tags)+'ttt '
class KindleDXOutput(OutputProfile):
name = 'Kindle DX'
short_name = 'kindle_dx'
description = _('This profile is intended for the Amazon Kindle DX.')
# Screen size is a best guess
screen_size = (1200, 824)
dpi = 150.0
comic_screen_size = (1180, 800)
@classmethod
def tags_to_string(cls, tags):
return 'ttt '.join(tags)+'ttt '
output_profiles = [OutputProfile, SonyReaderOutput, MSReaderOutput,
MobipocketOutput, HanlinV3Output, CybookG3Output, KindleOutput,
SonyReaderLandscapeOutput]
SonyReaderLandscapeOutput, KindleDXOutput]

View File

@ -85,7 +85,7 @@ class USBMS(CLI, Device):
elif on_card == 'cardb' and not self._card_b_prefix:
raise ValueError(_('The reader has no storage card in this slot.'))
elif on_card and on_card not in ('carda', 'cardb'):
raise DeviceError(_('Selected slot: %s is not supported.' % on_card))
raise DeviceError(_('Selected slot: %s is not supported.') % on_card)
if on_card == 'carda':
path = os.path.join(self._card_a_prefix, self.EBOOK_DIR_CARD_A)

View File

@ -7,6 +7,15 @@ __docformat__ = 'restructuredtext en'
Command line interface to conversion sub-system
'''
import sys, os
from optparse import OptionGroup, Option
from calibre.utils.config import OptionParser
from calibre.utils.logging import Log
from calibre.constants import preferred_encoding
from calibre.customize.conversion import OptionRecommendation
USAGE = '%prog ' + _('''\
input_file output_file [options]
@ -33,14 +42,6 @@ option.
For full documentation of the conversion system see
''') + 'http://calibre.kovidgoyal.net/user_manual/conversion.html'
import sys, os
from optparse import OptionGroup, Option
from calibre.utils.config import OptionParser
from calibre.utils.logging import Log
from calibre.constants import preferred_encoding
from calibre.customize.conversion import OptionRecommendation
def print_help(parser, log):
help = parser.format_help().encode(preferred_encoding, 'replace')
log(help)

View File

@ -3,7 +3,7 @@ __license__ = 'GPL 3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en'
import os, re
import os, re, sys
from calibre.customize.conversion import OptionRecommendation, DummyReporter
from calibre.customize.ui import input_profiles, output_profiles, \
@ -551,6 +551,13 @@ OptionRecommendation(name='list_recipes',
self.read_user_metadata()
def flush(self):
try:
sys.stdout.flush()
sys.stderr.flush()
except:
pass
def run(self):
'''
Run the conversion pipeline
@ -566,11 +573,13 @@ OptionRecommendation(name='list_recipes',
self.log('\t'+title)
self.log('%d recipes available'%len(titles))
raise SystemExit(0)
self.flush()
# Run any preprocess plugins
from calibre.customize.ui import run_plugins_on_preprocess
self.input = run_plugins_on_preprocess(self.input)
self.flush()
# Create an OEBBook from the input file. The input plugin does all the
# heavy lifting.
accelerators = {}
@ -595,11 +604,13 @@ OptionRecommendation(name='list_recipes',
self.oeb = create_oebbook(self.log, self.oeb, self.opts,
self.input_plugin)
pr = CompositeProgressReporter(0.34, 0.67, self.ui_reporter)
self.flush()
pr(0., _('Running transforms on ebook...'))
from calibre.ebooks.oeb.transforms.guide import Clean
Clean()(self.oeb, self.opts)
pr(0.1)
self.flush()
self.opts.source = self.opts.input_profile
self.opts.dest = self.opts.output_profile
@ -608,10 +619,12 @@ OptionRecommendation(name='list_recipes',
MergeMetadata()(self.oeb, self.user_metadata,
self.opts.prefer_metadata_cover)
pr(0.2)
self.flush()
from calibre.ebooks.oeb.transforms.structure import DetectStructure
DetectStructure()(self.oeb, self.opts)
pr(0.35)
self.flush()
from calibre.ebooks.oeb.transforms.flatcss import CSSFlattener
fbase = self.opts.base_font_size
@ -626,6 +639,7 @@ OptionRecommendation(name='list_recipes',
from calibre.ebooks.oeb.transforms.jacket import Jacket
Jacket()(self.oeb, self.opts, self.user_metadata)
pr(0.4)
self.flush()
if self.opts.extra_css and os.path.exists(self.opts.extra_css):
self.opts.extra_css = open(self.opts.extra_css, 'rb').read()
@ -651,6 +665,7 @@ OptionRecommendation(name='list_recipes',
from calibre.ebooks.oeb.transforms.linearize_tables import LinearizeTables
LinearizeTables()(self.oeb, self.opts)
pr(0.9)
self.flush()
from calibre.ebooks.oeb.transforms.trimmanifest import ManifestTrimmer
@ -660,6 +675,7 @@ OptionRecommendation(name='list_recipes',
self.oeb.toc.rationalize_play_orders()
pr(1.)
self.flush()
self.log.info('Creating %s...'%self.output_plugin.name)
our = CompositeProgressReporter(0.67, 1., self.ui_reporter)
@ -669,6 +685,7 @@ OptionRecommendation(name='list_recipes',
self.opts, self.log)
self.ui_reporter(1.)
self.log(self.output_fmt.upper(), 'output written to', self.output)
self.flush()
def create_oebbook(log, path_or_stream, opts, input_plugin, reader=None,
encoding='utf-8'):

View File

@ -35,7 +35,8 @@ class PRS500_PROFILE(object):
name = 'prs500'
def find_custom_fonts(options, logger):
from calibre.utils.fontconfig import files_for_family
from calibre.utils.fonts import fontconfig
files_for_family = fontconfig.files_for_family
fonts = {'serif' : None, 'sans' : None, 'mono' : None}
def family(cmd):
return cmd.split(',')[-1].strip()

View File

@ -15,7 +15,6 @@ from lxml import etree
from dateutil import parser
from calibre.ebooks.chardet import xml_to_unicode
from calibre import relpath
from calibre.constants import __appname__, __version__
from calibre.ebooks.metadata.toc import TOC
from calibre.ebooks.metadata import MetaInformation, string_to_authors
@ -86,8 +85,8 @@ class Resource(object):
if self.path == basedir:
return ''+frag
try:
rpath = relpath(self.path, basedir)
except OSError: # On windows path and basedir could be on different drives
rpath = os.path.relpath(self.path, basedir)
except ValueError: # On windows path and basedir could be on different drives
rpath = self.path
if isinstance(rpath, unicode):
rpath = rpath.encode('utf-8')
@ -560,7 +559,7 @@ class OPF(object):
has_path = True
break
if not has_path:
href = relpath(path, self.base_dir).replace(os.sep, '/')
href = os.path.relpath(path, self.base_dir).replace(os.sep, '/')
item = self.create_manifest_item(href, media_type)
manifest = self.manifest_ppath(self.root)[0]
manifest.append(item)

View File

@ -53,8 +53,9 @@ class Progress(object):
class ReadMetadata(Thread):
def __init__(self, tasks, result_queue):
def __init__(self, tasks, result_queue, spare_server=None):
self.tasks, self.result_queue = tasks, result_queue
self.spare_server = spare_server
self.canceled = False
Thread.__init__(self)
self.daemon = True
@ -67,7 +68,7 @@ class ReadMetadata(Thread):
for b in t:
ids.add(b[0])
progress = Progress(self.result_queue, self.tdir)
server = Server()
server = Server() if self.spare_server is None else self.spare_server
for i, task in enumerate(self.tasks):
job = ParallelJob('read_metadata',
'Read metadata (%d of %d)'%(i, len(self.tasks)),
@ -110,20 +111,20 @@ class ReadMetadata(Thread):
os.remove(job.log_path)
def read_metadata(paths, result_queue, chunk=50):
def read_metadata(paths, result_queue, chunk=50, spare_server=None):
tasks = []
pos = 0
while pos < len(paths):
tasks.append(paths[pos:pos+chunk])
pos += chunk
t = ReadMetadata(tasks, result_queue)
t = ReadMetadata(tasks, result_queue, spare_server=spare_server)
t.start()
return t
class SaveWorker(Thread):
def __init__(self, result_queue, db, ids, path, by_author=False,
single_dir=False, single_format=None):
single_dir=False, single_format=None, spare_server=None):
Thread.__init__(self)
self.daemon = True
self.path, self.by_author = path, by_author
@ -133,10 +134,11 @@ class SaveWorker(Thread):
self.canceled = False
self.result_queue = result_queue
self.error = None
self.spare_server = spare_server
self.start()
def run(self):
server = Server()
server = Server() if self.spare_server is None else self.spare_server
ids = set(self.ids)
tasks = server.split(list(ids))
jobs = set([])

View File

@ -29,6 +29,8 @@ from calibre.ebooks.oeb.base import prefixname
from calibre.ebooks.oeb.base import urlnormalize
from calibre.ebooks.compression.palmdoc import compress_doc
INDEXING = True
# TODO:
# - Optionally rasterize tables
@ -65,7 +67,9 @@ TAGX = {
'subchapter' :
'\x00\x00\x00\x01\x01\x01\x01\x00\x02\x01\x02\x00\x03\x01\x04\x00\x04\x01\x08\x00\x05\x01\x10\x00\x15\x01\x10\x00\x16\x01\x20\x00\x17\x01\x40\x00\x00\x00\x00\x01',
'periodical' :
'\x00\x00\x00\x02\x01\x01\x01\x00\x02\x01\x02\x00\x03\x01\x04\x00\x04\x01\x08\x00\x05\x01\x10\x00\x15\x01\x20\x00\x16\x01\x40\x00\x17\x01\x80\x00\x00\x00\x00\x01\x45\x01\x01\x00\x46\x01\x02\x00\x47\x01\x04\x00\x00\x00\x00\x01'
'\x00\x00\x00\x02\x01\x01\x01\x00\x02\x01\x02\x00\x03\x01\x04\x00\x04\x01\x08\x00\x05\x01\x10\x00\x15\x01\x20\x00\x16\x01\x40\x00\x17\x01\x80\x00\x00\x00\x00\x01\x45\x01\x01\x00\x46\x01\x02\x00\x47\x01\x04\x00\x00\x00\x00\x01',
'secondary_book':'\x00\x00\x00\x01\x01\x01\x01\x00\x00\x00\x00\x01',
'secondary_periodical':'\x00\x00\x00\x01\x01\x01\x01\x00\x0b\x03\x02\x00\x00\x00\x00\x01'
}
INDXT = {
@ -99,8 +103,7 @@ def decint(value, direction):
def align_block(raw, multiple=4, pad='\0'):
l = len(raw)
extra = l % multiple
extra = len(raw) % multiple
if extra == 0: return raw
return raw + pad*(multiple - extra)
@ -355,8 +358,11 @@ class MobiWriter(object):
def _generate_content(self):
self._map_image_names()
self._generate_text()
if not self.opts.no_mobi_index:
if INDEXING and not self.opts.no_mobi_index:
try:
self._generate_index()
except:
self._oeb.log.exception('Failed to generate index')
self._generate_images()
def _map_image_names(self):
@ -406,6 +412,7 @@ class MobiWriter(object):
self._content_length = len(text)
self._text_length = len(text)
text = StringIO(text)
buf = []
nrecords = 0
offset = 0
if self._compression != UNCOMPRESSED:
@ -435,9 +442,16 @@ class MobiWriter(object):
lsize += 1
record.write(size)
self._records.append(record.getvalue())
buf.append(self._records[-1])
nrecords += 1
offset += RECORD_SIZE
data, overlap = self._read_text_record(text)
if INDEXING:
extra = sum(map(len, buf))%4
if extra == 0:
extra = 4
self._records.append('\0'*(4-extra))
nrecords += 1
self._text_nrecords = nrecords
def _generate_indxt(self, ctoc):
@ -448,7 +462,7 @@ class MobiWriter(object):
indices.write('IDXT')
c = 0
last_index = last_name = None
last_name = None
def add_node(node, offset, length, count):
if self.opts.verbose > 2:
@ -487,21 +501,23 @@ class MobiWriter(object):
length = self._content_length - offset
add_node(child, offset, length, c)
last_index = c
ctoc_offset = self._ctoc_map[child]
last_name = "%4d"%c
c += 1
return align_block(indxt.getvalue()), c, \
align_block(indices.getvalue()), last_index, last_name
align_block(indices.getvalue()), last_name
def _generate_index(self):
self._oeb.log('Generating index...')
self._primary_index_record = None
ctoc = self._generate_ctoc()
indxt, indxt_count, indices, last_index, last_name = \
indxt, indxt_count, indices, last_name = \
self._generate_indxt(ctoc)
if last_name is None:
self._oeb.log.warn('Input document has no TOC. No index generated.')
return
indx1 = StringIO()
indx1.write('INDX'+pack('>I', 0xc0)) # header length
@ -529,7 +545,7 @@ class MobiWriter(object):
indx1.write(indices)
indx1 = indx1.getvalue()
idxt0 = chr(len(last_name)) + last_name + pack('>H', last_index)
idxt0 = chr(len(last_name)) + last_name + pack('>H', indxt_count)
idxt0 = align_block(idxt0)
indx0 = StringIO()
@ -597,16 +613,61 @@ class MobiWriter(object):
indx0 = indx0.getvalue()
self._primary_index_record = len(self._records)
self._records.extend([indx0, indx1, ctoc])
# Write secondary index records
tagx = TAGX['secondary_'+\
('periodical' if self.opts.mobi_periodical else 'book')]
tagx_len = 8 + len(tagx)
indx0 = StringIO()
indx0.write('INDX'+pack('>I', 0xc0)+'\0'*8)
indx0.write(pack('>I', 0x02))
indx0.write(pack('>I', 0xc0+tagx_len+4))
indx0.write(pack('>I', 1))
indx0.write(pack('>I', 65001))
indx0.write('\xff'*4)
indx0.write(pack('>I', 1))
indx0.write('\0'*4)
indx0.write('\0'*136)
indx0.write(pack('>I', 0xc0))
indx0.write('\0'*8)
indx0.write('TAGX'+pack('>I', tagx_len)+tagx)
if self.opts.mobi_periodical:
raise NotImplementedError
else:
indx0.write('\0'*3 + '\x01' + 'IDXT' + '\0\xd4\0\0')
indx1 = StringIO()
indx1.write('INDX' + pack('>I', 0xc0) + '\0'*4)
indx1.write(pack('>I', 1))
extra = 0xf0 if self.opts.mobi_periodical else 4
indx1.write('\0'*4 + pack('>I', 0xc0+extra))
num = 4 if self.opts.mobi_periodical else 1
indx1.write(pack('>I', num))
indx1.write('\xff'*8)
indx1.write('\0'*(0xc0-indx1.tell()))
if self.opts.mobi_periodical:
raise NotImplementedError
else:
indx1.write('\0\x01\x80\0')
indx1.write('IDXT')
if self.opts.mobi_periodical:
raise NotImplementedError
else:
indx1.write('\0\xc0\0\0')
indx0, indx1 = indx0.getvalue(), indx1.getvalue()
self._records.extend((indx0, indx1))
if self.opts.verbose > 3:
from tempfile import mkdtemp
import os
t = mkdtemp()
open(os.path.join(t, 'indx0.bin'), 'wb').write(indx0)
open(os.path.join(t, 'indx1.bin'), 'wb').write(indx1)
open(os.path.join(t, 'ctoc.bin'), 'wb').write(ctoc)
for i, n in enumerate(['sindx1', 'sindx0', 'ctoc', 'indx0', 'indx1']):
open(os.path.join(t, n+'.bin'), 'wb').write(self._records[-(i+1)])
self._oeb.log.debug('Index records dumped to', t)
self._records.extend([indx0, indx1, ctoc])
def _generate_ctoc(self):
if self.opts.mobi_periodical:
@ -617,8 +678,8 @@ class MobiWriter(object):
self._last_toc_entry = None
ctoc = StringIO()
def add_node(node, cls):
t = node.title
def add_node(node, cls, title=None):
t = node.title if title is None else title
if t and t.strip():
t = t.strip()
if not isinstance(t, unicode):
@ -629,8 +690,10 @@ class MobiWriter(object):
self._ctoc_name_map[node] = t
ctoc.write(decint(len(t), DECINT_FORWARD)+t)
first = True
for child in toc.iter():
add_node(child, 'chapter')
add_node(child, 'chapter')#, title='Title Page' if first else None)
first = False
return align_block(ctoc.getvalue())
@ -666,12 +729,13 @@ class MobiWriter(object):
metadata = self._oeb.metadata
exth = self._build_exth()
last_content_record = len(self._records) - 1
if INDEXING:
self._generate_end_records()
record0 = StringIO()
# The PalmDOC Header
record0.write(pack('>HHIHHHH', self._compression, 0,
self._text_length,
self._text_nrecords, RECORD_SIZE, 0, 0)) # 0 - 15 (0x0 - 0xf)
self._text_nrecords-1, RECORD_SIZE, 0, 0)) # 0 - 15 (0x0 - 0xf)
uid = random.randint(0, 0xffffffff)
title = str(metadata.title[0])
# The MOBI Header
@ -697,8 +761,8 @@ class MobiWriter(object):
record0.write('\xff' * 8)
# 0x20 - 0x23 : Secondary index record
# TODO: implement
record0.write('\xff' * 4)
record0.write(pack('>I', 0xffffffff if self._primary_index_record is
None else self._primary_index_record+3))
# 0x24 - 0x3f : Unknown
record0.write('\xff' * 28)
@ -827,6 +891,11 @@ class MobiWriter(object):
if index is not None:
exth.write(pack('>III', 0xca, 0x0c, index - 1))
nrecs += 1
if INDEXING:
# Write unknown EXTH records as 0s
for code, size in [(204,4), (205,4), (206,4), (207,4), (300,40)]:
exth.write(pack('>II', code, 8+size)+'\0'*size)
nrecs += 1
exth = exth.getvalue()
trail = len(exth) % 4
pad = '\0' * (4 - trail) # Always pad w/ at least 1 byte
@ -849,7 +918,7 @@ class MobiWriter(object):
def _write_header(self):
title = str(self._oeb.metadata.title[0])
title = re.sub('[^-A-Za-z0-9]+', '_', title)[:32]
title = re.sub('[^-A-Za-z0-9]+', '_', title)[:31]
title = title + ('\0' * (32 - len(title)))
now = int(time.time())
nrecords = len(self._records)
@ -866,4 +935,3 @@ class MobiWriter(object):
self._write(record)

View File

@ -11,7 +11,12 @@ __docformat__ = 'restructuredtext en'
import struct
import zlib
try:
from PIL import Image
Image
except ImportError:
import Image
import cStringIO
from calibre.ebooks.pdb.formatwriter import FormatWriter

View File

@ -6,7 +6,12 @@ __docformat__ = 'restructuredtext en'
import os
try:
from PIL import Image
Image
except ImportError:
import Image
import cStringIO
from calibre.customize.conversion import OutputFormatPlugin

View File

@ -1,4 +1,3 @@
import os.path
# -*- coding: utf-8 -*-
__license__ = 'GPL 3'
@ -9,7 +8,12 @@ import os
import struct
import zlib
try:
from PIL import Image
Image
except ImportError:
import Image
import cStringIO
from calibre.ebooks.rb.rbml import RBMLizer

View File

@ -11,7 +11,12 @@ Transform OEB content into RTF markup
import os
import re
try:
from PIL import Image
Image
except ImportError:
import Image
import cStringIO
from calibre.ebooks.oeb.base import XHTML, XHTML_NS, barename, namespace, \

View File

@ -23,7 +23,11 @@ class TXTInput(InputFormatPlugin):
ienc = options.input_encoding
txt = stream.read().decode(ienc)
try:
html = txt_to_markdown(txt)
except RuntimeError:
raise ValueError('This txt file has malformed markup, it cannot be'
'converted by calibre. See http://daringfireball.net/projects/markdown/syntax')
with open('index.html', 'wb') as index:
index.write(html.encode('utf-8'))

View File

@ -39,9 +39,10 @@ class RecursiveFind(QThread):
class Adder(QObject):
def __init__(self, parent, db, callback):
def __init__(self, parent, db, callback, spare_server=None):
QObject.__init__(self, parent)
self.pd = ProgressDialog(_('Adding...'), parent=parent)
self.spare_server = spare_server
self.db = db
self.pd.setModal(True)
self.pd.show()
@ -79,7 +80,8 @@ class Adder(QObject):
tasks.append((i, b))
self.ids[i] = b
self.nmap[i] = os.path.basename(b[0])
self.worker = read_metadata(tasks, self.rq)
self.worker = read_metadata(tasks, self.rq,
spare_server=self.spare_server)
self.pd.set_min(0)
self.pd.set_max(len(self.ids))
self.pd.value = 0
@ -165,9 +167,11 @@ class Adder(QObject):
class Saver(QObject):
def __init__(self, parent, db, callback, rows, path,
by_author=False, single_dir=False, single_format=None):
by_author=False, single_dir=False, single_format=None,
spare_server=None):
QObject.__init__(self, parent)
self.pd = ProgressDialog(_('Saving...'), parent=parent)
self.spare_server = spare_server
self.db = db
self.pd.setModal(True)
self.pd.show()
@ -183,7 +187,7 @@ class Saver(QObject):
from calibre.ebooks.metadata.worker import SaveWorker
self.worker = SaveWorker(self.rq, db, self.ids, path, by_author,
single_dir, single_format)
single_dir, single_format, spare_server=self.spare_server)
self.connect(self.pd, SIGNAL('canceled()'), self.canceled)
self.timer = QTimer(self)
self.connect(self.timer, SIGNAL('timeout()'), self.update)

View File

@ -13,6 +13,7 @@ from calibre.gui2.convert import Widget
class PluginWidget(Widget, Ui_Form):
TITLE = _('Comic Input')
HELP = _('Options specific to')+' comic '+_('input')
def __init__(self, parent, get_option, get_help, db=None, book_id=None):
Widget.__init__(self, parent, 'comic_input',

View File

@ -13,6 +13,7 @@ from calibre.gui2.convert import Widget
class PluginWidget(Widget, Ui_Form):
TITLE = _('EPUB Output')
HELP = _('Options specific to')+' EPUB '+_('output')
def __init__(self, parent, get_option, get_help, db=None, book_id=None):
Widget.__init__(self, parent, 'epub_output',

View File

@ -16,6 +16,7 @@ font_family_model = None
class PluginWidget(Widget, Ui_Form):
TITLE = _('LRF Output')
HELP = _('Options specific to')+' LRF '+_('output')
def __init__(self, parent, get_option, get_help, db=None, book_id=None):
Widget.__init__(self, parent, 'lrf_output',

View File

@ -13,6 +13,8 @@ from calibre.gui2.convert import Widget
class PluginWidget(Widget, Ui_Form):
TITLE = _('MOBI Output')
HELP = _('Options specific to')+' MOBI '+_('output')
def __init__(self, parent, get_option, get_help, db=None, book_id=None):
Widget.__init__(self, parent, 'mobi_output',

View File

@ -49,6 +49,12 @@ class PageSetupWidget(Widget, Ui_Form):
x.setMouseTracking(True)
self.connect(x, SIGNAL('entered(QModelIndex)'), self.show_desc)
self.initialize_options(get_option, get_help, db, book_id)
it = unicode(self.opt_input_profile.toolTip())
self.opt_input_profile.setToolTip('<p>'+it.replace('t.','t.\n<br>'))
it = unicode(self.opt_output_profile.toolTip())
self.opt_output_profile.setToolTip('<p>'+it.replace('t.','ce.\n<br>'))
def show_desc(self, index):
desc = index.model().data(index, Qt.StatusTipRole).toString()

View File

@ -14,6 +14,7 @@ format_model = None
class PluginWidget(Widget, Ui_Form):
TITLE = _('PDB Output')
HELP = _('Options specific to')+' PDB '+_('output')
def __init__(self, parent, get_option, get_help, db=None, book_id=None):
Widget.__init__(self, parent, 'pdb_output', ['format'])

View File

@ -15,6 +15,7 @@ orientation_model = None
class PluginWidget(Widget, Ui_Form):
TITLE = _('PDF Output')
HELP = _('Options specific to')+' PDF '+_('output')
def __init__(self, parent, get_option, get_help, db=None, book_id=None):
Widget.__init__(self, parent, 'pdf_output', ['paper_size', 'orientation'])

View File

@ -14,6 +14,7 @@ newline_model = None
class PluginWidget(Widget, Ui_Form):
TITLE = _('TXT Output')
HELP = _('Options specific to')+' TXT '+_('output')
def __init__(self, parent, get_option, get_help, db=None, book_id=None):
Widget.__init__(self, parent, 'txt_output', ['newline'])

View File

@ -38,7 +38,7 @@ class Wizard(QDialog):
def __init__(self, parent=None):
QDialog.__init__(self, parent)
self.resize(400, 300)
self.resize(440, 480)
self.verticalLayout = QVBoxLayout(self)
self.widget = WizardWidget(self)
self.verticalLayout.addWidget(self.widget)

View File

@ -1,3 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
@ -12,8 +13,8 @@
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout" >
<item row="0" column="0" colspan="2" >
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Match HTML &amp;tags with tag name:</string>
@ -23,7 +24,7 @@
</property>
</widget>
</item>
<item row="1" column="0" >
<item>
<widget class="QComboBox" name="tag">
<property name="editable">
<bool>true</bool>
@ -90,7 +91,7 @@
</item>
</widget>
</item>
<item row="2" column="0" colspan="2" >
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Having the &amp;attribute:</string>
@ -100,10 +101,10 @@
</property>
</widget>
</item>
<item row="3" column="0" colspan="2" >
<item>
<widget class="QLineEdit" name="attribute"/>
</item>
<item row="4" column="0" >
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>With &amp;value:</string>
@ -113,20 +114,20 @@
</property>
</widget>
</item>
<item row="5" column="0" >
<widget class="QLineEdit" name="value" />
</item>
<item row="5" column="1" >
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>(A regular expression)</string>
</property>
</widget>
</item>
<item row="6" column="0" colspan="2" >
<item>
<widget class="QLineEdit" name="value"/>
</item>
<item>
<widget class="QLabel" name="label_5">
<property name="text">
<string>&lt;p>For example, to match all h2 tags that have class="chapter", set tag to &lt;i>h2&lt;/i>, attribute to &lt;i>class&lt;/i> and value to &lt;i>chapter&lt;/i>.&lt;/p>&lt;p>Leaving attribute blank will match any attribute and leaving value blank will match any value. Setting tag to * will match any tag.&lt;/p>&lt;p>To learn more advanced usage of XPath see the &lt;a href="http://calibre.kovidgoyal.net/user_manual/xpath.html">XPath Tutorial&lt;/a>.</string>
<string>&lt;p&gt;For example, to match all h2 tags that have class=&quot;chapter&quot;, set tag to &lt;i&gt;h2&lt;/i&gt;, attribute to &lt;i&gt;class&lt;/i&gt; and value to &lt;i&gt;chapter&lt;/i&gt;.&lt;/p&gt;&lt;p&gt;Leaving attribute blank will match any attribute and leaving value blank will match any value. Setting tag to * will match any tag.&lt;/p&gt;&lt;p&gt;To learn more advanced usage of XPath see the &lt;a href=&quot;http://calibre.kovidgoyal.net/user_manual/xpath.html&quot;&gt;XPath Tutorial&lt;/a&gt;.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
@ -136,6 +137,19 @@
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<resources/>

View File

@ -59,7 +59,6 @@ class ConfigTabs(QTabWidget):
fromlist=[1])
pw = input_widget.PluginWidget
pw.ICON = ':/images/forward.svg'
pw.HELP = _('Options specific to the input format.')
self.widgets.append(widget_factory(pw))
except ImportError:
continue
@ -71,14 +70,15 @@ class ConfigTabs(QTabWidget):
fromlist=[1])
pw = output_widget.PluginWidget
pw.ICON = ':/images/forward.svg'
pw.HELP = _('Options specific to the input format.')
self.widgets.append(widget_factory(pw))
except ImportError:
continue
for widget in self.widgets:
for i, widget in enumerate(self.widgets):
self.addTab(widget, widget.TITLE.replace('\n', ' ').replace('&',
'&&'))
self.setTabToolTip(i, widget.HELP if widget.HELP else widget.TITLE)
self.setUsesScrollButtons(True)
def commit(self):
for widget in self.widgets:

View File

@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>738</width>
<width>767</width>
<height>575</height>
</rect>
</property>

View File

@ -9,8 +9,8 @@
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="250"
height="525"
width="150"
height="350"
id="svg2347"
sodipodi:version="0.32"
inkscape:version="0.46"
@ -1149,7 +1149,7 @@
<g
inkscape:label="Layer 1"
id="g3155"
transform="matrix(1.9160726,0,0,4.0935085,4.833863,-12.457556)">
transform="matrix(1.2103698,0,0,2.7823904,-2.5000367,-12.695448)">
<path
sodipodi:nodetypes="ccssssssscsssssssc"
id="path1931"

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 108 KiB

View File

@ -18,6 +18,7 @@ from calibre import __version__, __appname__, sanitize_file_name, \
iswindows, isosx, prints, patheq
from calibre.ptempfile import PersistentTemporaryFile
from calibre.utils.config import prefs, dynamic
from calibre.utils.ipc.server import Server
from calibre.gui2 import APP_UID, warning_dialog, choose_files, error_dialog, \
initialize_file_icon_provider, question_dialog,\
pixmap_to_data, choose_dir, ORG_NAME, \
@ -104,10 +105,12 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
def __init__(self, listener, opts, actions, parent=None):
self.preferences_action, self.quit_action = actions
self.spare_servers = []
MainWindow.__init__(self, opts, parent)
# Initialize fontconfig in a separate thread as this can be a lengthy
# process if run for the first time on this machine
self.fc = __import__('calibre.utils.fontconfig', fromlist=1)
from calibre.utils.fonts import fontconfig
self.fc = fontconfig
self.listener = Listener(listener)
self.check_messages_timer = QTimer()
self.connect(self.check_messages_timer, SIGNAL('timeout()'),
@ -459,6 +462,8 @@ 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),
@ -489,7 +494,16 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.connect(self.action_sync, SIGNAL('triggered(bool)'),
self._sync_menu.trigger_default)
def add_spare_server(self, *args):
self.spare_servers.append(Server())
@property
def spare_server(self):
try:
QTimer.singleShot(1000, self.add_spare_server)
return self.spare_servers.pop()
except:
pass
def no_op(self, *args):
pass
@ -729,7 +743,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
from calibre.gui2.add import Adder
self._adder = Adder(self,
self.library_view.model().db,
Dispatcher(self._files_added))
Dispatcher(self._files_added), spare_server=self.spare_server)
self._adder.add_recursive(root, single)
def add_recursive_single(self, checked):
@ -792,7 +806,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.__adder_func = partial(self._files_added, on_card=on_card)
self._adder = Adder(self,
None if to_device else self.library_view.model().db,
Dispatcher(self.__adder_func))
Dispatcher(self.__adder_func), spare_server=self.spare_server)
self._adder.add(paths)
def _files_added(self, paths=[], names=[], infos=[], on_card=None):
@ -985,7 +999,8 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
Dispatcher(self._books_saved), rows, path,
by_author=self.library_view.model().by_author,
single_dir=single_dir,
single_format=single_format)
single_format=single_format,
spare_server=self.spare_server)
else:
paths = self.current_view().model().paths(rows)
@ -1617,6 +1632,8 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.check_messages_timer.stop()
self.listener.close()
self.job_manager.server.close()
while self.spare_servers:
self.spare_servers.pop().close()
self.device_manager.keep_going = False
self.cover_cache.stop()
self.hide()
@ -1735,6 +1752,11 @@ def run_gui(opts, args, actions, listener, app):
if getattr(main, 'restart_after_quit', False):
e = sys.executable if getattr(sys, 'froze', False) else sys.argv[0]
print 'Restarting with:', e, sys.argv
if hasattr(sys, 'frameworks_dir'):
app = os.path.dirname(os.path.dirname(sys.frameworks_dir))
import subprocess
subprocess.Popen('sleep 3s; open '+app, shell=True)
else:
os.execvp(e, sys.argv)
else:
if iswindows:
@ -1829,7 +1851,9 @@ if __name__ == '__main__':
logfile = os.path.join(os.path.expanduser('~'), 'calibre.log')
if os.path.exists(logfile):
log = open(logfile).read().decode('utf-8', 'ignore')
d = QErrorMessage(('<b>Error:</b>%s<br><b>Traceback:</b><br>'
'%s<b>Log:</b><br>%s')%(unicode(err), unicode(tb), log))
d.exec_()
d = QErrorMessage()
d.showMessage(('<b>Error:</b>%s<br><b>Traceback:</b><br>'
'%s<b>Log:</b><br>%s')%(unicode(err),
unicode(tb).replace('\n', '<br>'),
log.replace('\n', '<br>')))

View File

@ -543,8 +543,9 @@ class EbookViewer(MainWindow, Ui_EbookViewer):
if isinstance(worker.exception, DRMError):
error_dialog(self, _('DRM Error'), _('<p>This book is protected by <a href="%s">DRM</a>')%'http://wiki.mobileread.com/wiki/DRM').exec_()
else:
r = getattr(worker.exception, 'reason', worker.exception)
error_dialog(self, _('Could not open ebook'),
unicode(worker.exception.reason), det_msg=worker.traceback, show=True)
unicode(r), det_msg=worker.traceback, show=True)
self.close_progress_indicator()
else:
self.metadata.show_opf(self.iterator.opf)

View File

@ -16,7 +16,7 @@ from calibre.gui2 import human_readable, NONE, TableView, \
from calibre.gui2.dialogs.job_view_ui import Ui_Dialog
from calibre.gui2.filename_pattern_ui import Ui_Form
from calibre import fit_image
from calibre.utils.fontconfig import find_font_families
from calibre.utils.fonts import fontconfig
from calibre.ebooks.metadata.meta import metadata_from_filename
from calibre.utils.config import prefs
@ -293,7 +293,7 @@ class FontFamilyModel(QAbstractListModel):
def __init__(self, *args):
QAbstractListModel.__init__(self, *args)
try:
self.families = find_font_families()
self.families = fontconfig.find_font_families()
except:
self.families = []
print 'WARNING: Could not load fonts'

View File

@ -23,6 +23,7 @@ from calibre.gui2.wizard.library_ui import Ui_WizardPage as LibraryUI
from calibre.gui2.wizard.finish_ui import Ui_WizardPage as FinishUI
from calibre.gui2.wizard.kindle_ui import Ui_WizardPage as KindleUI
from calibre.gui2.wizard.stanza_ui import Ui_WizardPage as StanzaUI
from calibre.gui2 import min_available_height, available_width
from calibre.utils.config import dynamic, prefs
from calibre.gui2 import NONE, choose_dir, error_dialog
@ -62,6 +63,13 @@ class Kindle(Device):
manufacturer = 'Amazon'
id = 'kindle'
class KindleDX(Kindle):
output_profile = 'kindle_dx'
output_format = 'MOBI'
name = 'Kindle DX'
id = 'kindledx'
class Sony500(Device):
output_profile = 'sony'
@ -306,7 +314,7 @@ class DevicePage(QWizardPage, DeviceUI):
def nextId(self):
idx = list(self.device_view.selectionModel().selectedIndexes())[0]
dev = self.dev_model.data(idx, Qt.UserRole)
if dev is Kindle:
if dev in (Kindle, KindleDX):
return KindlePage.ID
if dev is iPhone:
return StanzaPage.ID
@ -483,6 +491,15 @@ class Wizard(QWizard):
self.setPage(self.stanza_page.ID, self.stanza_page)
self.device_extra_page = None
nh, nw = min_available_height()-75, available_width()-30
if nh < 0:
nh = 580
if nw < 0:
nw = 400
nh = min(400, nh)
nw = min(580, nw)
self.resize(nw, nh)
def accept(self):
self.device_page.commit()

View File

@ -27,7 +27,6 @@ entry_points = {
'librarything = calibre.ebooks.metadata.library_thing:main',
'calibre-debug = calibre.debug:main',
'calibredb = calibre.library.cli:main',
'calibre-fontconfig = calibre.utils.fontconfig:main',
'calibre-parallel = calibre.utils.ipc.worker:main',
'calibre-customize = calibre.customize.ui:main',
'calibre-complete = calibre.utils.complete:main',

View File

@ -4,9 +4,9 @@
#
msgid ""
msgstr ""
"Project-Id-Version: calibre 0.5.14\n"
"POT-Creation-Date: 2009-05-31 09:36+PDT\n"
"PO-Revision-Date: 2009-05-31 09:36+PDT\n"
"Project-Id-Version: calibre 0.6.0b1\n"
"POT-Creation-Date: 2009-06-02 08:53+PDT\n"
"PO-Revision-Date: 2009-06-02 08:53+PDT\n"
"Last-Translator: Automatically generated\n"
"Language-Team: LANGUAGE\n"
"MIME-Version: 1.0\n"
@ -48,7 +48,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/mobi.py:153
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:333
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf.py:448
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:866
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/opf2.py:865
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdb.py:39
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/pdf.py:58
#: /home/kovid/work/calibre/src/calibre/ebooks/metadata/topaz.py:29
@ -57,8 +57,8 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:69
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:78
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:149
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:520
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:704
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:531
#: /home/kovid/work/calibre/src/calibre/ebooks/mobi/reader.py:715
#: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:44
#: /home/kovid/work/calibre/src/calibre/ebooks/odt/input.py:46
#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/base.py:791
@ -66,8 +66,8 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:162
#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/reader.py:165
#: /home/kovid/work/calibre/src/calibre/ebooks/oeb/transforms/jacket.py:82
#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/ereader/writer.py:96
#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/ereader/writer.py:97
#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/ereader/writer.py:101
#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/ereader/writer.py:102
#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/input.py:26
#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/palmdoc/writer.py:28
#: /home/kovid/work/calibre/src/calibre/ebooks/pdb/ztxt/writer.py:26
@ -261,31 +261,35 @@ msgstr ""
msgid "This profile is intended for the SONY PRS line. The 500/505/700 etc, in landscape mode. Mainly useful for comics."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:30
#: /home/kovid/work/calibre/src/calibre/customize/profiles.py:242
msgid "This profile is intended for the Amazon Kindle DX."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:29
msgid "Installed plugins"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:31
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:30
msgid "Mapping for filetype plugins"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:32
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:31
msgid "Local plugin customization"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:33
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:32
msgid "Disabled plugins"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:75
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:74
msgid "No valid plugin found in "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:215
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:214
msgid "Initialization of plugin %s failed with traceback:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:333
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:332
msgid ""
" %prog options\n"
"\n"
@ -293,27 +297,27 @@ msgid ""
" "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:339
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:338
msgid "Add a plugin by specifying the path to the zip file containing it."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:341
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:340
msgid "Remove a custom plugin by name. Has no effect on builtin plugins"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:343
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:342
msgid "Customize plugin. Specify name of plugin and customization string separated by a comma."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:345
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:344
msgid "List all installed plugins"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:347
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:346
msgid "Enable the named plugin"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:349
#: /home/kovid/work/calibre/src/calibre/customize/ui.py:348
msgid "Disable the named plugin"
msgstr ""
@ -446,7 +450,6 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/prs505/driver.py:110
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:84
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:86
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:88
msgid "The reader has no storage card in this slot."
msgstr ""
@ -489,6 +492,10 @@ msgstr ""
msgid "Communicate with an eBook reader."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:88
msgid "Selected slot: %s is not supported."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:173
#: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:181
msgid "Adding books to device metadata listing..."
@ -563,7 +570,7 @@ msgstr ""
msgid "Page"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:10
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:19
msgid ""
"input_file output_file [options]\n"
"\n"
@ -578,43 +585,43 @@ msgid ""
"For full documentation of the conversion system see\n"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:86
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:87
msgid "INPUT OPTIONS"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:87
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:88
msgid "Options to control the processing of the input %s file"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:93
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:94
msgid "OUTPUT OPTIONS"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:94
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:95
msgid "Options to control the processing of the output %s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:108
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:109
msgid "Options to control the look and feel of the output"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:122
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:123
msgid "Control auto-detection of document structure."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:132
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:133
msgid "Control the automatic generation of a Table of Contents. By default, if the source file has a Table of Contents, it will be used in preference to the automatically generated one."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:142
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:143
msgid "Options to set metadata in the output"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:145
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:146
msgid "Options to help with debugging the conversion"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:219
#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:220
msgid "Output saved to"
msgstr ""
@ -1805,6 +1812,20 @@ msgstr ""
msgid "Comic Input"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input.py:16
msgid "input"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input.py:16
#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output.py:16
#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output.py:19
#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output.py:16
#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output.py:17
#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output.py:18
#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output.py:17
msgid "Options specific to"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/comic_input_ui.py:76
#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:38
#: /home/kovid/work/calibre/src/calibre/gui2/convert/look_and_feel_ui.py:85
@ -1818,7 +1839,7 @@ msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/toc_ui.py:61
#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output_ui.py:31
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_edit_ui.py:41
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:65
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:67
#: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:53
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:35
#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:96
@ -1884,6 +1905,15 @@ msgstr ""
msgid "EPUB Output"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output.py:16
#: /home/kovid/work/calibre/src/calibre/gui2/convert/lrf_output.py:19
#: /home/kovid/work/calibre/src/calibre/gui2/convert/mobi_output.py:16
#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdb_output.py:17
#: /home/kovid/work/calibre/src/calibre/gui2/convert/pdf_output.py:18
#: /home/kovid/work/calibre/src/calibre/gui2/convert/txt_output.py:17
msgid "output"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/epub_output_ui.py:39
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/epub_ui.py:513
msgid "Do not &split on page breaks"
@ -2295,8 +2325,6 @@ msgid "Convert"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/single.py:162
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:62
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:74
msgid "Options specific to the input format."
msgstr ""
@ -2455,71 +2483,71 @@ msgstr ""
msgid "Use a wizard to help construct the XPath expression"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:66
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:68
msgid "Match HTML &tags with tag name:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:67
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:69
msgid "*"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:68
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:70
msgid "a"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:69
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:71
msgid "br"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:70
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:72
msgid "div"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:71
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:73
msgid "h1"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:72
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:74
msgid "h2"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:73
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:75
msgid "h3"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:74
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:76
msgid "h4"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:75
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:77
msgid "h5"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:76
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:78
msgid "h6"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:77
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:79
msgid "hr"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:78
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:80
msgid "span"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:79
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:81
msgid "Having the &attribute:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:80
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:82
msgid "With &value:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:81
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:83
msgid "(A regular expression)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:82
#: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:84
msgid "<p>For example, to match all h2 tags that have class=\"chapter\", set tag to <i>h2</i>, attribute to <i>class</i> and value to <i>chapter</i>.</p><p>Leaving attribute blank will match any attribute and leaving value blank will match any value. Setting tag to * will match any tag.</p><p>To learn more advanced usage of XPath see the <a href=\"http://calibre.kovidgoyal.net/user_manual/xpath.html\">XPath Tutorial</a>."
msgstr ""
@ -2882,12 +2910,12 @@ msgid "Access log:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:607
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:513
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:514
msgid "Failed to start content server"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config.py:631
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:423
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:431
msgid "Select location for books"
msgstr ""
@ -4379,137 +4407,137 @@ msgstr ""
msgid "Save single format to disk..."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:134
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:911
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:912
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:49
msgid "Error"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:135
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:136
msgid "Error communicating with device"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:149
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:150
msgid "&Restore"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:151
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:152
msgid "&Donate to support calibre"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:156
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:157
msgid "&Restart"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:182
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:183
msgid "<p>For help visit <a href=\"http://%s.kovidgoyal.net/user_manual\">%s.kovidgoyal.net</a><br>"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:185
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:186
msgid "<b>%s</b>: %s by <b>Kovid Goyal %%(version)s</b><br>%%(device)s</p>"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:205
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:206
msgid "Edit metadata individually"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:207
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:208
msgid "Edit metadata in bulk"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:209
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:210
msgid "Download metadata and covers"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:210
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:211
msgid "Download only metadata"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:211
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:212
msgid "Download only covers"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:214
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:215
msgid "Add books from a single directory"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:215
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:216
msgid "Add books from directories, including sub-directories (One book per directory, assumes every ebook file is the same book in a different format)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:218
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:219
msgid "Add books from directories, including sub directories (Multiple books per directory, assumes every ebook file is a different book)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:254
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:255
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:357
msgid "Save to disk"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:255
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:256
msgid "Save to disk in a single directory"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:256
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1388
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:257
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1389
msgid "Save only %s format to disk"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:264
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:265
#: /home/kovid/work/calibre/src/calibre/gui2/main_ui.py:363
msgid "View"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:265
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:266
msgid "View specific format"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:291
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:292
msgid "Convert individually"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:292
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:293
msgid "Bulk convert"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:303
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:304
msgid "Run welcome wizard"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:335
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:336
msgid "Similar books..."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:392
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:393
msgid "Bad database location"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:395
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1516
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:396
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1517
msgid "Choose a location for your ebook library."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:556
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:557
msgid "Browse by covers"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:657
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:658
msgid "Device: "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:659
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:660
msgid " detected."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:681
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:682
msgid "Connected "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:693
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:694
msgid "Device database corrupted"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:694
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:695
msgid ""
"\n"
" <p>The database of books on the reader is corrupted. Try the following:\n"
@ -4520,286 +4548,286 @@ msgid ""
" "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:761
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:804
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:762
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:805
msgid "Uploading books to device."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:769
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:770
msgid "Books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:770
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:771
msgid "EPUB Books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:771
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772
msgid "LRF Books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:772
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:773
msgid "HTML Books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:773
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:774
msgid "LIT Books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:774
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:775
msgid "MOBI Books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:775
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:776
msgid "Text books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:776
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:777
msgid "PDF Books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:777
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:778
msgid "Comics"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:778
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:779
msgid "Archives"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:825
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:826
msgid "The selected books will be <b>permanently deleted</b> and the files removed from your computer. Are you sure?"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:842
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:843
msgid "Deleting books from device."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:873
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:874
msgid "Cannot download metadata"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:874
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:924
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:951
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:976
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1106
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:875
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:925
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:952
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:977
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1107
msgid "No books selected"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:883
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:884
msgid "covers"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:883
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:884
msgid "metadata"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:885
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:886
msgid "Downloading %s for %d book(s)"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:906
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:907
msgid "Failed to download some metadata"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:907
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:908
msgid "Failed to download metadata for the following:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:910
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:911
msgid "Failed to download metadata:"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:923
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:950
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:924
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:951
msgid "Cannot edit metadata"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:975
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:976
msgid "Cannot save to disk"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:978
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:979
msgid "Choose destination directory"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1000
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001
msgid "Error while saving"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1001
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1002
msgid "There was an error while saving."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1005
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1006
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007
msgid "Could not save some books"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1007
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1008
msgid "as the %s format is not available for them."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1008
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1009
msgid "Click the show details button to see which ones."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1027
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1028
msgid "Fetching news from "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1040
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1041
msgid " fetched."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1105
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1106
msgid "Cannot convert"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1282
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1301
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1283
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1302
msgid "No book selected"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1282
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1331
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1283
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1332
msgid "Cannot view"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1288
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1336
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1289
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1337
msgid "Choose the format to view"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1300
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1301
msgid "Cannot open folder"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1332
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1333
msgid "%s has no available formats."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1373
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1374
msgid "Cannot configure"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1374
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1375
msgid "Cannot configure while there are running jobs."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1417
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1418
msgid "No detailed info available"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1418
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1419
msgid "No detailed information is available for books on the device."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1466
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1467
msgid "Error talking to device"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1467
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1468
msgid "There was a temporary error talking to the device. Please unplug and reconnect the device and or reboot."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1484
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1499
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1485
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1500
msgid "Conversion Error"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1485
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1486
msgid "<p>Could not convert: %s<p>It is a <a href=\"%s\">DRM</a>ed book. You must first remove the DRM using 3rd party tools."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1500
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1501
msgid "<b>Failed</b>"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1525
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1526
msgid "Invalid library location"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1526
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1527
msgid "Could not access %s. Using %s as the library."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1574
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1575
msgid "is the result of the efforts of many volunteers from all over the world. If you find it useful, please consider donating to support its development."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1598
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1599
msgid "There are active jobs. Are you sure you want to quit?"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1601
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1602
msgid ""
" is communicating with the device!<br>\n"
" Quitting may cause corruption on the device.<br>\n"
" Are you sure you want to quit?"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1605
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1606
msgid "WARNING: Active jobs"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1654
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1655
msgid "will keep running in the system tray. To close it, choose <b>Quit</b> in the context menu of the system tray."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1673
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1674
msgid "<span style=\"color:red; font-weight:bold\">Latest version: <a href=\"%s\">%s</a></span>"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1681
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1682
msgid "Update available"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1682
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1683
msgid "%s has been updated to version %s. See the <a href=\"http://calibre.kovidgoyal.net/wiki/Changelog\">new features</a>. Visit the download page?"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1700
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1701
msgid "Use the library located at the specified path."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1702
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1703
msgid "Start minimized to system tray."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1704
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1705
msgid "Log debugging information to console"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1747
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1753
msgid "If you are sure it is not running"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1749
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1755
msgid "Cannot Start "
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1750
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1756
msgid "%s is already running."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1753
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1759
msgid "may be running in the system tray, in the"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1755
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1761
msgid "upper right region of the screen."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1757
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1763
msgid "lower right region of the screen."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1760
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1766
msgid "try rebooting your computer."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1762
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1782
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1768
#: /home/kovid/work/calibre/src/calibre/gui2/main.py:1788
msgid "try deleting the file"
msgstr ""
@ -5122,7 +5150,7 @@ msgid "Options to customize the ebook viewer"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/documentview.py:57
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:629
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:630
msgid "Remember last used window size"
msgstr ""
@ -5227,19 +5255,19 @@ msgstr ""
msgid "DRM Error"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:546
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:547
msgid "Could not open ebook"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:619
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:620
msgid "Options to control the ebook viewer"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:626
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:627
msgid "If specified, viewer window will try to come to the front when started."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:635
#: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:636
msgid ""
"%prog [options] file\n"
"\n"
@ -5350,39 +5378,39 @@ msgstr ""
msgid "Click to see the list of books on storage card B in your reader"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:35
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:36
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:119
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:120
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:37
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:127
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:128
msgid "Default"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:325
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:333
msgid "Moving library..."
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:341
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:342
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:349
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:350
msgid "Failed to move library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:351
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:359
msgid "Copied"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:395
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:403
msgid "Invalid database"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:396
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:404
msgid "<p>An invalid library already exists at %s, delete it before trying to move the existing library.<br>Error: %s"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:407
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:415
msgid "Could not move library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:466
#: /home/kovid/work/calibre/src/calibre/gui2/wizard/__init__.py:474
msgid "welcome wizard"
msgstr ""
@ -5863,10 +5891,6 @@ msgstr ""
msgid "The priority of worker processes"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/fontconfig.py:180
msgid "Could not initialize the fontconfig library"
msgstr ""
#: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:39
msgid "Waiting..."
msgstr ""

View File

@ -1,400 +0,0 @@
#!/usr/bin/env python
__license__ = 'GPL v3'
__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net'
__docformat__ = 'restructuredtext en'
'''
:mod:`fontconfig` -- Query system fonts
=============================================
.. module:: fontconfig
:platform: Unix, Windows, OS X
:synopsis: Query system fonts
.. moduleauthor:: Kovid Goyal <kovid@kovidgoyal.net>
A ctypes based wrapper around the `fontconfig <http://fontconfig.org>`_ library.
It can be used to find all fonts available on the system as well as the closest
match to a given font specification. The main functions in this module are:
.. autofunction:: find_font_families
.. autofunction:: files_for_family
.. autofunction:: match
'''
import sys, os, locale, codecs, subprocess, re
from ctypes import cdll, c_void_p, Structure, c_int, POINTER, c_ubyte, c_char, util, \
pointer, byref, create_string_buffer, Union, c_char_p, c_double
try:
preferred_encoding = locale.getpreferredencoding()
codecs.lookup(preferred_encoding)
except:
preferred_encoding = 'utf-8'
iswindows = 'win32' in sys.platform or 'win64' in sys.platform
isosx = 'darwin' in sys.platform
isbsd = 'bsd' in sys.platform
DISABLED = False
#if isosx:
# libc = ctypes.cdll.LoadLibrary(ctypes.util.find_library('c'))
# size = ctypes.c_uint(0)
# ok = libc.sysctlbyname("hw.cpu64bit_capable", None, byref(size), None, 0)
# if ok != 0:
# is64bit = False
# else:
# buf = ctypes.c_char_p("\0" * size.value)
# ok = libc.sysctlbyname("hw.cpu64bit_capable", buf, byref(size), None, 0)
# if ok != 0:
# is64bit = False
# else:
# is64bit = '1' in buf.value
# DISABLED = is64bit
def load_library():
if isosx:
lib = os.path.join(getattr(sys, 'frameworks_dir'), 'libfontconfig.1.dylib') \
if hasattr(sys, 'frameworks_dir') else util.find_library('fontconfig')
return cdll.LoadLibrary(lib)
elif iswindows:
return cdll.LoadLibrary('libfontconfig-1')
elif isbsd:
raw = subprocess.Popen('pkg-config --libs-only-L fontconfig'.split(),
stdout=subprocess.PIPE).stdout.read().strip()
match = re.search(r'-L([^\s,]+)', raw)
if not match:
return cdll.LoadLibrary('libfontconfig.so')
return cdll.LoadLibrary(match.group(1)+'/libfontconfig.so')
else:
try:
return cdll.LoadLibrary(util.find_library('fontconfig'))
except:
try:
return cdll.LoadLibrary('libfontconfig.so')
except:
return cdll.LoadLibrary('libfontconfig.so.1')
class FcPattern(Structure):
_fields_ = [
('num', c_int),
('size', c_int),
('elts_offset', c_void_p),
('ref', c_int)
]
class FcFontSet(Structure):
_fields_ = [
('nfont', c_int),
('sfont', c_int),
('fonts', POINTER(POINTER(FcPattern)))
]
(
FcTypeVoid,
FcTypeInteger,
FcTypeDouble,
FcTypeString,
FcTypeBool,
FcTypeMatrix,
FcTypeCharSet,
FcTypeFTFace,
FcTypeLangSet
) = map(c_int, range(9))
(FcMatchPattern, FcMatchFont, FcMatchScan) = map(c_int, range(3))
(
FcResultMatch, FcResultNoMatch, FcResultTypeMismatch, FcResultNoId,
FcResultOutOfMemory
) = map(c_int, range(5))
FcFalse, FcTrue = c_int(0), c_int(1)
class _FcValue(Union):
_fields_ = [
('s', c_char_p),
('i', c_int),
('b', c_int),
('d', c_double),
]
class FcValue(Structure):
_fields_ = [
('type', c_int),
('u', _FcValue)
]
class FcObjectSet(Structure): pass
lib = load_library()
lib.FcPatternBuild.restype = POINTER(FcPattern)
lib.FcPatternCreate.restype = c_void_p
lib.FcObjectSetCreate.restype = POINTER(FcObjectSet)
lib.FcFontSetDestroy.argtypes = [POINTER(FcFontSet)]
lib.FcFontList.restype = POINTER(FcFontSet)
lib.FcNameUnparse.argtypes = [POINTER(FcPattern)]
lib.FcNameUnparse.restype = POINTER(c_ubyte)
lib.FcPatternGetString.argtypes = [POINTER(FcPattern), POINTER(c_char), c_int, c_void_p]
lib.FcPatternGetString.restype = c_int
lib.FcPatternAdd.argtypes = [c_void_p, POINTER(c_char), FcValue, c_int]
lib.FcPatternGetInteger.argtypes = [POINTER(FcPattern), POINTER(c_char), c_int, POINTER(c_int)]
lib.FcPatternGetInteger.restype = c_int
lib.FcNameParse.argtypes = [c_char_p]
lib.FcNameParse.restype = POINTER(FcPattern)
lib.FcDefaultSubstitute.argtypes = [POINTER(FcPattern)]
lib.FcConfigSubstitute.argtypes = [c_void_p, POINTER(FcPattern), c_int]
lib.FcFontSetCreate.restype = POINTER(FcFontSet)
lib.FcFontMatch.argtypes = [c_void_p, POINTER(FcPattern), POINTER(c_int)]
lib.FcFontMatch.restype = POINTER(FcPattern)
lib.FcFontSetAdd.argtypes = [POINTER(FcFontSet), POINTER(FcPattern)]
lib.FcFontSort.argtypes = [c_void_p, POINTER(FcPattern), c_int, c_void_p, POINTER(c_int)]
lib.FcFontSort.restype = POINTER(FcFontSet)
lib.FcFontRenderPrepare.argtypes = [c_void_p, POINTER(FcPattern), POINTER(FcPattern)]
lib.FcFontRenderPrepare.restype = POINTER(FcPattern)
lib.FcConfigCreate.restype = c_void_p
lib.FcConfigSetCurrent.argtypes = [c_void_p]
lib.FcConfigSetCurrent.restype = c_int
lib.FcConfigParseAndLoad.argtypes = [c_void_p, POINTER(c_char), c_int]
lib.FcConfigParseAndLoad.restype = c_int
lib.FcConfigBuildFonts.argtypes = [c_void_p]
lib.FcConfigBuildFonts.restype = c_int
_init_error = None
_initialized = False
from threading import Thread
class FontScanner(Thread):
def run(self):
# Initialize the fontconfig library. This has to be done manually
# for the OS X bundle as it may have its own private fontconfig.
if getattr(sys, 'frameworks_dir', False):# and not os.path.exists('/usr/X11/lib/libfontconfig.1.dylib'):
config_dir = os.path.join(os.path.dirname(getattr(sys, 'frameworks_dir')), 'Resources', 'fonts')
if isinstance(config_dir, unicode):
config_dir = config_dir.encode(sys.getfilesystemencoding())
config = lib.FcConfigCreate()
if not lib.FcConfigParseAndLoad(config, os.path.join(config_dir, 'fonts.conf'), 1):
_init_error = 'Could not parse the fontconfig configuration'
return
if not lib.FcConfigBuildFonts(config):
_init_error = 'Could not build fonts'
return
if not lib.FcConfigSetCurrent(config):
_init_error = 'Could not set font config'
return
elif not lib.FcInit():
_init_error = _('Could not initialize the fontconfig library')
return
global _initialized
_initialized = True
if not DISABLED:
_scanner = FontScanner()
_scanner.start()
def join():
_scanner.join(120)
if _scanner.isAlive():
raise RuntimeError('Scanning for system fonts seems to have hung. Try again in a little while.')
if _init_error is not None:
raise RuntimeError(_init_error)
def find_font_families(allowed_extensions=['ttf', 'otf']):
'''
Return an alphabetically sorted list of font families available on the system.
`allowed_extensions`: A list of allowed extensions for font file types. Defaults to
`['ttf', 'otf']`. If it is empty, it is ignored.
'''
if DISABLED:
return []
join()
allowed_extensions = [i.lower() for i in allowed_extensions]
empty_pattern = lib.FcPatternCreate()
oset = lib.FcObjectSetCreate()
if not lib.FcObjectSetAdd(oset, 'file'):
raise RuntimeError('Allocation failure')
if not lib.FcObjectSetAdd(oset, 'family'):
raise RuntimeError('Allocation failure')
fs = lib.FcFontList(0, empty_pattern, oset)
font_set = fs.contents
file = pointer(create_string_buffer(chr(0), 5000))
family = pointer(create_string_buffer(chr(0), 200))
font_families = []
for i in range(font_set.nfont):
pat = font_set.fonts[i]
if lib.FcPatternGetString(pat, 'file', 0, byref(file)) != FcResultMatch.value:
raise RuntimeError('Error processing pattern')
path = str(file.contents.value)
ext = os.path.splitext(path)[1]
if ext:
ext = ext[1:].lower()
if (not allowed_extensions) or (allowed_extensions and ext in allowed_extensions):
if lib.FcPatternGetString(pat, 'family', 0, byref(family)) != FcResultMatch.value:
raise RuntimeError('Error processing pattern')
font_families.append(str(family.contents.value))
lib.FcObjectSetDestroy(oset)
lib.FcPatternDestroy(empty_pattern)
lib.FcFontSetDestroy(fs)
font_families = list(set(font_families))
font_families.sort()
return font_families
def files_for_family(family, normalize=True):
'''
Find all the variants in the font family `family`.
Returns a dictionary of tuples. Each tuple is of the form (Full font name, path to font file).
The keys of the dictionary depend on `normalize`. If `normalize` is `False`,
they are a tuple (slant, weight) otherwise they are strings from the set
`('normal', 'bold', 'italic', 'bi', 'light', 'li')`
'''
if DISABLED:
return {}
join()
if isinstance(family, unicode):
family = family.encode(preferred_encoding)
family_pattern = lib.FcPatternBuild(0, 'family', FcTypeString, family, None)
if not family_pattern:
raise RuntimeError('Allocation failure')
#lib.FcPatternPrint(family_pattern)
oset = lib.FcObjectSetCreate()
if not lib.FcObjectSetAdd(oset, 'file'):
raise RuntimeError('Allocation failure')
if not lib.FcObjectSetAdd(oset, 'weight'):
raise RuntimeError('Allocation failure')
if not lib.FcObjectSetAdd(oset, 'fullname'):
raise RuntimeError('Allocation failure')
if not lib.FcObjectSetAdd(oset, 'slant'):
raise RuntimeError('Allocation failure')
if not lib.FcObjectSetAdd(oset, 'style'):
raise RuntimeError('Allocation failure')
fonts = {}
fs = lib.FcFontList(0, family_pattern, oset)
font_set = fs.contents
file = pointer(create_string_buffer(5000))
full_name = pointer(create_string_buffer(200))
weight = c_int(0)
slant = c_int(0)
fname = ''
for i in range(font_set.nfont):
pat = font_set.fonts[i]
#lib.FcPatternPrint(pat)
pat = font_set.fonts[i]
if lib.FcPatternGetString(pat, 'file', 0, byref(file)) != FcResultMatch.value:
raise RuntimeError('Error processing pattern')
if lib.FcPatternGetInteger(pat, 'weight', 0, byref(weight)) != FcResultMatch.value:
raise RuntimeError('Error processing pattern')
if lib.FcPatternGetString(pat, 'fullname', 0, byref(full_name)) != FcResultMatch.value:
if lib.FcPatternGetString(pat, 'fullname', 0, byref(full_name)) == FcResultNoMatch.value:
if lib.FcPatternGetString(pat, 'style', 0, byref(full_name)) != FcResultMatch.value:
raise RuntimeError('Error processing pattern')
fname = family + ' ' + full_name.contents.value
else:
raise RuntimeError('Error processing pattern')
else:
fname = full_name.contents.value
if lib.FcPatternGetInteger(pat, 'slant', 0, byref(slant)) != FcResultMatch.value:
raise RuntimeError('Error processing pattern')
style = (slant.value, weight.value)
if normalize:
italic = slant.value > 0
normal = weight.value == 80
bold = weight.value > 80
if italic:
style = 'italic' if normal else 'bi' if bold else 'li'
else:
style = 'normal' if normal else 'bold' if bold else 'light'
fonts[style] = (file.contents.value, fname)
lib.FcObjectSetDestroy(oset)
lib.FcPatternDestroy(family_pattern)
if not iswindows:
lib.FcFontSetDestroy(fs)
return fonts
def match(name, sort=False, verbose=False):
'''
Find the system font that most closely matches `name`, where `name` is a specification
of the form::
familyname-<pointsize>:<property1=value1>:<property2=value2>...
For example, `verdana:weight=bold:slant=italic`
Returns a list of dictionaries. Each dictionary has the keys: 'weight', 'slant', 'family', 'file'
`sort`: If `True` return a sorted list of matching fonts, where the sort id in order of
decreasing closeness of matching.
`verbose`: If `True` print debugging information to stdout
'''
if DISABLED:
return []
join()
if isinstance(name, unicode):
name = name.encode(preferred_encoding)
pat = lib.FcNameParse(name)
if not pat:
raise ValueError('Could not parse font name')
if verbose:
print 'Searching for pattern'
lib.FcPatternPrint(pat)
if not lib.FcConfigSubstitute(0, pat, FcMatchPattern):
raise RuntimeError('Allocation failure')
lib.FcDefaultSubstitute(pat)
fs = lib.FcFontSetCreate()
result = c_int(0)
matches = []
if sort:
font_patterns = lib.FcFontSort(0, pat, FcFalse, 0, byref(result))
if not font_patterns:
raise RuntimeError('Allocation failed')
fps = font_patterns.contents
for j in range(fps.nfont):
fpat = fps.fonts[j]
fp = lib.FcFontRenderPrepare(0, pat, fpat)
if fp:
lib.FcFontSetAdd(fs, fp)
lib.FcFontSetDestroy(font_patterns)
else:
match_pat = lib.FcFontMatch(0, pat, byref(result))
if pat:
lib.FcFontSetAdd(fs, match_pat)
if result.value != FcResultMatch.value:
lib.FcPatternDestroy(pat)
return matches
font_set = fs.contents
file = pointer(create_string_buffer(chr(0), 5000))
family = pointer(create_string_buffer(chr(0), 200))
weight = c_int(0)
slant = c_int(0)
for j in range(font_set.nfont):
fpat = font_set.fonts[j]
#lib.FcPatternPrint(fpat)
if lib.FcPatternGetString(fpat, 'file', 0, byref(file)) != FcResultMatch.value:
raise RuntimeError('Error processing pattern')
if lib.FcPatternGetString(fpat, 'family', 0, byref(family)) != FcResultMatch.value:
raise RuntimeError('Error processing pattern')
if lib.FcPatternGetInteger(fpat, 'weight', 0, byref(weight)) != FcResultMatch.value:
raise RuntimeError('Error processing pattern')
if lib.FcPatternGetInteger(fpat, 'slant', 0, byref(slant)) != FcResultMatch.value:
raise RuntimeError('Error processing pattern')
matches.append({
'file' : file.contents.value,
'family' : family.contents.value,
'weight' : weight.value,
'slant' : slant.value,
}
)
lib.FcPatternDestroy(pat)
lib.FcFontSetDestroy(fs)
return matches
def main(args=sys.argv):
print find_font_families()
if len(args) > 1:
print
print files_for_family(args[1])
print
print match(args[1], verbose=True)
return 0
if __name__ == '__main__':
sys.exit(main())

View File

@ -0,0 +1,150 @@
#!/usr/bin/env python
# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
from __future__ import with_statement
__license__ = 'GPL v3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en'
import os, sys
from threading import Thread
from calibre.constants import plugins
_fc, _fc_err = plugins['fontconfig']
if _fc is None:
raise RuntimeError('Failed to load fontconfig with error:'+_fc_err)
class FontConfig(Thread):
def __init__(self):
Thread.__init__(self)
self.daemon = True
self.failed = False
def run(self):
config = None
if getattr(sys, 'frameworks_dir', False):
config_dir = os.path.join(os.path.dirname(
getattr(sys, 'frameworks_dir')), 'Resources', 'fonts')
if isinstance(config_dir, unicode):
config_dir = config_dir.encode(sys.getfilesystemencoding())
config = os.path.join(config_dir, 'fonts.conf')
try:
_fc.initialize(config)
except:
import traceback
traceback.print_exc()
self.failed = True
def wait(self):
self.join()
if self.failed:
raise RuntimeError('Failed to initialize fontconfig')
def find_font_families(self, allowed_extensions=['ttf', 'otf']):
'''
Return an alphabetically sorted list of font families available on the system.
`allowed_extensions`: A list of allowed extensions for font file types. Defaults to
`['ttf', 'otf']`. If it is empty, it is ignored.
'''
self.wait()
ans = _fc.find_font_families([bytes('.'+x) for x in allowed_extensions])
ans = sorted(set(ans), cmp=lambda x,y:cmp(x.lower(), y.lower()))
ans2 = []
for x in ans:
try:
ans2.append(x.decode('utf-8'))
except UnicodeDecodeError:
continue
return ans2
def files_for_family(self, family, normalize=True):
'''
Find all the variants in the font family `family`.
Returns a dictionary of tuples. Each tuple is of the form (Full font name, path to font file).
The keys of the dictionary depend on `normalize`. If `normalize` is `False`,
they are a tuple (slant, weight) otherwise they are strings from the set
`('normal', 'bold', 'italic', 'bi', 'light', 'li')`
'''
self.wait()
if isinstance(family, unicode):
family = family.encode('utf-8')
fonts = {}
ofamily = str(family).decode('utf-8')
for fullname, path, style, nfamily, weight, slant in \
_fc.files_for_family(str(family)):
style = (slant, weight)
if normalize:
italic = slant > 0
normal = weight == 80
bold = weight > 80
if italic:
style = 'italic' if normal else 'bi' if bold else 'li'
else:
style = 'normal' if normal else 'bold' if bold else 'light'
try:
fullname, path = fullname.decode('utf-8'), path.decode('utf-8')
nfamily = nfamily.decode('utf-8')
except UnicodeDecodeError:
continue
if style in fonts:
if nfamily.lower().strip() == ofamily.lower().strip() \
and 'Condensed' not in fullname and 'ExtraLight' not in fullname:
fonts[style] = (path, fullname)
else:
fonts[style] = (path, fullname)
return fonts
def match(self, name, all=False, verbose=False):
'''
Find the system font that most closely matches `name`, where `name` is a specification
of the form::
familyname-<pointsize>:<property1=value1>:<property2=value2>...
For example, `verdana:weight=bold:slant=italic`
Returns a list of dictionaries, or a single dictionary.
Each dictionary has the keys:
'weight', 'slant', 'family', 'file', 'fullname', 'style'
`all`: If `True` return a sorted list of matching fonts, where the sort
is in order of decreasing closeness of matching. If `False` only the
best match is returned. '''
self.wait()
if isinstance(name, unicode):
name = name.encode('utf-8')
fonts = []
for fullname, path, style, family, weight, slant in \
_fc.match(str(name), bool(all), bool(verbose)):
try:
fullname = fullname.decode('utf-8')
path = path.decode('utf-8')
style = style.decode('utf-8')
family = family.decode('utf-8')
fonts.append({
'fullname' : fullname,
'path' : path,
'style' : style,
'family' : family,
'weight' : weight,
'slant' : slant
})
except UnicodeDecodeError:
continue
return fonts if all else (fonts[0] if fonts else None)
fontconfig = FontConfig()
fontconfig.start()
def test():
from pprint import pprint;
pprint(fontconfig.find_font_families());
pprint(fontconfig.files_for_family('liberation serif'));
pprint(fontconfig.match('liberation serif:slant=italic:weight=bold', verbose=True))
if __name__ == '__main__':
test()

View File

@ -0,0 +1,331 @@
/*
:mod:`fontconfig` -- Pythonic interface to fontconfig
=====================================================
.. module:: fontconfig
:platform: All
:synopsis: Pythonic interface to the fontconfig library
.. moduleauthor:: Kovid Goyal <kovid@kovidgoyal.net> Copyright 2009
*/
#define PY_SSIZE_T_CLEAN
#include <Python.h>
#include <stdio.h>
#include <string.h>
#include <fontconfig.h>
static PyObject *
fontconfig_initialize(PyObject *self, PyObject *args) {
char *path;
FcBool ok;
FcConfig *config;
PyThreadState *_save;
if (!PyArg_ParseTuple(args, "z", &path))
return NULL;
if (path == NULL) {
_save = PyEval_SaveThread();
ok = FcInit();
PyEval_RestoreThread(_save);
} else {
config = FcConfigCreate();
if (config == NULL) return PyErr_NoMemory();
_save = PyEval_SaveThread();
ok = FcConfigParseAndLoad(config, path, FcTrue);
if (ok) ok = FcConfigBuildFonts(config);
if (ok) ok = FcConfigSetCurrent(config);
PyEval_RestoreThread(_save);
if (!ok) return PyErr_NoMemory();
ok = 1;
}
if (ok) Py_RETURN_TRUE;
Py_RETURN_FALSE;
}
static
fontconfig_cleanup_find(FcPattern *p, FcObjectSet *oset, FcFontSet *fs) {
if (p != NULL) FcPatternDestroy(p);
if (oset != NULL) FcObjectSetDestroy(oset);
if (fs != NULL) FcFontSetDestroy(fs);
}
static PyObject *
fontconfig_find_font_families(PyObject *self, PyObject *args) {
int i;
size_t flen;
char *ext;
Py_ssize_t l, j, extlen;
FcBool ok;
FcPattern *pat, *temp;
FcObjectSet *oset;
FcFontSet *fs;
FcValue v, w;
PyObject *ans, *exts, *t;
ans = PyList_New(0);
fs = NULL; oset = NULL; pat = NULL;
if (ans == NULL) return PyErr_NoMemory();
if (!PyArg_ParseTuple(args, "O", &exts))
return NULL;
if (!PySequence_Check(exts)) {
PyErr_SetString(PyExc_ValueError, "Must pass sequence of extensions");
return NULL;
}
l = PySequence_Size(exts);
pat = FcPatternCreate();
if (pat == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
oset = FcObjectSetCreate();
if (oset == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (!FcObjectSetAdd(oset, FC_FILE)) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (!FcObjectSetAdd(oset, FC_FAMILY)) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
fs = FcFontList(FcConfigGetCurrent(), pat, oset);
if (fs == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
for (i = 0; i < fs->nfont; i++) {
temp = fs->fonts[i];
if (temp == NULL) continue;
if (FcPatternGet(temp, FC_FILE, 0, &v) != FcResultMatch) continue;
if (v.type == FcTypeString) {
flen = strlen((char *)v.u.s);
ok = FcFalse;
if (l == 0) ok = FcTrue;
for ( j = 0; j < l && !ok; j++) {
ext = PyBytes_AS_STRING(PySequence_ITEM(exts, j));
extlen = PyBytes_GET_SIZE(PySequence_ITEM(exts, j));
ok = flen > extlen && extlen > 0 &&
PyOS_strnicmp(ext, v.u.s + (flen - extlen), extlen) == 0;
}
if (ok) {
if (FcPatternGet(temp, FC_FAMILY, 0, &w) != FcResultMatch) continue;
if (w.type != FcTypeString) continue;
t = PyString_FromString(w.u.s);
if (t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (PyList_Append(ans, t) != 0)
{ fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
}
}
}
fontconfig_cleanup_find(pat, oset, fs);
Py_INCREF(ans);
return ans;
}
static PyObject *
fontconfig_files_for_family(PyObject *self, PyObject *args) {
char *family; int i;
FcPattern *pat, *tp;
FcObjectSet *oset;
FcFontSet *fs;
FcValue file, weight, fullname, style, slant, family2;
PyObject *ans, *temp, *t;
if (!PyArg_ParseTuple(args, "s", &family))
return NULL;
ans = PyList_New(0);
if (ans == NULL) return PyErr_NoMemory();
fs = NULL; oset = NULL; pat = NULL;
pat = FcPatternBuild(0, FC_FAMILY, FcTypeString, family, (char *) 0);
if (pat == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
oset = FcObjectSetCreate();
if (oset == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (!FcObjectSetAdd(oset, FC_FILE)) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (!FcObjectSetAdd(oset, FC_STYLE)) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (!FcObjectSetAdd(oset, FC_SLANT)) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (!FcObjectSetAdd(oset, FC_WEIGHT)) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (!FcObjectSetAdd(oset, FC_FAMILY)) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (!FcObjectSetAdd(oset, "fullname")) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
fs = FcFontList(FcConfigGetCurrent(), pat, oset);
if (fs == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
for (i = 0; i < fs->nfont; i++) {
tp = fs->fonts[i];
if (tp == NULL) continue;
if (FcPatternGet(tp, FC_FILE, 0, &file) != FcResultMatch) continue;
if (FcPatternGet(tp, FC_STYLE, 0, &style) != FcResultMatch) continue;
if (FcPatternGet(tp, FC_WEIGHT, 0, &weight) != FcResultMatch) continue;
if (FcPatternGet(tp, FC_SLANT, 0, &slant) != FcResultMatch) continue;
if (FcPatternGet(tp, FC_FAMILY, 0, &family2) != FcResultMatch) continue;
if (FcPatternGet(tp, "fullname", 0, &fullname) != FcResultMatch) continue;
temp = PyTuple_New(6);
if(temp == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
t = PyBytes_FromString(fullname.u.s);
if(t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
PyTuple_SET_ITEM(temp, 0, t);
t = PyBytes_FromString(file.u.s);
if(t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
PyTuple_SET_ITEM(temp, 1, t);
t = PyBytes_FromString(style.u.s);
if(t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
PyTuple_SET_ITEM(temp, 2, t);
t = PyBytes_FromString(family2.u.s);
if(t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
PyTuple_SET_ITEM(temp, 3, t);
t = PyInt_FromLong((long)weight.u.i);
if(t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
PyTuple_SET_ITEM(temp, 4, t);
t = PyInt_FromLong((long)slant.u.i);
if(t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
PyTuple_SET_ITEM(temp, 5, t);
if (PyList_Append(ans, temp) != 0)
{ fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
}
fontconfig_cleanup_find(pat, oset, fs);
Py_INCREF(ans);
return ans;
}
static PyObject *
fontconfig_match(PyObject *self, PyObject *args) {
char *namespec; int i;
FcPattern *pat, *tp;
FcObjectSet *oset;
FcFontSet *fs, *fs2;
FcValue file, weight, fullname, style, slant, family;
FcResult res;
PyObject *ans, *temp, *t, *all, *verbose;
if (!PyArg_ParseTuple(args, "sOO", &namespec, &all, &verbose))
return NULL;
ans = PyList_New(0);
if (ans == NULL) return PyErr_NoMemory();
fs = NULL; oset = NULL; pat = NULL; fs2 = NULL;
pat = FcNameParse(namespec);
if (pat == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (PyObject_IsTrue(verbose)) FcPatternPrint(pat);
if (!FcConfigSubstitute(FcConfigGetCurrent(), pat, FcMatchPattern))
{ fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
FcDefaultSubstitute(pat);
fs = FcFontSetCreate();
if (fs == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (PyObject_IsTrue(all)) {
fs2 = FcFontSort(FcConfigGetCurrent(), pat, FcTrue, NULL, &res);
if (fs2 == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
for (i = 0; i < fs2->nfont; i++) {
tp = fs2->fonts[i];
if (tp == NULL) continue;
tp = FcFontRenderPrepare(FcConfigGetCurrent(), pat, tp);
if (tp == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (!FcFontSetAdd(fs, tp))
{ fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
}
if (fs2 != NULL) FcFontSetDestroy(fs2);
} else {
tp = FcFontMatch(FcConfigGetCurrent(), pat, &res);
if (tp == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
if (!FcFontSetAdd(fs, tp))
{ fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
}
for (i = 0; i < fs->nfont; i++) {
tp = fs->fonts[i];
if (tp == NULL) continue;
if (FcPatternGet(tp, FC_FILE, 0, &file) != FcResultMatch) continue;
if (FcPatternGet(tp, FC_STYLE, 0, &style) != FcResultMatch) continue;
if (FcPatternGet(tp, FC_WEIGHT, 0, &weight) != FcResultMatch) continue;
if (FcPatternGet(tp, FC_SLANT, 0, &slant) != FcResultMatch) continue;
if (FcPatternGet(tp, FC_FAMILY, 0, &family) != FcResultMatch) continue;
if (FcPatternGet(tp, "fullname", 0, &fullname) != FcResultMatch) continue;
temp = PyTuple_New(6);
if(temp == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
t = PyBytes_FromString(fullname.u.s);
if(t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
PyTuple_SET_ITEM(temp, 0, t);
t = PyBytes_FromString(file.u.s);
if(t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
PyTuple_SET_ITEM(temp, 1, t);
t = PyBytes_FromString(style.u.s);
if(t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
PyTuple_SET_ITEM(temp, 2, t);
t = PyBytes_FromString(family.u.s);
if(t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
PyTuple_SET_ITEM(temp, 3, t);
t = PyInt_FromLong((long)weight.u.i);
if(t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
PyTuple_SET_ITEM(temp, 4, t);
t = PyInt_FromLong((long)slant.u.i);
if(t == NULL) { fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
PyTuple_SET_ITEM(temp, 5, t);
if (PyList_Append(ans, temp) != 0)
{ fontconfig_cleanup_find(pat, oset, fs); return PyErr_NoMemory(); }
}
fontconfig_cleanup_find(pat, oset, fs);
Py_INCREF(ans);
return ans;
}
static
PyMethodDef fontconfig_methods[] = {
{"initialize", fontconfig_initialize, METH_VARARGS,
"initialize(path_to_config_file)\n\n"
"Initialize the library. If path to config file is specified it is used instead of the "
"default configuration. Returns True iff the initialization succeeded."
},
{"find_font_families", fontconfig_find_font_families, METH_VARARGS,
"find_font_families(allowed_extensions)\n\n"
"Find all font families on the system for fonts of the specified types. If no "
"types are specified all font families are returned."
},
{"files_for_family", fontconfig_files_for_family, METH_VARARGS,
"files_for_family(family, normalize)\n\n"
"Find all the variants in the font family `family`. "
"Returns a list of tuples. Each tuple is of the form "
"(fullname, path, style, family, weight, slant). "
},
{"match", fontconfig_match, METH_VARARGS,
"match(namespec,all,verbose)\n\n"
"Find all system fonts that match namespec, in decreasing order "
"of closeness. "
"Returns a list of tuples. Each tuple is of the form "
"(fullname, path, style, family, weight, slant). "
},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC
initfontconfig(void) {
PyObject *m;
m = Py_InitModule3(
"fontconfig", fontconfig_methods,
"Find fonts."
);
if (m == NULL) return;
}

View File

@ -101,6 +101,10 @@ class Worker(object):
contents = os.path.join(self.osx_contents_dir, 'console.app', 'Contents')
resources = os.path.join(contents, 'Resources')
fd = os.path.join(contents, 'Frameworks')
sp = os.path.join(resources, 'lib', 'python'+sys.version[:3], 'site-packages.zip')
self.osx_prefix = 'import sys; sys.frameworks_dir = "%s"; sys.frozen = "macosx_app"; '%fd
self.osx_prefix += 'sys.path.insert(0, %s); '%repr(sp)
self._env['PYTHONHOME'] = resources
self._env['MAGICK_HOME'] = os.path.join(fd, 'ImageMagick')
self._env['DYLD_LIBRARY_PATH'] = os.path.join(fd, 'ImageMagick', 'lib')
@ -124,7 +128,7 @@ class Worker(object):
priority = prefs['worker_process_priority']
cmd = [exe]
if isosx:
cmd += ['-c', 'from calibre.utils.worker import main; main()']
cmd += ['-c', self.osx_prefix + 'from calibre.utils.ipc.worker import main; main()']
args = {
'env' : env,
'cwd' : _cwd,

View File

@ -32,8 +32,6 @@ class ClimateProgress(BasicNewsRecipe):
html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + '"'
remove_tags = [dict(name='a', attrs={'rel':'bookmark'})]
feeds = [(u'Posts', u'http://feeds.feedburner.com/climateprogress/lCrX')]
def preprocess_html(self, soup):

View File

@ -8,46 +8,37 @@ globeandmail.com
'''
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup
class GlobeAndMail(BasicNewsRecipe):
title = 'Globe and Mail'
__author__ = 'Kovid Goyal'
language = _('English')
oldest_article = 2.0
no_stylesheets = True
description = 'Canada\'s national newspaper'
keep_only_tags = [dict(id='content')]
remove_tags = [dict(attrs={'class':'nav'}), dict(id=['related', 'TPphoto', 'secondaryNav', 'articleBottomToolsHolder'])]
remove_tags_before = dict(id="article-top")
remove_tags = [
{'id':['util', 'article-tabs', 'comments', 'article-relations',
'gallery-controls', 'video', 'galleryLoading']},
]
remove_tags_after = dict(id='article-content')
def parse_index(self):
src = self.browser.open('http://www.theglobeandmail.com/frontpage/').read()
soup = BeautifulSoup(src)
feeds = []
articles = []
feed = 'Front Page'
for tag in soup.findAll(['h3', 'h4']):
if tag.name == 'h3':
a = tag.find('a', href=True)
if a is not None:
href = 'http://www.theglobeandmail.com' + a['href'].strip()
text = a.find(text=True)
if text:
text = text.strip()
desc = ''
summary = tag.findNextSiblings('p', attrs={'class':'summary'}, limit=1)
if summary:
desc = self.tag_to_string(summary[0], False)
articles.append({
'title': text,
'url' : href,
'desc' : desc,
'date' : '',
})
elif tag.name == 'h4':
if articles:
feeds.append((feed, articles))
articles = []
feed = self.tag_to_string(tag, False)
return feeds
feeds = [
('Latest headlines', 'http://www.theglobeandmail.com/?service=rss'),
('Top stories', 'http://www.theglobeandmail.com/?service=rss&feed=topstories'),
('National', 'http://www.theglobeandmail.com/news/national/?service=rss'),
('Politics', 'http://www.theglobeandmail.com/news/politics/?service=rss'),
('World', 'http://www.theglobeandmail.com/news/world/?service=rss'),
('Business', 'http://www.theglobeandmail.com/report-on-business/?service=rss'),
('Opinions', 'http://www.theglobeandmail.com/news/opinions/?service=rss'),
('Columnists', 'http://www.theglobeandmail.com/news/opinions/columnists/?service=rss'),
('Globe Investor', 'http://www.theglobeandmail.com/globe-investor/?service=rss'),
('Sports', 'http://www.theglobeandmail.com/sports/?service=rss'),
('Technology', 'http://www.theglobeandmail.com/news/technology/?service=rss'),
('Arts', 'http://www.theglobeandmail.com/news/arts/?service=rss'),
('Life', 'http://www.theglobeandmail.com/life/?service=rss'),
('Blogs', 'http://www.theglobeandmail.com/blogs/?service=rss'),
('Real Estate', 'http://www.theglobeandmail.com/real-estate/?service=rss'),
('Auto', 'http://www.theglobeandmail.com/auto/?service=rss'),
]

View File

@ -18,7 +18,7 @@ class SanFranciscoChronicle(BasicNewsRecipe):
no_stylesheets = True
use_embedded_content = False
keep_only_tags = [dict(name='td' , attrs={'class':'column1 w627'})]
remove_tags_before = {'class':'articleheadings'}
remove_tags_after = dict(name='div', attrs={'id':'articlecontent' })
remove_tags = [
dict(name='div', attrs={'class':'tools tools_top'})

3
todo
View File

@ -1,9 +1,6 @@
* Refactor web.fetch.simple to use per connection timeouts via the timeout kwarg for mechanize.open
* Rationalize books table. Add a pubdate column, remove the uri column (and associated support in add_books) and convert series_index to a float.
- test adding/recusrsize adding and adding of duplicates
* Testing framework
* MOBI navigation indexing support

View File

@ -707,6 +707,15 @@ class stage1(OptionlessCommand):
('upload_demo', None),
]
class betas(OptionlessCommand):
description = 'Build an upload beta builds to the servers'
sub_commands = [ ('update', None), ('stage2', None) ]
def run(self):
OptionlessCommand.run(self)
check_call('scp dist/* divok:'+BETAS, shell=True)
class upload(OptionlessCommand):
description = 'Build and upload calibre to the servers'