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

system.verbs.builtins.html.utilities.buildMCF

on buildMCF (folder, url, f, sitename, author=user.name, org=user.organization, email=user.mailaddress, filter=@defaultFilter) {
	<<Wed, Dec 25, 1996 at 8:08:38 AM by DW
		<<Derived from Jim Correia's MCFGenerator suite.
		<<I'll list changes I make on the change notes page.
	<<Thu, Dec 26, 1996 at 9:57:32 PM by JimC
		<<removed remaning dependencies on MCFGenerator suite - uses the 4.2 html.getOneTagValue
		<<incorporated Guha's suggestions about the generated MCF
		<<added the email parameter
		<<added the filter paramter ( gives users more control over what files are included in the mcf )
	<<this is the default filter - only includes .html files in the resulting mcf
	on defaultFilter(f) {
		if file.isFolder(f) {
			return true};
		if ( f endsWith ".html" ) {
			msg (file.fileFromPath (f));
			return true};
		return false};
	<<this is the filter that is used if someone passes in nil - everything is included
	on nilFilter(f) {
		msg (file.fileFromPath (f));
		return true};
	<<this function does all the work
	on generateFileStructureMCF (baseFolder,outputFile,siteURL,siteName,authorName="",orgName="",mailAddress="",fileFilter) {
		local {
			mcfText = ""};
		if ( ! (siteURL endsWith "/" ) ) {
			siteURL = siteURL + "/"};
		<<utility methods
		on add(s) {
			mcfText = mcfText + s + cr};
		on addAuthor() {
			<<if (authorName!="")
				<<add("author_individual_name: \"" + authorName + "\"")
			if ((authorName!="")&&(mailAddress!="")) {
				add("authorIndividual: #\"" + mailAddress + "\"")}};
		on addOrganization() {
			<<if (orgName!="")
				<<add("author_organization_name: \"" + orgName + "\"")
			if (orgName!="") {
				add("authorOrganization: #\"" + orgName + "\"")}};
		on addFileInfo(f) {
			add("firstPublicationDate: \"" + date.shortString(file.created(f)) + "\"");
			add("lastRevisionDate: \"" + date.shortString(file.modified(f)) + "\"");
			add("size: \"" + file.size(f) + "\"")};
		
		bundle { <<add the file header information
			<<add("begin-headers:\rMCFVersion: 1.0\rname: \"" + siteName + "\"\rend-headers:")
			add(";This MCF File was generated by Userland Frontier 4.2 Mac -" + clock.now());
			<<add(";Script by Jim Correia <pmth02jc@umassd.edu> and Dave Winer <dwiner@well.com>.")
			add("");
			add("begin-headers:");
			add("MCFVersion: 1.0");
			add("name: \"" + siteName + "\"");
			add("typeOf: #\"TableOfContents\"");
			add("tocOf: \"" + siteURL + "\"");
			add("end-headers:");
			add("");
			bundle { << add an author tag
				if ((authorName!="")&&(mailAddress!="")) {
					add("unit: \"" + mailAddress + "\"");
					add("name: \"" + authorName + "\"");
					add("typeOf: #\"person\"");
					add("emailAddress: \"" + mailAddress + "\"");
					add("")}};
			bundle { << add an organization tag
				if (orgName!="") {
					add("unit: \"" + orgName + "\"");
					add("name: \"" + orgName + "\"");
					add("typeOf:#\"Organization\"");
					add("")}}};
		
		on ProcessFolder(theFolder,parentgenls="",topmostfolder=false) {
			rollBeachBall();
			local ( genls="" );
			if ( topmostfolder==false ) {
				genls = string(theFolder) - string(baseFolder);
				<<genls = string.replaceAll(genls,":","/") - "/"
				genls = string.replaceAll(genls,":","/");
				<<genls = (siteURL - "http://") + (genls) + ".mco"
				genls = (siteURL - "http://") + (genls);
				add( "unit: \"" + genls + "\"");
				add( "name: \"" + ( file.fileFromPath(theFolder) - ":") + "\"");
				add( "typeOf: #\"SubjectCategory\"" );
				addAuthor();
				addOrganization();
				if ( parentgenls!="" ) {
					<<add( "genls: \"" + parentgenls + "\"")
					add( "parent: #\"" + parentgenls + "\"")};
				add("")};
			local ( f );
			fileloop( f in theFolder ) {
				if ( fileFilter^(f) ) {
					if ( file.isFolder(f) ) {
						ProcessFolder(f,genls)}
					else {
						ProcessFile(f,genls)}}}};
		on ProcessFile(theFile,thegenls) {
			<<if ( ! (theFile endsWith ".html") )
				<<return
			<<moved into the default filters
			rollBeachBall();
			local ( s );
			s = theFile - baseFolder;
			s = string.replaceAll(s,":","/");
			add( "unit: \"" + siteURL + s + "\"");
			local ( theTitle = html.getOneTagValue( string(file.readWholeFile(f)), "title") );
			if ( theTitle == "" ) {
				theTitle = file.fileFromPath(f)};
			add( "name: \"" + theTitle + "\"");
			addAuthor();
			addOrganization();
			addFileInfo(f);
			if ( thegenls!="" ) {
				<<add( "genls: \"" + thegenls + "\"")
				add( "parent: #\"" + thegenls + "\"")};
			add("")};
		
		ProcessFolder(baseFolder,"",true);
		msg ("Writing file...");
		file.writeWholeFile(outputFile, mcfText, 'TEXT', 'R*ch', clock.now());
		msg ("");
		return true};
	if ( filter == nil ) {
		filter = @nilFilter};
	return (generateFileStructureMCF (folder, f, url, sitename, author, org, email, filter))}
<<bundle <<test code
	<<local (folder = "internal:apps:webstar:frontier:")
	<<local (url = "http://www.scripting.com/frontier/")
	<<local (f = folder + "siteMap.mcf")
	<<buildMCF (folder, url, f, "Frontier")
<<bundle <<Êmore test code
	<<html.utilities.buildMCF ("Touch of Grey:WebSite:", "http://tango.mth.umassd.edu/correia/", "Touch of Grey:WebSite:root.mcf", "JimC")



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.