I have many old *.chm compiled help files on my computer and for some reason the help viewer is bust. I am considering writing (Python) code which will upgrade these *.chm files into ebooks. The first module is given here, it will run the Microsoft HTML Help executable (hh.exe) to decompile a *.chm file into its constituent html files all within working subdirectories in the %temp% folder.
Submitting to Code Review
I might very well complete a full application and place in github. This means I need to raise my Python standards and so I have submitted this module to codereview.stackexchange.com
The HelpFileDecompiler Python class
Here is the Python code
class HelpFileDecompiler(object):
_reg_clsid_ = "{4B388A08-8CAB-4568-AF78-47032744A368}"
_reg_progid_ = 'PythonInVBA.HelpFileDecompiler'
_public_methods_ = ['DecompileHelpFileMain']
def DecompileHelpFileMain(self, sHelpFile):
import os.path
eg = ", e.g. 'c:\\foo.chm'"
if not isinstance(sHelpFile, str):
raise Exception("sHelpFile needs to be a string" + eg)
if len(sHelpFile) == 0:
raise Exception("sHelpFile needs to be a non-null string" + eg)
if sHelpFile.lower()[-4:] != ".chm":
raise Exception("sHelpFile needs to end with '.chm' " + eg)
if not os.path.isfile(sHelpFile):
raise Exception("sHelpFile " + sHelpFile + " not found")
self.BuildTmpDirectory()
sCopiedFile = self.CopyChmFileToTempAppPath(sHelpFile)
self.DecompileHelpFile(sCopiedFile)
def BuildTmpDirectory(self):
import os
import os.path
sTempAppPath = os.path.join(os.environ['tmp'], 'HelpFileDecompiler')
if not os.path.isdir(sTempAppPath):
os.mkdir(sTempAppPath)
def CopyChmFileToTempAppPath(self, sHelpFile):
import shutil
import os.path
sDestFile = os.path.join(os.environ['tmp'], 'HelpFileDecompiler',
os.path.basename(sHelpFile))
shutil.copyfile(sHelpFile, sDestFile)
return sDestFile
def DecompileHelpFile(self, sHelpFile):
import win32api
import subprocess
import os.path
if not os.path.isfile(sHelpFile):
raise Exception("sHelpFile " + sHelpFile + " not found")
sDecompiledFolder = os.path.join(
os.environ['tmp'],
'HelpFileDecompiler',
os.path.basename(sHelpFile).split(".")[0])
if not os.path.isdir(sDecompiledFolder):
os.mkdir(sDecompiledFolder)
sHELPEXE = "C:\Windows\hh.exe"
if not os.path.isfile(sHELPEXE):
raise Exception("sHELPEXE " + sHELPEXE + " not found")
# Not allowed to quote arguments to HH.EXE
# so we take the short path to eliminate spaces
sHelpFileShort = win32api.GetShortPathName(sHelpFile)
sDecompiledFolderShort = win32api.GetShortPathName(sDecompiledFolder)
# so now we can run the decompiler
subprocess.run([sHELPEXE, '-decompile',
sDecompiledFolderShort, sHelpFileShort])
if __name__ == '__main__':
print ("Registering COM servers...")
import win32com.server.register
win32com.server.register.UseCommandLine(HelpFileDecompiler)
helpFile=("C:\\Program Files\\Microsoft Office 15\\root\\vfs\\"
"ProgramFilesCommonX86\\Microsoft Shared\\VBA\\VBA7.1\\"
"1033\\VBLR6.chm")
test = HelpFileDecompiler()
test.DecompileHelpFileMain(helpFile)
Here is some test VBA client code
Option Explicit
Sub Test()
Dim obj As Object
Set obj = VBA.CreateObject("PythonInVBA.HelpFileDecompiler")
obj.DecompileHelpFileMain "C:\Program Files\Microsoft Office 15\root\vfs\" & _
"ProgramFilesCommonX86\Microsoft Shared\VBA\VBA7.1\" & _
"1033\VBLR6.chm"
End Sub
No comments:
Post a Comment