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


on crawler (adrobject, adrcallback = @msg) {
	local (adrstack = @system.temp.crawlerStack);
	on crawlObject (adrobject) {
		try {
			adrstack^.[string.padwithzeros (sizeof (adrstack^), 5)] = adrobject;
			if not adrcallback^ (adrobject) { //callback gets to say no
			case typeof (adrobject^) {
				addresstype {
					if not defined (adrobject^^) {
						edit (adrobject);
						scripterror ("Pointer points to an object that doesn't exist.")};
					crawlObject (adrobject^)};
				tabletype {
					local (i, adritem);
					for i = 1 to sizeof (adrobject^) {
						adritem = @adrobject^ [i];
						if not html.traversalSkip (adritem) {
							crawlObject (adritem)}}};
				filespectype {
					local (f = adrobject^);
					if not file.exists (f) {
						edit (adrobject);
						scripterror (f + " does not exist.")};
					if file.isfolder (f) {
						local (subfile);
						fileloop (subfile in f) {
							crawlObject (@subfile)}}
					else {
						if f endswith ".root" { //an object db, open it
							local (weOpenedIt = false);
							if not window.isopen (f) { (f);
								window.hide (f);
								weOpenedIt = true};
							crawlObject (@[f]);
							if weOpenedIt {
								filemenu.close (f)}}}}};
			delete (@adrstack^ [sizeof (adrstack^)])}
		else {
			edit (adrobject);
			scripterror (tryerror)}};
	mainresponder.init ();
	window.about ();
	if defined (adrstack^) {
		table.emptytable (adrstack)}
	else {
		new (tabletype, adrstack)};
	crawlObject (adrobject)}
<<bundle //test code
	<<on callback (adrobject)
		<<case typeof (adrobject^)
				<<msg (adrobject^)
			<<msg (adrobject)
		<<return (true)
	<<crawler (, @callback)

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.