Monday, November 08, 2010 at 12:04 AM.
system.verbs.builtins.mainResponder.siteTree.addSiteToTree
on addSiteToTree (domainName, path, siteRef, flCreateDomain = false, flConvertToSiteTree = false, adrDomains = @config.mainResponder.domains) { <<Changes <<7/9/03; 3:44:34 PM by JES <<Fixed a bug which could cause invalid XML to be produced for the site tree if siteRef is the address of an object whose name begins with a numeric character. <<8/13/02; 4:54:46 PM by JES <<Pass adrDomains to mainResponder.siteTree.convertDomainToSiteTree. <<8/13/02; 3:47:32 PM by JES <<New optional parameter, adrDomains. Compile the siteTree XML after adding a new site to the tree. <<8/6/02; 6:35:22 PM by JES <<Fixed a pair of bugs which would cause errors when creating a top-level site for the first time. <<7/1/02; 11:44:22 PM by JES <<Add a site to the siteTree for a given domain. <<Parameters: <<domainName -- the domain to add the site to <<path -- the relative, slash-delimited path for the site <<siteRef -- a reference to the site -- an address or a filespec. local (adrdomain = @adrDomains^.[domainName]); try {mainResponder.siteTree.compileIfDirty (adrdomain)}; if not defined (adrdomain^) { //make sure the domain exists if flCreateDomain { new (tableType, adrdomain); new (tableType, @adrdomain^.siteTree); new (tableType, @adrdomain^.siteTree.directory); op.newOutlineObject ("<siteTree>\r\t</siteTree>", @adrdomain^.siteTree.directory.outline)} else { scriptError ("Can't add a site to \"" + domainName + "\" because the domain doesn't exist.")}}; if not defined (adrdomain^.siteTree) { //make sure the domain is defined by an XML siteTree if flConvertToSiteTree { mainResponder.siteTree.convertDomainToSiteTree (domainName, adrDomains)} else { scriptError ("Can't add a site to \"" + domainName + "\" because the domain is not defined by an XML siteTree.")}}; local (flAddress = false, flFile = false, flRedirect = false); case typeOf (siteRef) { addressType { flAddress = true}; stringType; filespecType { if string.lower (siteRef) beginsWith "http://" { //redirect flRedirect = true} else { flFile = true}}} else { //configuration error scriptError ("Can't create the siteTree entry for \"" + siteRef + "\" because there's a configuration error for the \"" + domainName + "\" domain.")}; bundle { //add the site to the tree local (pathAttName); bundle { //set pathAttName, pop file from address if necessary if flAddress { pathAttName = "address"; siteRef = string.popFileFromAddress (siteRef); siteRef = string.replaceAll (siteRef, "[\"", ""); siteRef = string.replaceAll (siteRef, "\"]", "")}; if flFile { pathAttName = "folderpath"}; if flRedirect { pathAttName = "redirect"}}; if path beginsWith "/" { path = string.delete (path, 1, 1)}; local (xstruct); local (adroutline = @adrdomain^.siteTree.directory.outline); xml.compile (string (adroutline^), @xstruct); local (adrtree = xml.getAddress (@xstruct, "siteTree")); if typeOf (adrtree^) == stringType { if adrtree^ == "" { new (tableType, adrtree)}}; local (adrtopsite); try { //get adrtopsite adrtopsite = xml.getAddress (adrtree, "site")} else { //create top site adrtopsite = xml.addTable (adrtree, "site")}; local (nomad = mainResponder.siteTree.dive (adrtopsite, path, true)); if not defined (nomad^.["/atts"]) { new (tableType, @nomad^.["/atts"])}; nomad^.["/atts"].[pathAttName] = siteRef; bundle { //delete other atts that may be lying around if we're re-defining an existing site if flAddress { if defined (nomad^.["/atts"].folderpath) { delete (@nomad^.["/atts"].folderpath)}; if defined (nomad^.["/atts"].redirect) { delete (@nomad^.["/atts"].redirect)}}; if flFile { if defined (nomad^.["/atts"].address) { delete (@nomad^.["/atts"].address)}; if defined (nomad^.["/atts"].redirect) { delete (@nomad^.["/atts"].redirect)}}; if flRedirect { if defined (nomad^.["/atts"].address) { delete (@nomad^.["/atts"].address)}; if defined (nomad^.["/atts"].folderpath) { delete (@nomad^.["/atts"].folderpath)}}}; bundle { //delete all /pcdata tables, since they prevent sub-elements from being decompiled on visitproc (adrtable) { if defined (adrtable^.["/pcdata"]) { delete (@adrtable^.["/pcdata"])}; return (true)}; table.visit (@xstruct, @visitproc)}; local (xtext = xml.decompile (@xstruct)); xtext = string.trimWhiteSpace (string.delete (xtext, 1, sizeOf (string.nthField (xtext, "\r", 1) + 1))); op.newOutlineObject (xtext, adroutline); mainResponder.siteTree.compileIfDirty (adrdomain)}; return (true)} <<bundle //test code <<addSiteToTree ("default", "foo", "Mac_OS_X:") <<addSiteToTree ("default", "bar", @createASiteManilaWebsite) <<addSiteToTree ("default", "baz", "http://www.yahoo.com") <<addSiteToTree ("default", "flim/flam/floz", "http://www.scripting.com")
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.