mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Fix #35. Move windows installer code into setup.py.
This commit is contained in:
parent
8775a98191
commit
b9314bcb25
181
installer.nsi
181
installer.nsi
@ -1,181 +0,0 @@
|
|||||||
SetCompressor lzma
|
|
||||||
ShowInstDetails show
|
|
||||||
ShowUnInstDetails show
|
|
||||||
|
|
||||||
;------------------------------------------------------------------------------------------------------
|
|
||||||
;Include Modern UI
|
|
||||||
!include "AddToPath.nsh"
|
|
||||||
!include "XPUI.nsh"
|
|
||||||
!define XPUI_SKIN "Windows XP"
|
|
||||||
|
|
||||||
;------------------------------------------------------------------------------------------------------
|
|
||||||
;Variables
|
|
||||||
Var STARTMENU_FOLDER
|
|
||||||
Var MUI_TEMP
|
|
||||||
|
|
||||||
!define PRODUCT_NAME "libprs500"
|
|
||||||
!define XPUI_BRANDINGTEXT "${PRODUCT_NAME} created by Kovid Goyal"
|
|
||||||
!define PRODUCT_VERSION "0.3.15"
|
|
||||||
!define WEBSITE "https://libprs500.kovidgoyal.net"
|
|
||||||
!define PY2EXE_DIR "C:\libprs500"
|
|
||||||
!define LIBUSB_DIR "C:\libusb-prs500"
|
|
||||||
!define LIBUNRAR_DIR "C:\Program Files\UnrarDLL"
|
|
||||||
!define QT_DIR "C:\Qt\4.2.3\bin"
|
|
||||||
|
|
||||||
;------------------------------------------------------------------------------------------------------
|
|
||||||
;General
|
|
||||||
|
|
||||||
;Name and file
|
|
||||||
Name "${PRODUCT_NAME}"
|
|
||||||
OutFile "dist\${PRODUCT_NAME}-${PRODUCT_VERSION}.exe"
|
|
||||||
|
|
||||||
;Default installation folder
|
|
||||||
InstallDir "$PROGRAMFILES\${PRODUCT_NAME}"
|
|
||||||
|
|
||||||
;Get installation folder from registry if available
|
|
||||||
InstallDirRegKey HKCU "Software\${PRODUCT_NAME}" ""
|
|
||||||
|
|
||||||
;Vista redirects $SMPROGRAMS to all users without this
|
|
||||||
RequestExecutionLevel admin
|
|
||||||
|
|
||||||
;------------------------------------------------------------------------------------------------------
|
|
||||||
;Interface Settings
|
|
||||||
|
|
||||||
!define MUI_HEADERIMAGE
|
|
||||||
!define MUI_HEADERIMAGE_BITMAP "icons\library.ico"
|
|
||||||
!define MUI_ABORTWARNING
|
|
||||||
|
|
||||||
;------------------------------------------------------------------------------------------------------
|
|
||||||
;Pages
|
|
||||||
|
|
||||||
!insertmacro MUI_PAGE_WELCOME
|
|
||||||
!insertmacro MUI_PAGE_LICENSE "LICENSE"
|
|
||||||
!insertmacro MUI_PAGE_COMPONENTS
|
|
||||||
!insertmacro MUI_PAGE_DIRECTORY
|
|
||||||
;Start Menu Folder Page Configuration
|
|
||||||
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU"
|
|
||||||
!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\${PRODUCT_NAME}"
|
|
||||||
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
|
|
||||||
|
|
||||||
!insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
|
|
||||||
!insertmacro MUI_PAGE_INSTFILES
|
|
||||||
|
|
||||||
!insertmacro MUI_UNPAGE_CONFIRM
|
|
||||||
!insertmacro MUI_UNPAGE_INSTFILES
|
|
||||||
!insertmacro MUI_UNPAGE_FINISH
|
|
||||||
;------------------------------------------------------------------------------------------------------
|
|
||||||
;Languages
|
|
||||||
|
|
||||||
!insertmacro MUI_LANGUAGE "English"
|
|
||||||
;------------------------------------------------------------------------------------------------------
|
|
||||||
;Installer Sections
|
|
||||||
|
|
||||||
Function .onInit
|
|
||||||
; Prevent multiple instances of the installer from running
|
|
||||||
System::Call 'kernel32::CreateMutexA(i 0, i 0, t "${PRODUCT_NAME}-setup") i .r1 ?e'
|
|
||||||
Pop $R0
|
|
||||||
|
|
||||||
StrCmp $R0 0 +3
|
|
||||||
MessageBox MB_OK|MB_ICONEXCLAMATION "The installer is already running."
|
|
||||||
Abort
|
|
||||||
|
|
||||||
FunctionEnd
|
|
||||||
|
|
||||||
|
|
||||||
Section "libprs500" Seclibprs500
|
|
||||||
|
|
||||||
SetOutPath "$INSTDIR"
|
|
||||||
|
|
||||||
;ADD YOUR OWN FILES HERE...
|
|
||||||
File /r "${PY2EXE_DIR}\*"
|
|
||||||
; The next line can be commented out once py2exe starts including QtSvg.dll
|
|
||||||
File "${QT_DIR}\QtSvg4.dll"
|
|
||||||
|
|
||||||
SetOutPath "$INSTDIR\driver"
|
|
||||||
File "${LIBUSB_DIR}\*.dll"
|
|
||||||
File "${LIBUSB_DIR}\*.sys"
|
|
||||||
File "${LIBUSB_DIR}\*.cat"
|
|
||||||
File "${LIBUSB_DIR}\*.inf"
|
|
||||||
|
|
||||||
SetOutPath "$SYSDIR"
|
|
||||||
File "${LIBUSB_DIR}\libusb0.dll"
|
|
||||||
File "${LIBUNRAR_DIR}\unrar.dll"
|
|
||||||
DetailPrint " "
|
|
||||||
|
|
||||||
DetailPrint "Installing USB driver (this may take a few seconds) ..."
|
|
||||||
ExecWait '"rundll32" libusb0.dll,usb_install_driver_np_rundll "$INSTDIR\driver\prs500.inf"' $0
|
|
||||||
DetailPrint "rundll32 returned exit code $0"
|
|
||||||
IfErrors 0 +2
|
|
||||||
MessageBox MB_OK 'You may need to run the following at the console in order for the SONY Reader to be detected:\r\n"rundll32" libusb0.dll,usb_install_driver_np_rundll "$INSTDIR\driver\prs500.inf"'
|
|
||||||
DetailPrint " "
|
|
||||||
|
|
||||||
|
|
||||||
;Store installation folder
|
|
||||||
WriteRegStr HKCU "Software\${PRODUCT_NAME}" "" $INSTDIR
|
|
||||||
|
|
||||||
;Create uninstaller
|
|
||||||
WriteUninstaller "$INSTDIR\Uninstall.exe"
|
|
||||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
|
|
||||||
"DisplayName" "${PRODUCT_NAME} -- E-book management software"
|
|
||||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
|
|
||||||
"UninstallString" "$INSTDIR\Uninstall.exe"
|
|
||||||
|
|
||||||
SetOutPath "$INSTDIR"
|
|
||||||
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
|
|
||||||
|
|
||||||
;Create shortcuts
|
|
||||||
WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${WEBSITE}"
|
|
||||||
CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER"
|
|
||||||
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\libprs500.lnk" "$INSTDIR\prs500-gui.exe"
|
|
||||||
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
|
|
||||||
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
|
|
||||||
CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\prs500-gui.exe"
|
|
||||||
|
|
||||||
!insertmacro MUI_STARTMENU_WRITE_END
|
|
||||||
|
|
||||||
;Add the installation directory to PATH for the commandline tools
|
|
||||||
Push "$INSTDIR"
|
|
||||||
Call AddToPath
|
|
||||||
|
|
||||||
SectionEnd
|
|
||||||
;------------------------------------------------------------------------------------------------------
|
|
||||||
;Descriptions
|
|
||||||
|
|
||||||
;Language strings
|
|
||||||
LangString DESC_Seclibprs500 ${LANG_ENGLISH} "The GUI and command-line tools for working with ebooks"
|
|
||||||
|
|
||||||
;Assign language strings to sections
|
|
||||||
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
|
|
||||||
!insertmacro MUI_DESCRIPTION_TEXT ${Seclibprs500} $(DESC_Seclibprs500)
|
|
||||||
!insertmacro MUI_FUNCTION_DESCRIPTION_END
|
|
||||||
;------------------------------------------------------------------------------------------------------
|
|
||||||
;Uninstaller Section
|
|
||||||
|
|
||||||
Section "Uninstall"
|
|
||||||
;ADD YOUR OWN FILES HERE...
|
|
||||||
RMDir /r "$INSTDIR"
|
|
||||||
!insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP
|
|
||||||
RMDir /r "$SMPROGRAMS\$MUI_TEMP"
|
|
||||||
;Delete empty start menu parent diretories
|
|
||||||
StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP"
|
|
||||||
|
|
||||||
startMenuDeleteLoop:
|
|
||||||
ClearErrors
|
|
||||||
RMDir $MUI_TEMP
|
|
||||||
GetFullPathName $MUI_TEMP "$MUI_TEMP\.."
|
|
||||||
|
|
||||||
IfErrors startMenuDeleteLoopDone
|
|
||||||
|
|
||||||
StrCmp $MUI_TEMP $SMPROGRAMS startMenuDeleteLoopDone startMenuDeleteLoop
|
|
||||||
startMenuDeleteLoopDone:
|
|
||||||
Delete "$DESKTOP\${PRODUCT_NAME}.lnk"
|
|
||||||
|
|
||||||
DeleteRegKey /ifempty HKCU "Software\${PRODUCT_NAME}"
|
|
||||||
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
|
|
||||||
; Remove installation directory from PATH
|
|
||||||
Push "$INSTDIR"
|
|
||||||
Call un.RemoveFromPath
|
|
||||||
|
|
||||||
SectionEnd
|
|
||||||
|
|
||||||
|
|
193
setup.py
193
setup.py
@ -25,14 +25,7 @@ from setuptools import setup, find_packages
|
|||||||
################################# py2exe #######################################
|
################################# py2exe #######################################
|
||||||
py2exe_options = {}
|
py2exe_options = {}
|
||||||
if sys.argv[1] == 'py2exe':
|
if sys.argv[1] == 'py2exe':
|
||||||
py2exe_dir = 'C:\libprs500'
|
py2exe_dir = 'C:\libprs500'
|
||||||
f = open('installer.nsi', 'r+')
|
|
||||||
src = f.read()
|
|
||||||
f.seek(0)
|
|
||||||
src = re.sub('(define PRODUCT_VERSION).*', r'\1 "'+VERSION+'"', src)
|
|
||||||
src = re.sub('(define PY2EXE_DIR).*', r'\1 "'+py2exe_dir+'"', src)
|
|
||||||
f.write(src)
|
|
||||||
f.close()
|
|
||||||
try:
|
try:
|
||||||
import py2exe
|
import py2exe
|
||||||
console = [
|
console = [
|
||||||
@ -55,6 +48,190 @@ if sys.argv[1] == 'py2exe':
|
|||||||
except ImportError:
|
except ImportError:
|
||||||
print >>sys.stderr, 'Must be in Windows to run py2exe'
|
print >>sys.stderr, 'Must be in Windows to run py2exe'
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
installer = \
|
||||||
|
'''
|
||||||
|
SetCompressor lzma
|
||||||
|
ShowInstDetails show
|
||||||
|
ShowUnInstDetails show
|
||||||
|
|
||||||
|
;------------------------------------------------------------------------------------------------------
|
||||||
|
;Include Modern UI
|
||||||
|
!include "AddToPath.nsh"
|
||||||
|
!include "XPUI.nsh"
|
||||||
|
!define XPUI_SKIN "Windows XP"
|
||||||
|
|
||||||
|
;------------------------------------------------------------------------------------------------------
|
||||||
|
;Variables
|
||||||
|
Var STARTMENU_FOLDER
|
||||||
|
Var MUI_TEMP
|
||||||
|
|
||||||
|
!define PRODUCT_NAME "libprs500"
|
||||||
|
!define XPUI_BRANDINGTEXT "${PRODUCT_NAME} created by Kovid Goyal"
|
||||||
|
!define PRODUCT_VERSION "'''+VERSION+'''"
|
||||||
|
!define WEBSITE "https://libprs500.kovidgoyal.net"
|
||||||
|
!define PY2EXE_DIR "C:\libprs500"
|
||||||
|
!define LIBUSB_DIR "C:\libusb-prs500"
|
||||||
|
!define LIBUNRAR_DIR "C:\Program Files\UnrarDLL"
|
||||||
|
!define QT_DIR "C:\Qt\4.2.3\bin"
|
||||||
|
|
||||||
|
;------------------------------------------------------------------------------------------------------
|
||||||
|
;General
|
||||||
|
|
||||||
|
;Name and file
|
||||||
|
Name "${PRODUCT_NAME}"
|
||||||
|
OutFile "dist\${PRODUCT_NAME}-${PRODUCT_VERSION}.exe"
|
||||||
|
|
||||||
|
;Default installation folder
|
||||||
|
InstallDir "$PROGRAMFILES\${PRODUCT_NAME}"
|
||||||
|
|
||||||
|
;Get installation folder from registry if available
|
||||||
|
InstallDirRegKey HKCU "Software\${PRODUCT_NAME}" ""
|
||||||
|
|
||||||
|
;Vista redirects $SMPROGRAMS to all users without this
|
||||||
|
RequestExecutionLevel admin
|
||||||
|
|
||||||
|
;------------------------------------------------------------------------------------------------------
|
||||||
|
;Interface Settings
|
||||||
|
|
||||||
|
!define MUI_HEADERIMAGE
|
||||||
|
!define MUI_HEADERIMAGE_BITMAP "icons\library.ico"
|
||||||
|
!define MUI_ABORTWARNING
|
||||||
|
|
||||||
|
;------------------------------------------------------------------------------------------------------
|
||||||
|
;Pages
|
||||||
|
|
||||||
|
!insertmacro MUI_PAGE_WELCOME
|
||||||
|
!insertmacro MUI_PAGE_LICENSE "LICENSE"
|
||||||
|
!insertmacro MUI_PAGE_COMPONENTS
|
||||||
|
!insertmacro MUI_PAGE_DIRECTORY
|
||||||
|
;Start Menu Folder Page Configuration
|
||||||
|
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU"
|
||||||
|
!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\${PRODUCT_NAME}"
|
||||||
|
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
|
||||||
|
|
||||||
|
!insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
|
||||||
|
!insertmacro MUI_PAGE_INSTFILES
|
||||||
|
|
||||||
|
!insertmacro MUI_UNPAGE_CONFIRM
|
||||||
|
!insertmacro MUI_UNPAGE_INSTFILES
|
||||||
|
!insertmacro MUI_UNPAGE_FINISH
|
||||||
|
;------------------------------------------------------------------------------------------------------
|
||||||
|
;Languages
|
||||||
|
|
||||||
|
!insertmacro MUI_LANGUAGE "English"
|
||||||
|
;------------------------------------------------------------------------------------------------------
|
||||||
|
;Installer Sections
|
||||||
|
|
||||||
|
Function .onInit
|
||||||
|
; Prevent multiple instances of the installer from running
|
||||||
|
System::Call 'kernel32::CreateMutexA(i 0, i 0, t "${PRODUCT_NAME}-setup") i .r1 ?e'
|
||||||
|
Pop $R0
|
||||||
|
|
||||||
|
StrCmp $R0 0 +3
|
||||||
|
MessageBox MB_OK|MB_ICONEXCLAMATION "The installer is already running."
|
||||||
|
Abort
|
||||||
|
|
||||||
|
FunctionEnd
|
||||||
|
|
||||||
|
|
||||||
|
Section "libprs500" Seclibprs500
|
||||||
|
|
||||||
|
SetOutPath "$INSTDIR"
|
||||||
|
|
||||||
|
;ADD YOUR OWN FILES HERE...
|
||||||
|
File /r "${PY2EXE_DIR}\*"
|
||||||
|
; The next line can be commented out once py2exe starts including QtSvg.dll
|
||||||
|
File "${QT_DIR}\QtSvg4.dll"
|
||||||
|
|
||||||
|
SetOutPath "$INSTDIR\driver"
|
||||||
|
File "${LIBUSB_DIR}\*.dll"
|
||||||
|
File "${LIBUSB_DIR}\*.sys"
|
||||||
|
File "${LIBUSB_DIR}\*.cat"
|
||||||
|
File "${LIBUSB_DIR}\*.inf"
|
||||||
|
|
||||||
|
SetOutPath "$SYSDIR"
|
||||||
|
File "${LIBUSB_DIR}\libusb0.dll"
|
||||||
|
File "${LIBUNRAR_DIR}\unrar.dll"
|
||||||
|
DetailPrint " "
|
||||||
|
|
||||||
|
DetailPrint "Installing USB driver (this may take a few seconds) ..."
|
||||||
|
ExecWait '"rundll32" libusb0.dll,usb_install_driver_np_rundll "$INSTDIR\driver\prs500.inf"' $0
|
||||||
|
DetailPrint "rundll32 returned exit code $0"
|
||||||
|
IfErrors 0 +2
|
||||||
|
MessageBox MB_OK 'You may need to run the following at the console in order for the SONY Reader to be detected:\r\n"rundll32" libusb0.dll,usb_install_driver_np_rundll "$INSTDIR\driver\prs500.inf"'
|
||||||
|
DetailPrint " "
|
||||||
|
|
||||||
|
|
||||||
|
;Store installation folder
|
||||||
|
WriteRegStr HKCU "Software\${PRODUCT_NAME}" "" $INSTDIR
|
||||||
|
|
||||||
|
;Create uninstaller
|
||||||
|
WriteUninstaller "$INSTDIR\Uninstall.exe"
|
||||||
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
|
||||||
|
"DisplayName" "${PRODUCT_NAME} -- E-book management software"
|
||||||
|
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
|
||||||
|
"UninstallString" "$INSTDIR\Uninstall.exe"
|
||||||
|
|
||||||
|
SetOutPath "$INSTDIR"
|
||||||
|
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
|
||||||
|
|
||||||
|
;Create shortcuts
|
||||||
|
WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${WEBSITE}"
|
||||||
|
CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER"
|
||||||
|
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\libprs500.lnk" "$INSTDIR\prs500-gui.exe"
|
||||||
|
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
|
||||||
|
CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
|
||||||
|
CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\prs500-gui.exe"
|
||||||
|
|
||||||
|
!insertmacro MUI_STARTMENU_WRITE_END
|
||||||
|
|
||||||
|
;Add the installation directory to PATH for the commandline tools
|
||||||
|
Push "$INSTDIR"
|
||||||
|
Call AddToPath
|
||||||
|
|
||||||
|
SectionEnd
|
||||||
|
;------------------------------------------------------------------------------------------------------
|
||||||
|
;Descriptions
|
||||||
|
|
||||||
|
;Language strings
|
||||||
|
LangString DESC_Seclibprs500 ${LANG_ENGLISH} "The GUI and command-line tools for working with ebooks"
|
||||||
|
|
||||||
|
;Assign language strings to sections
|
||||||
|
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
|
||||||
|
!insertmacro MUI_DESCRIPTION_TEXT ${Seclibprs500} $(DESC_Seclibprs500)
|
||||||
|
!insertmacro MUI_FUNCTION_DESCRIPTION_END
|
||||||
|
;------------------------------------------------------------------------------------------------------
|
||||||
|
;Uninstaller Section
|
||||||
|
|
||||||
|
Section "Uninstall"
|
||||||
|
;ADD YOUR OWN FILES HERE...
|
||||||
|
RMDir /r "$INSTDIR"
|
||||||
|
!insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP
|
||||||
|
RMDir /r "$SMPROGRAMS\$MUI_TEMP"
|
||||||
|
;Delete empty start menu parent diretories
|
||||||
|
StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP"
|
||||||
|
|
||||||
|
startMenuDeleteLoop:
|
||||||
|
ClearErrors
|
||||||
|
RMDir $MUI_TEMP
|
||||||
|
GetFullPathName $MUI_TEMP "$MUI_TEMP\.."
|
||||||
|
|
||||||
|
IfErrors startMenuDeleteLoopDone
|
||||||
|
|
||||||
|
StrCmp $MUI_TEMP $SMPROGRAMS startMenuDeleteLoopDone startMenuDeleteLoop
|
||||||
|
startMenuDeleteLoopDone:
|
||||||
|
Delete "$DESKTOP\${PRODUCT_NAME}.lnk"
|
||||||
|
|
||||||
|
DeleteRegKey /ifempty HKCU "Software\${PRODUCT_NAME}"
|
||||||
|
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
|
||||||
|
; Remove installation directory from PATH
|
||||||
|
Push "$INSTDIR"
|
||||||
|
Call un.RemoveFromPath
|
||||||
|
|
||||||
|
SectionEnd
|
||||||
|
'''
|
||||||
|
f = open('installer.nsi', 'w').write(installer)
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ You may have to adjust the GROUP and the location of the rules file to
|
|||||||
suit your distribution.
|
suit your distribution.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__version__ = "0.3.16"
|
__version__ = "0.3.17"
|
||||||
__docformat__ = "epytext"
|
__docformat__ = "epytext"
|
||||||
__author__ = "Kovid Goyal <kovid@kovidgoyal.net>"
|
__author__ = "Kovid Goyal <kovid@kovidgoyal.net>"
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ class Span(_Span):
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def translate_attrs(d, font_delta=0):
|
def translate_attrs(d, font_delta=0, memory=None):
|
||||||
"""
|
"""
|
||||||
Receives a dictionary of html attributes and styles and returns
|
Receives a dictionary of html attributes and styles and returns
|
||||||
approximate Xylog equivalents in a new dictionary
|
approximate Xylog equivalents in a new dictionary
|
||||||
@ -184,10 +184,17 @@ class Span(_Span):
|
|||||||
if u[1] is not None:
|
if u[1] is not None:
|
||||||
t["sidemargin"] = str(u[1])
|
t["sidemargin"] = str(u[1])
|
||||||
else:
|
else:
|
||||||
print >>sys.stderr, 'Unhandled/malformed CSS key:', key, d[key]
|
report = True
|
||||||
|
if memory != None:
|
||||||
|
if key in memory:
|
||||||
|
report = False
|
||||||
|
else:
|
||||||
|
memory.append(key)
|
||||||
|
if report:
|
||||||
|
print >>sys.stderr, 'Unhandled/malformed CSS key:', key, d[key]
|
||||||
return t
|
return t
|
||||||
|
|
||||||
def __init__(self, ns, css, font_delta=0):
|
def __init__(self, ns, css, memory, font_delta=0):
|
||||||
src = ns.string if hasattr(ns, 'string') else str(ns)
|
src = ns.string if hasattr(ns, 'string') else str(ns)
|
||||||
src = re.sub(r'\s{2,}', ' ', src) # Remove multiple spaces
|
src = re.sub(r'\s{2,}', ' ', src) # Remove multiple spaces
|
||||||
for pat, repl in Span.rules:
|
for pat, repl in Span.rules:
|
||||||
@ -198,7 +205,7 @@ class Span(_Span):
|
|||||||
fs = css.pop('font-style')
|
fs = css.pop('font-style')
|
||||||
if fs.lower() == 'italic':
|
if fs.lower() == 'italic':
|
||||||
src = Italic(src)
|
src = Italic(src)
|
||||||
attrs = Span.translate_attrs(css, font_delta=font_delta)
|
attrs = Span.translate_attrs(css, font_delta=font_delta, memory=memory)
|
||||||
_Span.__init__(self, text=src, **attrs)
|
_Span.__init__(self, text=src, **attrs)
|
||||||
|
|
||||||
|
|
||||||
@ -260,6 +267,7 @@ class HTMLConverter(object):
|
|||||||
self.links_processed = False #: Whether links_processed has been called on this object
|
self.links_processed = False #: Whether links_processed has been called on this object
|
||||||
self.font_delta = font_delta
|
self.font_delta = font_delta
|
||||||
self.cover = cover
|
self.cover = cover
|
||||||
|
self.memory = [] #: Used to ensure that duplicate CSS unhandled erros are not reported
|
||||||
self.in_ol = False #: Flag indicating we're in an <ol> element
|
self.in_ol = False #: Flag indicating we're in an <ol> element
|
||||||
self.book = book #: The Book object representing a BBeB book
|
self.book = book #: The Book object representing a BBeB book
|
||||||
path = os.path.abspath(path)
|
path = os.path.abspath(path)
|
||||||
@ -372,7 +380,6 @@ class HTMLConverter(object):
|
|||||||
self.top = page.contents[0]
|
self.top = page.contents[0]
|
||||||
break
|
break
|
||||||
if not self.top.parent:
|
if not self.top.parent:
|
||||||
print self.top
|
|
||||||
raise ConversionError, 'Could not parse ' + self.file_name
|
raise ConversionError, 'Could not parse ' + self.file_name
|
||||||
|
|
||||||
|
|
||||||
@ -508,7 +515,7 @@ class HTMLConverter(object):
|
|||||||
self.current_block = TextBlock(TextStyle(align=align))
|
self.current_block = TextBlock(TextStyle(align=align))
|
||||||
self.current_para = Paragraph()
|
self.current_para = Paragraph()
|
||||||
try:
|
try:
|
||||||
self.current_para.append(Span(src, self.sanctify_css(css), \
|
self.current_para.append(Span(src, self.sanctify_css(css), self.memory,\
|
||||||
font_delta=self.font_delta))
|
font_delta=self.font_delta))
|
||||||
except ConversionError, err:
|
except ConversionError, err:
|
||||||
if self.verbose:
|
if self.verbose:
|
||||||
@ -584,7 +591,6 @@ class HTMLConverter(object):
|
|||||||
self.current_page.append(self.current_block)
|
self.current_page.append(self.current_block)
|
||||||
self.current_block = TextBlock()
|
self.current_block = TextBlock()
|
||||||
else:
|
else:
|
||||||
print 'yay'
|
|
||||||
found, marked = False, False
|
found, marked = False, False
|
||||||
for item in self.current_page.contents:
|
for item in self.current_page.contents:
|
||||||
if item == previous:
|
if item == previous:
|
||||||
@ -667,7 +673,7 @@ class HTMLConverter(object):
|
|||||||
lines = src.split('\n')
|
lines = src.split('\n')
|
||||||
for line in lines:
|
for line in lines:
|
||||||
try:
|
try:
|
||||||
self.current_para.append(Span(line, tag_css))
|
self.current_para.append(Span(line, tag_css, self.memory))
|
||||||
except ConversionError:
|
except ConversionError:
|
||||||
pass
|
pass
|
||||||
self.current_para.CR()
|
self.current_para.CR()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user