1 (изменено: Alexey, 2011-06-07 22:58:12)

Тема: 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.

Post's attachments

test.zip 12.63 kb, 149 downloads since 2011-06-06 

You don't have the permssions to download the attachments of this post.