کاهش حجم خروجی در ASP.NET
آموزش داده شده در دانشنامه سوران - اولين دانشنامه فارسي زبان
مساله سرعت بارگذاری صفحات چه به صورت ایستا طراحی شده باشند و چه به صورت پویا از مباحث مهم در طراحی حرفه ای صفحات وب است این مساله در کشور ما با توجه به سرعت نسبتا پایین خطوط اینترنت اهمیت مضاعفی می یابد از طرفی در سایتهای بزرگ که طبعا حجم بیشتری هم دارند مساله پهنای باند مصرفی نیز مورد توجه قرار می گیرد که رابطه مستقیمی با سرعت بارگذاری صفحات دارد چرا که سرعت بارگذاری صفحات نیز رابطه مستقیمی با حجم صفحات دارد.
آگهی
آموزش داده شده در دانشنامه سوران - اولين دانشنامه فارسي زبان
مساله سرعت بارگذاری صفحات چه به صورت ایستا طراحی شده باشند و چه به صورت پویا از مباحث مهم در طراحی حرفه ای صفحات وب است این مساله در کشور ما با توجه به سرعت نسبتا پایین خطوط اینترنت اهمیت مضاعفی می یابد از طرفی در سایتهای بزرگ که طبعا حجم بیشتری هم دارند مساله پهنای باند مصرفی نیز مورد توجه قرار می گیرد که رابطه مستقیمی با سرعت بارگذاری صفحات دارد چرا که سرعت بارگذاری صفحات نیز رابطه مستقیمی با حجم صفحات دارد.
آگهی
->مساله سرعت بارگذاری صفحات (چه به صورت Static طراحی شده باشند چه به
صورت Dynamic) از مباحث مهم در طراحی حرفه ای صفحات وب است این مساله در
کشور ما با توجه به سرعت نسبتا پایین خطوط اینترنت اهمیت مضاعفی می یابد
از طرفی در سایتهای بزرگ که طبعا حجم بیشتری هم دارند مساله پهنای باند
مصرفی نیز مورد توجه قرار می گیرد که رابطه مستقیمی با سرعت بارگذاری
صفحات دارد چرا که سرعت بارگذاری صفحات نیز رابطه مستقیمی با حجم صفحات
دارد.
در واقع عامل اصلی در سرعت بارگذاری صفحات حجم کدهای HTML صفحات است. صفحات چه به صورت Static طراحی شده باشند چه به صورت Dynamic در نهایت به صورت کدهای HTML در سمت Client به نمایش در می آیند. اگر چه در صفحات Dynamic میزان محاسبات روی Server نیز نقش دارند ولی با توجه به رشد قدرت سخت افزار و نرم افزار این عامل روز به روز کم رنگ تر می شود.
حال بحث را به ASP.NET محدود می کنیم. اگر با ساختار پاسخ گویی به درخواستهای کاربران توسط IIS در ASP.NET آشنا باشید، می دانید که پس از پردازش کدهای صفحات و تعیین کدهای HTML آنها را به سمت Client می فرستد. حال برای حل مشکل سرعت صفحات حجیم راه حل هایی ایجاد شده است که ریشه در فشرده سازی و کاهش حجم کدهای HTML ارسالی به سمت کاربر و بازگشایی کدهای HTML در سمت Client دارد.
روشهای بسیار قوی و توانایی در این زمینه وجود دارند که می توانند تا متوسط هشتاد درصد در سرعت و پهنای باند مصرفی صرفه جویی کنند. و بسته های نرم افزاری آنها در سایتهای داخلی و خارجی موجودند(مانند بسته نرم افزاری ASP.JET). ولی سوالی که مطرح می شود اینست که بازگشایی کدهای فشرده شده در سمت Client بر چه اساسی صورت می گیرد؟ پاسخ این است که در استاندارد HTTP 1.1 الگوریتمهای به صورت پیش فرض برای فشرده سازی صفحات در نظر گرفته شده اند که فشرده سازی نیز توسط همین الگوریتمها صورت می گیرد.
مقاله پیش روی شما به روشی می پردازد که جدا از مساله بازگشایی کدهای فشرده سازی شده است. پس در استاندارد HTTP 1.0 نیز قابل استفاده است ولی درصد کمتری از فشرده سازی را نسبت به روشهای مذکور انجام می دهد (بین ۷ تا ۳۰ درصد).
می دانیم در طراحی کدهای HTML در اکثر نرم افزارهای طراحی Editor ها برای خوانایی کدها و خطایابی، آنها را با فواصل و شکست خطوط مناسبی به نمایش گذاشته و به همین صورت نیز ذخیره می کند. این فواصل اضافی توسط مرورگرها در نظر گرفته نمی شوند ولی حجم زائدی را اشغال می کنند. در این مقاله با استفاده از یک کلاس نوشته شده در Visual Basic.NET این فواصل را پیش از ارسال کدهای HTML به سمت Client از بین می برد و از فواید این روش این است که برای سایتهای کوچکتر و وبلاگها به سهولت قابل استفاده است و در صورتی که در سایتهای بزرگ Client ها از استاندارد HTTP 1.0 استفاده کنند می توانند با استفاده از این روش خلا موجود را تا حدی پوشاند.
در اینجا ذکر این نکته لازم است که الگوریتمهای مورد استفاده در فشرده سازی صفحات نمی توانند کدهای حاصل از روش موجود در این مقاله را فشرده کنند و حاصل کدهایی خواهد بود که در مرورگر به نمایش در نمی آید زیرا این روشها بر مبنای شکست خطوط و فواصل پیش فرض واقعند. در صورتی که قصد استفاده از این روشها را در کنار هم دارید لازم است روش زیر را توسط شروط لازم به استاندارد HTTP 1.0 محدود کنید.
نکته قابل توجه دیگر این است که کلاس به کار رفته در این مقاله تعدادی از فواصل زائد موجود در Tag ها و کدهای معمول را حذف می کند و شما به سادگی می توانید مطابق الگوی به کار رفته Tag ها و کدهای دیگری را به این کلاس اضافه کنید.
روش استفاده:
این مقاله از فضای نام HttpResponse.Filter برای کاهش حجم خروجی استفاده می کند. برای استفاده از این الگوریتم لازم است که کد کلاس WhitespaceFilter موجود در زیر را در یک فایل به نام WhitespaceFilter.vb ذخیره نموده و به پروژه خود اضافه کنید و خط زیر را به متد Application_BeginRequest در فایل Global.asax اضافه کنید:
Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
' Fires at the beginning of each request
Response.Filter = New WhitespaceFilter(Response.Filter)
End Sub
در صورتی که هدف شما استفاده از این روش در صفحات خاصی است کافیست به جای عمل فوق کد بالا را در متد Load صفحات هدف اضافه کنید با کد موجود در فایل Global.asax را مانند مثال زیر با شروط لازم تغییر دهید:
Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
' Fires upon attempting to authenticate the use
If Request.Url.PathAndQuery.ToLower.IndexOf("makethumbnail") = -1 Then
Response.Filter = New WhitespaceFilter(Response.Filter)
End If
End Sub
بهتر است برای مقایسه حجم صفحات HTML خود قبل از استفاده از این روش یکی از صفحات خود را در مرورگر مشاهده کرده و توسط یک Editor مانند NotePad محتوای آن را بررسی کنید و آن را به صورت یک فایل متنی ذخیره کنید.سپس بعد از استفاده از این روش همان صفحه را مجددا بررسی کرده و به صورت فایل دیگری ذخیره سازی کنید.بعد از آن حجم دو فایل را با هم مقایسه کنید تا برای هر صفحه به درصد فشرده سازی صفحات پی ببرید.
بررسی کدهای کلاس WhitespaceFilter:
حال به بررسی کدهای مربوط به این Class می پردازیم:
Imports System.IO
Imports System.Text.RegularExpressions
این فیلتر از ایجاد فضاهای خالی غیر ضروری د رخروجی جلوگیری می کند:
' This filter gets rid of all unnecessary whitespace in the output.
Public Class WhitespaceFilter
Inherits Stream
Private _sink As Stream
Private _position As Long
Public Sub New(ByVal sink As Stream)
_sink = sink
End Sub 'New
این قسمت از کد در صورت ایجاد هر گونه تغییر نباید تغییر کند.
#Region " Code that will most likely never change from filter to filter. "
این اعضا از Stream مهم هستند.
' The following members of Stream must be overridden.
Public Overrides ReadOnly Property CanRead() As Boolean
Get
Return True
End Get
End Property
Public Overrides ReadOnly Property CanSeek() As Boolean
Get
Return True
End Get
End Property
Public Overrides ReadOnly Property CanWrite() As Boolean
Get
Return True
End Get
End Property
Public Overrides ReadOnly Property Length() As Long
Get
Return 0
End Get
End Property
Public Overrides Property Position() As Long
Get
Return _position
End Get
Set(ByVal Value As Long)
_position = Value
End Set
End Property
Public Overrides Function Seek(ByVal offset As Long, ByVal direction As System.IO.SeekOrigin) As Long
Return _sink.Seek(offset, direction)
End Function 'Seek
Public Overrides Sub SetLength(ByVal length As Long)
_sink.SetLength(length)
End Sub 'SetLength
Public Overrides Sub Close()
_sink.Close()
End Sub 'Close
Public Overrides Sub Flush()
_sink.Flush()
End Sub 'Flush
Public Overrides Function Read(ByVal MyBuffer() As Byte, ByVal offset As Integer, ByVal count As Integer) As Integer
_sink.Read(MyBuffer, offset, count)
End Function
#End Region
Write متد اصلی انجام عمل فیلتر است.
' Write is the method that actually does the filtering.
Public Overrides Sub Write(ByVal MyBuffer() As Byte, ByVal offset As Integer, ByVal count As Integer)
Dim data(count) As Byte
Buffer.BlockCopy(MyBuffer, offset, data, 0, count)
اینجا ASCII Encoding استفاده نکنید چون IDE برخی ار کاراکترها مثل ® را با کاراکترهای UTF-8 عوض می کنند اگر از ASCII Encoding استفاده کنید B را به جای علامت ® دریافت می کنید.
' Don't use ASCII encoding here. The .NET IDE replaces some characters, such as ®
' with a UTF-8 entity. If you use ASCII encoding, you'll get B. instead of the registered
' trademark symbol.
Dim s As String = System.Text.Encoding.UTF8.GetString(data)
جا به جا کردن کاراکترهای موجود در کنترلها با فضاهای خالی.
بررسی Semi-colon در این قسمت به علت وجود این کاراکتر در توضیحات Java Script موجود در کامپوننت است.
با این راه ما مقدار را حفظ می کنیم.
' Replace control characters with either spaces or nothing
' The funky semi-colon handling is there because of a JavaScript comment in a component.
' This way, we keep the carriage returns that actually matter.
s = s.Replace(ControlChars.Cr, Chr(255)).Replace(ControlChars.Lf, "").Replace(ControlChars.Tab, "")
s = s.Replace(";" & Chr(255), ";" & ControlChars.Cr)
s = s.Replace(Chr(255), " ")
حذف فضاهای خالی اضافی
' Eliminate excess whitespace.
Do
s = s.Replace(" ", " ")
Loop Until s.IndexOf(" ") = -1
حذف توضیحات پیش فرض و شناخته شده.
ما در قالبهای خود از سه توضیح استفاده می کنیم که در هر صفحه ای از سایت وارد می شوند.بنا بر این در زمان خروج ضفحات مط توانیم انها را حذف کنیم.با این راه توضیحات برای نگهداری و عیب یابی موجودند ولی در زمان انتشار صفحات حذف می شوند.
' Eliminate known comments.
' We use three comments in our template. These comments go on every single page on the site.
' Obviously, we can kill them when they are going out. This way, the comments stay in for
' maintenance, but are trimmed before release.
s = s.Replace("<!- Page Content Goes Above Here ->", "")
s = s.Replace("<!- Page Content Goes Below Here ->", "")
s = s.Replace("<!- Do not get rid of this on data pages ->", "")
حذف برخی فضاهای خالی وارد شده که از بین بردن آنها مجاز است.به دلایلی یک فضای خالی قبل از هدایت کننده DOCTYPE وارد می شود.
' Eliminate some additional whitespace we can kill
' For some reason, a single space gets emitted before each of our DOCTYPE directives.
s = s.Replace(" <!DOCTYPE", "<!DOCTYPE")
اینها فضاهای خالی معمولی هستند که می توانیم حذف کنیم:
' These are the most common excess whitespace items we can remove.
s = s.Replace("<li> ", "<li>").Replace("</td> ", "</td>").Replace("</tr> ", "</tr>").Replace("</ul> ", "</ul>").Replace("</table> ", "</table>").Replace("</li> ", "</li>")
s = s.Replace("<LI> ", "<LI>").Replace("</TD> ", "</TD>").Replace("</TR> ", "</TR>").Replace("</UL> ", "</UL>").Replace("</TABLE> ", "</TABLE>").Replace("</LI> ", "</LI>")
s = s.Replace("<td> ", "<td>").Replace("<tr> ", "<tr>")
s = s.Replace("<TD> ", "<TD>").Replace("<TR> ", "<TR>")
s = s.Replace("<P> ", "<P>").Replace("<p> ", "<p>")
s = s.Replace("</P> ", "</P>").Replace("</p> ", "</p>")
s = s.Replace("style=""display:inline""> ", "style=""display:inline"">")
s = s.Replace(" <H", "<H").Replace(" <h", "<h").Replace(" </H", "</H").Replace(" </h", "</h")
s = s.Replace("<UL> ", "<UL>").Replace("<ul> ", "<ul>")
s = s.Replace(" <TABLE", "<TABLE").Replace(" <table", "<table")
s = s.Replace(" <li>", "<li>").Replace(" <LI>", "<LI>")
s = s.Replace(" <br>", "<br>").Replace(" <BR>", "<BR>").Replace("<br> ", "<br>").Replace("<BR> ", "<BR>")
s = s.Replace(" <ul>", "<ul>").Replace(" <UL>", "<UL>")
جا به جایی Tag های بلند با معادل کوتاه آنها:
' Replace long tags with short ones
s = s.Replace("<STRONG>", "<B>").Replace("<strong>", "<b>")
s = s.Replace("</STRONG>", "</B>").Replace("</strong>", "</b>")
جا به جایی برخی نمادهای HTML با کدهای کاراکتری درست معادل آنها:
' Replace some HTML entities with true character codes
s = s.Replace("&brkbar;", "|")
s = s.Replace("¦", "|")
s = s.Replace("­", "-")
s = s.Replace(" ", Chr(160))
s = s.Replace("‚", "'")
s = s.Replace("„", """")
s = s.Replace("‘", "'")
s = s.Replace("’", "'")
s = s.Replace("’", "'")
s = s.Replace("“", """")
s = s.Replace("”", """")
s = s.Replace("”", """")
s = s.Replace("–", "-")
s = s.Replace("&endash;", "-")
اگر این کار را انجام ندهیم JavaScript روی سایت عمل نمی کند:
' If we don't do this, JavaScript horks on the site
s = s.Replace("<!-", "<!-" & ControlChars.Cr)
s = s.Replace("}", "}" & ControlChars.Cr)
آخرین شانس برای از بین بردن فضاهای خالی:
' Last chance to eliminate excess whitespace
Do
s = s.Replace(" ", " ")
Loop Until s.IndexOf(" ") = -1
در نهایت کاری که انجام داده ایم را خارج می کنیم:
' Finally, we spit out what we have done.
Dim outdata() As Byte = System.Text.Encoding.UTF8.GetBytes(s)
_sink.Write(outdata, 0, outdata.GetLength(0))
End Sub 'Write
End Class
در واقع عامل اصلی در سرعت بارگذاری صفحات حجم کدهای HTML صفحات است. صفحات چه به صورت Static طراحی شده باشند چه به صورت Dynamic در نهایت به صورت کدهای HTML در سمت Client به نمایش در می آیند. اگر چه در صفحات Dynamic میزان محاسبات روی Server نیز نقش دارند ولی با توجه به رشد قدرت سخت افزار و نرم افزار این عامل روز به روز کم رنگ تر می شود.
حال بحث را به ASP.NET محدود می کنیم. اگر با ساختار پاسخ گویی به درخواستهای کاربران توسط IIS در ASP.NET آشنا باشید، می دانید که پس از پردازش کدهای صفحات و تعیین کدهای HTML آنها را به سمت Client می فرستد. حال برای حل مشکل سرعت صفحات حجیم راه حل هایی ایجاد شده است که ریشه در فشرده سازی و کاهش حجم کدهای HTML ارسالی به سمت کاربر و بازگشایی کدهای HTML در سمت Client دارد.
روشهای بسیار قوی و توانایی در این زمینه وجود دارند که می توانند تا متوسط هشتاد درصد در سرعت و پهنای باند مصرفی صرفه جویی کنند. و بسته های نرم افزاری آنها در سایتهای داخلی و خارجی موجودند(مانند بسته نرم افزاری ASP.JET). ولی سوالی که مطرح می شود اینست که بازگشایی کدهای فشرده شده در سمت Client بر چه اساسی صورت می گیرد؟ پاسخ این است که در استاندارد HTTP 1.1 الگوریتمهای به صورت پیش فرض برای فشرده سازی صفحات در نظر گرفته شده اند که فشرده سازی نیز توسط همین الگوریتمها صورت می گیرد.
مقاله پیش روی شما به روشی می پردازد که جدا از مساله بازگشایی کدهای فشرده سازی شده است. پس در استاندارد HTTP 1.0 نیز قابل استفاده است ولی درصد کمتری از فشرده سازی را نسبت به روشهای مذکور انجام می دهد (بین ۷ تا ۳۰ درصد).
می دانیم در طراحی کدهای HTML در اکثر نرم افزارهای طراحی Editor ها برای خوانایی کدها و خطایابی، آنها را با فواصل و شکست خطوط مناسبی به نمایش گذاشته و به همین صورت نیز ذخیره می کند. این فواصل اضافی توسط مرورگرها در نظر گرفته نمی شوند ولی حجم زائدی را اشغال می کنند. در این مقاله با استفاده از یک کلاس نوشته شده در Visual Basic.NET این فواصل را پیش از ارسال کدهای HTML به سمت Client از بین می برد و از فواید این روش این است که برای سایتهای کوچکتر و وبلاگها به سهولت قابل استفاده است و در صورتی که در سایتهای بزرگ Client ها از استاندارد HTTP 1.0 استفاده کنند می توانند با استفاده از این روش خلا موجود را تا حدی پوشاند.
در اینجا ذکر این نکته لازم است که الگوریتمهای مورد استفاده در فشرده سازی صفحات نمی توانند کدهای حاصل از روش موجود در این مقاله را فشرده کنند و حاصل کدهایی خواهد بود که در مرورگر به نمایش در نمی آید زیرا این روشها بر مبنای شکست خطوط و فواصل پیش فرض واقعند. در صورتی که قصد استفاده از این روشها را در کنار هم دارید لازم است روش زیر را توسط شروط لازم به استاندارد HTTP 1.0 محدود کنید.
نکته قابل توجه دیگر این است که کلاس به کار رفته در این مقاله تعدادی از فواصل زائد موجود در Tag ها و کدهای معمول را حذف می کند و شما به سادگی می توانید مطابق الگوی به کار رفته Tag ها و کدهای دیگری را به این کلاس اضافه کنید.
روش استفاده:
این مقاله از فضای نام HttpResponse.Filter برای کاهش حجم خروجی استفاده می کند. برای استفاده از این الگوریتم لازم است که کد کلاس WhitespaceFilter موجود در زیر را در یک فایل به نام WhitespaceFilter.vb ذخیره نموده و به پروژه خود اضافه کنید و خط زیر را به متد Application_BeginRequest در فایل Global.asax اضافه کنید:
Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
' Fires at the beginning of each request
Response.Filter = New WhitespaceFilter(Response.Filter)
End Sub
در صورتی که هدف شما استفاده از این روش در صفحات خاصی است کافیست به جای عمل فوق کد بالا را در متد Load صفحات هدف اضافه کنید با کد موجود در فایل Global.asax را مانند مثال زیر با شروط لازم تغییر دهید:
Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
' Fires upon attempting to authenticate the use
If Request.Url.PathAndQuery.ToLower.IndexOf("makethumbnail") = -1 Then
Response.Filter = New WhitespaceFilter(Response.Filter)
End If
End Sub
بهتر است برای مقایسه حجم صفحات HTML خود قبل از استفاده از این روش یکی از صفحات خود را در مرورگر مشاهده کرده و توسط یک Editor مانند NotePad محتوای آن را بررسی کنید و آن را به صورت یک فایل متنی ذخیره کنید.سپس بعد از استفاده از این روش همان صفحه را مجددا بررسی کرده و به صورت فایل دیگری ذخیره سازی کنید.بعد از آن حجم دو فایل را با هم مقایسه کنید تا برای هر صفحه به درصد فشرده سازی صفحات پی ببرید.
بررسی کدهای کلاس WhitespaceFilter:
حال به بررسی کدهای مربوط به این Class می پردازیم:
Imports System.IO
Imports System.Text.RegularExpressions
این فیلتر از ایجاد فضاهای خالی غیر ضروری د رخروجی جلوگیری می کند:
' This filter gets rid of all unnecessary whitespace in the output.
Public Class WhitespaceFilter
Inherits Stream
Private _sink As Stream
Private _position As Long
Public Sub New(ByVal sink As Stream)
_sink = sink
End Sub 'New
این قسمت از کد در صورت ایجاد هر گونه تغییر نباید تغییر کند.
#Region " Code that will most likely never change from filter to filter. "
این اعضا از Stream مهم هستند.
' The following members of Stream must be overridden.
Public Overrides ReadOnly Property CanRead() As Boolean
Get
Return True
End Get
End Property
Public Overrides ReadOnly Property CanSeek() As Boolean
Get
Return True
End Get
End Property
Public Overrides ReadOnly Property CanWrite() As Boolean
Get
Return True
End Get
End Property
Public Overrides ReadOnly Property Length() As Long
Get
Return 0
End Get
End Property
Public Overrides Property Position() As Long
Get
Return _position
End Get
Set(ByVal Value As Long)
_position = Value
End Set
End Property
Public Overrides Function Seek(ByVal offset As Long, ByVal direction As System.IO.SeekOrigin) As Long
Return _sink.Seek(offset, direction)
End Function 'Seek
Public Overrides Sub SetLength(ByVal length As Long)
_sink.SetLength(length)
End Sub 'SetLength
Public Overrides Sub Close()
_sink.Close()
End Sub 'Close
Public Overrides Sub Flush()
_sink.Flush()
End Sub 'Flush
Public Overrides Function Read(ByVal MyBuffer() As Byte, ByVal offset As Integer, ByVal count As Integer) As Integer
_sink.Read(MyBuffer, offset, count)
End Function
#End Region
Write متد اصلی انجام عمل فیلتر است.
' Write is the method that actually does the filtering.
Public Overrides Sub Write(ByVal MyBuffer() As Byte, ByVal offset As Integer, ByVal count As Integer)
Dim data(count) As Byte
Buffer.BlockCopy(MyBuffer, offset, data, 0, count)
اینجا ASCII Encoding استفاده نکنید چون IDE برخی ار کاراکترها مثل ® را با کاراکترهای UTF-8 عوض می کنند اگر از ASCII Encoding استفاده کنید B را به جای علامت ® دریافت می کنید.
' Don't use ASCII encoding here. The .NET IDE replaces some characters, such as ®
' with a UTF-8 entity. If you use ASCII encoding, you'll get B. instead of the registered
' trademark symbol.
Dim s As String = System.Text.Encoding.UTF8.GetString(data)
جا به جا کردن کاراکترهای موجود در کنترلها با فضاهای خالی.
بررسی Semi-colon در این قسمت به علت وجود این کاراکتر در توضیحات Java Script موجود در کامپوننت است.
با این راه ما مقدار را حفظ می کنیم.
' Replace control characters with either spaces or nothing
' The funky semi-colon handling is there because of a JavaScript comment in a component.
' This way, we keep the carriage returns that actually matter.
s = s.Replace(ControlChars.Cr, Chr(255)).Replace(ControlChars.Lf, "").Replace(ControlChars.Tab, "")
s = s.Replace(";" & Chr(255), ";" & ControlChars.Cr)
s = s.Replace(Chr(255), " ")
حذف فضاهای خالی اضافی
' Eliminate excess whitespace.
Do
s = s.Replace(" ", " ")
Loop Until s.IndexOf(" ") = -1
حذف توضیحات پیش فرض و شناخته شده.
ما در قالبهای خود از سه توضیح استفاده می کنیم که در هر صفحه ای از سایت وارد می شوند.بنا بر این در زمان خروج ضفحات مط توانیم انها را حذف کنیم.با این راه توضیحات برای نگهداری و عیب یابی موجودند ولی در زمان انتشار صفحات حذف می شوند.
' Eliminate known comments.
' We use three comments in our template. These comments go on every single page on the site.
' Obviously, we can kill them when they are going out. This way, the comments stay in for
' maintenance, but are trimmed before release.
s = s.Replace("<!- Page Content Goes Above Here ->", "")
s = s.Replace("<!- Page Content Goes Below Here ->", "")
s = s.Replace("<!- Do not get rid of this on data pages ->", "")
حذف برخی فضاهای خالی وارد شده که از بین بردن آنها مجاز است.به دلایلی یک فضای خالی قبل از هدایت کننده DOCTYPE وارد می شود.
' Eliminate some additional whitespace we can kill
' For some reason, a single space gets emitted before each of our DOCTYPE directives.
s = s.Replace(" <!DOCTYPE", "<!DOCTYPE")
اینها فضاهای خالی معمولی هستند که می توانیم حذف کنیم:
' These are the most common excess whitespace items we can remove.
s = s.Replace("<li> ", "<li>").Replace("</td> ", "</td>").Replace("</tr> ", "</tr>").Replace("</ul> ", "</ul>").Replace("</table> ", "</table>").Replace("</li> ", "</li>")
s = s.Replace("<LI> ", "<LI>").Replace("</TD> ", "</TD>").Replace("</TR> ", "</TR>").Replace("</UL> ", "</UL>").Replace("</TABLE> ", "</TABLE>").Replace("</LI> ", "</LI>")
s = s.Replace("<td> ", "<td>").Replace("<tr> ", "<tr>")
s = s.Replace("<TD> ", "<TD>").Replace("<TR> ", "<TR>")
s = s.Replace("<P> ", "<P>").Replace("<p> ", "<p>")
s = s.Replace("</P> ", "</P>").Replace("</p> ", "</p>")
s = s.Replace("style=""display:inline""> ", "style=""display:inline"">")
s = s.Replace(" <H", "<H").Replace(" <h", "<h").Replace(" </H", "</H").Replace(" </h", "</h")
s = s.Replace("<UL> ", "<UL>").Replace("<ul> ", "<ul>")
s = s.Replace(" <TABLE", "<TABLE").Replace(" <table", "<table")
s = s.Replace(" <li>", "<li>").Replace(" <LI>", "<LI>")
s = s.Replace(" <br>", "<br>").Replace(" <BR>", "<BR>").Replace("<br> ", "<br>").Replace("<BR> ", "<BR>")
s = s.Replace(" <ul>", "<ul>").Replace(" <UL>", "<UL>")
جا به جایی Tag های بلند با معادل کوتاه آنها:
' Replace long tags with short ones
s = s.Replace("<STRONG>", "<B>").Replace("<strong>", "<b>")
s = s.Replace("</STRONG>", "</B>").Replace("</strong>", "</b>")
جا به جایی برخی نمادهای HTML با کدهای کاراکتری درست معادل آنها:
' Replace some HTML entities with true character codes
s = s.Replace("&brkbar;", "|")
s = s.Replace("¦", "|")
s = s.Replace("­", "-")
s = s.Replace(" ", Chr(160))
s = s.Replace("‚", "'")
s = s.Replace("„", """")
s = s.Replace("‘", "'")
s = s.Replace("’", "'")
s = s.Replace("’", "'")
s = s.Replace("“", """")
s = s.Replace("”", """")
s = s.Replace("”", """")
s = s.Replace("–", "-")
s = s.Replace("&endash;", "-")
اگر این کار را انجام ندهیم JavaScript روی سایت عمل نمی کند:
' If we don't do this, JavaScript horks on the site
s = s.Replace("<!-", "<!-" & ControlChars.Cr)
s = s.Replace("}", "}" & ControlChars.Cr)
آخرین شانس برای از بین بردن فضاهای خالی:
' Last chance to eliminate excess whitespace
Do
s = s.Replace(" ", " ")
Loop Until s.IndexOf(" ") = -1
در نهایت کاری که انجام داده ایم را خارج می کنیم:
' Finally, we spit out what we have done.
Dim outdata() As Byte = System.Text.Encoding.UTF8.GetBytes(s)
_sink.Write(outdata, 0, outdata.GetLength(0))
End Sub 'Write
End Class
تاريخ:جمعه، 18 اردیبهشتماه 1388 | نظرات [ 0 ] |

