Monday, November 08, 2010 at 12:04 AM.
system.verbs.builtins.mainResponder.search.client.index
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
<<Changes:
<<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 (config.mainResponder.search) {
mainResponder.search.client.logNoIndex (adrObject, "because config.mainResponder.search 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 (mainResponder.search.client.indexDiscussionMessage (adrObject))}
else { //it's a change to discuss.root, but it's not a changed message. Don't index, return right away.
mainResponder.search.client.logNoIndex (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) {
mainResponder.search.client.logNoIndex (adrObject, "begins with a # sign.");
return (true)};
if not (mainResponder.search.client.inWebsite (adrObject)) {
mainResponder.search.client.logNoIndex (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 (mainResponder.search.client.indexPage (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.
mainResponder.search.client.logNoIndex (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^) {
mainResponder.search.client.index (@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 (mainResponder.search.client.index (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.
mainResponder.search.client.logNoIndex (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 (mainResponder.search.client.indexPage (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.