Monday, November 08, 2010 at 12:05 AM.
system.verbs.builtins.radio.upstream.saveDirectoryXml
on saveDirectoryXml (folder) {
<<Changes
<<12/20/01; 1:22:34 AM by JES
<<Use file.writeTextFile to write the file, instead of file.writeWholeFile.
<<6/23/01; 8:30:39 PM by DW
<<Complete rewrite. Went from 1.6 seconds to 0.2 seconds. Not too bad!
<<bundle //old version, builds an outline
<<local (directoryOutline)
<<new (outlinetype, @directoryOutline)
<<local (oldtarget = target.set (@directoryOutline))
<<on dofolder (folder, fltoplevel=false) //return true if at least one file was inserted
<<local (f, insertdir = right, fname, atts, flfolder, adrfile, flinserted)
<<fileloop (f in folder)
<<fname = file.filefrompath (f)
<<if fname endswith file.getpathchar ()
<<fname = string.mid (fname, 1, sizeof (fname) - 1)
<<if fltoplevel //don't include the directory in the directory
<<if radio.data.upstream.directoryFileNames contains fname
<<continue
<<flfolder = file.isfolder (f)
<<if not flfolder
<<radio.file.getFileAttributes (f, @adrfile)
<<if adrfile^.upstream.ctuploads == 0
<<continue
<<op.insert (fname, insertdir)
<<flinserted = true
<<new (tabletype, @atts)
<<if flfolder
<<atts.type = "folder"
<<if dofolder (f)
<<op.go (left, 1)
<<else
<<op.deleteline ()
<<flinserted = false
<<else
<<radio.file.getFileAttributes (f, @adrfile)
<<atts.type = "file"
<<atts.url = adrfile^.upstream.url
<<atts.size = file.size (f)
<<atts.whenLastUploaded = adrfile^.upstream.whenLastUploaded
<<atts.whenCreated = file.created (f)
<<if flinserted
<<op.attributes.addgroup (@atts)
<<insertdir = down
<<return (insertdir == down)
<<dofolder (folder, fltoplevel:true)
<<op.firstsummit (); op.promote (); op.deleteline ()
<<window.zoom (@directoryOutline)
<<target.set (oldtarget)
<<scratchpad.directoryoutline = directoryoutline; edit (@scratchpad.directoryoutline)
<<local (xmltext = op.outlinetoxml (@directoryOutline))
<<local (f = folder + radio.data.upstream.directoryFileName)
<<file.writewholefile (f, xmltext, 'OPML', frontier.id)
<<return (f)
on callback (f) { //skip folders with their own #upstream.xml files
if file.isfolder (f) {
return (not file.exists (f + radio.data.fileNames.upstreamFileName))};
if file.filefrompath (f) beginswith "#" {
return (false)};
return (true)}; //include it
local (f = folder + radio.data.upstream.directoryFileName);
local (xmltext = radio.file.folderToOpml (folder, @callback));
file.writeTextFile (f, xmltext);
return (true)}
<<bundle //test code
<<local (tc = clock.ticks ())
<<for i = 1 to 1
<<saveDirectoryXml ("Backup:Radio UserLand:www:system:upstream:")
<<dialog.alert (double (clock.ticks () - tc) / 60)
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.