Monday, November 08, 2010 at 12:04 AM.

system.verbs.builtins.mainResponder.search.server.buildHtml

on buildHtml (adrSearch, adrScreen, adrSearchRequest) {
	<<Build the HTML results screen.
		<<Changes:
			<<8/7/02; 6:21:54 PM by JES
				<<Added support for #renderOneSearchResult callback. The callback takes two parameters, adrInfo and ranking.
				<<adrInfo is the address of a table containing meta-data about the page, usually in the pageinfo sub-table of Index.root.
				<<ranking is a number which can be converted to a pseudo-percentage by calling mainResponder.search.utilities.getRankPercent.
			<<8/7/02; 4:00:45 PM by JES
				<<Call mainResponder.search.utilities.getRankPercent instead of calculating the rank percent here.
			<<9/11/99; 12:52:52 PM by PBS
				<<When displaying the title and text of a search result, replace < with < so any HTML in the title, for instance, doesn't add unwanted HTML to the search results page.
			<<9/10/99; 9:35:21 PM by PBS
				<<The feedback URL gets a .wsf suffix appended if pta^.wsfSuffixRequired is true.
				<<Requested by Seth Dillingham on the Frontier-Server list, to facilitate running the search engine behind external servers.
			<<8/20/99; 11:17:09 AM by PBS
				<<If a #buildSearchResults script is defined, then call that script, allowing a scripter to over-ride the standard search engine results display.
	
	local (pta);
	
	local (adrRenderOneResultCallback);
	bundle { //PBS 8/20/99: look for #buildSearchResults callback
		try {
			pta = html.getPageTableAddress ()};
		if pta != nil { //this works only if we're running in the context of the website framework
			if defined (pta^.responderAttributes.buildSearchResults) {
				local (adrCallback = @pta^.responderAttributes.buildSearchResults);
				while typeOf (adrCallback^) == addressType { //de-reference in a loop until it's no longer an address
					adrCallback = adrCallback^};
				return (adrCallback^ (adrSearch, adrScreen, adrSearchRequest))}}}; //call the callback script
	bundle { //JES 8/7/02: look for #renderOneSearchResult callback
		if pta != nil {
			if defined (pta^.responderAttributes.renderOneSearchResult) {
				local (adrCallback = @pta^.responderAttributes.renderOneSearchResult);
				while typeOf (adrCallback^) == addressType { //de-reference in a loop until it's no longer an address
					adrCallback = adrCallback^};
				adrRenderOneResultCallback = adrCallback}}};
	
	local (results);
	local (adrResults = @adrSearch^.rawResults);
	
	on buildOneHitHtml (pageID, ranking, adrSearch, adrScreen, adrSearchRequest) {
		local (adrPageInfo);
		local (htmlText = "");
		local (rankPercent);
		local (redirect = "feedback?url=");
		local (linkText, dateString);
		
		if pta != nil { //PBS 9/10/99: append .wsf suffix if needed.
			<<This facilitates running the search engine behind an external server like WebTen, IIS, etc.
				<<This code was contributed by Seth Dillingham, and edited slightly to remove a try statement.
			if defined (pta^.wsfSuffixRequired) and pta^.wsfSuffixRequired {
				redirect = "feedback.wsf?url="}};
		
		if not (adrSearchRequest^.feedback) {
			redirect = ""};
		
		adrPageInfo = @[adrSearch^.index].pageInfo.[pageID];
		
		if not defined (adrPageInfo^) { //safety check, in case the indexed page doesn't have an info table
			return ("")};
		
		if adrRenderOneResultCallback != nil {
			return (adrRenderOneResultCallback^ (adrPageInfo, ranking))};
		
		if not defined (adrScreen^.hitCounter) {
			adrScreen^.hitCounter = 0};
		adrScreen^.hitCounter++;
		
		<<htmlText = htmlText + "\r<table border=0 cellpadding=4 cellspacing=0 width=90%>"
		if adrScreen^.hitCounter % 2 == 1 {
			htmlText = htmlText + "\r<tr bgcolor=\"" + adrSearchRequest^.altColor + "\">"}
		else {
			htmlText = htmlText + "\r<tr>"};
		
		bundle { //determine rank percentage
			rankPercent = mainResponder.search.utilities.getRankPercent (ranking, adrSearch^.min) + "%"};
			<<bundle //old, now factored code
				<<ranking = ranking - adrSearch^.min
				<<case true
					<<ranking > 2615
						<<ranking = 100
					<<ranking > 2609
						<<ranking = 99
					<<ranking > 2599
						<<ranking = ranking - 2600
						<<ranking = 90 + ranking
					<<ranking > 2009
						<<ranking = 89
					<<ranking > 1999
						<<ranking = ranking - 2000
						<<ranking = 80 + ranking
					<<ranking > 1209
						<<ranking = 79
					<<ranking > 1199
						<<ranking = ranking - 1200
						<<ranking = 70 + ranking
					<<ranking > 1000
						<<ranking = ranking - 1000
						<<ranking = 70 + ranking
					<<ranking > 609
						<<ranking = 69
					<<ranking > 599
						<<ranking = ranking - 600
						<<ranking = 60 + ranking 
					<<ranking > 500 and ranking < 1001
						<<ranking = 60
					<<ranking > 500
						<<ranking = ranking - 500
						<<ranking = 50 + ranking
					<<ranking > 109
						<<ranking = 49
					<<ranking > 99
						<<ranking = ranking - 100
						<<ranking = ranking + 40
					<<ranking < 100
						<<if ranking > 39
							<<ranking = 39
				<<rankPercent = ranking + "%"
		
		htmlText = htmlText + "\r<td valign=top align=left width=5%><font size=-2>" + rankPercent + "</font></td>\r<td valign=top align=right width=10%><nobr><font size=-2>" + string.nthField (adrPageInfo^.lastModDate, ";", 1) + " </font></nobr></td>";
		
		if not defined (adrScreen^.linkQuery) {
			adrScreen^.linkQuery = string.replaceAll (adrSearchRequest^.searchString, " ", "+");
			adrScreen^.linkQuery = string.replaceAll (adrScreen^.linkQuery, "\"", """)};
		
		if adrPageInfo^.showText {
			<<linkText = string.replaceAll (adrPageInfo^.text, "<", "<")
			linkText = adrPageInfo^.text}
		else {
			local (pageTitle = string.replaceAll (adrPageInfo^.title, "<", "<"));
			if redirect == "" {
				linkText = "<a href=\"" + adrPageInfo^.url + "\">" + pageTitle + "</a>"}
			else {
				linkText = "<a href=\"" + redirect + adrPageInfo^.url + "&q=" + adrScreen^.linkQuery + "\">" + pageTitle + "</a>"}};
		
		if adrPageInfo^.siteName != "" and adrSearchRequest^.flShowSiteNames {
			htmlText = htmlText + "\r<td valign=top align=left width=65%><font size=-1>" + linkText+ "</font></td>\r<td valign=top align=left width=20%><font size=-2>" + "<a href=\"" + adrPageInfo^.siteUrl + "\">" + adrPageInfo^.siteName + "</a></font></td>"}
		else {
			htmlText = htmlText + "\r<td valign=top align=left width=65%><font size=-1>" + linkText+ "</font></td>\r<td valign=top align=left width=20%><font size=-2> </font></td>"};
		
		return (htmlText)}; // + "\r</tr></table>")
	
	adrScreen^.hitsThisPage = 0;
	
	adrScreen^.top = (sizeOf (adrResults^) + 1) - adrSearchRequest^.start;
	adrScreen^.bottom = (adrScreen^.top + 1) - adrSearchRequest^.maxHitsPerPage;
	
	adrScreen^.totalHits = nil;
	adrScreen^.end = (adrSearchRequest^.start + adrSearchRequest^.maxHitsPerPage) - 1;
	
	adrScreen^.totalHits = sizeOf (adrResults^);
	
	if adrScreen^.end > adrScreen^.totalHits {
		adrScreen^.end = adrScreen^.totalHits};
	if adrScreen^.bottom < 1 {
		adrScreen^.bottom = 1};
	
	for i = adrScreen^.top downTo adrScreen^.bottom {
		results = results + buildOneHitHtml (nameOf (adrResults^ [i]), adrResults^ [i], adrSearch, adrScreen, adrSearchRequest);
		adrScreen^.hitsThisPage++;
		if adrScreen^.hitsThisPage == adrScreen^.totalHits {
			break}};
	
	results = "\r<table border=\"0\" cellpadding=4 cellspacing=0 width=90%>" + results;
	results = results + "\r</tr></table>";
	
	return (results)}



This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.