Ïe*X ¶Ò‚‰¶Þ±`ìZoåò·%ÿ n¶Ò„ð¶Þ±`VVerdana ¬„25?ËÏnPL$¶Ò‚‰¶Ý7ã  prefsXsites„P¹*Verdana ¶Ý5¶Þ¯ô –L.ÞLANDÿÿÿÿÿÿmac 3/20/01; 4:27:31 PM by JES Clean out the data table, and save a copy of the database. table.emptyTable (@theXmlFilesData.prefs) table.emptyTable (@theXmlFilesData.sites) fileMenu.saveMyRoot (this) target.set (this) fileMenu.saveCopy (file.getSystemDisk () + "TheXmlFiles.root") „€€€€€€¹ Verdana ¶ÝzF¶Þ¯Ú°ÉLANDÿÿÿÿÿÿmac 3/20/01; 8:40:28 PM by JES Created. Ask the user for the URL of a Manila site, a username and a password. Tell the server to export the site for download, download the site, open it, and export it as XML. theXmlFilesSuite.init () local (siteUrl = theXmlFilesData.prefs.lastDownloadedSite) if dialog.ask ("Enter the URL of a site to download and export...", @siteUrl) if not (string.lower (siteUrl) beginsWith "http://") siteUrl = "http://" + siteUrl if not (siteUrl endsWith "/") siteUrl = siteUrl + "/" theXmlFilesData.prefs.lastDownloadedSite = siteUrl local (username, password) if playlist.manila.getPasswordDialog (siteUrl, @username, @password) msg ("Exporting site for download...") local (downloadUrl = theXmlFilesSuite.getDownloadUrl (siteUrl, username, password)) msg ("Downloading site database...") local (adrSite = theXmlFilesSuite.downloadDatabase (downloadUrl)) local (exportFolder = theXmlFilesSuite.export (adrSite)) file.openFolder (exportFolder) else return (false) local (downloadUrl) „€€€€€€€€€€€€€€€€€€€€Bd Verdana ¶Ý07¶Þ¯Ú úwèlLANDÿÿÿÿÿÿmac 3/20/01; 4:05:16 PM by JES Ask for a downloaded site database, and export the site as XML. theXmlFilesSuite.init () local (f = theXmlFilesData.prefs.lastExportedSite) if file.getFileDialog ("Choose a site database to export as XML...", @f, 0) if not defined ([f]) fileMenu.open (f, true) local (adrSite = @[f][1]) theXmlFilesSuite.export (adrSite) „€€€€€€€€€€·]$¶Ý0¶ÝzF  )downloadAndExport exportSite=VVerdana ¬„2ç~}·tŠrVerdana ¶ÝzF¶Þ¯Û|P¥LANDÿÿÿÿÿÿmac on downloadDatabase (rootUrl) 3/12/01; 11:42:39 AM by JES Download a Manila site, save the database, open it, and return the address of the site table. local (filename, folderName, f, bits) bundle // get the path to save the database local (pc = file.getPathChar ()) filename = string.nthField (rootUrl, "/", string.countFields (rootUrl, "/")) folderName = string.nthField (filename, ".", 1) f = theXmlFilesData.prefs.downloadFolder + folderName + pc + filename bundle // close older versions of the database if defined ([f]) fileMenu.close (@[f]) bundle // download the database local (bits = tcp.httpReadUrl (rootUrl)) file.sureFilePath (f) file.writeWholeFile (f, bits, 'TABL', 'LAND') fileMenu.open (f, true) return (@[f] [1]) bundle // test code workspace.userlandSamples.manilaSiteToXml.downloadSite ("http://www.someserver.com/mySite.root") €„€€€€€€€€€€€€€€€€€€„t³0 Verdana ¶Ò¶Þ¯Û y¢VLANDÿÿÿÿÿÿmac on downloadGem (adrGem, gemsFolder) 3/12/01; 2:28:24 PM by JES Created. local (f = theXmlFilesSuite.utilities.urlToFilePath (adrGem^.url, gemsFolder)) local (bits = tcp.httpReadUrl (adrGem^.url)) file.sureFilePath (f) file.writeWholeFile (f, bits) return (f) €„€€€€€³Gü²>ÒŸVerdana Ž‚¶Þyà¶Þ¯Ü´lg¶LANDÿÿÿÿÿÿmac on export (adrSite) 3/12/01; 3:59:05 PM by JES Created. Changes 03/20/01; 9:16:41 PM by JES Make sure adrGems^.data is defined before attempting to export gems data. 03/20/01; 10:57:59 PM by JES Fixed a problem encoding sitePrefs->modules and sitePrefs->newsItems.departments. 03/20/01; 11:31:11 PM by JES Check to see if newsDayTemplate is defined. 03/20/01; 11:36:10 PM by JES Only export the homePageTemplate if it exists. 03/20/01; 11:39:37 PM by JES Only export the cascadingStyleSheet if it exists. 03/20/01; 11:39:37 PM by JES Only export the newsDayTemplate if it exists. 03/20/01; 11:43:30 PM by JES Fixed a bug where the plugins folder didn't exist before attempting to export plugin data. 03/21/01; 3:30:19 PM by JES Serialize stats by calling theXmlFilesSuite.serialize.stats, instead of theXmlFilesSuite.serialize.table. Don't export plugin data. theXmlFilesSuite.init () local (adrData = theXmlFilesSuite.utilities.getDataTable (adrSite)) local (adrDg = @adrSite^.["#discussionGroup"]) local (pc = file.getPathChar ()) local (folder = theXmlFilesSuite.utilities.getSiteFolder (adrSite) + "XML Files" + pc) local (dgFolder = folder + "discussionGroup" + pc) local (pictureFolder = folder + "pictures" + pc, pictureFolderExists = false) local (enclosureFolder = dgFolder + "enclosures" + pc, enclosureFolderExists = false) on needsUpdate (type, identifier, d) if not defined (adrData^.[type]) new (tableType, @adrData^.[type]) if not defined (adrData^.[type].[identifier]) adrData^.[type].[identifier] = date (0) if adrData^.[type].[identifier] < d return (true) return (false) on setLastUpdate (type, identifier, d) adrData^.[type].[identifier] = d on sureFolder (folder) file.sureFilePath (folder) file.sureFolder (folder) on exportPictureCallback (adrMsg) Export a picture to a file, and return the path to the picture on disk if not pictureFolderExists sureFolder (pictureFolder) local (adrImage = @adrMsg^.image) local (f, filename, extension, fileType) case string.lower (adrImage^.mimeType) "image/gif" extension = ".gif" fileType = 'GIFf' "image/jpeg" extension = ".jpeg" fileType = 'JPEG' if defined (adrImage^.url) local (ctFields = string.countFields (adrImage^.url, "/")) filename = string.nthField (adrImage^.url, "/", ctFields) else filename = string.innerCaseName (adrMsg^.subject) + extension if system.environment.isMac extension = "." + string.nthField (filename, '.', string.countFields (filename, '.')) filename = string.mid (string.popSuffix (filename), 1, 31 - sizeOf (extension)) + extension f = pictureFolder + filename file.writeWholeFile (f, adrImage^.bits, fileType, 'ogle') return (f) on exportEnclosureCallback (adrMsg) Export an enclosure to a file, and return the path to the enclosure on disk if not (enclosureFolderExists) sureFolder (msgsFolder) local (f, filename, extension, fileType) fileType = frontier.getFileType (adrMsg^.enclosureType) extension = "." + string.lower (fileType) bundle // get the filename from the enclosureAddress local (ctFields = string.countFields (adrMsg^.enclosureAddress, '.')) filename = string.nthField (string.countFields (adrMsg^.enclosureAddress, '.', ctFields)) filename = filename + extension if system.environment.isMac filename = string.mid (string.popSuffix (filename), 1, 31 - sizeOf (extension)) + extension f = enclosureFolder + filename file.writeWholeFile (f, adrMsg^.enclosureBits, fileType, 'LAND') return (f) on deleteScripts (adr) on doVisit (adr) local (adritem, ct = sizeOf (adr^)) for i = ct downto 1 local (adritem = @adr^[i]) case (typeOf (adritem^)) tableType doVisit (adritem) scriptType delete (adritem) doVisit (adr) on exportTable (adrtable, folder, name=nil) if name == nil name = nameOf (adrtable^) if name beginsWith "#" name = string.mid (name, 2, infinity) local (f = folder + name + ".xml") local (xmltext = theXmlFilesSuite.serialize.table (adrtable, 0)) file.sureFilePath (f) file.writeWholeFile (f, xmltext, 'TEXT', Frontier.id) local (flUpdateDiscussCalendar = false) bundle //export discussion group messages; exporting changed pictures and enclosures local (msgsFolder = dgFolder + "messages" + pc) sureFolder (msgsFolder) local (adrMsgs = @adrDg^.messages, adrMsg) for adrMsg in adrMsgs local (name = nameOf (adrMsg^)) local (f = msgsFolder + name + ".xml") local (xmltext) if needsUpdate ("messages", name, adrMsg^.lastUpdate) msg ("Exporting new and changed messages: " + number (name) + "...") flUpdateDiscussCalendar = true xmltext = theXmlFilesSuite.serialize.message (adrSite, adrMsg, @exportPictureCallback, @exportEnclosureCallback) file.writeWholeFile (f, xmltext, 'TEXT', Frontier.id) setLastUpdate ("messages", name, adrMsg^.lastUpdate) bundle //export discussion group calendar local (f = dgFolder + "calendar.xml") if not file.exists (f) flUpdateDiscussCalendar = true if flUpdateDiscussCalendar msg ("Exporting discussion group calendar...") local (xmltext) local (adrCalendar = @adrDg^.calendar) xmltext = theXmlFilesSuite.serialize.calendar (adrCalendar) file.writeWholeFile (f, xmltext, 'TEXT', Frontier.id) bundle //download gems local (adrGems = @adrSite^.["#newsSite"].gems) if defined (adrGems^) adrGems = @adrGems^.data if defined (adrGems^) local (ct = sizeOf (adrGems^)) if ct > 0 local (gemsFolder = folder + "gems" + pc) local (gemsFilesFolder = gemsFolder + "files" + pc) sureFolder (gemsFolder) for i = ct downTo 1 local (adrGem = @adrGems^[i]) local (flDeleted = false) if defined (adrGem^.flDeleted) flDeleted = adrGem^.flDeleted local (gemPath = theXmlFilesSuite.utilities.urlToFilePath (adrGem^.url, gemsFilesFolder)) if needsUpdate ("gems", adrGem^.url, adrGem^.postTime) if not flDeleted msg ("Downloading Gem: " + file.fileFromPath (gemPath) + "...") theXmlFilesSuite.downloadGem (adrGem, gemsFilesFolder) local (xmltext, f = gemsFolder + nameOf (adrGem^) + ".xml") xmltext = theXmlFilesSuite.serialize.gem (adrGem, gemPath) file.writeWholeFile (f, xmltext, 'TEXT', Frontier.id) setLastUpdate ("gems", adrGem^.url, adrGem^.postTime) if not flDeleted if not file.exists (gemPath) msg ("Downloading Gem: " + file.fileFromPath (gemPath) + "...") theXmlFilesSuite.downloadGem (adrGem, gemsFilesFolder) bundle //export the glossary local (adrGloss = @adrSite^.["#glossary"]) if needsUpdate ("siteData", "glossary", timeModified (adrGloss)) msg ("Exporting shortcuts...") local (f = folder + "glossary.xml") local (xmltext = theXmlFilesSuite.serialize.glossary (adrGloss)) file.writeWholeFile (f, xmltext, 'TEXT', Frontier.id) setLastUpdate ("siteData", "glossary", timeModified (adrGloss)) bundle //export site prefs/data msg ("Exporting site prefs...") on exportXml (adr, name) local (f = folder + name + ".xml") file.writeWholeFile (f, string (adr^), 'TEXT', 'Radu') local (sitePrefs = adrSite^.["#newsSite"]) bundle //add items which are stored elsewhere sitePrefs.siteUrl = adrSite^.["#ftpSite"].url new (tableType, @sitePrefs.prefs) table.copyContents (@adrSite^.["#prefs"], @sitePrefs.prefs) new (tableType, @sitePrefs.urls) table.copyContents (@adrSite^.["#urls"], @sitePrefs.urls) bundle //clean up the table delete (@sitePrefs.bulletins.htmlTemplate) delete (@sitePrefs.bulletins.plainTextTemplate) if defined (sitePrefs.cascadingStyleSheet) delete (@sitePrefs.cascadingStyleSheet) if defined (sitePrefs.checkouts) delete (@sitePrefs.checkouts) if defined (sitePrefs.editorialOutline) delete (@sitePrefs.editorialOutline) delete (@sitePrefs.emailConfirmation) if defined (sitePrefs.gems) delete (@sitePrefs.gems) if defined (sitePrefs.indexes) delete (@sitePrefs.indexes) delete (@sitePrefs.membersBoxTemplates) if defined (sitePrefs.modules) local (modules = sitePrefs.modules) new (tableType, @sitePrefs.modules) local (adr, ct=1) for adr in @modules local (adrTable = @sitePrefs.modules.["module" + string.padWithZeros (ct, 3)]) new (tableType, adrTable) adrTable^.name = nameOf (adr^) adrTable^.msgNum = adr^.msgNum ct++ if defined (sitePrefs.newsDayTemplate) delete (@sitePrefs.newsDayTemplate) if defined (sitePrefs.newsItems) if defined (sitePrefs.newsItems.all) delete (@sitePrefs.newsItems.all) if defined (sitePrefs.newsItems.template) delete (@sitePrefs.newsItems.template) if defined (sitePrefs.newsItems.departments) local (departments = sitePrefs.newsItems.departments) new (tableType, @sitePrefs.newsItems.departments) local (adr, ct=1) for adr in @departments local (adrTable = @sitePrefs.newsItems.departments.["department" + string.padWithZeros (ct, 3)]) new (tableType, adrTable) adrTable^.name = nameOf (adr^) adrTable^.createdDate = adr^.createdDate ct++ if defined (sitePrefs.pike) delete (@sitePrefs.pike) if defined (sitePrefs.prefsWizard) delete (@sitePrefs.prefsWizard) if defined (sitePrefs.preview) delete (@sitePrefs.preview) if defined (sitePrefs.signUpWizard) delete (@sitePrefs.signUpWizard) if defined (sitePrefs.slides) delete (@sitePrefs.slides.template) if defined (sitePrefs.stats) delete (@sitePrefs.stats) delete (@sitePrefs.welcomePage) local (xmltext) xmltext = theXmlFilesSuite.serialize.table (@sitePrefs, "sitePrefs") exportXml (@xmltext, "sitePrefs") exportXml (@adrSite^.["#hierarchy"].outline, "hierarchy") exportXml (@adrSite^.["#navigator"].outline, "navigator") if defined (adrSite^.["#newsSite"].prefsWizard) local (xmltext = string (adrSite^.["#newsSite"].prefsWizard.outline)) xmltext = string.replaceAll (xmltext, " ", "&nbsp;") //  isn't a valid XML entity exportXml (@xmltext, "userPrefs") bundle //export templates msg ("Exporting templates...") on exportTemplate (adr, name, extension=".html") local (f = folder + "templates" + pc + name + extension) local (fileCreator = user.html.prefs.textFileCreator) file.sureFilePath (f) file.writeWholeFile (f, string (adr^), 'TEXT', fileCreator) exportTemplate (@adrSite^.["#template"], "template") if defined (adrSite^.["#homePageTemplate"]) exportTemplate (@adrSite^.["#homePageTemplate"], "homePageTemplate") exportTemplate (@adrSite^.["#newsSite"].bulletins.htmlTemplate, "bulletinsHtmlTemplate") exportTemplate (@adrSite^.["#newsSite"].bulletins.plainTextTemplate, "bulletinsTextTemplate", ".txt") if defined (adrSite^.["#newsSite"].cascadingStyleSheet) exportTemplate (@adrSite^.["#newsSite"].cascadingStyleSheet, "styleSheet", ".css") exportTemplate (@adrSite^.["#newsSite"].emailConfirmation, "signupConfirmation", ".txt") exportTemplate (@adrSite^.["#newsSite"].membersBoxTemplates.signInBox, "joinNowMembersBox") exportTemplate (@adrSite^.["#newsSite"].membersBoxTemplates.signOutBox, "signOutMembersBox") if defined (adrSite^.["#newsSite"].newsDayTemplate) exportTemplate (@adrSite^.["#newsSite"].newsDayTemplate, "newsDayTemplate") if defined (adrSite^.["#newsSite"].newsItems) exportTemplate (@adrSite^.["#newsSite"].newsItems.template, "newsItemsTemplate") if defined (adrSite^.["#newsSite"].slides) exportTemplate (@adrSite^.["#newsSite"].slides.template, "slidesTemplate") exportTemplate (@adrSite^.["#newsSite"].welcomePage, "welcomePage") bundle //export stats msg ("Exporting stats...") local (xmltext, f = dgFolder + "stats.xml") xmltext = theXmlFilesSuite.serialize.stats (@adrSite^.["#discussionGroup"].stats) file.writeWholeFile (f, xmltext, 'TEXT', 'Radu') bundle //export membership group msg ("Exporting member data...") local (adrMembers = @adrSite^.["#membershipGroup"].users) local (f = folder + "members.xml") local (xmltext = "\r") local (adrMember) for adrMember in adrMembers xmltext = xmltext + theXmlFilesSuite.serialize.member (adrMember, 1) xmltext = xmltext + "\t\r" file.writeWholeFile (f, xmltext, 'TEXT', Frontier.id) bundle //export plugin data local (adrPlugins = @adrSite^.["#plugins"]) if defined (adrPlugins^) msg ("Exporting plug-in data...") local (pluginsFolder = folder + "plugins" + pc) local (pluginsList = {}, ct = 0) bundle // get a list of all the plugins local (adritem) if defined (adrPlugins^.data) for adritem in @adrPlugins^.data local (name = nameOf (adritem^)) pluginsList = pluginsList + name ct++ if defined (adrPlugins^.enabled) for adritem in @adrPlugins^.enabled local (name = nameOf (adritem^)) if not (pluginsList contains name) pluginsList = pluginsList + name ct++ for i = 1 to ct local (pluginData); new (tableType, @pluginData) local (name = pluginsList[i]) pluginData.name = name if defined (adrPlugins^.data) pluginData.data = adrPlugins^.data.[name] if defined (adrPlugins^.enabled.[name]) and (adrPlugins^.enabled.[name] != false) pluginData.enabled = true pluginData.websiteFragmentPath = adrPlugins^.enabled.[name] else pluginData.enabled = false pluginData.websiteFragmentPath = "" if pluginData.enabled and (sizeOf (pluginData.websiteFragmentPath) > 0) local (adrWebsiteFragment = theXmlFilesSuite.utilities.relativePathToAddress (adrSite, pluginData.websiteFragmentPath)) if defined (adrWebsiteFragment^) pluginData.websiteFragment = adrWebsiteFragment^ deleteScripts (@pluginData.websiteFragment) name = string.innerCaseName (name) local (f = pluginsFolder + name + ".xml") local (xmltext = theXmlFilesSuite.serialize.table (@pluginData, name)) file.sureFilePath (f) file.writeWholeFile (f, xmltext, 'TEXT', Frontier.id) bundle //export home page calendar msg ("Exporting home page calendar...") local (flUpdateHomePageCalendar = true) local (adrCalendar = adrSite) local (adrLastDay = theXmlFilesSuite.utilities.getLastCalendarAddress (adrCalendar)) local (f = folder + "homePageCalendar.xml") bundle //determine whether the home page calendar has changed We check the last day in the calendar If the message number has changed or if the site has switched to or from news items, then we need to update the calendar. if not defined (adrData^.homepage) new (tableType, @adrData^.homepage) if not defined (adrData.homepage.calendar) new (tableType, @adrData^.homepage.calendar) if not defined (adrData^.homepage.calendar.lastDay) new (tableType, @adrData^.homepage.calendar.lastDay) local (flNewsItems = false, msgNum = 0) if defined (adrLastDay^.flNewsItems) and adrLastDay^.flNewsItems flNewsItems = true if defined (adrLastDay^.msgNum) and not flNewsItems msgNum = adrLastDay^.msgNum if flNewsItems if defined (adrData^.homepage.calendar.lastDay.flNewsItems) if flNewsItems == adrData^.homepage.calendar.lastDay.flNewsItems flUpdateHomePageCalendar = false else if defined (adrData^.homepage.calendar.lastDay.msgNum) if msgNum == adrData^.homepage.calendar.lastDay.msgNum flUpdateHomePageCalendar = false if not defined (adrData^.homepage.calendar.lastDay.flNewsItems) adrData^.homepage.calendar.lastDay.flNewsItems = flNewsItems if not defined (adrData^.homepage.calendar.lastDay.msgNum) adrData^.homepage.calendar.lastDay.msgNum = msgNum if not file.exists (f) flUpdateHomePageCalendar = true if flUpdateHomePageCalendar local (xmltext) xmltext = theXmlFilesSuite.serialize.calendar (adrCalendar) file.writeWholeFile (f, xmltext, 'TEXT', Frontier.id) msg ("") return (folder) bundle //test code export (@theTwoWayWebManilaWebsite) €„„€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€„€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€GüaYVerdana N¶Òå¶Þ¯ÜŒQÝLANDÿÿÿÿÿÿmac on exportPicture (adrmsg, imgaeFolder) 3/12/01; 2:34:08 PM by JES Created. local (adrImage = @adrmsg^.image) local (fileType, extension, f) case string.lower (adrImage^.mimeType) // get type (mac) and extension "image/gif" fileType = 'GIFf' extension = ".gif" "image/jpeg" fileType = 'JPEG' extension = ".jpg" if defined (msg.image.url) // get the filename from the URL f = theXmlFilesSuite.utilities.urlToFilePath (adrImage^.url, imageFolder) else // no URL is defined -- base the filename on the message subject local (filename = msg.subject) if system.environment.isMac if sizeOf (filename) > 27 filename = string.mid (filename, 1, 27) filename = filename + extension f = imageFolder + filename file.sureFilePath (f) file.writeWholeFile (f, adrImage^.bits, fileType, user.html.prefs.imgFileCreator) return (f) €„€€€€€€€€€a¶fØ Verdana ¶ÝzF¶ÝzFBúLANDÿÿÿÿÿÿmac on getDownloadUrl (siteUrl, username, password) 3/20/01; 6:25:14 PM by JES Created. Tells the server to export the site, and returns the download URL for the site's object database. local (params = {siteUrl, username, password}) local (server, port = 80) bundle //determine server and port from the site URL local (urlParts = string.urlSplit (siteUrl)) server = urlParts[2] if server contains ":" port = string.nthField (server, ":", 2) server = string.nthField (server, ":", 1) local (ticksToTimeout = 60 * 60 * 60) //1 hour local (downloadUrl) downloadUrl = betty.rpc.client (server, port, "manila.exportSiteForDownload", @params, ticksToTimeout:ticksToTimeout, rpcPath:"/RPC2") return (downloadUrl) €„€€€€€€€€€¶4xDVerdana l¶ÝzF¶Þ¯Ý„ÅvüLANDÿÿÿÿÿÿmac 3/12/01; 11:38:41 AM by JES Initialize data and prefs for exporting Manila sites Changes: 03/20/01; 8:42:34 PM by JES Init theXmlFilesData.prefs.lastDownloadedSite. local (pc = file.getPathChar ()) local (appFolder = Frontier.pathString) local (downloadedSitesFolder = appFolder + "Downloaded Manila Sites" + pc) if not defined (theXmlFilesData.sites) new (tableType, @theXmlFilesData.sites) if not defined (theXmlFilesData.prefs.downloadFolder) theXmlFilesData.prefs.downloadFolder = downloadedSitesFolder if not defined (theXmlFilesData.prefs.exportFolder) theXmlFilesData.prefs.exportFolder = downloadedSitesFolder if not defined (theXmlFilesData.prefs.lastExportedSite) theXmlFilesData.prefs.lastExportedSite = "" if not defined (theXmlFilesData.prefs.lastDownloadedSite) theXmlFilesData.prefs.lastDownloadedSite = "" „€€€€€€€€€€€€€€€€€€€4­/Verdana ¶Ò‚Š¶Þ¯Ý&?îÀLANDÿÿÿÿÿÿmac theXmlFilesSuite.commands.downloadAndExport () €­¾0Charcoal ¶Ò‚‰¶Þ°z&?îÀLANDÿÿÿÿÿÿmac TheXmlFiles Download Site and Export as XML... €€ eà¾pf™5$ßÜVerdana t Œp¶ØfVerdana ¶Þy߶ޯݵŽñLANDÿÿÿÿÿÿmac on calendar (adrcalendar, startyear=1999, endyear=date.year ()) 3/12/01; 2:14:53 PM by JES Created. local (xmltext, indentlevel = 0) on add (s) xmltext = xmltext + string.filledString ("\t", indentlevel) + s + "\r\n" add (""); indentlevel++ local (year, adryear, adrmonth, adrday, atts) for year = startyear to endyear adryear = @adrcalendar^.[year] if defined (adryear^) add (""); indentlevel++ for adrmonth in adryear add (""); indentlevel++ for adrday in adrmonth local (day = number (nameOf (adrDay^))) if defined (adrday^.msgNum) or defined (adrday^.flNewsItems) //homepage calendar if defined (adrday^.flNewsItems) and adrday^.flNewsItems add ("") else add ("") else //discussion group calendar add (""); indentlevel++ local (adrmsg) for adrmsg in adrday add ("" + theXmlFilesSuite.utilities.encodeString (adrmsg^) + "") add (""); indentlevel-- add (""); indentlevel-- add (""); indentlevel-- add ("") return (xmltext) €„€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€¶X–JVerdana G¶ÔܶޯÞDU€LANDÿÿÿÿÿÿmac on gem (adrgem, f) 3/13/01; 6:14:15 PM by JES Created. local (xmltext, indentlevel = 0) on encodeString (s) return (theXmlFilesSuite.utilities.encodeString (s)) on add (s) xmltext = xmltext + string.filledString ("\t", indentlevel) + s + "\r\n" add (""); indentlevel++ add ("" + encodeString (file.fileToUrl (f)) + "") add ("" + encodeString (adrgem^.url) + "") add ("" + date.netStandardString (adrgem^.postTime) + "") add ("" + adrgem^.["Content-Type"] + "") add ("" + encodeString (adrgem^.member) + "") local (flDeleted = false) if defined (adrgem^.flDeleted) flDeleted = adrgem^.flDeleted add ("" + flDeleted + "") add ("") return (xmltext) €„€€€€€€€€€€€€€€€€€€€€XÚrðVerdana <¶Þy߶ޯÞ@ˆ'LANDÿÿÿÿÿÿmac on glossary (adrgloss) 3/16/01; 12:39:50 AM by JES Created. local (xmltext, indentlevel=0) on encodeString (s) theXmlFilesSuite.utilities.encodeString (s) on add (s) xmltext = xmltext + string.filledString ("\t", indentlevel) + s + "\r\n" add (""); indentlevel++ local (adritem) for adritem in adrgloss add ("" + encodeString (nameOf (adritem^)) + "") add (""); indentlevel-- return (xmltext) €„€€€€€€€€€€€€€€€€Ú’$öVerdana ¶×¶ޯÞ0Ñj_LANDÿÿÿÿÿÿmac on member (adrmember, indentlevel=0, adrAtts=nil) 3/16/01; 1:41:42 AM by JES Created. local (atts); new (tableType, @atts) atts.email = nameOf (adrmember^) return (theXmlFilesSuite.serialize.table (adrmember, "member", indentlevel, @atts)) €„€€€’Ò`úVerdana ž¶Þyà¶Þ¯ÞIkýuLANDÿÿÿÿÿÿmac on message (adrsite, adrmsg, adrExportPictureCallback=nil, adrExportEnclosureCallback=nil) 3/12/01; 2:00:38 PM by JES Created. local (xmltext, indentlevel = 0) local (flDeleted = false, body, bodyType = "text/plain", lastUpdate = adrmsg^.postTime) if defined (adrmsg^.flDeleted) flDeleted = adrMsg^.flDeleted if defined (adrmsg^.bodyType) bodyType = adrmsg^.bodyType if defined (adrmsg^.lastUpdate) lastUpdate = adrmsg^.lastUpdate on encodeString (s) return (theXmlFilesSuite.utilities.encodeString (s)) on add (s) xmltext = xmltext + string.filledString ("\t", indentlevel) + s + "\r\n" on addTag (tagname, cdata="", adrAtts=nil) local (s = "<" + tagName) if adrAtts != nil for i = 1 to sizeOf (adrAtts^) s = s + " " + adrAtts^[i].name + "=\"" + adrAtts^[i].value + "\"" if sizeOf (cdata) > 0 s = s + ">" + cdata + "" else s = s + "/>" add (s) on addToAtts (adrAtts, name, value) local (tableName = string.padWithZeros (sizeOf (adrAtts^) + 1, 2)) local (adrAtt = @adrAtts^.[tableName]) new (tableType, adrAtt) adrAtt^.name = name adrAtt^.value = value bundle //build the xml for the message local (authorName) bundle //set authorName authorName = theXmlFilesSuite.utilities.getMemberName (adrsite, adrmsg^.member) add ("") add (""); indentlevel++ addTag ("msgNum", adrmsg^.msgnum) addTag ("authorEmail", encodeString (adrmsg^.member)) addTag ("authorName", encodeString (authorName)) addTag ("inResponseTo", adrmsg^.inResponseTo) addTag ("postTime", date.netStandardString (adrmsg^.postTime)) addTag ("lastUpdate", date.netStandardString (lastUpdate)) addTag ("subject", encodeString (adrmsg^.subject)) bundle //add the body with the type attribute local (atts); new (tableType, @atts) if defined (adrmsg^.newsItem) bodyType = "text/xml" addToAtts (@atts, "type", bodyType) case string.lower (bodyType) "text/x-outline-tabbed" //outline addTag ("body", encodeString (string (adrmsg^.outline)), @atts) "text/x-opml" //opml document if false//defined (adrmsg^.opml) addTag ("body", encodeString (string (adrmsg^.opml)), @atts) else local (orphan) bundle //get an orphan address for the outline -- it's the message subject The following looks strange, but there's a method to the madness... The name of the outline is rendered as the attribute cdata by op.outlineToXml, which is kernel code, so it's not changeable. One possibility is to bash the opml after op.outlineToXml is called. A better option is to make sure that the window title is already what we want for the <title> element -- but we can't do that without opening the window... So we use an orphan address which is the title we want -- the address is the subject of the message... But there's a problem: If the subject of the message is a valid odb address, then that address would be overwritten with the below assignment or call to op.newOutlineObject... So we add some whitespace which makes it virtually impossible to overwrite an odb object, while at the same time preserving nice looking spacing in the opml. Mind you, this is a very rare case anyway, since adrmsg^.opml is nearly always defined when the bodyType is text/x-opml... but it will happen so we have to deal with it. local (tabs = string.filledString ("\t", 3)) orphan = "\r\n" + tabs + adrmsg^.subject + "\r\n" + tabs while defined ([orphan]^) // make sure adrOutline is safe for assignment orphan = orphan + " " local ([orphan]) if typeOf (adrmsg^.outline) == outlineType [orphan] = adrmsg^.outline else op.newOutlineObject (string (adrmsg^.outline), @[orphan]) local (opmltext = op.outlineToXml (@[orphan], authorName, adrmsg^.member)) addTag ("body", encodeString (opmltext), @atts) "text/xml" //news item local (xmlstruct) xml.compile (adrmsg^.body, @xmlstruct) local (adrNewsItem = xml.getAddress (@xmlstruct, "newsItem")) bundle //set flPosted, flReleased and postTime local (flPosted = false, flReleased = false, postTime = "") if defined (adrmsg^.newsItem.flPosted) flPosted = adrmsg^.newsItem.flPosted adrNewsItem^.flPosted = flPosted if defined (adrmsg^.newsItem.flReleased) flReleased = adrmsg^.newsItem.flReleased adrNewsItem^.flReleased = flReleased if defined (adrmsg^.newsItem.postTime) postTime = adrmsg^.newsItem.postTime adrNewsItem^.postTime = postTime adrNewsItem^.title = adrmsg^.newsItem.title local (body = xml.decompile (@xmlstruct)) addTag ("body", encodeString (body), @atts) "text/plain" //plain text addTag ("body", encodeString (string (adrmsg^.body)), @atts) addTag ("ctReads", adrmsg^.ctreads) bundle //serialize responses if sizeOf (adrmsg^.responses) > 0 local (item) add ("<responses>"); indentlevel++ for item in adrmsg^.responses addTag ("response", encodeString (item)) add ("</responses>"); indentlevel-- else add ("<responses/>") bundle //serialize alsoListedIn if defined (adrmsg^.alsoListedIn) and (sizeOf (adrmsg^.alsoListedIn) > 0) local (item) add ("<alsoListedIn>"); indentlevel++ for item in adrmsg^.alsoListedIn addTag ("category", encodeString (item)) add ("</alsoListedIn>"); indentlevel-- else add ("<alsoListedIn/>") bundle //deal with images local (atts); new (tableType, @atts) if defined (adrmsg^.image) local (f = adrExportPictureCallback^ (adrmsg)) addToAtts (@atts, "url", encodeString (file.fileToUrl (f))) if defined (adrmsg^.image.height) addToAtts (@atts, "height", adrmsg^.image.height) addToAtts (@atts, "witdh", adrmsg^.image.width) if defined (adrmsg^.image.shortcut) addToAtts (@atts, "shortcut", encodeString (adrmsg^.image.shortcut)) if defined (adrmsg^.image.url) addToAtts (@atts, "src", encodeString (adrmsg^.image.url)) addToAtts (@atts, "mimeType", adrmsg^.image.mimeType) addTag ("image", adrAtts: @atts) bundle //deal with enclosures local (atts); new (tableType, @atts) if defined (adrmsg^.enclosureType) local (f = adrExportEnclosureCallback^ (adrmsg)) addToAtts (@atts, "url", encodeString (file.fileToUrl (f))) addToAtts (@atts, "type", adrmsg^.enclosureType) addToAtts (@atts, "address", encodeString (string (adrmsg^.enclosureBits))) addTag ("enclosure", adrAtts: @atts) add ("</msg>") return (xmltext) €�����„�����������€�����€�����€�����€�����������€�����������€�����������€�����€�����€�����€�����������€�����������������������������������������������������������€�����������������������������������€�����€�����€�����€�����€�����€�����€�����„�����€�����€�����€�����€�����€�����€�����€����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������€�����€�����������������������������������������������������€�����������������������������������������������������€�����������������������������������������������������������������������������������€�����������������������������������������������€�����€�����€�������Ò��P��������ê��î���Verdana��������������������������� ��������������¶Ò‘¶Ò‘:������Œ‰T LANDÿÿÿÿÿÿ������mac ������������on plugins (adrPlugins) 3/12/01; 2:44:06 PM by JES Created. local (adrPlugins = @adrSite^.["#plugins"]) if defined (adrPlugins^) msg ("Exporting plug-in data...") local (pluginsFolder = folder + "plugins" + pc) local (pluginsList = {}, ct = 0) bundle // get a list of all the plugins local (adritem) if defined (adrPlugins^.data) for adritem in @adrPlugins^.data local (name = nameOf (adritem^)) pluginsList = pluginsList + name ct++ if defined (adrPlugins^.enabled) for adritem in @adrPlugins^.enabled local (name = nameOf (adritem^)) if not (pluginsList contains name) pluginsList = pluginsList + name ct++ for i = 1 to ct local (pluginData); new (tableType, @pluginData) local (name = pluginsList[i]) pluginData.name = name if defined (adrPlugins^.data) pluginData.data = adrPlugins^.data.[name] if defined (adrPlugins^.enabled.[name]) and (adrPlugins^.enabled.[name] != false) pluginData.enabled = true pluginData.websiteFragmentPath = adrPlugins^.enabled.[name] else pluginData.enabled = false pluginData.websiteFragmentPath = "" if pluginData.enabled and (sizeOf (pluginData.websiteFragmentPath) > 0) local (adrWebsiteFragment = relativePathToAddress (pluginData.websiteFragmentPath)) if defined (adrWebsiteFragment^) pluginData.websiteFragment = adrWebsiteFragment^ deleteScripts (@pluginData.websiteFragment) exportTable (@pluginData, pluginsFolder, string.innerCaseName (name)) €�����„�����������€�����€�����€�����€�����€�����€�����������������������������������������������������������������������������€�������������������������������������������������������������������������������������������������������������P����������º��Ó���Verdana��������������������������� ��������������¶ÞzX¶Þ­e������ý�<î’LANDÿÿÿÿÿÿ������mac ������������on stats (adrstats) 3/21/01; 2:50:50 PM by JES Created. local (xmltext, indentlevel=0) on add (s) xmltext = xmltext + string.filledString ("\t", indentlevel) + s + "\r\n" add ("<stats>"); indentlevel++ local (adrtable) for adrtable in adrstats local (name = nameOf (adrtable^)) add ("<" + name + ">"); indentlevel++ local (adritem) for adritem in adrtable local (msgnum = number (nameOf (adritem^))) local (s) s = "<msg msgNum=\"" + msgnum + "\">" case typeOf (adritem^) dateType s = s + date.netStandardString (adritem^) else s = s + adritem^ s = s + "</msg>" add (s) add ("</" + name + ">"); indentlevel-- add ("</stats>"); indentlevel-- return (xmltext) €�����„�����€�����€�����€�����€�����������€�����€�����€�����€�����€�����€�����€�����€�����€�����€�����€�����€�����€�����€�����€�����€�����€�����€�����€�����€�����€�����€�����€�����€���������†�������¾��P���Verdana��������������������������� �����Z��������¶Þ¶Þ¯Þ�����Æ�‹×LANDÿÿÿÿÿÿ������mac ������������on table (adrTable, elementName, indentLevel=0, adrAtts=nil) 3/20/01; 1:23:22 PM by JES Created. Changes: 3/20/01; 10:39:38 PM by JES Added support for binary type objects -- needed for images in plugin-data. 3/21/01; 4:19:15 PM by JES Don't generate tags with invalid characters. Encode high-ascii characters with entities. local (xmltext) on encodeString (s) return (theXmlFilesSuite.utilities.encodeString (s)) on add (s) xmltext = xmltext + string.filledString ("\t", indentlevel) + s + "\r\n" on addScalar (name, type, value="", adrAtts=nil) local (attsString = "", ix=1) loop if not (string.isNumeric (name[ix]) or string.isAlpha (name[ix]) or (name[ix] == "_") ) name = string.replaceAll (name, name[ix], "_") continue ix++ if ix > sizeOf (name) break bundle //build attsString if adrAtts != nil local (adrAtt) for adrAtt in adrAtts attsString = attsString + " " + nameOf (adrAtt^) + "=\"" + adrAtt^ + "\"" if string.isNumeric (name[1]) name = "item" + name if sizeOf (value) == 0 add ("<" + name + " type=\"" + type + "\"" + attsString + "/>") else add ("<" + name + " type=\"" + type + "\"" + attsString + ">" + encodeString (value) + "</" + name + ">") return (true) if adrAtts != nil local (s = "<" + elementName) local (adrAtt) for adrAtt in adrAtts s = s + " " + nameOf (adrAtt^) + "=\"" + adrAtt^ + "\"" s = s + ">" add (s); indentlevel++ else add ("<" + elementName + ">"); indentlevel++ on visitTable (adrtable) local (adritem) for adritem in adrtable local (name = nameOf (adritem^)) if name beginsWith "#" name = string.mid (name, 2, infinity) if name contains "\t" //skip compiled XML structures continue case typeOf (adritem^) tableType if sizeOf (adritem^) > 0 add ("<" + name + " type=\"struct\">"); indentlevel++ visitTable (adritem) add ("</" + name + ">"); indentlevel-- else add ("<" + name + " type=\"struct\"/>") listType if sizeOf (adritem^) > 0 add ("<" + name + " type=\"array\">"); indentlevel++ for i = 1 to sizeOf (adritem^) //note: we don't handle lists of tables add ("<value>" + encodeString (adritem^[i]) + "</value>") case typeOf (adritem^[i]) stringType addScalar ("item", "string", adritem^[i]) dateType addScalar ("item", "date", date.netStandardString (adritem^[i])) booleanType addScalar ("item", "boolean", adritem^[i]) intType singleType longType addScalar ("item", "number", adritem^[i]) doubleType addScalar ("item", "float", adritem^[i]) binaryType local (binType = getBinaryType (adritem^[i])) local (atts); new (tableType, @atts) atts.["binaryType"] = string.trimWhiteSpace (binType) addScalar ("item", "base64", base64.encode (adritem^[i], 0), @atts) add ("</" + name + ">"); indentlevel-- else add ("<" + name + " type=\"array\"/>") wpTextType outlineType add ("<" + name + " type=\"string\">" + encodeString (string (adritem^)) + "</" + name + ">") scriptType continue dateType addScalar (name, "date", date.netStandardString (adritem^)) booleanType addScalar (name, "boolean", adritem^) intType singleType longType addScalar (name, "number", adritem^) doubleType addScalar (name, "float", adritem^) binaryType local (binType = getBinaryType (adritem^)) local (atts); new (tableType, @atts) atts.["binaryType"] = string.trimWhiteSpace (binType) addScalar (name, "base64", base64.encode (adritem^, 0), @atts) else if typeOf (adritem^) != unknownType addScalar (name, "string", xml.entityEncode (string (adritem^), true)) visitTable (adrTable) add ("</" + elementName + ">") return (xmltext) €�����„�����������„�����������������������������€�����€�����€�����€�����€�����������€�����������������������������������������������������������������������������������������������������������������������������€�����€�����������������������������������������€�����������€�����€�����€�����€�����€�����€�����������€�����������€�����€�����������������������������������������€����������������������������������������������������������������������������������������������������������������������������������������������������������€�����€�����������€�����������€�����������€�����������€�����€�����€�����������€�����������€�����������������������������€�����€�����€�����€�����€�����€�����€�����€�����€�������†��W�������ý���`���¶Ò†ä¶Þ­X�������� ���� ��� �������% ����.���: ����A���M ����U���a ����i���u ����{���‡ ����calendar������gßgem������n¡glossary������smember������uëmessage������w‰plugins������•gstats������œÃtable������ Ô��VVerdana��������������������������� ����������¬�„�2�j'�·������������������������W��é��������T�����Verdana��������������������������� ��������������¶Òj¶ÒÏ������w�¡i LANDÿÿÿÿÿÿ������mac ������������on convertToString (adr) 3/12/01; 2:42:20 PM by JES Created. case typeOf (adr^) unknownType aliasType filespecType adr^ = string (adr^) addressType adr^ = string.popFileFromAddress (adr^) outlineType wpTextType table.assign (adr, string (adr^)) return (true) €�����„�����������€�����€�����€�����€�����€�����€�����€�����€�����€�����€�����€�������é��å��������N�����Verdana��������������������������� ��������������¶Òº¶ÒÅ������ö�ÙlLANDÿÿÿÿÿÿ������mac ������������on deleteScripts (adr) 3/12/01; 2:42:10 PM by JES Created. on doVisit (adr) local (adritem, ct = sizeOf (adr^)) for i = ct downto 1 local (adritem = @adr^[i]) case (typeOf (adritem^)) tableType doVisit (adritem) scriptType delete (adritem) doVisit (adr) €�����„�����������€�����€�����€�����€�����€�����€�����€�����€�����€�����€�������å��Ã��������6�����Verdana��������������������������� ��������������¶Ò¿ ¶ÒÖ!�����&?îÀLANDÿÿÿÿÿÿ������mac ������������on encodeString (s) 3/12/01; 5:59:43 PM by JES Created. s = string.replaceAll (s, "&", "&") s = string.replaceall (s, "<", "<") s = string.replaceall (s, ">", ">") s = string.replaceall (s, "\"", """) s = string.replaceall (s, "'", "'") return (s) €�����„�����������€�����€�����€�����€�����€�����€�������Ã��Ü��������6��.���Verdana��������������������������� ��������������¶ÒßͶޯÞ���� ´¼LANDÿÿÿÿÿÿ������mac ������������on getDataTable (adrSite) 3/12/01; 8:19:33 PM by JES Created. local (adrNewsSite = @adrSite^.["#newsSite"]) local (siteName = string.innerCaseName (adrNewsSite^.siteName)) local (adrData = @theXmlFilesData.sites.[siteName]) if not defined (adrData^) new (tableType, adrData) return (adrData) €�����„�����€�����€�����€�����€�����€�����������€�������Ü��q����������i���Verdana��������������������������� ��������������¶Óÿ²¶Ôv��� ��&?ŸßLANDÿÿÿÿÿÿ������mac ������������on getLastCalendarAddress (adrcalendar) 3/13/01; 4:47:55 PM by JES Created. on error () scriptError ("Can't get the address of the last day in the calendar because the address is not the address of a valid calendar structure containing at least one day.") local (lastYear = date.year ()) for year = lastYear downTo 1900 if not defined (adrcalendar^.[year]) continue if sizeOf (adrcalendar^.[year]) == 0 continue local (month) for month = 12 downTo 1 local (monthName = string.padWithZeros (month, 2)) if not defined (adrcalendar^.[year].[monthName]) continue if sizeOf (adrcalendar^.[year].[monthName]) == 0 continue local (day) for day = 31 downTo 1 local (dayName = string.padWithZeros (day, 2)) if defined (adrcalendar^.[year].[monthName].[dayName]) return (@adrcalendar^.[year].[monthName].[dayName]) error () €�����„�����������€�����������€�����€�����€�����€�����€�����€�����€�����€�����€�����€�����€�����€�����€�����€�����€�����€�����€�����€�����€�������q��ú��������<��F���Verdana��������������������������� ��������������¶ÒËz¶ÒÌ©�����É�m‘îLANDÿÿÿÿÿÿ������mac ������������on getMemberName (adrsite, member) 3/12/01; 6:55:10 PM by JES Created. local (adrUsers = @adrSite^.["#membershipGroup"].users) local (adrUser = @adrUsers^.[member]) if defined (adrUser^) if defined (adrUser^.personalInfo) if defined (adrUser^.personalInfo.name) return (adrUser^.personalInfo.name) return ("") €�����„�����������€�����€�����€�����€�����€�����€�����€�������ú��¢��������T��Ö� ��Verdana��������������������������� ��������������¶ÝzF¶Þ¯Þ�����ÞIîêLANDÿÿÿÿÿÿ������mac ������������on getSiteFolder (adrSite) 3/12/01; 4:18:59 PM by JES Created. local (folderName = nameOf (adrSite^)) if folderName endsWith ("ManilaWebsite") folderName = string.mid (folderName, 1, sizeOf (folderName) - sizeOf ("ManilaWebsite")) local (pc = file.getPathChar ()) local (folder) if system.environment.isMac foldername = string.mid (foldername, 1, 31) //truncate to 31 chars folder = theXmlFilesData.prefs.exportFolder + foldername + pc return (folder) €�����„�����������€�����€�����€�����€�����€�����€�����€�����€�����€�����€�����€�������¢��ó��������f�����Verdana��������������������������� ��������������¶Ò‘N¶Ò‘‘������ö�÷§LANDÿÿÿÿÿÿ������mac ������������on relativePathToAddress (adrTable, relativePath) 3/12/01; 2:44:37 PM by JES Created. local (adr = adrTable) while (sizeOf (relativePath) > 0) relativePath = string.popLeading (relativePath, '/') relativePath = string.popTrailing (relativePath, '/') local (nextPart = string.nthField (relativePath, '/', 1)) if nextPart == "" break relativePath = string.delete (relativePath, 1, sizeOf (nextPart)) adr = @adr^.[nextPart] if not defined (adr^) return (nil) if not defined (adr^) return (nil) return (adr) €�����„�����������€�����€�����€�����€�����€�����€�����������€�����€�����€�����������€�����€�����€�������ó��O��������<��›���Verdana��������������������������� ��������������¶Ò²¶Ò¾�������'Å"LANDÿÿÿÿÿÿ������mac ������������on urlToFilePath (url, folder) 3/12/01; 2:37:47 PM by JES Created. local (filename = string.nthField (url, "/", string.countFields (url, "/"))) if system.environment.isMac if sizeOf (filename) > 31 local (extension = string.nthField (filename, ".", string.countFields (filename, "."))) filename = string.mid (filename, 1, 31 - sizeOf (extension) - 1) + extension f = folder + filename return (f) €�����„�����€�����€�����€�����€�����€�����€�����€�����€�������O��Ã������i���j���¶Òª¶ÝzF�������� ������� ����*���6 ����C���O ����\���h �������‹ ����™���¥ ����³���¿ ����Õ���á ����ïconvertToString������´É deleteScripts������¶¾ encodeString������¸¯ getDataTable������º~getLastCalendarAddress������¼f getMemberName������Àã getSiteFolder������ÂérelativePathToAddress������Å— urlToFilePath������È–��VVerdana��������������������������� ����������¬�„�2?8ÕÈ������������������������Ã��Ò������x���~���¶Ò‚‰¶Þyà�������� ���� ��� �������+ ����<���H ����T���` ����g���s ������� ����œ���¨ ����­���¹ ����¾���Ê ����Ô���à ����ê cleanRoot�������Zcommands������� gdownloadDatabase������� * downloadGem�������ªexport�������i exportPicture�������YqgetDownloadUrl�������]Þinit�������a menu�������gc serialize�������³f utilities�������Êñ��VVerdana��������������������������� ����������¸�m�=¿¸UH������������������������Ò���»�������a���$���¶Ò‚‰¶Þ¯Þ�������� ������� ����-theXmlFilesData�������þtheXmlFilesSuite������ÌÀ��VVerdana��������������������������� ���������½�<�=�ÀÀ¿$�������������������������»��º�������Ξ?8ÕÈChicago��������������������������?ÿ� ���������������ÿÿÿÿÿÿÿÿCharcoal�������������������������Ò� ����������������kº�Geneva����������������������������� ����������������]=·ÃChicago��������������������������?ÿ� ����������������l.¨ÒChicago��������������������������?ÿ� ����������������ÿÿÿÿÿÿÿÿCharcoal�������������������������Ò� ����������������������ÿÿ����������������������������������������������������������º