Monday, November 08, 2010 at 12:02 AM.
system.verbs.builtins.file.writeTextFile
on writeTextFile (f, s, mimeType = nil, blockSize = nil, characterSet = nil, lineEnding = nil, creationDate = nil, type = nil, creator = nil) { <<Changes <<12/18/01; 7:57:44 PM by JES <<Created. Creates a new text file with the specified path, writes the contents to it with the correct line-endings and character set as specified by the input parameters, and closes the file. <<http://docserver.userland.com/file/writeTextFile local (pc = file.getPathChar ()); local (fname = string.nthField (f, pc, string.countFields (f, pc))); local (ext = string.nthField (fname, ".", string.countFields (fname, "."))); local (os); bundle { //calculate os if system.environment.isWindows { os = "win"} else { //mac if system.environment.isCarbon { os = "osx"} else { os = "mac"}}}; bundle { //set up default values if mimeType == nil { //get the mimeType from user.webserver.prefs.ext2MIME if defined (user.webserver.prefs.ext2MIME.[ext]) { mimeType = user.webserver.prefs.ext2MIME.[ext]}}; if blockSize == nil { //default to infinity blockSize = infinity}; if characterSet == nil { //base it on the mimeType case mimeType { "text/xml"; "text/x-opml" { characterSet = "windows"}} else { case os { "win" { characterSet = "windows"}; "osx"; "mac" { characterSet = "mac"}}}}; if lineEnding == nil { //base it on the current platform case os { "win" { lineEnding = "windows"}; "osx" { lineEnding = "unix"}; "mac" { lineEnding = "mac"}}}; if creationDate == nil { //if the file exists, preserve the creation date if file.exists (f) { try {creationDate = file.created (f)}}}; if system.environment.isMac { //set type/creator if not specified if type == nil { //get the type from user.webserver.prefs.MIME2type if defined (user.webserver.prefs.MIME2type) { if defined (user.webserver.prefs.MIME2type.[mimeType]) { type = user.webserver.prefs.MIME2type.[mimeType]}}; if type == nil { //no type defined -- pick a sensible default if system.environment.isCarbon { type = ' '} else { //classic type = 'TEXT'}}}; if creator == nil { //get the creator from user.webserver.prefs.MIME2creator, if defined if defined (user.webserver.prefs.MIME2creator) { if defined (user.webserver.prefs.MIME2creator.[mimeType]) { creator = user.webserver.prefs.MIME2creator.[mimeType]}} else { //set the default creator case mimeType { "text/xml"; "text/x-opml" { creator = Frontier.id}; "text/html" { creator = user.html.prefs.textFileCreator}} else { //couldn't determine mimeType -- use default creator for the platform if system.environment.isCarbon { creator = 'text'} //TextEdit else { //classic creator = 'ttxt'}}}}}}; //SimpleText file.new (f); file.open (f); bundle { //set type and creator on MacOS if system.environment.isMac { if type != nil { file.setType (f, type)}; if creator != nil { file.setCreator (f, creator)}}}; bundle { //convert text if necessary bundle { //convert line endings to the specified line endings local (eolChars); case lineEnding { //set eolChars "windows" { eolChars = "\r\n"}; "unix" { eolChars = "\n"}; "mac" { eolChars = "\r"}}; local (ixCr = string.patternMatch ("\r", s)); local (ixLf = string.patternMatch ("\n", s)); if ixLf == 0 { //mac line-endings, or none in s if ixCr != 0 { //any eol characters at all? if so, convert them if eolChars != "\r" { //optimization s = string.replaceAll (s, "\r", eolChars)}}} else { //windows or unix line-endings in s if ixCr == 0 { //unix line-endings in s if lineEnding != "unix" { if eolChars != "\n" { //optimization s = string.replaceAll (s, "\n", eolChars)}}} else { //windows line endings in s if lineEnding != "windows" { if eolChars != "\r\n" { //optimization s = string.replaceAll (s, "\r\n", "\r")}}}}}; case os { //convert character set to the one specified, if different from os "win" { case characterSet { "mac" { s = string.latinToMac (s)}; "utf-8" { s = string.ansiToUtf8 (s)}; "utf-16" { s = string.ansiToUtf16 (s)}}}; "osx"; "mac" { case characterSet { "windows" { s = string.macToLatin (s)}; "utf-8" { s = string.macToLatin (s); s = string.ansiToUtf8 (s)}; "utf-16" { s = string.macToLatin (s); s = string.ansiToUtf16 (s)}}}}}; bundle { //write the text to the file, yielding processor time if necessary loop { ct = sizeOf (s); if ct > 0 { file.write (f, string.mid (s, 1, blockSize)); if ct <= blocksize { break}; s = string.delete (s, 1, blockSize)}; thread.sleepTicks (0)}}; //yield some processor time file.close (f); if creationDate != nil { //set it file.setCreated (f, creationDate)}; bundle { //call the callbacks, if present local (adrscript); if not defined (user.callbacks.fileWriteWholeFile) { new (tableType, @user.callbacks.fileWriteWholeFile)}; for adrscript in @user.callbacks.fileWriteWholeFile { try { while typeOf (adrscript^) == addressType { adrscript = adrscript^}; adrscript^ (f)}}}; return (true)}
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.