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


on buildGlossary (adrGlossary = table.getCursorAddress (), flinteract = false, adrFilterScript = nil) {
	<<10/9/98; 7:28:39 AM by DW
		<<added filter callback script, to allow custom glossary builders for specific websites
			<<I needed this to convert the Scripting News site to run dynamically.
		<<if there's an error, we display a dialog...
			<<asking if the user wants to edit the object, or continue building the glossary
		<<if flinteract is true, show the addresses of tables we add thru msg.
	<<Thu, Jan 14, 1999 at 4:25:18 PM by PBS
		<<If an object has a . character in its name, don't convert the dot to a /.
		<<This allows for pages whose names contain their file suffix.
		<<The same fix was made to html.addPageToGlossary.
	local (name = nameOf (adrGlossary^));
	if (string.lower (name) != "glossary") and (string.lower (name) != "#glossary") {
		scriptError ("Can't build the glossary because \"" + name + "\" is not named #glossary or glossary.")};
	local (ctAdded = 0);
	local (flquit = false); //if true, we unwind recusion
	on visit (adrtable) {
		local (i, ct = sizeof (adrtable^), adritem, type, title, stringstrip, path, pagetable);
		for i = 1 to ct {
			if flquit { //unwind recursion
			adritem = @adrtable^ [i];
			if html.traversalSkip (adritem) {
			type = typeOf (adritem^);
			if type == tableType {
				if not defined (adritem^.["#glossary"]) { //don't dive into tables that already have glossaries
					visit (adritem)}}
			else {
				new (tabletype, @pagetable);
				try {
					case type { //we only preflight outlines and wptexts
						wptextType {
							html.runDirectives (string (adritem^), @pagetable)};
						outlineType {
							local (outlinecopy = adritem^);
							html.runOutlineDirectives (@outlinecopy, @pagetable)}}
					else {
				else {
					local (s = "Error processing " + nameof (adritem^) + ": \"" + tryError + "\"");
					if dialog.twoWay (s, "Continue", "Edit") { //user chose Continue
					else { //user chose Edit
						edit (adritem);
						flquit = true;
				html.buildPageTable (adritem, @pagetable); //for file extension
				if adrFilterScript != nil { //10/9/98; 8:11:51 AM by DW
					if not adrFilterScript^ (adritem, @pagetable) {
				if flinteract {
					msg (adritem)};
				stringstrip = (string (siteroot) - "root.") + ".";
				local (name = nameOf (pageTable.adrObject^)); //PBS 1/14/99
				path = string (adritem) - stringstrip;
				path = string.replaceall (path, "[\"", "");
				path = string.replaceall (path, "\"]", "");
				path = string.mid (path, 1, sizeOf (path) - sizeOf (name)); //PBS 1/14/99
				path = string.replaceall (path, ".", "/");
				path = path + name; //PBS 1/14/99
				local (adrsubtable = @adrGlossary^.[pagetable.title]);
				new (tableType, adrsubtable);
				adrsubtable^.linetext = pagetable.title;
				adrsubtable^.path = path + html.getPref ("fileExtension", @pagetable);
				if flinteract {
					msg (adritem)};
		return (true)};
	local (basetable = parentOf (adrGlossary^)); //the objects that get added to the glossary
	local (siteroot);
	bundle { //set the siteroot to the root of the site, relative to the ftpsite.
		local (nomad = basetable);
		loop {
			if defined (nomad^.["#ftpsite"]) {
				siteroot = nomad;
			try { //see if the #ftpsite is in a #prefs table
				if defined (nomad^.["#prefs"].ftpsite) or defined (nomad^.prefs.["#ftpsite"]) {
					siteroot = nomad;
			nomad = parentOf (nomad^);
			if (nomad == @root) or (nomad == "") {
				siteroot = parentOf (adrGlossary^);
	if flinteract {
		if not dialog.confirm ("Rebuild \"" + adrGlossary + "?") {
	visit (basetable);
	if flinteract {
		dialog.notify (ctAdded + " glossary entries added.")};
	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.