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


on refGlossary (name) {
	<<10/19/98; 6:51:19 AM by DW
		<<When generating a link to an object by its name (see the last case) we now won't generate links to tables.
		<<It was always generating an incorrect link in previous versions, so this can't break websites.
			<<03/28/00; 2:16:58 PM by PBS
				<<Added the refGlossary callback. If an script in the page table named refGlossaryCallback exists, call it when the glossary item is found. The callback script takes the address of the glossary entry that was found and the address of a variable in which to place text. If the callback returns true, the text it placed in glossaryText is returned, otherwise the normal expansion takes place.
	local (adrPageTable = html.getPageTableAddress ());
	local (adrObject = adrPageTable^.adrObject);
	local (adrParent = parentOf (adrObject^));
	on foundIt (adr) { //new in 5.0
		if defined (adrPageTable^.refGlossaryCallback) {
			local (glossaryText);
			if adrPageTable^.refGlossaryCallback^ (adr, @glossaryText) {
				return (glossaryText)}};
		case typeOf (adr^) {
			scriptType { //new in 5.0, glossary items can be scripts
				return (adr^ ())};
			tableType { //new in 5.0, convert a table (prettier to look at) to a glossPatch
				local (s = "[[#glossPatch ", path = adr^.path);
				if html.inResponder (adrPageTable) {
					path = string.popSuffix (path) + ".wsf"};
				s = s + adr^.linetext + "|";
				s = s + path + "|]]";
				return (s)}}
		else {
			local (s = string (adr^));
			if (s beginsWith "{") and (s endsWith "}") {
				return (html.processMacros (s, false, adrPageTable))}
			else {
				if html.inResponder (adrPageTable) and string (adr^) beginsWith "[[#glossPatch " {
					<<Substitute .wsf extension.
					local (path = string.popSuffix (string.nthField (s, '|', 2)) + ".wsf");
					s = string.nthField (s, '|', 1) + "|" + path + "|]]";
					return (s)}
				else {
					return (s)}}}};
	if defined (adrPageTable^.glossary) { //look in the default glossary
		local (adrElement = @adrPageTable^.glossary^ [name]);
		if defined (adrElement^) {
			return (foundIt (adrElement))}};
	try { //check the hierarchy for glossary tables
		local (nomad = adrParent, newNomad, found = false);
		on glossLookup (glossName) {
			if (defined (nomad^.[glossName])) { //the table has a glossary
				local (adrElement = @nomad^.[glossName].[name]);
				if defined (adrElement^) { //it defines the term
					found = true;
					return (foundIt (adrElement))}}};
		loop {
			s = glossLookup ("glossary");
			if found {
				return (s)};
			s = glossLookup ("#glossary");
			if found {
				return (s)};
			newNomad = parentOf (nomad^);
			if newNomad == "" {
			nomad = newNomad}};
	try { //check the user table glossary
		return (string (user.html.glossary [name]))};
	if not (name beginsWith "#") {
		try { //look for objects at the same level with the name
			local (normalizedName = html.normalizeName (name, adrPageTable));
			local (ext = html.getPref ("fileExtension", adrPageTable));
			local (adr = @adrParent^.[normalizedName]);
			if defined (adr^) {
				if typeof (adr^) != tabletype {
					return ("<a href=\"" + normalizedName + ext + "\">" + name + "</a>")}};
			adr = adrParent^.[name];
			if defined (adr^) {
				if typeof (adr^) != tabletype {
					return ("<a href=\"" + normalizedName + ext + "\">" + name + "</a>")}}}};
	scriptError ("There is no glossary entry named \"" + name + "\"")}

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.