ASP文章分页实现类(支持HTML标签)
功能说明:
可将含html标签的文章按指定字数分页(字数不含标签,并且不破坏标签)
可根据需求插入一个分页符号(如:[nextpage]),方便读取时用split分页
也可直接将分页后的文章按指定的页码输出
可输出分页链接
支持&起始的符号识别(按一个字符计算)
支持&#x或&#起始的unico字符识别
支持智能分页(即可按指定的误差范围内尽量按标签分页)
使用方法见下:
'**********************************
'ASP文章分页类测试版
'用法: Set var=new ArticlePage
' [var.SetVar|var.prop=vars]
' Call var.cutpage(content)
' Response.Write(var.content)|nArray=var.contentArray
'作者: shirne
'日期: 2011/8/21
'**********************************
Const HTML_SPEC_CHAR="acute|copy|gt|micro|reg|amp|deg|iexcl|nbsp|raquo|brvbar|divide|iquest|not|sect|bull|frac12|laquo|para|uml|cedil|frac14|lt|plusmn|times|cent|frac34|macr|quot|trade|euro|pound|yen|bdquo|hellip|middot|rsaquo|ordf|circ|ldquo|mdash|rsquo|ordm|dagger|lsaquo|ndash|sbquo|rdquo|Dagger|lsquo|permil|shy|tilde|asymp|frasl|larr|part|spades|cap|ge|le|Prime|sum|clubs|harr|loz|prime|uarr|darr|hearts|minus|prod|zwj|diams|infin|ne|radic|zwnj|equiv|int|oline|rarr|alpha|eta|mu|pi|theta|beta|gamma|nu|psi|upsilon|chi|iota|omega|rho|xi|delta|kappa|omicron|sigma|zeta|epsilon|lambda|phi|tau|Alpha|Eta|Mu|Pi|Theta|Beta|Gamma|Nu|Psi|Upsilon|Chi|Iota|Omega|Rho|Xi|Delta|Kappa|Omicron|Sigma|Zeta|Epsilon|Lambda|Phi|Tau|sigmaf|lt|gt|amp|quot|reg|copy|trade|ensp|emsp|nbsp"
Class ArticlePage
Private i,x,y,z,tc,ti,td,tag,etag,prev
Private page(),temp(),tags(),etags(),types(3)
Public pageTag,lo,pagesize,PicNum
Private cpage,ttpage
Private Sub Class_Initialize
x = -1 '分页总数
y = -1 '每页字数
z = -1 '当前标签深度
ti = 0 '图片数目
lo = 10 '误差字符
pagesize= 5000 '分页字符
PicNum = 1 '每页图片
pageTag = "[cutpage]" '分页的字符标记
types(1)=Split(HTML_SPEC_CHAR)
types(2)="0123456789"
types(3)="0123456789abcdef"
End Sub
Public Sub reset()
x = -1
y = -1
z = -1
ti = 0
ReDim page(0)
ReDim temp(pagesize+lo+2)
ReDim tags(0),etags(0)
End Sub
Public Property Get content
content = Join(page,pageTag)
End Property
Public Property Get contentArray
contentArray = page
End Property
Public Property Get pagecount
pagecount = x+1
End Property
'设置参数--分页字符数,图片数,误差,分页标签
Public Sub SetVar(wn,pn,loss,pt)
pagesize= wn
PicNum = pn
lo = loss
pageTag = pt
End Sub
'cpage为0时从querystring中取值,为all时显示全部
Public Sub Show(currentpage)
cpage=currentpage
If cpage=0 Then cpage=Request.QueryString("page")
If LCase(cpage)="all" Then
Response.Write Join(page,"")
cpage=0
Else
If Not IsNumeric(cpage) Or cpage=0 Then
cpage=1
Else
cpage=Int(cpage)
End If
If cpage>x+1 Then cpage=x+1
Response.Write(page(cpage-1))
End If
End Sub
'地址,显示页数,是否允许全部
Public Function showpage(ByVal turl,ByVal showNum,ByVal showAll)
Dim url,ttpage:url=turl:ttpage=x+1
If Right(url,1)<>"?" And Right(url,1)<>"&" Then
If InStr(url,"?")>0 Then
url = url & "&"
Else
url = url & "?"
End If
End If
Dim PageList:pageList=""
If cPage>1 Then
pageList = pageList & "<a href=""" & url & "page=" & (cPage-1) & """ >上一页</a>"
Else
pageList = pageList & "<a href=""javascript:void(0)"" class=""disabled"" >上一页</a>"
End If
If cPage>showNum+1 Then
pageList = pageList & "<a href=""" & url & "page=1"" >1</a>"
End If
If cPage>showNum+2 Then
pageList = pageList & "<a href=""" & url & "page=" & (cPage-showNum-1) & """ title=""前" & (showNum+1) & "页"" >...</a>"
End If
For i=cPage-showNum To cPage+showNum
If cPage=i Then
pageList = pageList & "<a href=""javascript:void(0)"" class=""current"" >" & i & "</a>"
ElseIf i<1 Then
i=0
ElseIf i>ttpage Then
Exit For
Else
pageList = pageList & "<a href="""&url & "page="&i&""" >"&i&"</a>"
End If
Next
If ttpage-cPage>showNum+1 Then
pageList = pageList & "<a href=""" & url & "page=" & (cPage+showNum+1) & """ title=""后" & (showNum+1) & "页"" >...</a>"
End If
If ttpage-cPage>showNum Then
pageList = pageList & "<a href=""" & url & "page=" & ttpage & """ >" & ttpage & "</a>"
End If
If cPage<ttpage Then
pageList = pageList & "<a href=""" & url & "page=" & (cPage+1) & """ >下一页</a>"
Else
pageList = pageList & "<a href=""javascript:void(0)"" class=""disabled"" >下一页</a>"
End If
If showAll Then
pageList = pageList & " <a href=""" & url & "page=all"" >阅读全部</a>"
End If
showpage=pageList
End Function
Public Sub CutPage(content)
Call reset()
For i=1 To Len(content)
If Mid(content,i,3)="&#x" Then
tc=InStr(i,content,";")-i
If tc>0 Then
td=Mid(content,i+3,tc-3)
tc=checkcode(td,3,1)
If tc>0 And Len(td)=tc Then
i=i+tc+3
y=y+1
temp(y)="&#x" & td & ";"
ElseIf tc>0 Then
i=i+tc+2
y=y+1
temp(y)="&#x" & Left(td,tc) & ";"
Else
i=i+2
y=y+3
temp(y)="&#x"
End If
Else
td=checkcode(content,3,i+3)
If td>0 Then
temp(y)=Mid(i,content,i+3+tc)
i=i+tc+2
Else
i=i+2
y=y+3
temp(y)="&#x"
End If
End If
If y=0 And prev<>"" Then temp(y)=prev & temp(y):prev=""
ElseIf Mid(content,i,2)="&#" Then
tc=InStr(i,content,";")-i
If tc>0 Then
td=Mid(content,i+2,tc-2)
tc=checkcode(td,2,1)
If tc>0 And Len(td)=tc Then
i=i+tc+2
y=y+1
temp(y)="&#" & td & ";"
ElseIf tc>0 Then
i=i+tc+1
y=y+1
temp(y)="&#" & Left(td,tc) & ";"
Else
i=i+1
y=y+2
temp(y)="&#"
End If
Else
td=checkcode(content,2,i+2)
If td>0 Then
y=y+1
temp(y)=Mid(i,content,i+2+tc)
i=i+tc+1
Else
i=i+1
y=y+2
temp(y)="&#"
End If
End If
If y=0 And prev<>"" Then temp(y)=prev & temp(y):prev=""
ElseIf Mid(content,i,1)="&" Then
tc=InStr(i,content,";")-i
y=y+1
If tc>0 Then
td=Mid(content,i+1,tc-1)
tc=checkcode(td,1,1)
If tc>0 And Len(td)=tc Then
i=i+tc+1
temp(y)="&" & td & ";"
ElseIf tc>0 Then
i=i+tc
temp(y)="&" & Left(td,tc) & ";"
Else
temp(y)="&"
End If
Else
td=checkcode(content,1,i+1)
If td>0 Then
temp(y)=Mid(i,content,i+1+tc)
i=i+tc
Else
temp(y)="&"
End If
End If
If y=0 And prev<>"" Then temp(y)=prev & temp(y):prev=""
ElseIf Mid(content,i,2)="</" Then
tc=InStr(i,content,">")-i
If z>-1 Then
If LCase(etags(z))=LCase(Mid(content,i+2,tc-2)) Then
z=z-1
If z>-1 Then
ReDim Preserve tags(z)
ReDim Preserve etags(z)
Else
tags(0)=""
etags(0)=""
End If
temp(y)= temp(y) & Mid(content,i,tc+1)
End If
End If
i=i+tc
ElseIf Mid(content,i,1)="<" Then
If y<0 Then y=0:temp(y)=prev:prev=""
tag=Mid(content,i+1,InStr(i,content,">")-i-1)
If InStr(tag,Chr(32))>0 Then
etag=Trim(Left( tag,InStr(tag,Chr(32)) ))
ElseIf InStr(tag,Chr(9))>0 Then
etag=Trim(Left( tag,InStr(tag,Chr(9)) ))
ElseIf InStr(tag,Chr(10))>0 Then
etag=Trim(Left( tag,InStr(tag,Chr(10)) ))
Else
etag=tag
End If
tc=Len(tag)
Select Case LCase(etag)
Case "img"
ti=ti+1
temp(y)= temp(y) & Mid(content,i,InStr(i,content,">")-i+1)
Case "br","hr","col","embed","input","param"
temp(y)= temp(y) & Mid(content,i,InStr(i,content,">")-i+1)
Case "textarea","select","style","script"
temp(y)= temp(y) & Mid(content,i,InStr(i,LCase(content),"</"& LCase(etag) &">")-i+Len(etag)+2)
Case Else
z=z+1
ReDim Preserve tags(z)
ReDim Preserve etags(z)
tags(z)=tag
etags(z)=etag
temp(y)= temp(y) & "<" & tag & ">"
End Select
i=i+tc+1
Else
y=y+1
If y=0 Then
temp(y)=prev & Mid(content,i,1)
prev=""
Else
temp(y)=Mid(content,i,1)
End If
End If
If (y>=pagesize-lo And Mid(content,i+1,2)<>"</" And Mid(content,i+1,1)="<") Or _
(y>=pagesize+lo And Mid(content,i+1,2)<>"</") Or _
(ti>=picNum And LCase(Mid(content,i+1,4))="<img") Or i=Len(content) Then
x=x+1
ReDim Preserve page(x)
If etags(0)<>"" Then
temp(y)= temp(y) & "</" & Join(Reverse(etags),"></") & ">"
page(x)=Join(temp,"")
prev="<" & Join(tags,"><") & ">"
Else
page(x)=Join(temp,"")
End If
y=-1
ti=0
ReDim temp(pagesize+lo+2)
End If
Next
End Sub
Private Function CheckCode(str,stype,ByVal ps)
CheckCode=0
Dim rstr,i
rstr=""
If stype=1 Then
For i=0 To Ubound(types(1))
If LCase(Mid(str,ps,Len(types(1)(i))))=types(1)(i) Then
CheckCode=Len(types(1)(i))
Exit Function
End If
Next
Else
For i=ps To Len(str)-ps
If InStr(types(stype),Mid(str,i,1))<1 Then
CheckCode=i-1-ps
Exit Function
End If
Next
End If
End Function
Private Sub Class_Terminate
Erase page
Erase temp
Erase tags
Erase etags
Erase types
End Sub
End Class