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

system.verbs.builtins.webserver.data.actions.macro

on macro (paramAdr) {
	<<This script currently supports only a single WebStar web server per machine.
		<<Support for other web servers and multiple servers per machine will be added later.
		<<by Mason Hale 9/20/95
		<<10/29/95 Added support for default documents.
	local (webroot =  file.folderFromPath (sys.getAppPath (Webstar.id)), pathtemp, htmlText);
	with paramAdr^ {
		if !defined (user.webServer.utilities.macroData) {
			new (tableType, @user.webServer.utilities.macroData)};
		bundle { <<build path to file from URL
			if scriptName endsWith "/" {
				<<default document was requested
				pathtemp = string.popLeading (scriptName, "/");
				pathtemp = string.replaceAll (pathTemp, "/", ":");
				if !defined (user.webServer.utilities.macroData.defaultPage) {
					user.webServer.utilities.macroData.defaultPage = WebStar.getIndexFile ()};
				pathtemp = webroot + pathtemp + user.webServer.utilities.macroData.defaultPage}
			else {
				pathtemp = string.popLeading (scriptName, "/");
				pathtemp =  string.replaceAll (pathTemp, "/", ":");
				pathtemp = webroot + pathtemp}};
		if defined (user.webServer.utilities.macroData.[scriptName]) {
			htmltext = user.webServer.utilities.macroData.[scriptName]}
		else {
			if !file.exists (pathtemp) {
				scriptError ("The file \"" + pathtemp + "\" was not found")}
			else {
				if !file.type (pathtemp) == "TEXT" {
					htmlText = webserver.errorMessage ("File is not expected type 'TEXT'.")}
				else { <<file exists and is TEXT, read it and process macros
					semaphores.lock (string (pathtemp), 3600);
					try {
						file.open (pathtemp);
						htmlText = string (file.read (pathtemp, infinity));
						file.close (pathtemp);
						semaphores.unlock (string (pathtemp));
						webServer.utilities.macroData.[scriptName] = htmlText}
					else {
						semaphores.unlock (string (pathtemp));
						scriptError ("Error opening file.")}}}};
		htmltext  = webserver.httpHeader () + webserver.utilities.processMacros (htmltext, paramAdr)};
	if !defined (cacheDate) {
		webServer.utilities.macroData.cacheDate = clock.now ()};
	if long (clock.now () - webServer.utilities.macroData.cacheDate) > 86400 { << 1 day
		table.emptyTable (@webServer.utilities.macroData)};
	return (htmltext);
	}



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.