From b9314bcb25d2b63e85e97365d1ff08052eeb45e6 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 30 Apr 2007 21:43:50 +0000 Subject: [PATCH] Fix #35. Move windows installer code into setup.py. --- installer.nsi | 181 ----------------------- setup.py | 193 ++++++++++++++++++++++++- src/libprs500/__init__.py | 2 +- src/libprs500/lrf/html/convert_from.py | 22 ++- 4 files changed, 200 insertions(+), 198 deletions(-) delete mode 100644 installer.nsi diff --git a/installer.nsi b/installer.nsi deleted file mode 100644 index 7af62b4cfe..0000000000 --- a/installer.nsi +++ /dev/null @@ -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 - - diff --git a/setup.py b/setup.py index d9f240d52b..71ae98141f 100644 --- a/setup.py +++ b/setup.py @@ -25,14 +25,7 @@ from setuptools import setup, find_packages ################################# py2exe ####################################### py2exe_options = {} if sys.argv[1] == 'py2exe': - 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() + py2exe_dir = 'C:\libprs500' try: import py2exe console = [ @@ -55,6 +48,190 @@ if sys.argv[1] == 'py2exe': except ImportError: print >>sys.stderr, 'Must be in Windows to run py2exe' 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) + ################################################################################ diff --git a/src/libprs500/__init__.py b/src/libprs500/__init__.py index 5b8a0d20bc..abee4fd3c5 100644 --- a/src/libprs500/__init__.py +++ b/src/libprs500/__init__.py @@ -33,7 +33,7 @@ You may have to adjust the GROUP and the location of the rules file to suit your distribution. """ -__version__ = "0.3.16" +__version__ = "0.3.17" __docformat__ = "epytext" __author__ = "Kovid Goyal " diff --git a/src/libprs500/lrf/html/convert_from.py b/src/libprs500/lrf/html/convert_from.py index 8a44438017..c54f2bc5db 100644 --- a/src/libprs500/lrf/html/convert_from.py +++ b/src/libprs500/lrf/html/convert_from.py @@ -78,7 +78,7 @@ class Span(_Span): return result @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 approximate Xylog equivalents in a new dictionary @@ -184,10 +184,17 @@ class Span(_Span): if u[1] is not None: t["sidemargin"] = str(u[1]) 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 - 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 = re.sub(r'\s{2,}', ' ', src) # Remove multiple spaces for pat, repl in Span.rules: @@ -198,7 +205,7 @@ class Span(_Span): fs = css.pop('font-style') if fs.lower() == 'italic': 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) @@ -260,6 +267,7 @@ class HTMLConverter(object): self.links_processed = False #: Whether links_processed has been called on this object self.font_delta = font_delta 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
    element self.book = book #: The Book object representing a BBeB book path = os.path.abspath(path) @@ -372,7 +380,6 @@ class HTMLConverter(object): self.top = page.contents[0] break if not self.top.parent: - print self.top raise ConversionError, 'Could not parse ' + self.file_name @@ -508,7 +515,7 @@ class HTMLConverter(object): self.current_block = TextBlock(TextStyle(align=align)) self.current_para = Paragraph() 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)) except ConversionError, err: if self.verbose: @@ -584,7 +591,6 @@ class HTMLConverter(object): self.current_page.append(self.current_block) self.current_block = TextBlock() else: - print 'yay' found, marked = False, False for item in self.current_page.contents: if item == previous: @@ -667,7 +673,7 @@ class HTMLConverter(object): lines = src.split('\n') for line in lines: try: - self.current_para.append(Span(line, tag_css)) + self.current_para.append(Span(line, tag_css, self.memory)) except ConversionError: pass self.current_para.CR()