The HaloscanMacro enables readers to post comments and trackbacks to your TiddlyWiki entries.\n\nIt works by using the [[Haloscan]] service, which is currently free (for a basic account). Currently, you must have a Haloscan account to use this macro, but it should be easy to adapt to other systems.\n\nI am in no way affiliated with Haloscan. It just seemed like their service was a good fit for solving this problem.
[[About]]\nTestTiddler\n
[[Haloscan|http://www.haloscan.com/]] provides a comment and trackback hosting service. This service seems like the perfect thing for providing the back-end support for these features in a TiddlyWiki.
/***\n|Name|HaloscanMacro|\n|Created by|JimSpeth|\n|Location|http://end.com/~speth/HaloscanMacro.html|\n|Version|1.1.0|\n|Requires|~TW2.x|\n\n!Description\nComment and trackback support for TiddlyWiki (via Haloscan).\n\n!History\n* 16-Feb-06, version 1.1.0, drastic changes, now uses settings from haloscan account config\n* 31-Jan-06, version 1.0.1, fixed display of counts for default tiddlers\n* 30-Jan-06, version 1.0, initial release\n\n!Examples\n|!Source|!Output|h\n|{{{<<haloscan comments>>}}}|<<haloscan comments>>|\n|{{{<<haloscan trackbacks>>}}}|<<haloscan trackbacks>>|\n\n!Installation\nRegister for a [[Haloscan|http://www.haloscan.com]] account. It's free and painless.\nInstall the HaloscanMacro in a new tiddler with a tag of systemConfig (save and reload to activate).\nIn the macro configuration code (below), change //YourName// to your Haloscan account name.\nUse the macro somewhere in a tiddler (see ViewTemplate for an example).\n\n!Settings\nYou can adjust various options for your account in the member configuration area of Haloscan's web site. The macro will use these settings when formatting the links.\n\n!Code\n***/\n//{{{\n\n/* change "YourName" to your Haloscan account name */\nconfig.macros.haloscan = {account: "YourName", baseURL: "http://www.haloscan.com/load/"};\n\nvar haloscanLoaded = 0;\nconfig.macros.haloscan.load = function ()\n{\n if (haloscanLoaded == 1)\n return;\n \n account = config.macros.haloscan.account;\n if (!account || (account == "YourName"))\n account = store.getTiddlerText("SiteTitle");\n \n var el = document.createElement('script');\n el.language = 'JavaScript'; \n el.type = 'text/javascript'; \n el.src = config.macros.haloscan.baseURL + account;\n document.documentElement.childNodes[0].appendChild(el);\n \n haloscanLoaded = 1;\n}\nconfig.macros.haloscan.load();\n\n/* this totally clobbers document.write, i hope that's ok */\nvar safeWrite = function(s)\n{\n document.written = s;\n return s;\n};\ndocument.write = safeWrite;\n\nconfig.macros.haloscan.refreshDefaultTiddlers = function ()\n{\n var start = store.getTiddlerText("DefaultTiddlers");\n if (start)\n {\n var titles = start.readBracketedList();\n for (var t=titles.length-1; t>=0; t--)\n story.refreshTiddler(titles[t], DEFAULT_VIEW_TEMPLATE, 1);\n }\n}\n\nvar haloscanRefreshed = 0;\nconfig.macros.haloscan.handler = function (place, macroName, params, wikifier, paramString, tiddler)\n{\n if (typeof HaloScan == 'undefined')\n {\n if (haloscanRefreshed == 0)\n {\n setTimeout("config.macros.haloscan.refreshDefaultTiddlers()", 1);\n haloscanRefreshed = 1;\n }\n return;\n }\n \n var id = story.findContainingTiddler(place).id.substr(7);\n var hs_search = new RegExp('\s\sW','gi');\n id = id.replace(hs_search,"_");\n \n account = config.macros.haloscan.account;\n if (!account || (account == "YourName"))\n account = store.getTiddlerText("SiteTitle");\n \n var haloscanError = function (msg)\n {\n createTiddlyError(place, config.messages.macroError.format(["HaloscanMacro"]), config.messages.macroErrorDetails.format(["HaloscanMacro", msg]));\n }\n \n if (params.length == 1)\n {\n if (params[0] == "comments")\n {\n postCount(id);\n commentsLabel = document.written;\n commentsPrompt = "Comments on this tiddler";\n var commentsHandler = function(e) { HaloScan(id); return false; };\n var commentsButton = createTiddlyButton(place, commentsLabel, commentsPrompt, commentsHandler);\n }\n else if (params[0] == "trackbacks")\n {\n postCountTB(id);\n trackbacksLabel = document.written;\n trackbacksPrompt = "Trackbacks for this tiddler";\n var trackbacksHandler = function(e) { HaloScanTB(id); return false; };\n var trackbackButton = createTiddlyButton(place, trackbacksLabel, trackbacksPrompt, trackbacksHandler);\n }\n else\n haloscanError("unknown parameter: " + params[0]);\n }\n else if (params.length == 0)\n haloscanError("missing parameter");\n else\n haloscanError("bad parameter count");\n}\n\n//}}}\n
[[About]]\nHaloscanMacro\nViewTemplate\nTestTiddler\n[[Haloscan]]\n
<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal 'DD MMM YYYY'>><<saveChanges>><<upload http://end.com/~speth/store.php HaloscanMacro.html HaloscanMacro-archive>><<slider chkSliderOptionsPanel OptionsPanel 'options »' 'Change TiddlyWiki advanced options'>>
comments and trackback support for TiddlyWiki
HaloscanMacro
Feel free to test comments and trackbacks here.
|!Date|!url|!toFilename|!backupDir|!user|!status|\n| 30/1/2006 23:55:10 | [[store.php|http://end.com/~speth/store.php]] | [[HaloscanMacro.html|http://end.com/~speth/HaloscanMacro.html]] | HaloscanMacro-archive | speth |\n| 30/1/2006 23:58:55 | [[store.php|http://end.com/~speth/store.php]] | [[HaloscanMacro.html|http://end.com/~speth/HaloscanMacro.html]] | HaloscanMacro-archive | speth |\n| 31/1/2006 0:23:3 | [[store.php|http://end.com/~speth/store.php]] | [[HaloscanMacro.html|http://end.com/~speth/HaloscanMacro.html]] | HaloscanMacro-archive | speth |\n| 31/1/2006 0:26:53 | [[store.php|http://end.com/~speth/store.php]] | [[HaloscanMacro.html|http://end.com/~speth/HaloscanMacro.html]] | HaloscanMacro-archive | speth |\n| 31/1/2006 1:6:59 | [[store.php|http://end.com/~speth/store.php]] | [[HaloscanMacro.html|http://end.com/~speth/HaloscanMacro.html]] | HaloscanMacro-archive | speth |\n| 31/1/2006 15:3:18 | [[store.php|http://end.com/~speth/store.php]] | [[HaloscanMacro.html|http://end.com/~speth/HaloscanMacro.html]] | HaloscanMacro-archive | speth |\n| 31/1/2006 21:11:32 | [[store.php|http://end.com/~speth/store.php]] | [[HaloscanMacro.html|http://end.com/~speth/HaloscanMacro.html]] | HaloscanMacro-archive | speth |\n| 16/2/2006 4:37:34 | [[store.php|http://end.com/~speth/store.php]] | [[HaloscanMacro.html|http://end.com/~speth/HaloscanMacro.html]] | HaloscanMacro-archive | speth |\n| 16/2/2006 11:18:16 | [[store.php|http://end.com/~speth/store.php]] | [[HaloscanMacro.html|http://end.com/~speth/HaloscanMacro.html]] | HaloscanMacro-archive | speth |
/***\n\n\n----\nUploadPlugin, with [[store.php]] and [[.htaccess]] provide the @@upload@@ and the @@save to web@@ functions. See HowToUpload.\nThe french translation available as a separate tiddler UploadPluginMsgFR\n----\n\n\n***/\n\n/***\n|''Name:''|UploadPlugin|\n|''Type:''|Plugin|\n|''Version:''|3.0.1 (18-Jan-2006)|\n|''Source:''|[[TiddlyWiki.BidiX.info|http://tiddlywiki.BidiX.info/#UploadPlugin]]|\n|''Author:''|BidiX[at]BidiX.info|\n|''Compatibility:''|TW1.2 & TW2|\n!Usage : \n{{{\n<<upload storeUrl [toFilename [backupDir]]>>\n storeUrl : the url of the store.php to POST the TiddlyWiki\n toFilename : the filename in the storeUrl directory\n backupDir : if present backup the previous toFilename file\n to the backupDir directory\n}}}\n\nInstall the {{{<<upload ... >>}}} macro in SideBarOptions just below the {{{<<saveChanges>>}}} macro.\n\n!Description\n!!Plugin\n*If the TiddlyWiki came from @@local disk@@ :\n**{{{<<saveChanges>>}}} \n***display as ''save to disk''\n***work as usual\n**{{{<<upload ...>>}}}\n***display as ''upload''\n***after saving to disk, upload in the storeUrl directory.\n*If the TiddlyWiki came from @@website@@ :\n**{{{<<saveChanges>>}}} \n***print nothing\n***has been disabled\n**{{{<<upload ...>>}}}\n***display as '''save to web''\n***save in the storeUrl directory.\n*If GenerateAnRssFeed is set :\n**generate the content of the RSSFeed \n**upload the RssFile\n**Caution : use the SiteUrl tiddler to specify url of the TiddlyWiki in the generated RssFile\n*DisplayMessage\n*Log upload in UploadLog\nhint : if UploadLog is the first tiddler in the Timeline Tab, no tiddler has been updated since last upload.\n\n!!store.php\n*method GET\n**display an information page\n*method POST\n**if toFilename already exists and backDir parameter specified\n***rename toFilename to backupDir/toFilename.AAAAMMDD.HHSS.html\n**copy temporaryUploadedFile to toFilename\n** return status\n!User manual\nSee HowToUpload\n!Installation :\n*Install the UploadPlugin as usual\n*Upload the [[store.php]] file on your php aware webserver in your TiddlyWiki directory\n*Protect your directory : \n**for Apache web server ([[for detail see Apache documentation|http://httpd.apache.org/docs/1.3/howto/htaccess.html]]) : \n***configure the [[.htaccess]] :\n****Set the /full/path/from/root/to/your/.passwd file\n****<limit xxx> :\n*****For a private access to your TiddlyWiki directory set ''<limit GET POST>''\n*****For a public access to your TiddlyWiki files, but a private uploading facility set ''<limit POST>''\n***Upload [[.passwd]] and [[.htaccess]] files\n**for other web servers see the appropriate documentation\n*Configure an upload button, for example in the SideBarOptions\n!Suppported Browser\n*Firefox : Ok\n*Internet Explorer : Ok\n*Others : Not tested, please report status.\n\n!Revision history\n* v1.0.0 (17-Dec-2005)\n** first public working version\n*v1.0.1 (23-Dec-2005)\n**reformatting code\n*v1.0.2 (24-Dec-2005)\n**Optional parameter toFilename\n**Optional parameter backupDir\n*v1.0.3 (26-Dec-2005)\n**UploadLog tiddler\n*v1.1.0 (27-Dec-2005)\n**Upload RSS File\n*V2.0.0 (3-Jan-2006)\n**Save to web\n**Compatibilty with TiddlyWiki 1.2.39 and TiddlyWiki 2.0.0 Beta 6\n*V2.0.1 (8-Jan-2006)\n**Compatibilty with TiddlyWiki 2.0.1\n*V2.0.2 (8-Jan-2006)\n**SiteTitle and SiteSubtitle in web page Title\n*V3.0.0 (15-Jan-2006)\n**Asynchronous upload\n**Synchronous upload before unload of the page\n**All strings extracted in macro config\n**Compatibility checked with TW 2.0.2 & TW 1.2.39 for both FF 1.5 and IE 6\n*V3.0.1 (18-Jan-2006)\n**UTF8toUnicode conversion problem in Firefox\n\n!Code\n***/\n//{{{\nversion.extensions.UploadPlugin = {major: 3, minor: 0, revision: 1, date: new Date(2006,1,18)};\n\n//\n// Upload Macro\n//\n\nconfig.macros.upload = {\n label: "upload", \n saveLabel: "save to web", \n prompt: "Save and Upload this TiddlyWiki in ", \n accessKey: "U",\n formName: "UploadPlugin",\n contentType: "text/html;charset=UTF-8",\n defaultStoreScript: "store.php"\n};\n\n// only this config need to be translated\nconfig.macros.upload.messages = {\n aboutToUpload: "About to upload TiddlyWiki to %0",\n errorDownloading: "Error downloading",\n errorUploadingContent: "Error uploading content",\n fileNotFound: "file to upload not found",\n fileNotUploaded: "File %0 NOT uploaded",\n label: "upload", \n mainFileUploaded: "Main TiddlyWiki file uploaded to %0",\n prompt: "Save and Upload this TiddlyWiki in ", \n urlParamMissing: "url param missing",\n rssFileNotUploaded: "RssFile %0 NOT uploaded",\n rssFileUploaded: "Rss File uploaded to %0",\n saveLabel: "save to web", \n saveToDisk: "save to disk"\n};\n\nconfig.macros.upload.label = config.macros.upload.messages.label; \nconfig.macros.upload.saveLabel = config.macros.upload.messages.saveLabel; \nconfig.macros.upload.prompt = config.macros.upload.messages.prompt;\n\n\nconfig.macros.upload.handler = function(place,macroName,params){\n var url;\n if (params[0]) {\n url = params[0];\n this.defaultStoreScript = basename(url);\n }\n else\n url = dirname(document.location.toString())+"/"+ this.defaultStoreScript;\n var toFilename=params[1];\n var backupDir=params[2];\n var label;\n if (document.location.toString().substr(0,5) == "http:")\n label = this.saveLabel;\n else\n label = this.label;\n createTiddlyButton(place, label, this.prompt+dirname(url), \n function () {upload(url, toFilename, backupDir, true); return false;}, \n null, null, this.accessKey);\n};\n\n//\n// TiddlyWiki Core patches\n//\n\n// overwrite the saveChanges handler \n// configure no Macro instead of saveChanges Macro in case of http: access\nconfig.macros.saveChanges.label = config.macros.upload.messages.saveToDisk;\nconfig.macros.saveChanges.handler = function(place,macroName,params)\n{\n if(!readOnly) {\n if (document.location.toString().substr(0,5) != "http:") \n createTiddlyButton(place,this.label,this.prompt,function () {saveChanges(); return false;},null,null,this.accessKey);\n // else no TiddlyButton\n }\n}\n\n// Check if there is any unsaved changes before exiting\n// if unsaved changes : saveOrUpload\n//function checkUnsavedChanges()\ncheckUnsavedChanges = function ()\n{\n if(store && store.dirty) {\n if(confirm(config.messages.unsavedChangesWarning))\n saveOrUpload(false); // Because called by <body onunload=... Upload must be synchronous\n }\n}\n\n//\n// Utility functions \n//\n\nfunction dirname(filePath)\n{\n if ((lastpos = filePath.lastIndexOf("/")) != -1)\n return filePath.substring(0, lastpos);\n else\n return filePath.substring(0, filePath.lastIndexOf("\s\s"));\n}\n\nfunction basename(filePath)\n{\n if ((lastpos = filePath.lastIndexOf("#")) != -1) \n filePath = filePath.substring(0, lastpos);\n if ((lastpos = filePath.lastIndexOf("/")) != -1)\n return filePath.substring(lastpos + 1);\n else\n return filePath.substring(filePath.lastIndexOf("\s\s")+1);\n}\n\n// TiddlyWiki utilities\n\nfunction getLocalPath() {\n //extract from the Jeremy's SaveFile \n var originalPath = document.location.toString();\n // Check we were loaded from a file URL\n if(originalPath.substr(0,5) != "file:")\n {\n alert(config.messages.notFileUrlError);\n displayTiddler(null,"SaveChanges",0,null,null,false,false);\n return;\n }\n // Remove any location part of the URL\n var hashPos = originalPath.indexOf("#");\n if(hashPos != -1)\n originalPath = originalPath.substr(0,hashPos);\n // Convert to a native file format assuming\n // "file:///x:/path/path/path..." - pc local file --> "x:\spath\spath\spath..."\n // "file://///server/share/path/path/path..." - FireFox pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n // "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."\n // "file://server/share/path/path/path..." - pc network file --> "\s\sserver\sshare\spath\spath\spath..."\n var localPath;\n if(originalPath.charAt(9) == ":") // pc local file\n localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file://///") == 0) // FireFox pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\s\s");\n else if(originalPath.indexOf("file:///") == 0) // mac/unix local file\n localPath = unescape(originalPath.substr(7));\n else if(originalPath.indexOf("file:/") == 0) // mac/unix local file\n localPath = unescape(originalPath.substr(5));\n else // pc network file\n localPath = "\s\s\s\s" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\s\s");\n return localPath;\n}\n\n//\n// LogUpload\n//\n\nfunction getLogUploadTiddler() {\n var tiddler;\n if (version.major < 2)\n tiddler = store.tiddlers['UploadLog'];\n else\n tiddler = store.getTiddler("UploadLog");\n if (!tiddler) \n {\n tiddler = new Tiddler();\n tiddler.title = 'UploadLog';\n tiddler.text = "|!Date|!url|!toFilename|!backupDir|!user|!status|";\n if (version.major < 2)\n store.tiddlers['UploadLog'] = tiddler;\n else\n store.addTiddler(tiddler);\n }\n return tiddler;\n}\n\nfunction logUpload(url, toFilename, backupDir) \n{\n var tiddler = getLogUploadTiddler();\n var now = new Date();\n newText = "| ";\n //newText += now.toLocaleString() + " | ";\n \n newText += now.getDate()+"/"+(now.getMonth()+1)+"/"+now.getFullYear() + " ";\n newText += now.getHours()+":"+now.getMinutes()+":"+now.getSeconds()+" | ";\n newText += "[["+basename(url)+"|"+url + "]] | ";\n newText += "[["+basename(toFilename) + "|" + dirname(url)+"/"+basename(toFilename) + "]] | ";\n newText += backupDir + " | ";\n newText += config.options.txtUserName + " |";\n\n tiddler.text = tiddler.text + "\sn" + newText;\n tiddler.modifier = config.options.txtUserName;\n tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers['UploadLog'] = tiddler;\n else\n store.addTiddler(tiddler);\n //displayTiddler(document.getElementById('sidebar'),"UploadLog",1,null,null,false);\n if (version.major < 2)\n store.notifyAll();\n}\n\nfunction logUploadStatusOk() \n{\n var tiddler = getLogUploadTiddler();\n newText = " ok |";\n tiddler.text = tiddler.text + newText;\n tiddler.modifier = config.options.txtUserName;\n tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers['UploadLog'] = tiddler;\n else\n store.addTiddler(tiddler);\n //displayTiddler(document.getElementById('sidebar'),"UploadLog",1,null,null,false);\n if (version.major < 2)\n store.notifyAll();\n store.notify('UploadLog',true);\n}\n\n//\n// download file before save it\n// \n\nfunction download(uploadUrl, uploadToFilename, uploadBackupDir, asynchronous) {\n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n try {\n if (url.substr(0,5) == "http:") {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");\n }\n else {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n }\n } catch (e) { }\n\n request.open("GET",document.location.toString(), asynchronous);\n if (asynchronous) {\n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if(request.status == 200) {\n uploadChangesFrom(uploadUrl, uploadToFilename, uploadBackupDir, request.responseText, asynchronous);\n }\n else\n alert(config.macros.upload.messages.errorDownloading.format([document.location.toString()]));\n }\n }\n }\n request.send(null);\n if (! asynchronous) {\n if(request.status == 200) {\n uploadChangesFrom(uploadUrl, uploadToFilename, uploadBackupDir, request.responseText, asynchronous);\n }\n else\n alert(config.macros.upload.messages.errorDownloading.format([document.location.toString()]));\n }\n\n}\n\n// saveOrUpload\n\nfunction saveOrUpload(asynchronous) {\n if (document.location.toString().substr(0,5) == "http:") {\n // try a default synchronous upload\n url = dirname(document.location.toString())+"/"+ config.macros.upload.defaultStoreScript;\n upload(url, null, null, asynchronous);\n }\n else \n saveChanges();\n}\n\n//\n//Upload\n//\n\nfunction upload(url, toFilename, backupDir, asynchronous)\n{\n clearMessage();\n // only for forcing the message to display\n if (version.major < 2)\n store.notifyAll();\n if (url == null) {\n alert(config.macros.upload.messages.urlParamMissing);\n return;\n }\n if (backupDir == null)\n backupDir = '';\n var toPath;\n if (toFilename)\n toPath = toFilename;\n else {\n toPath = basename(document.location.toString());\n }\n logUpload(url, toPath, backupDir);\n if (document.location.toString().substr(0,5) == "file:") {\n saveChanges();\n }\n displayMessage(config.macros.upload.messages.aboutToUpload.format([dirname(url)]), dirname(url));\n uploadChanges(url, toPath, backupDir, asynchronous);\n if(config.options.chkGenerateAnRssFeed) {\n //var rssContent = convertUnicodeToUTF8(generateRss());\n var rssContent = generateRss();\n var rssPath = toPath.substr(0,toPath.lastIndexOf(".")) + ".xml";\n uploadContent(url, rssContent, rssPath, '', asynchronous, function (responseText) {\n if (responseText.substring(0,1) != 0) {\n alert(responseText);\n displayMessage(config.macros.upload.messages.rssFileNotUploaded.format([rssPath]));\n }\n else {\n displayMessage(config.macros.upload.messages.rssFileUploaded.format([dirname(url)+"/"+basename(rssPath)]), dirname(url)+"/"+basename(rssPath));\n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n }\n );\n }\n return;\n}\n\nfunction uploadChanges(url, toFilename, backupDir, asynchronous)\n{\n var original;\n if (document.location.toString().substr(0,5) == "http:") {\n original = download(url, toFilename, backupDir, asynchronous);\n return;\n }\n else {\n // standard way : Local file\n original = loadFile(getLocalPath());\n if(window.Components)\n // it's a mozilla browser\n try {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]\n .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);\n converter.charset = /* The character encoding you want, using UTF-8 here */ "UTF-8";\n original = converter.ConvertToUnicode(original);\n }\n catch(e) {\n }\n }\n //DEBUG alert(original);\n uploadChangesFrom(url, toFilename, backupDir, original, asynchronous);\n}\n\nfunction uploadChangesFrom(url, toFilename, backupDir, original, asynchronous)\n{\n\n var startSaveArea = '<div id="' + 'storeArea">'; // Split up into two so that indexOf() of this source doesn't find it\n var endSaveArea = '</d' + 'iv>';\n // Locate the storeArea div's\n var posOpeningDiv = original.indexOf(startSaveArea);\n var posClosingDiv = original.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1))\n {\n alert(config.messages.invalidFileError.format([document.location.toString()]));\n return;\n }\n // I think conversion is automatically done\n //var revised = original.substr(0,posOpeningDiv + startSaveArea.length) + \n // convertUnicodeToUTF8(allTiddlersAsHtml()) + "\sn\st\st" +\n // original.substr(posClosingDiv);\n \n var revised = original.substr(0,posOpeningDiv + startSaveArea.length) + \n allTiddlersAsHtml() + "\sn\st\st" +\n original.substr(posClosingDiv);\n\n // I think conversion is automatically done\n // var newSiteTitle = convertUnicodeToUTF8((getElementText("siteTitle") + " - " + getElementText("siteSubtitle")).htmlEncode());\n var newSiteTitle;\n if(version.major < 2){ //version is set in core TW code\n newSiteTitle = (getElementText("siteTitle") + " - " + getElementText("siteSubtitle")).htmlEncode();\n } else {\n newSiteTitle = (wikifyPlain ("SiteTitle") + " - " + wikifyPlain ("SiteSubtitle")).htmlEncode();\n }\n revised = revised.replace(new RegExp("<title>[^<]*</title>", "im"),"<title>"+ newSiteTitle +"</title>");\n var response = uploadContent(url, revised, toFilename, backupDir, asynchronous, function (responseText) {\n if (responseText.substring(0,1) != 0) {\n alert(responseText);\n displayMessage(config.macros.upload.messages.fileNotUploaded.format([getLocalPath()]));\n }\n else {\n displayMessage(config.macros.upload.messages.mainFileUploaded.format([dirname(url)+"/"+basename(toFilename)]), dirname(url)+"/"+basename(toFilename));\n logUploadStatusOk();\n store.setDirty(false);\n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n }\n );\n}\n\nfunction uploadContent(url, content, toPath, backupDir, asynchronous, callbackFn) {\n var boundary = "---------------------------"+"AaB03x";\n //Create XMLHttpRequest Object\n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n try {\n // Needed for Mozilla if local file tries to access an http URL\n if (document.location.toString().substr(0,5) == "http:") {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");\n }\n else {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n }\n } catch (e) { }\n // compose headers data\n var sheader = "\sr\sn";\n sheader += "--" + boundary + "\sr\snContent-disposition: form-data;name=\s"" + config.macros.upload.formName +"\s"\sr\sn\sr\sn";\n sheader += "backupDir="+backupDir+";user=" + config.options.txtUserName + "\sr\sn"; \n sheader += "\sr\sn" + "--" + boundary + "\sr\sn";\n sheader += "Content-disposition: form-data;name=\s"userfile\s";filename=\s""+toPath+"\s"\sr\sn";\n sheader += "Content-Type: " + config.macros.upload.contentType + "\sr\sn";\n sheader += "Content-Length: " + content.length + "\sr\sn\sr\sn";\n // compose trailer data\n var strailer = new String();\n strailer = "\sr\sn--" + boundary + "--\sr\sn";\n var data;\n data = sheader + content + strailer;\n request.open("POST",url,asynchronous);\n if (asynchronous) {\n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if(request.status == 200)\n callbackFn(request.responseText);\n else\n alert(config.macros.upload.messages.errorUploadingContent);\n }\n };\n }\n request.setRequestHeader("Content-Length",data.length);\n request.setRequestHeader("Content-Type","multipart/form-data; boundary="+boundary);\n request.send(data); \n if (! asynchronous) {\n if(request.status == 200)\n callbackFn(request.responseText);\n else\n alert(config.macros.upload.messages.errorUploadingContent);\n }\n\n}\n\n//}}}\n
<div class='toolbar' macro='toolbar -closeTiddler closeOthers +editTiddler permalink references jump'></div>\n<div class='title' macro='view title'></div>\n<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date [[DD MMM YYYY]]'></span> (created <span macro='view created date [[DD MMM YYYY]]'></span>) | <span class='comments' macro='haloscan comments'></span> | <span class='comments' macro='haloscan trackbacks'></span></div>\n<div class='tagging' macro='tagging'></div>\n<div class='tagged' macro='tags'></div>\n<div class='viewer' macro='view text wikified'></div>\n<div class='tagClear'></div>
Hi. I made this.\n[[speth@end.com|mailto:speth@end.com]]\n