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

system.verbs.builtins.html.data.standardMacros.linkStyleSheet

on linkStyleSheet (sheetName="default", sheetTitle="", adrPageTable=nil) {
	<<Create a link to an external style sheet of the form:
		<<<link rel=stylesheet href="../defaultStyleSheet.css" type="text/css">
		<<Call this macro from within your #pageHeader attribute.
		<<Style sheets are stored in a #styleSheets table.
		<<You can have multiple, named style sheets.
		<<The #styleSheets are searched hierarchically.
		<<This macro also renders the style sheet and writes it to disk.
		<<Thu, May 14, 1998 at 3:35:12 PM by PBS
	
	local (nomad, s, urlPrefix, adrStyleSheet);
	local (folder, styleSheetText, fname);
	local (templateName);
	
	if adrPageTable == nil {
		adrPageTable = html.getPageTableAddress ()};
	
	<<Are we using an alternate template?
		<<Saturday, May 30, 1998 at 5:04:32 PM by PBS
	try {
		if adrPageTable^.indirectTemplate {
			templateName = html.getPref ("template", adrPageTable)}};
	
	bundle { //find the address of the style sheet
		on getStyleSheetAddress (altTemplate=nil) {
			nomad = adrPageTable^.adrObject;
			folder = file.folderFromPath (adrPageTable^.f);
			urlPrefix = "";
			loop { //search for the named style sheet object
				nomad = parentOf (nomad^);
				if nomad == nil or nomad == @root {
					break};
				if altTemplate != nil {
					if defined (nomad^.["#styleSheets"].[altTemplate].[sheetName]) {
						adrStyleSheet = @nomad^.["#styleSheets"].[altTemplate].[sheetName];
						break};
					if defined (nomad^.["#prefs"].styleSheets.[altTemplate].[sheetName]) {
						adrStyleSheet = @nomad^.["#prefs"].styleSheets.[altTemplate].[sheetName];
						break};
					if defined (nomad^.["#prefs"].["#styleSheets"].[altTemplate].[sheetName]) {
						adrStyleSheet = @nomad^.["#prefs"].["#styleSheets"].[altTemplate].[sheetName];
						break}}
				else {
					if defined (nomad^.["#styleSheets"].[sheetName]) {
						adrStyleSheet = @nomad^.["#styleSheets"].[sheetName];
						break};
					if defined (nomad^.["#prefs"].styleSheets.[sheetName]) {
						adrStyleSheet = @nomad^.["#prefs"].styleSheets.[sheetName];
						break};
					if defined (nomad^.["#prefs"].["#styleSheets"].[sheetName]) {
						adrStyleSheet = @nomad^.["#prefs"].["#styleSheets"].[sheetName];
						break}};
				folder = file.folderFromPath (folder);
				urlPrefix = "../" + urlPrefix}};
		if templateName != nil {
			getStyleSheetAddress (templateName)}; //alternate template
		if adrStyleSheet == nil {
			getStyleSheetAddress ()}; //default template
		if adrStyleSheet == nil { //Didn't find it
			scriptError ("Can't link to style sheet \"" + sheetName + "\" because it wasn't found.")}};
	
	bundle { //build the html
		local (maxLen = number (html.getPref ("maxFileNameLength", adrPageTable)));
		if sizeOf (sheetName) > (maxLen - 4) { //make sure the file name isn't too long
			sheetName = string.mid (sheetName, 1, maxLen - 4)};
		fname = sheetName + ".css";
		s = "<link rel=stylesheet href=\"" + urlPrefix + fname + "\"";
		if sheetTitle != "" {
			s = s + " title=\"" + sheetTitle + "\""};
		s = s + " type=\"text/css\">"};
	
	bundle { //render the style sheet object
		case typeOf (adrStyleSheet^) {
			outlineType {
				<<We cache rendered sheets based on modification dates.
				local (adrCache = @temp.renderedStyleSheets);
				local (adrCachedSheet);
				if not defined (adrCache^) {
					new (tableType, adrCache)};
				adrCachedSheet = @adrCache^.[adrStyleSheet];
				if defined (adrCachedSheet^) {
					local (modDateSheet = timeModified (adrStyleSheet));
					local (modDateCache = timeModified (adrCachedSheet));
					if modDateSheet < modDateCache {
						styleSheetText = string (adrCachedSheet^)}};
				if styleSheetText == "" {
					styleSheetText = html.utilities.renderStyleSheet (adrStyleSheet);
					wp.newTextObject (styleSheetText, adrCachedSheet)}};
			scriptType {
				styleSheetText = adrStyleSheet^ ()}}
		else {
			styleSheetText = string (adrStyleSheet^)}};
	
	bundle { //write the style sheet to disk if needed
		local (f = folder + fname, flWrite = true);
		if file.exists (f) and (string.lower (html.getPref ("fileWriter", adrPageTable)) == "file") {
			if file.modified (f) > timeModified (adrStyleSheet) {
				if typeOf (adrStyleSheet^) != scriptType {
					flWrite = false}}};
		if flWrite {
			html.writeFile (f, @styleSheetText, 'TEXT', html.getPref ("textFileCreator"), clock.now (), adrPageTable)}};
	
	return (s)} //return the link text



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.