Main Page Content
ASP BreadCrumb Class
Rated 0 (Add your rating)
Log in to add a comment
(0 comments so far)
Background
My current employer Etelesolv (www.etelesolv.com) had a client that, as part of their new website, required that required breadcrumb nav. The project was to use ASP .
I had used the BreadCrumbs PHP Class, by Richard Baskitt, for a couple of projects and I wanted to have a class similar to it that would easily implement this type of navigation. The closest thing I could find on the web was Adrian Roselli's "Breadcrumbs for Those Using ASP" evolt.org article.
So I proceded to use the Breadcrumb PHP Class model and implement some of Adrien's string manipulation methods with a touch of ASP 101 for the PCase method, to create a reusable piece of code that our developers could use on any of their projects. I now share it with you.... (dramatic reverberation)
Here is the code:
<%
'BreadCrumb Class v1.0
'Created by Jason Irving Copyright 2005 - pittster@hotmail.com
'Last Update January 24, 2005
'This class was heavily influenced by Breadcrumbs PHP Class @ http://www.baskettcase.com/classes/breadcrumb/
'the build method was inspired by breadcrumb.asp Version 1.0 by Adrian Roselli adrian@roselli.org @ http://www.evolt.org/article/Breadcrumbs_for_Those_Using_ASP/17/4438/
'********Properties
'cssClass : string - css stylesheet class for the <a> tag
'to separate the style for the delimiter, use the following css syntax example
' mystyle { color: blue; }
' mystyle a {color: red; }
' the delimiter will be in the first style, the link in the second
'Homepage : string - name of the homepage
'Uscore2Space : boolean string (1, yes, true) - replace underscores with " " space
'wordCase : string (mixed, upper, lower) -
'Delimiter : string - the text delimiter between elements
'showFiles : boolean string (1, yes, true) - append the name of the viewed file to menu
'showFilesNoExt: boolean string (1, yes, true) - append the name of the viewed file to menu without extension, overrides showFiles
'
'*********Methods
'build() - print the menu
'changeName : string tag, string, str - Hashtable of elements and replacement words
class clsBreadCrumb
Private strDelimiter
Private dictReplaceWords
Private strPath
Private strCSSClass
Private strHomePage
Private bolUscore2Space
Private bolShowFiles
Private bolShowFilesNoExt
Private strCaseFormat
Private Sub Class_Initialize()
strCSSClass = ""
strHomePage = "home"
strPath = Request.ServerVariables("PATH_INFO")
bolUscore2Space = "1"
strCaseFormat = "mixed"
bolShowFiles = "1"
bolShowFilesNoExt = "0"
strDelimiter = ">"
set dictReplaceWords = Server.CreateObject("Scripting.Dictionary")
End Sub
Private Sub Class_Terminate()
dictReplaceWords = nothing
End Sub
'*********Properties*************
'*****SET
Public Property Let cssClass(str)
strCSSClass = " class='" & str & "'"
End Property
Public Property Let Homepage(str)
strHomePage = str
End Property
Public Property Let showFiles(str)
if lcase(trim(str)) = "1" or lcase(trim(str)) = "yes" or lcase(trim(str)) = "true" then
bolShowFiles = 1
else
bolShowFiles = 0
end if
End Property
Public Property Let showFilesNoExt(str)
if lcase(trim(str)) = "1" or lcase(trim(str)) = "yes" or lcase(trim(str)) = "true" then
bolShowFilesNoExt = 1
else
bolShowFilesNoExt = 0
end if
End Property
Public Property Let Uscore2Space(str)
if lcase(trim(str)) = "1" or lcase(trim(str)) = "yes" or lcase(trim(str)) = "true" then
bolUscore2Space = 1
else
bolUscore2Space = 0
end if
End Property
Public Property Let wordCase(str)
if lcase(trim(str)) = "mixed" or lcase(trim(str)) = "upper" or lcase(trim(str)) = "lower" then
strCaseFormat = lcase(trim(str))
else
strCaseFormat = "mixed"
end if
End Property
Public Property Let Delimiter(str)
strDelimiter = Server.HTMLEncode(trim(str))
End Property
'*********Methods*************
Public Function changeName(tag,str)
dictReplaceWords.add lcase(tag), lcase(str)
End Function
Public Function Build()
dim tmpPath
dim strTmpPath
dim DirPath
dim FullPath
dim strContent
FullPath = strPath
response.write ("")
Do Until instr(1,FullPath,"/") = 0
'Split the string on the "/"
strTmpPath = Trim(mid(FullPath,1,instr(1,FullPath,"/")-1))
DirPath = DirPath & strTmpPath & "/"
'Replace the underscore with a space if the option is set
if bolUscore2Space = 1 then
strTmpPath = Replace(Trim(strTmpPath),"_"," ")
end if
if dictReplaceWords.exists(lcase(strTmpPath)) then
strTmpPath = dictReplaceWords.item(strTmpPath)
end if
'Apply the appropriate case to the entry
'get the next directory
FullPath = mid(FullPath,instr(1,FullPath,"/")+1,Len(FullPath)-Len(tmpPath))
'create the filename entry if applicable
dim tmpFileName
dim tmpFileNameLabel
tmpFileName = FullPath
if instr(1,tmpFileName,"/") = 0 then
if bolShowFilesNoExt = "1" then
dim intPos
intPos = InStrRev(tmpFileName , ".", -1, 1)
if intPos > 0 Then
tmpFileNameLabel = Left(tmpFileName , intPos - 1)
end if
else
tmpFileNameLabel = tmpFileName
end if
else
tmpFileName = ""
end if
select case lcase(strCaseFormat)
case "mixed"
strTmpPath = PCase(strTmpPath)
strHomePage = PCase(strHomePage)
case "upper"
strTmpPath = UCase(strTmpPath)
strHomePage = UCase(strHomePage)
case "lower"
strTmpPath = LCase(strTmpPath)
strHomePage = LCase(strHomePage)
case else
strTmpPath = PCase(strTmpPath)
strHomePage = PCase(strHomePage)
end select
'add home page link
if strTmpPath = "" then
response.write "" & strHomePage & ""
else
response.write " " & strDelimiter & " " & strTmpPath & ""
end if
if tmpFileName "" then
if bolShowFiles = "1" or bolShowFilesNoExt = "1" then
response.write " " & strDelimiter & " " & tmpFileNameLabel & ""
end if
end if
Loop
response.write ("")
End Function
'************************************************************
' This function takes a string and converts to Proper Case.
' Prototyped by: Brian Shamblen on 3/18/99
' This version by: Us... naturally! - ASP 101
'************************************************************
private Function PCase(strInput)
Dim iPosition ' Our current position in the string (First character = 1)
Dim iSpace ' The position of the next space after our iPosition
Dim strOutput ' Our temporary string used to build the function's output
' Set our position variable to the start of the string.
iPosition = 1
' We loop through the string checking for spaces.
' If there are unhandled spaces left, we handle them...
Do While InStr(iPosition, strInput, " ", 1) 0
' To begin with, we find the position of the offending space.
iSpace = InStr(iPosition, strInput, " ", 1)
' We uppercase (and append to our output) the first character after
' the space which was handled by the previous run through the loop.
strOutput = strOutput & UCase(Mid(strInput, iPosition, 1))
' We lowercase (and append to our output) the rest of the string
' up to and including the current space.
strOutput = strOutput & LCase(Mid(strInput, iPosition + 1, iSpace - iPosition))
' Note:
' The above line is something you may wish to change to not convert
' everything to lowercase. Currently things like "McCarthy" end up
' as "Mccarthy", but if you do change it, it won't fix things like
' ALL CAPS. I don't see an easy compromise so I simply did it the
' way I'd expect it to work and the way the VB command
' StrConv(string, vbProperCase) works. Any other functionality is
' left "as an exercise for the reader!"
' Set our location to start looking for spaces to the
' position immediately after the last space.
iPosition = iSpace + 1
Loop
' Because we loop until there are no more spaces, it leaves us
' with the last word uncapitalized so we handle that here.
' This also takes care of capitalizing single word strings.
' It's the same as the two lines inside the loop except the
' second line LCase's to the end and not to the next space.
strOutput = strOutput & UCase(Mid(strInput, iPosition, 1))
strOutput = strOutput & LCase(Mid(strInput, iPosition + 1))
' That's it - Set our return value and exit
PCase = strOutput
End Function
end class %>
To implement it on a page, simply do the following
<%
dim objBreadCrumb
set objBreadCrumb = new clsBreadCrumb
'Set a property
objBreadCrumb.wordCase = "upper"
' Changes the instance of a directory called "about" to "about this site"
objBreadCrumb.changeName("about", "about this site")
objBreadCrumb.Build()
%>
Use the guides at the top of the class source code and VOILA! a breadcrumb nav.
Enjoy,
Jason Irving


