Monday, November 08, 2010 at 12:03 AM.
system.verbs.builtins.html.buildObject
on buildObject (adrObject, adrPageTable=@websites.["#data"], templateName=nil) { local (pc = file.getPathChar (), adrFiltersTable); local (flSemaphores = true); bundle { //store the page table address html.setPageTableAddress (adrPageTable)}; if not (html.getPref ("useSemaphores", adrPageTable)) { flSemaphores = false}; if defined (adrPageTable^) { if adrPageTable == @websites.["#data"] { //DW 3/4/98 table.emptyTable (adrPageTable)}} else { new (tableType, adrPageTable)}; html.buildPageTable (adrObject, adrPageTable, templateName); bundle { //handle binary objects if typeOf (adrObject^) == binaryType { return (html.publishBinaryObject (adrObject, adrPageTable, templateName))}}; if defined (adrPageTable^.filters) { //call firstFilter adrFiltersTable = adrPageTable^.filters; if defined (adrFiltersTable^.firstFilter) { adrFiltersTable^.firstFilter (adrPageTable)}}; local (ro); bundle { //semaphore lock around call to render object if flSemaphores { semaphore.lock ("html.data.adrPageTable", 3600)}; html.data.adrPageTable = adrPageTable; //see html.refGlossary ro = html.tenderRender (adrObject); try {delete (@html.data.adrPageTable)}; if flSemaphores { semaphore.unlock ("html.data.adrPageTable")}}; bundle { //make sure f, fname, and URL reflect page-based directives adrPageTable^.fname = html.getFileName (nameOf (adrObject^), adrPageTable); //4.0.1 local (adrSiteTable = html.getSiteTable (adrPageTable)); if not defined (adrSiteTable^) { scriptError ("Site table is missing at " + adrSiteTable + pc)}; with adrPageTable^ { local (folder = html.getSiteFolder (adrPageTable)); f = folder + subDirectoryPath + fname; if not defined (adrPageTable^.requestHeaders) { //PBS 12/3/98 <<Don't create the folders if this is a dynamic page. file.sureFilePath (f)}; if not (url endsWith fname) { url = string.popSuffix (url, '/'); url = url + "/" + fname}}}; if defined (adrFiltersTable^.pagefilter) { adrPageTable^.bodytext = ro; adrFiltersTable^.pagefilter (adrPageTable); ro = adrPageTable^.bodytext}; local (s); adrPageTable^.renderedText = ""; with adrPageTable^ { //build the page bundle { //get the template text into s local (adrTemplate); if indirectTemplate { try { adrTemplate = @adrPageTable^.templates^.[template]; if not defined (adrTemplate^) { scriptError ("")}} else { adrTemplate = @user.html.templates.[template]}; if not defined (adrTemplate^) { scriptError ("There is no template named \"" + template + "\".")}} else { adrTemplate = @adrPageTable^.template}; if typeOf (adrTemplate^) == outlineType { //DMB: 2/25/98 local (outlinecopy = adrTemplate^); html.runOutlineDirectives (@outlinecopy, adrPageTable); s = s + string (outlinecopy)} else { s = s + html.runDirectives (string (adrTemplate^), adrPageTable)}; if defined (adrPageTable^.fileExtension) { //make sure f, fname, and URL reflect template-based directives if not (fname endsWith fileExtension) { //there was a #fileExtension directive in the template fname = string.popSuffix (fname, '.'); fname = fname + fileExtension; f = siteRootFolder + subDirectoryPath + fname; url = string.popSuffix (url, '/'); url = url + "/" + fname}}}; local (t = string.replaceAll (title, "\"", "\\\"")); //4.0.1 -- handle titles that contain double quotes if html.getPref ("tagSubstitution", adrPageTable) { s = string.replaceall (s, "<title>", t); s = string.replaceall (s, "<meat>", ro); //grandfathered in, for perpetuity s = string.replaceall (s, "<bodytext>", ro); <<4.0.1 s = string.replaceall (s, "{bodytext}", ro)}; <<5.0 bundle { //call to html.processMacros if flSemaphores { semaphore.lock ("html.data.adrPageTable", 3600)}; html.data.adrPageTable = adrPageTable; //see html.refGlossary s = string.replaceAll (s, "\n", ""); //work around Windows problem -- 11/8/97 DW s = html.processMacros (s, false, adrPageTable); try {delete (@html.data.adrPageTable)}; if flSemaphores { semaphore.unlock ("html.data.adrPageTable")}}; bundle { //4.2 -- relative addresses are supported directly <<Mon, Dec 30, 1996 at 6:26:26 AM by DW renderedtext = s; s = html.data.standardMacros.glossaryPatcher (adrPageTable); s = renderedtext}; bundle { //5.0 -- support for the #pageHeader attribute if defined (adrPageTable^.pageHeader) { if flSemaphores { semaphore.lock ("html.data.adrPageTable", 3600)}; html.data.adrPageTable = adrPageTable; //see html.refGlossary if typeOf (adrPageTable^.pageHeader) == addressType { s = html.processMacros (string (adrPageTable^.pageHeader^), true, adrPageTable) + s} else { s = html.processMacros (string (adrPageTable^.pageHeader), true, adrPageTable) + s}; try {delete (@html.data.adrPageTable)}; if flSemaphores { semaphore.unlock ("html.data.adrPageTable")}}}; bundle { //5.0 -- add linefeeds if the pref is set if html.getPref ("addLineFeeds", adrPageTable) { s = string.replaceAll (s, "\r", "\r\n")}}; bundle { //5.0 -- add fatpage comment after everything else <<This used to be generated in the pageFooter macro <<But then it would get run thru html.processMacros. <<Usually not a problem, but sometimes... <<Also, grandfathering-in the noHintsInHeader attribute. <<It's an old name for fatpages. local (flHints = not html.getPref ("noHintsInHeader", adrPageTable)); local (flFatPageComment = html.getPref ("isFatPage", adrPageTable)); if flHints or flFatPageComment { s = s + fatPages.buildPageAtts (adrPageTable)}}; if defined (adrFiltersTable^.finalfilter) { renderedtext = s; adrFiltersTable^.finalfilter (adrPageTable); s = renderedtext}}; return (s)}
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.