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

on index (adrObject, flMsgReader=false, adrDgMsg=nil, adrSiteTable=nil) {
	<<Index an object.
		<<This is the highest-level client-side index verb. Call this whenever something is new or changed.
		<<Pages are indexed when:
			<<1) They're checked in or sent to server via WebEdit.
			<<2) A discussion group message is new or changed.
		<<Wed, Mar 10, 1999 at 1:33:27 PM by PBS
			<<01/31/00; 12:50:09 PM by PBS
				<<Don't index messages in a Manila site. Allow Manila's indexing routines to handle those. Don't add anything to the log in this case.
			<<01/21/00; 6:10:11 PM by PBS
				<<If the script has access to the page table, get the address of the site there and check to see if it's a Manila site. If so, don't try the standard mainResponder indexer, allow Manila's indexer to handle indexing.
			<<07/15/00; 12:51:02 PM by PBS
				<<Fixed a bug in checking that the site is a Manila site. If a site is a Manila site, let Manila handle sending the index request to the search engine, skip the mainResponder indexer.
	local (dbPath = window.getFile (table.getRootAddress (adrObject)));
	local (adrParent = parentOf (adrObject^));
	try { //PBS 01/31/00: don't index content in a Manila site, allow Manila's own indexing routines to handle indexing.
		try { //we might have access to the page table -- get the address of the site there.
			local (pta = html.getPageTableAddress ());
			if manilaSuite.isManilaSite (pta^.adrSiteRootTable) {
				return (true)}};
		if string.lower (nameOf (adrParent^)) == "messages" {
			local (adrDg = parentOf (adrParent^));
			if string.lower (nameOf (adrDg^)) == "#discussiongroup" {
				local (adrSite = parentOf (adrDg^));
				if manilaSuite.isManilaSite (adrSite) {
					return (true)}}}}; //don't index, this is a Manila site, let Manila do the indexing
	local (pageTable);
	new (tableType, @pageTable);
	<<First make sure our prefs exist.
	if not defined ( { (adrObject, "because is undefined.");
		return (true)};
	<<Find out if this is a discussion group message. If it is, call indexDiscussionMessage and return.
	bundle {
		local (flDg = false);
		bundle { //PBS 03/15/00: new logic for finding out if it's a dg message -- supports discussion groups outside of discuss.root
			if string.lower (dbPath) == string.lower (system.temp.mainResponder.discussRootFile) {
				flDg = true}
			else {
				local (adrParent = parentOf (adrObject^));
				if nameOf (adrParent^) == "messages" { //it's probably a dg message
					<<Check to see if the object is a table containing subject, body, member, and postTime fields.
					if defined (adrObject^.body) and defined (adrObject^.subject) and defined (adrObject^.member) and defined (adrObject^.postTime) {
						<<It's a dg message.
						flDg = true}}}};
		if flDg {
			<<Make sure the parent of adrObject is the messages table.
			if string.lower (nameOf (adrParent^)) == "messages" {
				<<flDiscussMessage = true //PBS 03/15/00: this line appears to be extraneous
				return ( (adrObject))}
			else { //it's a change to discuss.root, but it's not a changed message. Don't index, return right away. (adrObject, "is in discuss.root, but it's not the address of a discussion group message table.");
				return (true)}}}; //true just means this script ran okay, it doesn't indicate anything else
	<<At this point, adrObject is in a website, or it shouldn't be indexed.
	<<First make sure it's in a website and doesn't start with # or have # in its path.
		<<Otherwise return -- this object should not be indexed.
	bundle {
		if html.traversalSkip (adrObject) { (adrObject, "begins with a # sign.");
			return (true)};
		if not ( (adrObject)) { (adrObject, "it's not in the content part of a website.");
			return (true)}};
	<<At this point, adrObject is either a page, a part of a table that's a table, or a table containing pages.
		<<If it's a page, index it.
		<<If it's part of a table that's a page, figure out the address of the page itself.
		<<If it's a table containing pages, loop through the table, indexing each page.
	bundle { //build the page table for this page, we'll need it
		<<Build a page table.
		html.buildPageTable (adrObject, @pageTable)};
	<<If it's a table, is it a table of pages or a table that's rendered as one web page?
	if typeOf (adrObject^) == tableType {
		<<Look for the presence of a #renderTableWith directive. Look for a msgNum item.
		if defined (pageTable.renderTableWith) {
			if defined (adrObject^.msgNum) and defined (adrObject^.discussionRoot) {
				return ( (adrObject, @pageTable, flMsgReader, adrDgMsg, adrSiteTable))} //it's a page, index it
			else {
				<<It's impossible to tell if it's a page or not. Don't index it, rather than index it wrongly.
					<<Return. (adrObject, "the search engine can't tell if this is a page or a table containing other pages.");
				return (true)}}
		else { //it's a table containing other pages. Loop through the objects in that table.
			local (i);
			for i = 1 to sizeOf (adrObject^) { (@adrObject^ [i], flMsgReader, adrDgMsg, adrSiteTable)};
			return (true)}}
	else { //if it's not a table, it might be contained by a table that's a page
		<<Look for a renderTableWith directive.
		if defined (pageTable.renderTableWith) {
			if defined (adrParent^.msgNum) { //it's contained by a table that's a page
				return ( (adrParent, @pageTable, flMsgReader, adrDgMsg, adrSiteTable))}
			else {
				<<We don't know if this is a page or part of a table that's a page. Don't index, return. (adrObject, "the search engine can't tell if this is a page or an element in a table containing other pages.");
				return (true)}}
		else { //it's a page, index it
			return ( (adrObject, @pageTable, flMsgReader, adrDgMsg, adrSiteTable))}};
	return (true)}

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.