Тема: HTA: Хранение ресурсов в HTA
Возникла необходимость хранить картинки в теле HTA документа. Проблем для систем с Internet Explorer >=8 вообще не возникает, используя DATA Uri можно хранить рисунок в BASE64 прямо в стиле документа:
.mystyle{
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAwklEQVRYhe3XXQqDMBhE0dtsIKvNwrOC+mIhTfNrlAzlm0eR4ShomFcI4U2WGGN+6Sfe++49d/S5O8tKWe37AqrhIAEq4uAEquIAnDIOCh/JStkTD9sE7sZB4w0q4KACVMFBAaiEgwyohoMEqIiDE6iKA3DKOBj4Uc+UPfGwQ8Cdx2EXuPusbgJ346ABVMBBBaiCA9sktknmyj6xTXK1zDbJalkrtklGykqxTTJTlsY2yZUysE2yVjYa2yS1sl7+cpMcegPyrqBRcaoAAAAASUVORK5CYIL=);
}
К сожалению, такой вариант не подходит для IE<8.
В системах с Internet Explorer 6 и 7 можно использовать mhtml css hack.
Но хранить одни и те же ресурсы для разных IE как то не комильфо.
Было решено хранить ресурсы в mhtml-блоке (BASE64 enocded) в теге <!-- '--> в начале HTA файла.
<!--
/*
Content-Type: multipart/related; boundary="_ANY_STRING_WILL_DO_AS_A_SEPARATOR"
--_ANY_STRING_WILL_DO_AS_A_SEPARATOR
Content-Location:background
Content-Transfer-Encoding:base64
iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAwklEQVRYhe3XXQqDMBhE0dtsIKvNwrOC+mIhTfNrlAzlm0eR4ShomFcI4U2WGGN+6Sfe++49d/S5O8tKWe37AqrhIAEq4uAEquIAnDIOCh/JStkTD9sE7sZB4w0q4KACVMFBAaiEgwyohoMEqIiDE6iKA3DKOBj4Uc+UPfGwQ8Cdx2EXuPusbgJ346ABVMBBBaiCA9sktknmyj6xTXK1zDbJalkrtklGykqxTTJTlsY2yZUysE2yVjYa2yS1sl7+cpMcegPyrqBRcaoAAAAASUVORK5CYIL=
--_ANY_STRING_WILL_DO_AS_A_SEPARATOR
Content-Location:loading_bar
Content-Transfer-Encoding:base64
R0lGODlh3AATAPQAAP///wAAA.....
--_ANY_STRING_WILL_DO_AS_A_SEPARATOR--
*/
'-->
<html>...
Таким образом эта часть HTA-документа считается комментарием и не отображается, зато ее можно использовать как mhtml-источник для отображения графики в IE<8.
background-image: url(mhtml:http://phpied.com/mhtml.css!somestring);
Для отображения в IE>=8 будем использовать DATA Uri.
С помощью специальной процедуры необходимо подготовить соответствующий стиль HTA-приложения, но сначала
в css блоке опишем картинку специальный идентификатором !BASE64-background!, где background - mhtml идентификатор необходимого нам ресурса.
<style type="text/css">
.hiddenlayer{
background:#666666 50% 50% repeat url(!BASE64-background!);
}
и теперь модифицируем стили
Function ShowBASE64Images
Set fso = CreateObject("Scripting.Filesystemobject")
file_text=fso.OpenTextFile(Replace(document.url,"file://",""),1).readall 'it's my own contents
Set fso = Nothing
Set RExp = CreateObject("VBScript.RegExp")
RExp.Global=True
RExp.Pattern="!BASE64-.*!"
For i=0 To document.styleSheets.length-1
For Each base64record In RExp.Execute(document.styleSheets(i).cssText) 'iterate each !BASE64-.*! pattern
base64id=Replace(Replace(base64record,"!",""),"BASE64-","")
If GetIEVersion<8 Then
document.styleSheets(i).cssText=Replace(document.styleSheets(i).cssText,base64record,"mhtml:"&document.URLUnencoded&"!"&base64id)'for ie=6=7 set pattern to mhtml:file...!id
Else
RExp.Pattern="Content\-Location\:"&base64id&"(.*\n)+?\-" 'get only this id section
For Each base64my_record In RExp.Execute(file_text)
RExp.Pattern="Content\-Location\:"&base64id&"(.*\n)+?\s" 'will replace this data
result=RExp.Replace(base64my_record,"") 'replace this data
result=Left(result,Len(result)-1) 'cut last symbols
RExp.Pattern="\n"
result=RExp.Replace(result,"")'clear \r\n
result="data:image/png;base64,"&Trim(result)&");" 'trim all data
Next
document.styleSheets(i).cssText=Replace(document.styleSheets(i).cssText,base64record,result)'set new cssText
End If
Next
Next
Set RExp = Nothing
End function
function GetIEVersion
Set WshShell = CreateObject("Wscript.Shell")
GetIEVersion=Left(WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Version"),1)
End Function
В результате таких нехитрых манипуляций ресурсы хранятся в файле один раз и отображаются во всех версиях IE.