Тема: AHK: Сохранение HTML-файлов из браузера — в CHM
Скрипт компилирует HTML-файлы, открытые в браузере — в CHM, по клавише CapsLock + S. В приложенном архиве лежит с используемыми им hhc.exe и hha.dll.
Возник вопрос по кодировке текста для переменной %Html_Title_Name% (заголовок из тегов TITLE индексного HTML), который в default.hhp (в строку заголовка CHM-файла) попадает в нечитаемом виде. Как исправить?
SendMode Input
SetBatchLines, -1
#SingleInstance Force
;Рабочая папка (не для файлов из архива htm2chm.rar)
Chm_Tmp_Pth = C:\Chm_Tmp
CapsLock & sc1F:: ;CapsLock+S
IfNotExist, %Chm_Tmp_Pth% ;создаем временную папку CHM
FileCreateDir, %Chm_Tmp_Pth%
Else ;если она уже сущ — перед новой компиляцией очищаем её от всего
FileRecycle, %Chm_Tmp_Pth%\*
;открываем диалог (запоминаем имя) и сохраняем во временную папку CHM как index.html
Send, ^{sc1f} ; Ctrl+S
WinWait, ahk_class #32770,, 3
If ErrorLevel
Return
WinWaitActive, ahk_class #32770
WinActivate, ahk_class #32770
WinGet, f_window_id, ID, A
WinActivate ahk_id %f_window_id%
ControlGetText, 1Html_Title_Name, Edit1, ahk_id %f_window_id%
Sleep, 100
ControlSetText, Edit1, %Chm_Tmp_Pth%\index.html, ahk_id %f_window_id%
Sleep, 100
ControlSend, Edit1, {Enter}, ahk_id %f_window_id%
SplashImage,, FS12 B1 CT0000FF, Редактирую...
IfNotExist, %Chm_Tmp_Pth%\index.html
Sleep, 200
IfNotExist, %Chm_Tmp_Pth%\index.html
Sleep, 100
IfNotExist, %Chm_Tmp_Pth%\index.html
Sleep, 200
IfNotExist, %Chm_Tmp_Pth%\index.html
Sleep, 300
IfNotExist, %Chm_Tmp_Pth%\index.html
Sleep, 2000
FileRead, Index_Html, %Chm_Tmp_Pth%\index.html
if not ErrorLevel ; Загрузка успешна
{
Sleep, 100
Loop, 1
{ ; дописываем в индексный HTML, чтобы в CHM-файле потом блокировались ошибки сценариев:
StringReplace, Index_Html, Index_Html, <head>, <head><script type=`"text/javascript`">window.onerror=function`(`)`{return true`}</script>, All
}
FileDelete, %Chm_Tmp_Pth%\index.html
FileAppend, % Index_Html, %Chm_Tmp_Pth%\index.html
}
; обработка заголовка
Html_Title_Name := RegExReplace(Index_Html, "is).*<title>(.*)</title>.*", "$1")
Html_Title_Name := ComUnHTML(Html_Title_Name)
StringReplace, Html_Title_Name, Html_Title_Name, ", ', All ;программистск кавычек не должно быть
Html_Title_Name = %Html_Title_Name%
; обработка запрещ симв для названия
Chm_Name = %1Html_Title_Name%
Chm_Name := RegExReplace(Chm_Name, "^(.*?)\.(htm|html)$", "$1")
StringReplace, Chm_Name, Chm_Name, `:, `-, All
StringReplace, Chm_Name, Chm_Name, `?, `_, All
StringReplace, Chm_Name, Chm_Name, `<, `(, All
StringReplace, Chm_Name, Chm_Name, `>, `), All
StringReplace, Chm_Name, Chm_Name, `\, --, All
StringReplace, Chm_Name, Chm_Name, `/, --, All
StringReplace, Chm_Name, Chm_Name, `*, --, All
StringReplace, Chm_Name, Chm_Name, `|, --, All
Chm_Name := ComUnHTML(Chm_Name)
Chm_Name = %Chm_Name%
SplashImage, Off
; Диалог сохранения CHM-файла выводится перед подготовкой и компиляцией, для быстроты
FileSelectFile, Res_Chm, S, %Chm_Tmp_Pth%\%Chm_Name%.chm, Укажите путь для сохранения файла,
; список всех файлов и папок из временной папки (для файла hhp)
Loop, %Chm_Tmp_Pth%\*.* , 1, 1 ; (файлы-папки)
list .= A_LoopFileLongPath "`n"
Sort, list
hhp =
( LTrim Join
[OPTIONS]`n
Compatibility=1.1 or later`n
Compiled file=%Chm_Tmp_Pth%\%Chm_Name%.chm`n
Default window=main`n
Default topic=index.html`n
[WINDOWS]`n
main="%Html_Title_Name%",,,"index.html",,,,,,262432,,1056828,[10,10,810,610],,,3,1,,,0`n
[FILES]`n
%list%
)
FileAppend, % hhp, %Chm_Tmp_Pth%\default.hhp
IfNotExist, %Chm_Tmp_Pth%\default.hhp
Sleep, 100
IfNotExist, %Chm_Tmp_Pth%\default.hhp
Sleep, 100
IfNotExist, %Chm_Tmp_Pth%\default.hhp
Sleep, 100
IfNotExist, %Chm_Tmp_Pth%\default.hhp
Sleep, 100
IfNotExist, %Chm_Tmp_Pth%\default.hhp
Sleep, 100
IfNotExist, %Chm_Tmp_Pth%\default.hhp
Sleep, 300
SplashImage,, FS12 B1 CT0000FF, Компилирую...
RunWait, "%A_ScriptDir%\hhc.exe" "%Chm_Tmp_Pth%\default.hhp",, Hide
SplashImage, Off
; сохраняем по указанному пути
FileCopy, %Chm_Tmp_Pth%\%Chm_Name%.chm, %Res_Chm%
AllSubFlFldList =
Index_Html =
list =
hhp =
Return
ComUnHTML(html) {
oHTML := ComObjCreate("HtmlFile")
oHTML.write(html)
return oHTML.documentElement.innerText
}

