I stumbled upon TiddlyWiki (found at [[TiddlyWiki.com|http://tiddlywiki.com/]]) and I immediatly fell in love. As is typical, when I find a great gadget, application, or service, I often dive into it, learn all about it, and inevitably, I end up posting Tips and Tricks about it. Well, it was no different with TiddlyWiki...thus [[TiddlyWikiTips.com]] was born! Here you will find TiddlyWiki Tips as well as anything else that I find interesting that's relevent to TiddlyWiki!\n\n[img[http://g04.com/images/Logo_JimsTips.gif]]\n\n[[TiddlyWikiTips.com]] is a [[Jim's Tips|http://JimsTips.com]] site, home of [[Gmail Tips|http://GmailTips.com]], [[SageTV Tips|http://SageTVTips.com]], and many other Jim's Tips!\n\n[[TiddlyWikiTips.com]] is run by [[Jim Barr]], and is hosted through [[DreamHost|http://DreamHost.com]]. \n\nThis site is consists of a single TiddlyWiki file!\n\n<><
I never actually thought about this before, but it really makes sense now. When you access a TiddleWiki site, you are actually downloading the //entire// Web site (ie: a single HTML file) but only viewing a portion of it. Initially, this means that the site will take a bandwidth hit for the size of the entire site file simply by loading the page.\n\nThe good news, though, is that this means that once the site visitor loads the site, there is //no further interaction with the Web host// for that session! The site visitors can click and click and click on as many site links as they want, and they are only affecting the local copy that was initially loaded. This could potentially be a huge bandwidth savings for the site. Just keep the content as lean as you can to keep the file size down.
|!Format |!Codes used|\n|''Bold'' |{{{''Bold'' }}}|\n|==Strike== |{{{==Strike== }}}|\n|__Underline__ |{{{__Underline__ }}}|\n|//Italic// |{{{//Italic// }}}|\n|Superscript: 2^^3^^=8 |{{{Superscript: 2^^3^^=8 }}}|\n|Subscript: a~~ij~~ = -a~~ji~~|{{{Subscript: a~~ij~~ = -a~~ji~~}}}|\n|@@highlight@@ highlighting. |{{{@@highlight@@ highlighting. }}}|\n|@@color(green):green colored@@ |{{{@@color(green):green colored@@ }}}|\n|@@bgcolor(#ff0000): bg red colored@@ |{{{@@bgcolor(#ff0000): bg red colored@@ }}}|\n|@@bgcolor(#ff0000):color(#ffffff):red colored@@ |{{{@@bgcolor(#ff0000):color(#ffffff):red colored@@ }}}|\n\nTiddlyWiki uses Wiki style markup, a way of lightly "tagging" plain text so it can be transformed into HTML. Edit this Tiddler to see samples.
<<<\nThis is how you do an extended, wrapped blockquote so you don't have to put angle quotes on every line.\n<<<\n>level 1\n>level 1\n>>level 2\n>>level 2\n>>>level 3\n>>>level 3\n>>level 2\n>level 1\nHere's how it's done:\n{{{\n<<<\nThis is how you do an extended, wrapped blockquote so you don't have to put angle quotes on every line.\n<<<\n>level 1\n>level 1\n>>level 2\n>>level 2\n>>>level 3\n>>>level 3\n>>level 2\n>level 1\n}}}\nTiddlyWiki uses Wiki style markup, a way of lightly "tagging" plain text so it can be transformed into HTML. Edit this Tiddler to see samples.
Content Management System\n\n[[Wikipedia|http://en.wikipedia.org/wiki/Wiki]] defines a "Content Management System" as: \n>In computing, a content management system ([[CMS]]) is a system used to organize and facilitate collaborative creation of documents and other content. A [[CMS]] is frequently a web application used for managing websites and web content, though in many cases, content management systems require special client software for editing and constructing articles. The market for content management systems remains fragmented, with many open-source and proprietary solutions available.\n>[[CMS]]s allow end-users (typically authors of some sort) to provide new content in the form of articles. The articles are typically entered as plain text, perhaps with markup to indicate where other resources (such as pictures) should be placed. The system then uses rules to style the article, separating the display from the content, which has a number of advantages when trying to get many articles to conform to a consistent "look and feel". The system then adds the articles to a larger collection for publishing.\n(Click [[here|http://en.wikipedia.org/wiki/Content_management_system]] for Wikipedia's page)
CamelCase\n[[Wikipedia|http://en.wikipedia.org/wiki/Wiki]] defines a "CamelCase" as: \n>CamelCase is a common name for the practice of writing compound words or phrases where the words are joined without spaces, and each word is capitalized within the compound. This practice is known by a large variety of names, including Bicapitalization, InterCaps, MixedCase, etc, and many of its users do not ascribe a name to it at all.\n>\n>CamelCase is a standard identifier naming convention for several programming languages, and has become fashionable in marketing for names of products and companies. Outside of these contexts, however, CamelCase is rarely used in formal written English, and most style guides recommend against it.\n(Click [[here|http://en.wikipedia.org/wiki/CamelCase]] for Wikipedia's page)
This is a brief, but growing list of things you can do with TiddlyWiki.\n\nThis list will grow as new uses are discovered!
TiddlyWiki, exists as a single, compact HTML file. The file contains JavaScript code, Cascading Style Sheet data, and the necessary HTML code to tie it all together. An "empty" TiddlyWiki file is around 100K or so in size, and only grows based on what data you add.
/***\nJust some bits and pieces\n***/\n//{{{\nconfig.messages.messageClose.text = "X"; // default is "close"\nconfig.views.wikified.defaultText = ""; // default is "The tiddler '%0' doesn't yet exist. Double-click to create it"\n//}}}
[[Site News]] [[Tips]] [[About]]
Here you will find some definitions of common terms associated to TiddlyWiki!\n\nClick on a term at the left to open its definition.
Do you have some documentation that needs to be available for easy access? Why not use TiddlyWiki? It lets you very easily store, manage, and find all sorts of information. OK, TiddlyWiki is definitely //not// designed to be a full-blown documentation repository, but if your needs are small, it just might do the trick. Here are some tips:\n*Try to keep to the MicroContent concept, and you should be OK.\n*Use the Tags feature to categorize your documentation. \n*You can embed external links to other documents that will launch when you click on the links. This way, you don't have to store all the content within TiddlyWiki. (Doing this however, does remove the "self-containied" aspect of TiddlyWiki and requires that the external files are accessible removing the easy portability.)
If you would like to download an "empty" TiddlyWiki file that contains all of the formatting and Plugins necessary to provide the same look and function of this site, right-click on the following link:\n\nhttp://tiddlywikitips.com/tiddlywikitips_empty.html\n\nand select "Save link as..." in Firefox or "Save target as..." in Internet Explorer\n\nNote: Do not just click on the link to load it and save it from your browser, because the resulting file will not work properly!
[[Dictionary.com|http://dictionary.com]] defines elegant as:\n\n>"...refined and tasteful in appearance or behavior or...style; suggesting...ease; of seemingly effortless beauty in form or proportion..."\n\nOK, TiddlyWiki is just a computer program, but lets face it: TiddlyWiki really shines because of its [[Simplicity]], [[Compactness]], and [[Wiki-like Interface]].
You can link to [[external sites (google)|http://www.google.com/]] with brackets or without will just type the url link http://www.google.com/ .You can also Link to folders on your machine or network shares.\n\nTiddlyWiki uses Wiki style markup, a way of lightly "tagging" plain text so it can be transformed into HTML. Edit this Tiddler to see samples.
Here are some Frequently Asked Questions about TiddlyWiki.\n\nJust click on the link to the left to open the answers!
Click on any of the entries to the left to open topics related to \nformatting your TiddlyWiki documents.\n\nTiddlyWiki is incredibly powerful as-is, but by learning some simple formatting\ncodes and techniques, you acn achieve very useful and professional results!\n\nA good place to start is with [[Basic Formatting]].
!Header 1\n!!Header 2\n!!!Header 3\n!!!!Header 4\n!!!!!Header 5\nHere's how it's done:\n{{{\n!Header 1\n!!Header 2\n!!!Header 3\n!!!!Header 4\n!!!!!Header 5\n}}}\nTiddlyWiki uses Wiki style markup, a way of lightly "tagging" plain text so it can be transformed into HTML. Edit this Tiddler to see samples.
Here you find some information to help you get started and to better understand TiddlyWiki. Click on any of the titles to the left for more details.
You can divide a tiddler into\n----\nsections by simply typing four dashes on a line by themselves.\n\nTiddlyWiki uses Wiki style markup, a way of lightly "tagging" plain text so it can be transformed into HTML. Edit this Tiddler to see samples.
[[Wikipedia|http://www.wikipedia.org]] describes IdentityTheft as:\n>Identity theft (or identity fraud) is the deliberate assumption of another person's identity, usually to gain access to their finances or frame them for a crime. Less commonly, it is to enable illegal immigration, terrorism, espionage, or changing identity permanently. It may also be a means of blackmail, especially if medical privacy or political privacy has been breached, and if revealing the activities undertaken by the thief under the name of the victim would have serious consequences like loss of job or marriage. Assuming a false identity with the knowledge and approval of the person being impersonated, such as for cheating on an exam, is not considered to be identity theft.\n>\n>Techniques for obtaining identification information range from the crude, such as stealing mail or rummaging through rubbish (dumpster diving in the USA), stealing personal information in computer databases, to infiltration of organizations that store large amounts of personal information.\n>\n>Identity theft is usually the result of serious breaches of privacy. Except for the simplest credit-related cases, it is usually not possible without breakdowns in\n>\n>* customer privacy, in which case the consequences may be limited to fraud on one corporation, typically the one that leaked the data in the first place, e.g. account numbers.\n>* consumer privacy, more serious, where credit card numbers or other generally-useful identity data is stolen and used much more widely.\n>* client confidentiality and political privacy, making it easy to effectively impersonate someone, by using confidential information that an ordinary impersonator would not have access to.\n(Click [[here|http://en.wikipedia.org/wiki/Identity_theft]] for Wikipedia's page)
\n[img[http://g04.com/images/avatar.gif]]\n\nHere's how it's done:\n{{{\n[img[http://g04.com/images/avatar.gif]]\n}}}\n\nTiddlyWiki uses Wiki style markup, a way of lightly "tagging" plain text so it can be transformed into HTML. Edit this Tiddler to see samples.\n
On Thursday, March 02, 2006 4:24:57 PM, YourName imported tiddlers from\n[[H:\sNotes\sIT_Notes.html|H:\sNotes\sIT_Notes.html]]:\n<<<\nOut of 231 tiddlers in {{{H:/Notes/IT_Notes.html}}}:\n7 new tiddlers were added to your document.\n3 existing tiddlers were replaced.\n221 tiddlers were not imported.\n#[[StyleSheet]]^^\nreplaces StyleSheet - 1/30/2006 17:51:0 by YourName^^\n#[[StyleSheetPrint]]\n#[[Styles]]\n#[[Styles Breadcrumbs]]\n#[[Styles Calendar]]\n#[[Styles Editor]]\n#[[Styles HorizontalMainMenu]]^^\nreplaces Styles HorizontalMainMenu - 1/19/2006 10:47:0 by YourName^^\n#[[Styles MessageArea]]\n#[[Styles SideBarOptions]]\n#[[Styles TagglyTagging]]^^\nreplaces Styles TagglyTagging - 1/19/2006 10:42:0 by YourName^^\n<<<\n<html><input type="button" href="javascript:;" onclick="story.closeTiddler('ImportedTiddlers'); store.deleteTiddler('ImportedTiddlers');" value="discard report"></html>
In addition to the excellent Plugins found here and throughout the TiddlyWiki world, TiddlyWiki contains some internal Macros that, for the most part, remain undocumented. They can offer lots of interesting possibilities when customizing your TiddlyWiki. The Macro list below was compiled from TiddlyWiki version 1.2.31. Click on a macro's description below to view more detail about each Macro including syntax, description, and examples!\n\n|!Macro|!Description|!Syntax|\n|allTags|[[List all Tags in a Tiddler|TipAllTags]]|{{{<}}}{{{<allTags>>}}}|\n|closeAll|[[Close all displayed Tiddlers|TipCloseAll]]|{{{<}}}{{{<closeAll>>}}}|\n|list all|[[List all Tiddlers in a Tiddler|TipListAll]]|{{{<}}}{{{<list all>>}}}|\n|list missing|[[List all Missing Tiddlers in a Tiddler|TipListMissing]]|{{{<}}}{{{<list missing>>}}}|\n|list orphans|[[List all orphaned Tiddlers in a Tiddler|TipListOrphans]]|{{{<}}}{{{<list orphans>>}}}|\n|newJournal|[[Create new date & Time stamped Tiddler|TipNewJournal]]|{{{<}}}{{{<newJournal>>}}}|\n|newTiddler|[[Create new Tiddler|TipNewTiddler]]|{{{<}}}{{{<newTiddler>>}}}|\n|permaview|[[URL link for all open Tiddlers|TipPermaView]]|{{{<}}}{{{<permaview>>}}}|\n|saveChanges |[[Save all TiddlyWiki changes|TipSaveChanges]]|{{{<}}}{{{<saveChanges>>}}}|\n|search|[[Display a Search box|TipSearch]]|{{{<}}}{{{<search>>}}}|\n|slider|[[Display a Slider|TipSlider]]|{{{<}}}{{{<slider sliderID sliderTiddler sliderLabel>>}}}|\n|tabs|[[Display Tabbed content|TipTabbedContent]]|{{{<}}}{{{<tabs indentifier tabLabel tabName Tiddler>>}}}|\n|tag|[[Display a Tag PopUp|TipTagPopUp]]|{{{<}}}{{{<tag tagName>>}}}|\n|tiddler|[[Display inline contents of a Tiddler|TipTiddlerContents]]|{{{<}}}{{{<tiddler Tiddler>>}}}|\n|timeline|[[Display Timeline in a Tiddler|TipTimeline]]|{{{<}}}{{{<timeline>>}}}|\n|today|[[Dusplay Today's Date|TipToday]]|{{{<}}}{{{<today>>}}}|\n|version|[[Display TiddlyWiki's version|TipTWVersion]]|{{{<}}}{{{<version>>}}}|\n\nHere is a [[PermaView Link|http://TiddlyWikiTips.com/index.html#%5B%5BTip%20%2312%3A%20TiddlyWiki%20Internal%20Macros%5D%5D%20TipAllTags%20TipCloseAll%20TipNewJournal%20TipNewTiddler%20TipPermaView%20TipSaveChanges%20TipSearch%20TipSlider%20TipTabbedContent%20TipTagPopUp%20TipTiddlerContents%20TipTimeline%20TipToday%20TipTWVersion]] to open all of the Internal Macro Tiddlers!
Part of TiddlyWiki's [[elegance|Elegant]] is the fact that it is a single, self-contained HTML file. All data is stored //within// the HTML file itself, and it is currently stored in plan text. Because of this, please consider the following:\n* Don't store //anything// that is sensitive in nature unless you are securely storing the HTML file (such as on a secure Thumb Drive or on your local PC.)\n* If you must store sensitive data and access it through a public terminal, be sure to clear the cache after accessing the file.\n* If you must store secure data, consider one of the TiddlyWikiAdaptations that uses encryption. \n\nIdentityTheft is a growing problem, so cool apps like TiddlyWiki unfortunatly have the potential for being abused if not used properly. You should always make security a high priority when dealing with any computers.
I'm Jim! I manage this site as well as several other "tips" sites including;\n*http://JimsTips.com\n*http://GmailTips.com\n**http://GoogleMailTips.com also points there)\n*http://MoxiTips.com\n*http://PageCreatorTips.com\n**http://GooglePagesTips.com also points there)\n\nand my personal site:\n*http://jim.barr.net\n\nI can be contacted via email at: jim@barr.net
The format for PrettyLinks allows for links that open local or network folders. Depending on your browser and operating system, the folders are opened in Windows Explorer, the OS X Finder, or the browser itself.\n\nEdit this tiddler to see [[this link to a Windows network share|file://server/share/folder/path/name]], [[this link to a Windows drive-mapped folder|file:///c:/folder/path/name]] and [[this link to a Unix-style folder|file:///folder/path/name]].\n\nTiddlyWiki uses Wiki style markup, a way of lightly "tagging" plain text so it can be transformed into HTML. Edit this Tiddler to see samples.
<<defaultHome>><<tag Tips>><<tag "Site News">><<tag "Resources">><<tag Help>>SiteMap [[Download]] [[About]]
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml'>\n\n<style type="text/css">#contentWrapper {display:none;}</style><div id="SplashScreen" style="border: 3px solid #ccc; display: block; text-align: center; width: 320px; margin: 100px auto; padding: 50px; color:#000; font-size: 28px; font-family:Tahoma; background-color:#eee;"><b>TiddlyWiki Tips</b> is loading<blink>...</blink><br><br><span style="font-size: 14px; color:red;">(Requires Javascript.)</span></div>\n
MicroContent being a fashionable word for self-contained fragments of content that are typically smaller than entire pages. Often MicroContent is presented via some kind of aggregation that reduces the perceptual shock and resource cost of context switching (eg Blogs aggregating several entries onto a page or Flickr presenting photos in an album). This TiddlyWiki aggregates MicroContent items that I call 'tiddlers' into pages that are loaded in one gulp and progressively displayed as the user clicks hypertext links to read them.
{{{Monospaced text}}} is now supported, thanks to [[AlecThomas|http://www.swapoff.org/]]. Edit this tiddler to see the syntax.\n\nYou can also have monospaced blocks (useful for source code):\n\n{{{\nvar posTop = findPosY(e);\nvar posBot = posTop + e.offsetHeight;\nvar winTop = findScrollY();\nvar winHeight = findWindowHeight();\nvar winBot = winTop + winHeight;\nif(posTop < winTop)\n return(posTop);\nelse if(posBot > winBot)\n {\n if(e.offsetHeight < winHeight)\n return(posTop - (winHeight - e.offsetHeight));\n else\n return(posTop);\n }\nelse\n return(winTop);\n}}}\n\nHere's a formatting variation for monospaced blocks. To use it, copy it into the StyleSheet tiddler, SaveChanges and refresh in your browser.\n\n{{{\n.viewer pre {\n border: 1px solid #660000;\n padding: 0.5em 0.5em 0.5em 0.5em;\n background: #eeeeaa;\n color: #660000;\n}\n}}}\n\nTiddlyWiki uses Wiki style markup, a way of lightly "tagging" plain text so it can be transformed into HTML. Edit this Tiddler to see samples.
/***\n''NewDocumentPlugin for TiddlyWiki version 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#NewDocumentPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nQuickly create new TiddlyWiki documents from your existing document, with just one click! Use the {{{<<newDocument>>}}} macro to place a "new document" link into your sidebar/mainmenu/any tiddler (wherever you like). Select this command to automatically create a "new.html" document containing a specific set of tagged tiddlers. Optional parameters let you specify an alternate path/filename for the new file, or different combinations of tags to match (using AND, OR, NOT and parentheses to form complex matches). You can also indicate "ask" for either parameter, which will trigger a prompt for input when the command is selected.\n\n!!!!!Usage\n<<<\n{{{<<newDocument filename tags>>}}}\n where:\n* ''filename'' is any local path-and-filename. If no parameters are provided, the default is to create the file "new.htm" in the current directory. If a filename is provided without a path (i.e., there is no "/" in the input), then the current directory is also assumed. Otherwise, this parameter is expected to contain the complete path and filename needed to write the file to your local hard disk.\n* ''tags'' an //expression// that can be a single tag value, a space-separated list of tags, or a logical formula using AND, OR, NOT and parentheses to create complex matches. The default tag expression includes only tiddlers tagged with <<tag includeNew>>or<<tag systemTiddlers>>. If the special keyword "ask" is used in place of either parameter then, when the command link is selected, a browser prompt() message box will be automatically displayed so you can input the parameter value(s) "on-the-fly".\n\n<<<\n!!!!!Examples:\n<<<\n{{{<<newDocument>>}}}\nequivalent to {{{<<newDocument new.htm includeNew systemTiddlers>>}}}\ncreates default "new.htm" containing tiddlers tagged with either<<tag includeNew>>or<<tag systemTiddlers>>\ntry it: <<newDocument>>\n\n{{{<<newDocument empty.html systemTiddlers>>}}}\ncreates "empty.html" containing only tiddlers tagged with<<tag systemTiddlers>>\n//(reproduces old-style (pre 2.0.2) empty file)//\ntry it: <<newDocument empty.html systemTiddlers>>\n\n{{{<<newDocument ask ask>>}}}\nprompts for path/file, prompts for tags to match\ntry it: <<newDocument ask ask>>\n<<<\n!!!!!Installation\n<<<\nImport (or copy/paste) the following tiddlers into your document:\n''NewDocumentPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2006.02.24 [1.1.2]''\nFix incompatiblity with TW 2.0.5 by removing custom definition of getLocalPath() (which is now part of TW core)\n''2006.02.03 [1.1.1]''\nconcatentate 'extra' params so that tag expressions don't have to be quoted\nmoved all text to 'formatted' string definitions for easier translation.\neven better documentation and some minor code cleanup\n''2006.02.03 [1.1.0]''\nadded support for tag EXPRESSIONS\nplus improved documentation and code cleanup\n''2006.02.03 [1.0.0]''\nCreated.\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.newDocument = {major: 1, minor: 1, revision: 2, date: new Date(2006,2,24)};\n\nconfig.macros.newDocument = {\n label: "new document",\n prompt: "create a new TiddlyWiki 'starter' document",\n newtag: "includeNew OR systemTiddlers",\n newfile: "new.htm",\n fileprompt: "Enter a new filename",\n tagprompt: "Enter tag(s) to match (use AND, OR, NOT)",\n okmsg: "%0 tiddlers written to %1",\n failmsg: "An error occurred while creating '%0'",\n tagerrmsg: "Error in tag filter '%0'"\n};\n\nconfig.macros.newDocument.handler = function(place,macroName,params) {\n var btn=createTiddlyButton(place,this.label,this.prompt,onClickNewDocument);\n btn.newfile=config.macros.newDocument.newfile;\n if (params[0]) btn.newfile=params.shift();\n btn.newtag=config.macros.newDocument.newtag;\n if (params[0]) btn.newtag=params.join(" ");\n}\n\n// IE needs explicit global scoping for functions called by browser events\nwindow.onClickNewDocument=function(e)\n{\n if (!e) var e = window.event;\n\n // get the TiddlyWiki core code source\n var sourcefile=getLocalPath(document.location.toString());\n var source=loadFile(sourcefile);\n if(source==null) { alert(config.messages.cantSaveError); return null; }\n var posOpeningDiv=source.indexOf(startSaveArea);\n var posClosingDiv=source.lastIndexOf(endSaveArea);\n if((posOpeningDiv==-1)||(posClosingDiv==-1)) { alert(config.messages.invalidFileError.format([sourcefile])); return; }\n\n // get output path/filename\n var newfile=resolveTarget(e).newfile;\n if (newfile=="ask") newfile=prompt(config.macros.newDocument.fileprompt, config.macros.newDocument.newfile);\n if (!newfile) return; // cancelled by user\n // if specified file does not include a path, assemble fully qualified path and filename\n var slashpos=newfile.lastIndexOf("/"); if (slashpos==-1) slashpos=newfile.lastIndexOf("\s\s");\n if (slashpos==-1) {\n var path=getLocalPath(document.location.toString());\n var slashpos=path.lastIndexOf("/"); if (slashpos==-1) slashpos=path.lastIndexOf("\s\s"); \n if (slashpos!=-1) path = path.substr(0,slashpos); // remove filename from path\n newfile=path+(config.browser.isWindows?"\s\s":"/")+newfile;\n }\n\n // get the tiddler divs\n var match=resolveTarget(e).newtag;\n if (match=="ask")\n match=prompt(config.macros.newDocument.tagprompt,config.macros.newDocument.newtag);\n if (!match) return; // cancelled by user\n var storeAreaDivs=[];\n var tiddlers=store.getTiddlers('title');\n for (var i=0; i<tiddlers.length; i++)\n if (matchTags(tiddlers[i],match))\n storeAreaDivs.push(tiddlers[i].saveToDiv());\n\n // construct and write the file output\n var out=source.substr(0,posOpeningDiv+startSaveArea.length)+storeAreaDivs.join("\sn")+"\sn\st\st"+source.substr(posClosingDiv);\n if (saveFile(newfile,out))\n var msg=config.macros.newDocument.okmsg.format([storeAreaDivs.length,newfile]);\n else\n var msg=config.macros.newDocument.failmsg.format([newfile]);\n clearMessage(); displayMessage(msg);\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n//}}}\n\n//{{{\nif (!window.matchTags) window.matchTags=function(tiddler,cond)\n{\n if (!cond||!cond.trim().length) return false;\n\n // build a regex of all tags as a big-old regex that \n // OR's the tags together (tag1|tag2|tag3...) in length order\n var tgs = store.getTags();\n if ( tgs.length == 0 ) return results ;\n tags = tgs.sort( function(a,b){return (a[0].length<b[0].length)-(a[0].length>b[0].length);});\n var exp = "(" + tags.join("|") + ")" ;\n exp = exp.replace( /(,[\sd]+)/g, "" ) ;\n var regex = new RegExp( exp, "ig" );\n\n // build a string such that an expression that looks like this: tag1 AND tag2 OR NOT tag3\n // turns into : /tag1/.test(...) && /tag2/.test(...) || ! /tag2/.test(...)\n cond = cond.replace( regex, "/$1\s\s|/.test(tiddlerTags)" );\n cond = cond.replace( /\ssand\ss/ig, " && " ) ;\n cond = cond.replace( /\ssor\ss/ig, " || " ) ;\n cond = cond.replace( /\ss?not\ss/ig, " ! " ) ;\n\n // if a boolean uses a tag that doesn't exist - it will get left alone \n // (we only turn existing tags into actual tests).\n // replace anything that wasn't found as a tag, AND, OR, or NOT with the string "false"\n // if the tag doesn't exist then /tag/.test(...) will always return false.\n cond = cond.replace( /(\ss|^)+[^\s/\s|&!][^\ss]*/g, "false" ) ;\n\n // make a string of the tags in the tiddler and eval the 'cond' string against that string \n // if it's TRUE then the tiddler qualifies!\n var tiddlerTags = (tiddler.tags?tiddler.tags.join("|"):"")+"|" ;\n try { if ( eval( cond ) ) return true; }\n catch( e ) { displayMessage(config.macros.newDocument.tagerrmsg.format([e])); }\n return false;\n}\n//}}}
# Ordered lists are pretty neat too\n# If you're handy with HTML and CSS you could customize the [[numbering scheme|http://www.w3schools.com/css/pr_list-style-type.asp]]\n## To nest, just add more octothorpes (pound signs)...\n### Like this\n* You can also\n** Mix list types\n*** like this\n# Pretty neat don't you think?\nHere's how it's done:\n{{{\n# Ordered lists are pretty neat too\n# If you're handy with HTML and CSS you could customize the [[numbering scheme|http://www.w3schools.com/css/pr_list-style-type.asp]]\n## To nest, just add more octothorpes (pound signs)...\n### Like this\n* You can also\n** Mix list types\n*** like this\n# Pretty neat don't you think?\n}}}\nTiddlyWiki uses Wiki style markup, a way of lightly "tagging" plain text so it can be transformed into HTML. Edit this Tiddler to see samples.
<div class='header' macro='gradient vert #000 #069'>\n <div class='headerShadow'>\n <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>\n <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n </div>\n <div class='headerForeground'>\n <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\n <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n </div>\n <div id='topMenu' refresh='content' tiddler='MainMenu'></div>\n</div>\n<div id='sidebar'>\n <div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\n <div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\n</div>\n<div id='displayArea'>\n <div id='messageArea'></div>\n <div id='tiddlerDisplay'></div>\n</div>\n
What a great way to store and manage personal notes and information! TiddlyWiki's editor is simple to use and easy to learn. You can use it to keep Contact Information, Notes, Thoughts, Todo lists, Ideas, etc. Once you start using TiddlyWiki, you will inevitably start thinking of new uses for it.\n*Try to keep to the MicroContent concept, and you should be OK.\n*Use the Tags feature to categorize your documentation. \n*Use the [[Plugin listTags]] macro feature to create Tag Listings.
function onClickDefaultHome(e) {\nstory.closeAllTiddlers();\nconfig.options.txtDefaultTiddlers = "";\nsaveOptionCookie('txtDefaultTiddlers');\nvar start = store.getTiddlerText("DefaultTiddlers");\nif(start)\nstory.displayTiddlers(null,start.readBracketedList());\n}\n\nconfig.macros["defaultHome"] = {label: "Home", prompt: "Show the default tiddlers", title: "Home"};\nconfig.macros.defaultHome.handler = function(place) {\ncreateTiddlyButton(place,this.label,this.prompt,onClickDefaultHome);\n\n}
/***\n|''Name:''|ForEachTiddlerPlugin|\n|''Version:''|1.0.5 (2006-02-05)|\n|''Source:''|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin|\n|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|\n|''Licence:''|[[BSD open source license]]|\n|''Macros:''|[[ForEachTiddlerMacro]] v1.0.5|\n|''TiddlyWiki:''|1.2.38+, 2.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n!Description\n\nCreate customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.\n\n''Syntax:'' \n|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|\n|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|\n|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|\n|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|\n|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|\n|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]] is used.|\n|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|\n|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|\n\nSee details see [[ForEachTiddlerMacro]] and [[ForEachTiddlerExamples]].\n\n!Revision history\n* v1.0.5\n** Pass tiddler containing the macro with wikify, context object also holds reference to tiddler containing the macro ("inTiddler"). Thanks to SimonBaird.\n** Support Firefox\n** Internal\n*** Make "JSLint" conform\n*** "Only install once"\n* v1.0.4 (2006-01-06)\n** Support TiddlyWiki 2.0\n* v1.0.3 (2005-12-22)\n** Features: \n*** Write output to a file supports multi-byte environments (Thanks to Bram Chen) \n*** Provide API to access the forEachTiddler functionality directly through JavaScript (see getTiddlers and performMacro)\n** Enhancements:\n*** Improved error messages on InternetExplorer.\n* v1.0.2 (2005-12-10)\n** Features: \n*** context object also holds reference to store (TiddlyWiki)\n** Fixed Bugs: \n*** ForEachTiddler 1.0.1 has broken support on win32 Opera 8.51 (Thanks to BrunoSabin for reporting)\n* v1.0.1 (2005-12-08)\n** Features: \n*** Access tiddlers stored in separated TiddlyWikis through the "in" option. I.e. you are no longer limited to only work on the "current TiddlyWiki".\n*** Write output to an external file using the "toFile" option of the "write" action. With this option you may write your customized tiddler exports.\n*** Use the "script" section to define "helper" JavaScript functions etc. to be used in the various JavaScript expressions (whereClause, sortClause, action arguments,...).\n*** Access and store context information for the current forEachTiddler invocation (through the build-in "context" object) .\n*** Improved script evaluation (for where/sort clause and write scripts).\n* v1.0.0 (2005-11-20)\n** initial version\n\n!Code\n***/\n//{{{\n\n \n//============================================================================\n//============================================================================\n// ForEachTiddlerPlugin\n//============================================================================\n//============================================================================\n\n// Only install once\nif (!version.extensions.ForEachTiddlerPlugin) {\n\nversion.extensions.ForEachTiddlerPlugin = {major: 1, minor: 0, revision: 5, date: new Date(2006,2,5), source: "http://tiddlywiki.abego-software.de/#ForEachTiddlergPlugin"};\n\n// For backward compatibility with TW 1.2.x\n//\nif (!TiddlyWiki.prototype.forEachTiddler) {\n TiddlyWiki.prototype.forEachTiddler = function(callback) {\n for(var t in this.tiddlers) {\n callback.call(this,t,this.tiddlers[t]);\n }\n };\n}\n\n//============================================================================\n// forEachTiddler Macro\n//============================================================================\n\nversion.extensions.forEachTiddler = {major: 1, minor: 0, revision: 5, date: new Date(2006,2,5), provider: "http://tiddlywiki.abego-software.de"};\n\n// ---------------------------------------------------------------------------\n// Configurations and constants \n// ---------------------------------------------------------------------------\n\nconfig.macros.forEachTiddler = {\n // Standard Properties\n label: "forEachTiddler",\n prompt: "Perform actions on a (sorted) selection of tiddlers",\n\n // actions\n actions: {\n addToList: {},\n write: {}\n }\n};\n\n// ---------------------------------------------------------------------------\n// The forEachTiddler Macro Handler \n// ---------------------------------------------------------------------------\n\nconfig.macros.forEachTiddler.getContainingTiddler = function(e) {\n while(e && !hasClass(e,"tiddler"))\n e = e.parentNode;\n var title = e ? e.getAttribute("tiddler") : null; \n return title ? store.getTiddler(title) : null;\n};\n\nconfig.macros.forEachTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {\n // config.macros.forEachTiddler.traceMacroCall(place,macroName,params,wikifier,paramString,tiddler);\n\n if (!tiddler) tiddler = config.macros.forEachTiddler.getContainingTiddler(place);\n // --- Parsing ------------------------------------------\n\n var i = 0; // index running over the params\n // Parse the "in" clause\n var tiddlyWikiPath = undefined;\n if ((i < params.length) && params[i] == "in") {\n i++;\n if (i >= params.length) {\n this.handleError(place, "TiddlyWiki path expected behind 'in'.");\n return;\n }\n tiddlyWikiPath = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the where clause\n var whereClause ="true";\n if ((i < params.length) && params[i] == "where") {\n i++;\n whereClause = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the sort stuff\n var sortClause = null;\n var sortAscending = true; \n if ((i < params.length) && params[i] == "sortBy") {\n i++;\n if (i >= params.length) {\n this.handleError(place, "sortClause missing behind 'sortBy'.");\n return;\n }\n sortClause = this.paramEncode(params[i]);\n i++;\n\n if ((i < params.length) && (params[i] == "ascending" || params[i] == "descending")) {\n sortAscending = params[i] == "ascending";\n i++;\n }\n }\n\n // Parse the script\n var scriptText = null;\n if ((i < params.length) && params[i] == "script") {\n i++;\n scriptText = this.paramEncode((i < params.length) ? params[i] : "");\n i++;\n }\n\n // Parse the action. \n // When we are already at the end use the default action\n var actionName = "addToList";\n if (i < params.length) {\n if (!config.macros.forEachTiddler.actions[params[i]]) {\n this.handleError(place, "Unknown action '"+params[i]+"'.");\n return;\n } else {\n actionName = params[i]; \n i++;\n }\n } \n \n // Get the action parameter\n // (the parsing is done inside the individual action implementation.)\n var actionParameter = params.slice(i);\n\n\n // --- Processing ------------------------------------------\n try {\n this.performMacro({\n place: place, \n inTiddler: tiddler,\n whereClause: whereClause, \n sortClause: sortClause, \n sortAscending: sortAscending, \n actionName: actionName, \n actionParameter: actionParameter, \n scriptText: scriptText, \n tiddlyWikiPath: tiddlyWikiPath});\n\n } catch (e) {\n this.handleError(place, e);\n }\n};\n\n// Returns an object with properties "tiddlers" and "context".\n// tiddlers holds the (sorted) tiddlers selected by the parameter,\n// context the context of the execution of the macro.\n//\n// The action is not yet performed.\n//\n// @parameter see performMacro\n//\nconfig.macros.forEachTiddler.getTiddlersAndContext = function(parameter) {\n\n var context = config.macros.forEachTiddler.createContext(parameter.place, parameter.whereClause, parameter.sortClause, parameter.sortAscending, parameter.actionName, parameter.actionParameter, parameter.scriptText, parameter.tiddlyWikiPath, parameter.inTiddler);\n\n var tiddlyWiki = parameter.tiddlyWikiPath ? this.loadTiddlyWiki(parameter.tiddlyWikiPath) : store;\n context["tiddlyWiki"] = tiddlyWiki;\n \n // Get the tiddlers, as defined by the whereClause\n var tiddlers = this.findTiddlers(parameter.whereClause, context, tiddlyWiki);\n context["tiddlers"] = tiddlers;\n\n // Sort the tiddlers, when sorting is required.\n if (parameter.sortClause) {\n this.sortTiddlers(tiddlers, parameter.sortClause, parameter.sortAscending, context);\n }\n\n return {tiddlers: tiddlers, context: context};\n};\n\n// Returns the (sorted) tiddlers selected by the parameter.\n//\n// The action is not yet performed.\n//\n// @parameter see performMacro\n//\nconfig.macros.forEachTiddler.getTiddlers = function(parameter) {\n return this.getTiddlersAndContext(parameter).tiddlers;\n};\n\n// Performs the macros with the given parameter.\n//\n// @param parameter holds the parameter of the macro as separate properties.\n// The following properties are supported:\n//\n// place\n// whereClause\n// sortClause\n// sortAscending\n// actionName\n// actionParameter\n// scriptText\n// tiddlyWikiPath\n//\n// All properties are optional. \n// For most actions the place property must be defined.\n//\nconfig.macros.forEachTiddler.performMacro = function(parameter) {\n var tiddlersAndContext = this.getTiddlersAndContext(parameter);\n\n // Perform the action\n var actionName = parameter.actionName ? parameter.actionName : "addToList";\n var action = config.macros.forEachTiddler.actions[actionName];\n if (!action) {\n this.handleError(parameter.place, "Unknown action '"+actionName+"'.");\n return;\n }\n\n var actionHandler = action.handler;\n actionHandler(parameter.place, tiddlersAndContext.tiddlers, parameter.actionParameter, tiddlersAndContext.context);\n};\n\n// ---------------------------------------------------------------------------\n// The actions \n// ---------------------------------------------------------------------------\n\n// Internal.\n//\n// --- The addToList Action -----------------------------------------------\n//\nconfig.macros.forEachTiddler.actions.addToList.handler = function(place, tiddlers, parameter, context) {\n // Parse the parameter\n var p = 0;\n\n // Check for extra parameters\n if (parameter.length > p) {\n config.macros.forEachTiddler.createExtraParameterErrorElement(place, "addToList", parameter, p);\n return;\n }\n\n // Perform the action.\n var list = document.createElement("ul");\n place.appendChild(list);\n for (var i = 0; i < tiddlers.length; i++) {\n var tiddler = tiddlers[i];\n var listItem = document.createElement("li");\n list.appendChild(listItem);\n createTiddlyLink(listItem, tiddler.title, true);\n }\n};\n\n// Internal.\n//\n// --- The write Action ---------------------------------------------------\n//\nconfig.macros.forEachTiddler.actions.write.handler = function(place, tiddlers, parameter, context) {\n // Parse the parameter\n var p = 0;\n if (p >= parameter.length) {\n this.handleError(place, "Missing expression behind 'write'.");\n return;\n }\n\n var textExpression = config.macros.forEachTiddler.paramEncode(parameter[p]);\n p++;\n\n // Parse the "toFile" option\n var filename = null;\n var lineSeparator = undefined;\n if ((p < parameter.length) && parameter[p] == "toFile") {\n p++;\n if (p >= parameter.length) {\n this.handleError(place, "Filename expected behind 'toFile' of 'write' action.");\n return;\n }\n \n filename = config.macros.forEachTiddler.getLocalPath(config.macros.forEachTiddler.paramEncode(parameter[p]));\n p++;\n if ((p < parameter.length) && parameter[p] == "withLineSeparator") {\n p++;\n if (p >= parameter.length) {\n this.handleError(place, "Line separator text expected behind 'withLineSeparator' of 'write' action.");\n return;\n }\n lineSeparator = config.macros.forEachTiddler.paramEncode(parameter[p]);\n p++;\n }\n }\n \n // Check for extra parameters\n if (parameter.length > p) {\n config.macros.forEachTiddler.createExtraParameterErrorElement(place, "write", parameter, p);\n return;\n }\n\n // Perform the action.\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(textExpression, context);\n var count = tiddlers.length;\n var text = "";\n for (var i = 0; i < count; i++) {\n var tiddler = tiddlers[i];\n text += func(tiddler, context, count, i);\n }\n \n if (filename) {\n if (lineSeparator !== undefined) {\n lineSeparator = lineSeparator.replace(/\s\sn/mg, "\sn").replace(/\s\sr/mg, "\sr");\n text = text.replace(/\sn/mg,lineSeparator);\n }\n saveFile(filename, convertUnicodeToUTF8(text));\n } else {\n var wrapper = createTiddlyElement(place, "span");\n wikify(text, wrapper, null/* highlightRegExp */, context.inTiddler);\n }\n};\n\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n// Internal.\n//\nconfig.macros.forEachTiddler.createContext = function(placeParam, whereClauseParam, sortClauseParam, sortAscendingParam, actionNameParam, actionParameterParam, scriptText, tiddlyWikiPathParam, inTiddlerParam) {\n return {\n place : placeParam, \n whereClause : whereClauseParam, \n sortClause : sortClauseParam, \n sortAscending : sortAscendingParam, \n script : scriptText,\n actionName : actionNameParam, \n actionParameter : actionParameterParam,\n tiddlyWikiPath : tiddlyWikiPathParam,\n inTiddler : inTiddlerParam\n };\n};\n\n// Internal.\n//\n// Returns a TiddlyWiki with the tiddlers loaded from the TiddlyWiki of \n// the given path.\n//\nconfig.macros.forEachTiddler.loadTiddlyWiki = function(path, idPrefix) {\n if (!idPrefix) {\n idPrefix = "store";\n }\n var lenPrefix = idPrefix.length;\n \n // Read the content of the given file\n var content = loadFile(this.getLocalPath(path));\n if(content === null) {\n throw "TiddlyWiki '"+path+"' not found.";\n }\n \n // Locate the storeArea div's\n var posOpeningDiv = content.indexOf(startSaveArea);\n var posClosingDiv = content.lastIndexOf(endSaveArea);\n if((posOpeningDiv == -1) || (posClosingDiv == -1)) {\n throw "File '"+path+"' is not a TiddlyWiki.";\n }\n var storageText = content.substr(posOpeningDiv + startSaveArea.length, posClosingDiv);\n \n // Create a "div" element that contains the storage text\n var myStorageDiv = document.createElement("div");\n myStorageDiv.innerHTML = storageText;\n myStorageDiv.normalize();\n \n // Create all tiddlers in a new TiddlyWiki\n // (following code is modified copy of TiddlyWiki.prototype.loadFromDiv)\n var tiddlyWiki = new TiddlyWiki();\n var store = myStorageDiv.childNodes;\n for(var t = 0; t < store.length; t++) {\n var e = store[t];\n var title = null;\n if(e.getAttribute)\n title = e.getAttribute("tiddler");\n if(!title && e.id && e.id.substr(0,lenPrefix) == idPrefix)\n title = e.id.substr(lenPrefix);\n if(title && title !== "") {\n var tiddler = tiddlyWiki.createTiddler(title);\n tiddler.loadFromDiv(e,title);\n }\n }\n tiddlyWiki.dirty = false;\n\n return tiddlyWiki;\n};\n\n\n \n// Internal.\n//\n// Returns a function that has a function body returning the given javaScriptExpression.\n// The function has the parameters:\n// \n// (tiddler, context, count, index)\n//\nconfig.macros.forEachTiddler.getEvalTiddlerFunction = function (javaScriptExpression, context) {\n var script = context["script"];\n var functionText = "var theFunction = function(tiddler, context, count, index) { return "+javaScriptExpression+"}";\n var fullText = (script ? script+";" : "")+functionText+";theFunction;";\n return eval(fullText);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.findTiddlers = function(whereClause, context, tiddlyWiki) {\n var result = [];\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(whereClause, context);\n tiddlyWiki.forEachTiddler(function(title,tiddler) {\n if (func(tiddler, context, undefined, undefined)) {\n result.push(tiddler);\n }\n });\n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.createExtraParameterErrorElement = function(place, actionName, parameter, firstUnusedIndex) {\n var message = "Extra parameter behind '"+actionName+"':";\n for (var i = firstUnusedIndex; i < parameter.length; i++) {\n message += " "+parameter[i];\n }\n this.handleError(place, message);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortAscending = function(tiddlerA, tiddlerB) {\n var result = \n (tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) \n ? 0\n : (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)\n ? -1 \n : +1; \n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortDescending = function(tiddlerA, tiddlerB) {\n var result = \n (tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) \n ? 0\n : (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)\n ? +1 \n : -1; \n return result;\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.sortTiddlers = function(tiddlers, sortClause, ascending, context) {\n // To avoid evaluating the sortClause whenever two items are compared \n // we pre-calculate the sortValue for every item in the array and store it in a \n // temporary property ("forEachTiddlerSortValue") of the tiddlers.\n var func = config.macros.forEachTiddler.getEvalTiddlerFunction(sortClause, context);\n var count = tiddlers.length;\n var i;\n for (i = 0; i < count; i++) {\n var tiddler = tiddlers[i];\n tiddler.forEachTiddlerSortValue = func(tiddler,context, undefined, undefined);\n }\n\n // Do the sorting\n tiddlers.sort(ascending ? this.sortAscending : this.sortDescending);\n\n // Delete the temporary property that holds the sortValue. \n for (i = 0; i < tiddlers.length; i++) {\n delete tiddlers[i].forEachTiddlerSortValue;\n }\n};\n\n\n// Internal.\n//\nconfig.macros.forEachTiddler.trace = function(message) {\n displayMessage(message);\n};\n\n// Internal.\n//\nconfig.macros.forEachTiddler.traceMacroCall = function(place,macroName,params) {\n var message ="<<"+macroName;\n for (var i = 0; i < params.length; i++) {\n message += " "+params[i];\n }\n message += ">>";\n displayMessage(message);\n};\n\n\n// Internal.\n//\n// Creates an element that holds an error message\n// \nconfig.macros.forEachTiddler.createErrorElement = function(place, exception) {\n var message = (exception.description) ? exception.description : exception.toString();\n return createTiddlyElement(place,"span",null,"forEachTiddlerError","<<forEachTiddler ...>>: "+message);\n};\n\n// Internal.\n//\n// @param place [may be null]\n//\nconfig.macros.forEachTiddler.handleError = function(place, exception) {\n if (place) {\n this.createErrorElement(place, exception);\n } else {\n throw exception;\n }\n};\n\n// Internal.\n//\n// Encodes the given string.\n//\n// Replaces \n// "$))" to ">>"\n// "$)" to ">"\n//\nconfig.macros.forEachTiddler.paramEncode = function(s) {\n var reGTGT = new RegExp("\s\s$\s\s)\s\s)","mg");\n var reGT = new RegExp("\s\s$\s\s)","mg");\n return s.replace(reGTGT, ">>").replace(reGT, ">");\n};\n\n// Internal.\n//\n// Returns the given original path (that is a file path, starting with "file:")\n// as a path to a local file, in the systems native file format.\n//\n// Location information in the originalPath (i.e. the "#" and stuff following)\n// is stripped.\n// \nconfig.macros.forEachTiddler.getLocalPath = function(originalPath) {\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// Stylesheet Extensions (may be overridden by local StyleSheet)\n// ---------------------------------------------------------------------------\n//\nsetStylesheet(\n ".forEachTiddlerError{color: #ffffff;background-color: #880000;}",\n "forEachTiddler");\n\n//============================================================================\n// End of forEachTiddler Macro\n//============================================================================\n\n\n//============================================================================\n// String.startsWith Function\n//============================================================================\n//\n// Returns true if the string starts with the given prefix, false otherwise.\n//\nversion.extensions["String.startsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.startsWith = function(prefix) {\n var n = prefix.length;\n return (this.length >= n) && (this.slice(0, n) == prefix);\n};\n\n\n\n//============================================================================\n// String.endsWith Function\n//============================================================================\n//\n// Returns true if the string ends with the given suffix, false otherwise.\n//\nversion.extensions["String.endsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.endsWith = function(suffix) {\n var n = suffix.length;\n return (this.length >= n) && (this.right(n) == suffix);\n};\n\n\n//============================================================================\n// String.contains Function\n//============================================================================\n//\n// Returns true when the string contains the given substring, false otherwise.\n//\nversion.extensions["String.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nString.prototype.contains = function(substring) {\n return this.indexOf(substring) >= 0;\n};\n\n//============================================================================\n// Array.indexOf Function\n//============================================================================\n//\n// Returns the index of the first occurance of the given item in the array or \n// -1 when no such item exists.\n//\n// @param item [may be null]\n//\nversion.extensions["Array.indexOf"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.indexOf = function(item) {\n for (var i = 0; i < this.length; i++) {\n if (this[i] == item) {\n return i;\n }\n }\n return -1;\n};\n\n//============================================================================\n// Array.contains Function\n//============================================================================\n//\n// Returns true when the array contains the given item, otherwise false. \n//\n// @param item [may be null]\n//\nversion.extensions["Array.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.contains = function(item) {\n return (this.indexOf(item) >= 0);\n};\n\n//============================================================================\n// Array.containsAny Function\n//============================================================================\n//\n// Returns true when the array contains at least one of the elements \n// of the item. Otherwise (or when items contains no elements) false is returned.\n//\nversion.extensions["Array.containsAny"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.containsAny = function(items) {\n for(var i = 0; i < items.length; i++) {\n if (this.contains(items[i])) {\n return true;\n }\n }\n return false;\n};\n\n\n//============================================================================\n// Array.containsAll Function\n//============================================================================\n//\n// Returns true when the array contains all the items, otherwise false.\n// \n// When items is null false is returned (even if the array contains a null).\n//\n// @param items [may be null] \n//\nversion.extensions["Array.containsAll"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};\n//\nArray.prototype.containsAll = function(items) {\n for(var i = 0; i < items.length; i++) {\n if (!this.contains(items[i])) {\n return false;\n }\n }\n return true;\n};\n\n\n} // of "install only once"\n\n// Used Globals (for JSLint) ==============\n// ... DOM\n/*global document */\n// ... TiddlyWiki Core\n/*global convertUnicodeToUTF8, createTiddlyElement, createTiddlyLink, \n displayMessage, endSaveArea, hasClass, loadFile, saveFile, \n startSaveArea, store, wikify */\n//}}}\n\n\n/***\n!Licence and Copyright\nCopyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this\nlist of conditions and the following disclaimer in the documentation and/or other\nmaterials provided with the distribution.\n\nNeither the name of abego Software nor the names of its contributors may be\nused to endorse or promote products derived from this software without specific\nprior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\nSHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\nBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\nANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.\n***/\n\n
/***\n|Name|HoverMenuPlugin|\n|Created by|SaqImtiaz|\n|Location|http://lewcid.googlepages.com/lewcid.html#HoverMenuPlugin|\n|Version|1.11|\n|Requires|~TW2.x|\n!Description:\nProvides a hovering menu on the edge of the screen for commonly used commands, that scrolls with the page.\n\n!Demo:\nObserve the hovering menu on the right edge of the screen.\n\n!Installation:\nCopy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.\nTo customize your HoverMenu, edit the HoverMenu shadow tiddler.\n\nTo customize whether the menu sticks to the right or left edge of the screen, and its start position, edit the HoverMenu configuration settings part of the code below. It's well documented, so don't be scared!\n\nThe menu has an id of hoverMenu, in case you want to style the buttons in it using css.\n\n!Notes:\nSince the default HoverMenu contains buttons for toggling the side bar and jumping to the top of the screen and to open tiddlers, the ToggleSideBarMacro, JumpMacro and the JumpToTopMacro are included in this tiddler, so you dont need to install them separately. Having them installed separately as well could lead to complications.\n\nIf you dont intend to use these three macros at all, feel free to remove those sections of code in this tiddler.\n\n!To Do:\n* rework code to allow multiple hovering menus in different positions, horizontal etc.\n* incorporate code for keyboard shortcuts that correspond to the buttons in the hovermenu\n\n!History:\n*03-08-06, ver 1.11: fixed error with button tooltips\n*27-07-06, ver 1.1 : added JumpMacro to hoverMenu\n*23-07-06\n\n!Code\n***/\n\n/***\nstart HoverMenu plugin code\n***/\n//{{{\nconfig.hoverMenu={};\n//}}}\n\n/***\nHoverMenu configuration settings\n***/\n//{{{\nconfig.hoverMenu.settings={\n align: 'right', //align menu to right or left side of screen, possible values are 'right' and 'left' \n x: 1, // horizontal distance of menu from side of screen, increase to your liking.\n y: 158 //vertical distance of menu from top of screen at start, increase or decrease to your liking\n };\n//}}}\n\n//{{{\n//continue HoverMenu plugin code\nconfig.hoverMenu.handler=function()\n{\n var theMenu = createTiddlyElement(document.getElementById("contentWrapper"), "div","hoverMenu");\n theMenu.setAttribute("refresh","content");\n theMenu.setAttribute("tiddler","HoverMenu");\n var menuContent = store.getTiddlerText("HoverMenu");\n wikify(menuContent,theMenu);\n\n var Xloc = this.settings.x;\n Yloc =this.settings.y;\n var ns = (navigator.appName.indexOf("Netscape") != -1);\n function SetMenu(id)\n {\n var GetElements=document.getElementById?document.getElementById(id):document.all?document.all[id]:document.layers[id];\n if(document.layers)GetElements.style=GetElements;\n GetElements.sP=function(x,y){this.style[config.hoverMenu.settings.align]=x +"px";this.style.top=y +"px";};\n GetElements.x = Xloc;\n GetElements.y = findScrollY();\n GetElements.y += Yloc;\n return GetElements;\n }\n window.LoCate_XY=function()\n {\n var pY = findScrollY();\n ftlObj.y += (pY + Yloc - ftlObj.y)/15;\n ftlObj.sP(ftlObj.x, ftlObj.y);\n setTimeout("LoCate_XY()", 10);\n }\n ftlObj = SetMenu("hoverMenu");\n LoCate_XY();\n};\n\nwindow.old_lewcid_hovermenu_restart = restart;\nrestart = function()\n{\n window.old_lewcid_hovermenu_restart();\n config.hoverMenu.handler();\n};\n\nsetStylesheet(\n"#hoverMenu .button, #hoverMenu .tiddlyLink {border:none; font-weight:bold; background:#18f; color:#FFF; padding:0 5px; float:right; margin-bottom:4px;}\sn"+\n"#hoverMenu .button:hover, #hoverMenu .tiddlyLink:hover {font-weight:bold; border:none; color:#fff; background:#000; padding:0 5px; float:right; margin-bottom:4px;}\sn"+\n"#hoverMenu .button {width:100%; text-align:center}"+\n"#hoverMenu { position:absolute; width:7px;}\sn"+\n"\sn","hoverMenuStyles");\n\n\nconfig.macros.renameButton={};\nconfig.macros.renameButton.handler = function(place,macroName,params,wikifier,paramString,tiddler)\n{\n\n if (place.lastChild.tagName!="BR")\n {\n place.lastChild.firstChild.data = params[0];\n if (params[1]) {place.lastChild.title = params[1];}\n }\n};\n\nconfig.shadowTiddlers["HoverMenu"]="<<top>>\sn<<toggleSideBar>><<renameButton '>' >>\sn<<jump j '' top>>\sn<<saveChanges>><<renameButton s 'Save TiddlyWiki'>>\sn<<newTiddler>><<renameButton n>>\sn";\n//}}}\n//end HoverMenu plugin code\n\n//Start ToggleSideBarMacro code\n//{{{\nconfig.macros.toggleSideBar={};\n\nconfig.macros.toggleSideBar.settings={\n styleHide : "#sidebar { display: none;}\sn"+"#contentWrapper #displayArea { margin-right: 1em;}\sn"+"",\n styleShow : " ",\n arrow1: "«",\n arrow2: "»"\n};\n\nconfig.macros.toggleSideBar.handler=function (place,macroName,params,wikifier,paramString,tiddler)\n{\n var tooltip= params[1]||'toggle sidebar';\n var mode = (params[2] && params[2]=="hide")? "hide":"show";\n var arrow = (mode == "hide")? this.settings.arrow1:this.settings.arrow2;\n var label= (params[0]&&params[0]!='.')?params[0]+" "+arrow:arrow;\n var theBtn = createTiddlyButton(place,label,tooltip,this.onToggleSideBar,"button HideSideBarButton");\n if (mode == "hide")\n { \n (document.getElementById("sidebar")).setAttribute("toggle","hide");\n setStylesheet(this.settings.styleHide,"ToggleSideBarStyles");\n }\n};\n\nconfig.macros.toggleSideBar.onToggleSideBar = function(){\n var sidebar = document.getElementById("sidebar");\n var settings = config.macros.toggleSideBar.settings;\n if (sidebar.getAttribute("toggle")=='hide')\n {\n setStylesheet(settings.styleShow,"ToggleSideBarStyles");\n sidebar.setAttribute("toggle","show");\n this.firstChild.data= (this.firstChild.data).replace(settings.arrow1,settings.arrow2);\n }\n else\n { \n setStylesheet(settings.styleHide,"ToggleSideBarStyles");\n sidebar.setAttribute("toggle","hide");\n this.firstChild.data= (this.firstChild.data).replace(settings.arrow2,settings.arrow1);\n }\n\n return false;\n}\n\nsetStylesheet(".HideSideBarButton .button {font-weight:bold; padding: 0 5px;}\sn","ToggleSideBarButtonStyles");\n//}}}\n//end ToggleSideBarMacro code\n\n//start JumpToTopMacro code\n//{{{\nconfig.macros.top={};\nconfig.macros.top.handler=function(place,macroName)\n{\n createTiddlyButton(place,"^","jump to top",this.onclick);\n}\nconfig.macros.top.onclick=function()\n{\n window.scrollTo(0,0);\n};\n\nconfig.commands.top =\n{\n text:" ^ ",\n tooltip:"jump to top"\n};\n\nconfig.commands.top.handler = function(event,src,title)\n{\n window.scrollTo(0,0);\n}\n//}}}\n//end JumpToStartMacro code\n\n//start JumpMacro code\n//{{{\nconfig.macros.jump= {};\nconfig.macros.jump.handler = function (place,macroName,params,wikifier,paramString,tiddler)\n{\n var label = (params[0] && params[0]!=".")? params[0]: 'jump';\n var tooltip = (params[1] && params[1]!=".")? params[1]: 'jump to an open tiddler';\n var top = (params[2] && params[2]=='top') ? true: false; \n\n var btn =createTiddlyButton(place,label,tooltip,this.onclick);\n if (top==true)\n btn.setAttribute("top","true")\n}\n\nconfig.macros.jump.onclick = function(e)\n{\n if (!e) var e = window.event;\n var theTarget = resolveTarget(e);\n var top = theTarget.getAttribute("top");\n var popup = Popup.create(this);\n if(popup)\n {\n if(top=="true")\n {createTiddlyButton(createTiddlyElement(popup,"li"),'Top ↑','Top of TW',config.macros.jump.top);\n createTiddlyElement(popup,"hr");}\n \n story.forEachTiddler(function(title,element) {\n createTiddlyLink(createTiddlyElement(popup,"li"),title,true);\n });\n }\n Popup.show(popup,false);\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return false;\n}\n\nconfig.macros.jump.top = function()\n{\n window.scrollTo(0,0);\n}\n//}}}\n//end JumpMacro code\n\n//utility functions\n//{{{\nPopup.show = function(unused,slowly)\n{\n var curr = Popup.stack[Popup.stack.length-1];\n var rootLeft = findPosX(curr.root);\n var rootTop = findPosY(curr.root);\n var rootHeight = curr.root.offsetHeight;\n var popupLeft = rootLeft;\n var popupTop = rootTop + rootHeight;\n var popupWidth = curr.popup.offsetWidth;\n var winWidth = findWindowWidth();\n if (isChild(curr.root,'hoverMenu'))\n var x = config.hoverMenu.settings.x;\n else\n var x = 0;\n if(popupLeft + popupWidth+x > winWidth)\n popupLeft = winWidth - popupWidth -x;\n if (isChild(curr.root,'hoverMenu'))\n {curr.popup.style.right = x + "px";}\n else\n curr.popup.style.left = popupLeft + "px";\n curr.popup.style.top = popupTop + "px";\n curr.popup.style.display = "block";\n addClass(curr.root,"highlight");\n if(config.options.chkAnimate)\n anim.startAnimating(new Scroller(curr.popup,slowly));\n else\n window.scrollTo(0,ensureVisible(curr.popup));\n}\n\nwindow.isChild = function(e,parentId) {\n while (e != null) {\n var parent = document.getElementById(parentId);\n if (parent == e) return true;\n e = e.parentNode;\n }\n return false;\n};\n//}}}
/***\n''Import Tiddlers Plugin for TiddlyWiki version 1.2.x and 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#ImportTiddlersPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nWhen many people share and edit copies of the same TiddlyWiki document, the ability to quickly collect all these changes back into a single, updated document that can then be redistributed to the entire group is very important. This plugin lets you selectively combine tiddlers from any two TiddlyWiki documents. It can also be very useful when moving your own tiddlers from document to document (e.g., when upgrading to the latest version of TiddlyWiki, or 'pre-loading' your favorite stylesheets into a new 'empty' TiddlyWiki document.)\n\n!!!!!Inline interface (live)\n<<<\n<<importTiddlers inline>>\n<<<\n!!!!!Macro Syntax\n<<<\n{{{<<importTiddlers>>}}}\ncreates "import tiddlers" link. click to show/hide import control panel\n\n{{{<<importTiddlers inline>>}}}\ncreates import control panel directly in tiddler content\n\n{{{<<importTiddlers filter source quiet ask>>}}}\nnon-interactive 'automatic' import.\n''filter'' determines which tiddlers will be automatically selected for importing. Use one of the following keywords:\n>''"new"'' retrieves only tiddlers that are found in the import source document, but do not yet exist in the destination document\n>''"changes"'' retrieves only tiddlers that exist in both documents for which the import source tiddler is newer than the existing tiddler\n>''"updates"'' retrieves both ''new'' and ''changed'' tiddlers (this is the default action when none is specified)\n>''"all"'' retrieves ALL tiddlers from the import source document, even if they have not been changed.\n''source'' is the location of the imported document. It can be either a local document or an URL:\n>filename is any local path/file, in whatever format your system requires\n>URL is any remote web location that starts with "http://" or "https://"\n''"quiet"'' (optional)\n>supresses all status message during the import processing (e.g., "opening local file...", "found NN tiddlers..." etc). Note that if ANY tiddlers are actualy imported, a final information message will still be displayed (along with the ImportedTiddlers report), even when 'quiet' is specified. This ensures that changes to your document cannot occur without any visible indication at all.\n''"ask"'' (optional)\n>adds interactive confirmation. A browser message box (OK/Cancel) is displayed for each tiddler that will be imported, so that you can manually bypass any tiddlers that you do not want to import.\n\n''Special tag values: importReplace and importPublic''\n\nBy adding these special tags to an existing tiddler, you can precisely control whether or not to allow updates to that tiddler as well as decide which tiddlers in your document can be automatically imported by others.\n*''For maximum safety, the default action is to prevent existing tiddlers from being unintentionally overwritten by incoming tiddlers.'' To allow an existing tiddler to be overwritten by an imported tiddler, you must tag the existing tiddler with ''<<tag importReplace>>''\n*''For maximum privacy, the default action for //outgoing// tiddlers is to NOT automatically share your tiddlers with others.'' To allow a tiddler in your document to be shared via auto-import actions by others, you must tag it with ''<<tag importPublic>>''\n//Note: these tags are only applied when using the auto-import processing. When using the interactive control panel, all tiddlers in the imported document are available in the listbox, regardless of their tag values.//\n<<<\n!!!!!Interactive Usage\n<<<\nWhen used interactively, a control panel is displayed consisting of an "import source document" filename input (text field plus a ''[Browse...]'' button), a listbox of available tiddlers, a "differences only" checkbox, an "add tags" input field and four push buttons: ''[open]'', ''[select all]'', ''[import]'' and ''[close]''.\n\nPress ''[browse]'' to select a TiddlyWiki document file to import. You can also type in the path/filename or a remote document URL (starting with http://)and press ''[open]''. //Note: There may be some delay to permit the browser time to access and load the document before updating the listbox with the titles of all tiddlers that are available to be imported.//\n\nSelect one or more titles from the listbox (hold CTRL or SHIFT while clicking to add/remove the highlight from individual list items). You can press ''[select all]'' to quickly highlight all tiddler titles in the list. Use the ''[-]'', ''[+]'', or ''[=]'' links to adjust the listbox size so you can view more (or less) tiddler titles at one time. When you have chosen the tiddlers you want to import and entered any extra tags, press ''[import]'' to begin copying them to the current TiddlyWiki document.\n\n''select: all, new, changes, or differences''\n\nYou can click on ''all'', ''new'', ''changes'', or ''differences'' to automatically select a subset of tiddlers from the list. This makes it very quick and easy to find and import just the updated tiddlers you are interested in:\n>''"all"'' selects ALL tiddlers from the import source document, even if they have not been changed.\n>''"new"'' selects only tiddlers that are found in the import source document, but do not yet exist in the destination document\n>''"changes"'' selects only tiddlers that exist in both documents but that are newer in the source document\n>''"differences"'' selects all new and existing tiddlers that are different from the destination document (even if destination tiddler is newer)\n\n''Import Tagging:''\n\nTiddlers that have been imported can be automatically tagged, so they will be easier to find later on, after they have been added to your document. New tags are entered into the "add tags" input field, and then //added// to the existing tags for each tiddler as it is imported.\n\n''Skip, Rename, Merge, or Replace:''\n\nWhen importing a tiddler whose title is identical to one that already exists, the import process pauses and the tiddler title is displayed in an input field, along with four push buttons: ''[skip]'', ''[rename]'', ''[merge]'' and ''[replace]''.\n\nTo bypass importing this tiddler, press ''[skip]''. To import the tiddler with a different name (so that both the tiddlers will exist when the import is done), enter a new title in the input field and then press ''[rename]''. Press ''[merge]'' to combine the content from both tiddlers into a single tiddler. Press ''[replace]'' to overwrite the existing tiddler with the imported one, discarding the previous tiddler content.\n\n//Note: if both the title ''and'' modification date/////time match, the imported tiddler is assumed to be identical to the existing one, and will be automatically skipped (i.e., not imported) without asking.//\n\n''Import Report History''\n\nWhen tiddlers are imported, a report is generated into ImportedTiddlers, indicating when the latest import was performed, the number of tiddlers successfully imported, from what location, and by whom. It also includes a list with the title, date and author of each tiddler that was imported.\n\nWhen the import process is completed, the ImportedTiddlers report is automatically displayed for your review. If more tiddlers are subsequently imported, a new report is //added// to ImportedTiddlers, above the previous report (i.e., at the top of the tiddler), so that a reverse-chronological history of imports is maintained.\n\nIf a cumulative record is not desired, the ImportedTiddlers report may be deleted at any time. A new ImportedTiddlers report will be created the next time tiddlers are imported.\n\nNote: You can prevent the ImportedTiddlers report from being generated for any given import activity by clearing the "create a report" checkbox before beginning the import processing.\n\n<<<\n!!!!!Installation\n<<<\ncopy/paste the following tiddlers into your document:\n''ImportTiddlersPlugin'' (tagged with <<tag systemConfig>>)\n\ncreate/edit ''SideBarOptions'': (sidebar menu items) \n^^Add "< < ImportTiddlers > >" macro^^\n\n''Quick Installation Tip #1:''\nIf you are using an unmodified version of TiddlyWiki (core release version <<version>>), you can get a new, empty TiddlyWiki with the Import Tiddlers plugin pre-installed (''[[download from here|TW+ImportExport.html]]''), and then simply import all your content from your old document into this new, empty document.\n<<<\n!!!!!Revision History\n<<<\n''2006.02.17 [2.6.0]''\nRemoved "differences only" listbox display mode, replaced with selection filter 'presets': all/new/changes/differences. Also fixed initialization handling for "add new tags" so that checkbox state is correctly tracked when panel is first displayed.\n''2006.02.16 [2.5.4]''\nadded checkbox options to control "import remote tags" and "keep existing tags" behavior, in addition to existing "add new tags" functionality.\n''2006.02.14 [2.5.3]''\nFF1501 corrected unintended global 't' (loop index) in importReport() and autoImportTiddlers()\n''2006.02.10 [2.5.2]''\ncorrected unintended global variable in importReport().\n''2006.02.05 [2.5.1]''\nmoved globals from window.* to config.macros.importTiddlers.* to avoid FireFox crash bug when referencing globals\n''2006.01.18 [2.5.0]''\nadded checkbox for "create a report". Default is to create/update the ImportedTiddlers report. Clear the checkbox to skip this step.\n''2006.01.15 [2.4.1]''\nadded "importPublic" tag and inverted default so that auto sharing is NOT done unless tagged with importPublic\n''2006.01.15 [2.4.0]''\nAdded support for tagging individual tiddlers with importSkip, importReplace, and/or importPrivate to control which tiddlers can be overwritten or shared with others when using auto-import macro syntax. Defaults are to SKIP overwriting existing tiddlers with imported tiddlers, and ALLOW your tiddlers to be auto-imported by others.\n''2006.01.15 [2.3.2]''\nAdded "ask" parameter to confirm each tiddler before importing (for use with auto-importing)\n''2006.01.15 [2.3.1]''\nStrip TW core scripts from import source content and load just the storeArea into the hidden IFRAME. Makes loading more efficient by reducing the document size and by preventing the import document from executing its TW initialization (including plugins). Seems to resolve the "Found 0 tiddlers" problem. Also, when importing local documents, use convertUTF8ToUnicode() to convert the file contents so support international characters sets.\n''2006.01.12 [2.3.0]''\nReorganized code to use callback function for loading import files to support event-driven I/O via an ASYNCHRONOUS XMLHttpRequest. Let's processing continue while waiting for remote hosts to respond to URL requests. Added non-interactive 'batch' macro mode, using parameters to specify which tiddlers to import, and from what document source. Improved error messages and diagnostics, plus an optional 'quiet' switch for batch mode to eliminate //most// feedback.\n''2006.01.11 [2.2.0]''\nAdded "[by tags]" to list of tiddlers, based on code submitted by BradleyMeck\n''2006.01.09 [2.1.1]''\nWhen a URL is typed in, and then the "open" button is pressed, it generates both an onChange event for the file input and a click event for open button. This results in multiple XMLHttpRequest()'s which seem to jam things up quite a bit. I removed the onChange handling for file input field. To open a file (local or URL), you must now explicitly press the "open" button in the control panel.\n''2006.01.08 [2.1.0]''\nIMPORT FROM ANYWHERE!!! re-write getImportedTiddlers() logic to either read a local file (using local I/O), OR... read a remote file, using a combination of XML and an iframe to permit cross-domain reading of DOM elements. Adapted from example code and techniques courtesy of Jonny LeRoy.\n''2006.01.06 [2.0.2]''\nWhen refreshing list contents, fixed check for tiddlerExists() when "show differences only" is selected, so that imported tiddlers that don't exist in the current file will be recognized as differences and included in the list.\n''2006.01.04 [2.0.1]''\nWhen "show differences only" is NOT checked, import all tiddlers that have been selected even when they have a matching title and date.\n''2005.12.27 [2.0.0]''\nUpdate for TW2.0\nDefer initial panel creation and only register a notification function when panel first is created\n''2005.12.22 [1.3.1]''\ntweak formatting in importReport() and add 'discard report' link to output\n''2005.12.03 [1.3.0]''\nDynamically create/remove importPanel as needed to ensure only one instance of interface elements exists, even if there are multiple instances of macro embedding. Also, dynamically create/recreate importFrame each time an external TW document is loaded for importation (reduces DOM overhead and ensures a 'fresh' frame for each document)\n''2005.11.29 [1.2.1]''\nfixed formatting of 'detail info' in importReport()\n''2005.11.11 [1.2.0]''\nadded 'inline' param to embed controls in a tiddler\n''2005.11.09 [1.1.0]''\nonly load HTML and CSS the first time the macro handler is called. Allows for redundant placement of the macro without creating multiple instances of controls with the same ID's.\n''2005.10.25 [1.0.5]''\nfixed typo in importReport() that prevented reports from being generated\n''2005.10.09 [1.0.4]''\ncombined documentation with plugin code instead of using separate tiddlers\n''2005.08.05 [1.0.3]''\nmoved CSS and HTML definitions into plugin code instead of using separate tiddlers\n''2005.07.27 [1.0.2]''\ncore update 1.2.29: custom overlayStyleSheet() replaced with new core setStylesheet()\n''2005.07.23 [1.0.1]''\nadded parameter checks and corrected addNotification() usage\n''2005.07.20 [1.0.0]''\nInitial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n\n// // Version\n//{{{\nversion.extensions.importTiddlers = {major: 2, minor: 6, revision: 0, date: new Date(2006,2,17)};\n//}}}\n\n// // 1.2.x compatibility\n//{{{\nif (!window.story) window.story=window;\nif (!store.getTiddler) store.getTiddler=function(title){return store.tiddlers[title]}\nif (!store.addTiddler) store.addTiddler=function(tiddler){store.tiddlers[tiddler.title]=tiddler}\nif (!store.deleteTiddler) store.deleteTiddler=function(title){delete store.tiddlers[title]}\n//}}}\n\n// // IE needs explicit global scoping for functions/vars called from browser events\n//{{{\nwindow.onClickImportButton=onClickImportButton;\nwindow.loadImportFile=loadImportFile;\nwindow.refreshImportList=refreshImportList;\n//}}}\n\n// // default cookie/option values\n//{{{\nif (!config.options.chkImportReport) config.options.chkImportReport=true;\n//}}}\n\n\n// // ''MACRO DEFINITION''\n\n//{{{\nconfig.macros.importTiddlers = { };\nconfig.macros.importTiddlers = {\n label: "import tiddlers",\n prompt: "Copy tiddlers from another document",\n countMsg: "%0 tiddlers selected for import",\n src: "", // path/filename or URL of document to import\n inbound: null, // hash-indexed array of tiddlers from other document\n newTags: "", // text of tags added to imported tiddlers\n addTags: true, // add new tags to imported tiddlers\n listsize: 8, // # of lines to show in imported tiddler list\n importTags: true, // include tags from remote source document when importing a tiddler\n keepTags: true, // retain existing tags when replacing a tiddler\n index: 0, // current processing index in import list\n sort: "" // sort order for imported tiddler listbox\n};\n\nconfig.macros.importTiddlers.handler = function(place,macroName,params) {\n // LINK WITH FLOATING PANEL\n if (!params[0]) {\n createTiddlyButton(place,this.label,this.prompt,onClickImportMenu);\n return;\n }\n // INLINE TIDDLER CONTENT\n if (params[0]=="inline") {\n createImportPanel(place);\n document.getElementById("importPanel").style.position="static";\n document.getElementById("importPanel").style.display="block";\n return;\n }\n // NON-INTERACTIVE BATCH MODE\n switch (params[0]) {\n case 'all':\n case 'new':\n case 'changes':\n case 'updates':\n var filter=params.shift();\n break;\n default:\n var filter="updates";\n break;\n } \n if (!params[0]||!params[0].length) return; // filename is required\n config.macros.importTiddlers.src=params.shift();\n var quiet=(params[0]=="quiet"); if (quiet) params.shift();\n var ask=(params[0]=="ask"); if (ask) params.shift();\n config.macros.importTiddlers.inbound=null; // clear the imported tiddler buffer\n // load storeArea from a hidden IFRAME, then apply import rules and add/replace tiddlers\n loadImportFile(config.macros.importTiddlers.src,filter,quiet,ask,autoImportTiddlers);\n}\n//}}}\n\n// // ''READ TIDDLERS FROM ANOTHER DOCUMENT''\n\n//{{{\nfunction loadImportFile(src,filter,quiet,ask,callback) {\n if (!quiet) clearMessage();\n // LOCAL FILE\n if ((src.substr(0,7)!="http://")&&(src.substr(0,8)!="https://")) {\n if (!quiet) displayMessage("Opening local document: "+ src);\n var txt=loadFile(src);\n if(!txt) { if (!quiet) displayMessage("Could not open local document: "+src); }\n else {\n var s="<html><body>"+txt.substr(txt.indexOf('<div id="storeArea">'));\n if (!quiet) displayMessage(txt.length+" bytes in document. ("+s.length+" bytes used for tiddler storage)");\n config.macros.importTiddlers.inbound = readImportedTiddlers(convertUTF8ToUnicode(s));\n var count=config.macros.importTiddlers.inbound?config.macros.importTiddlers.inbound.length:0;\n if (!quiet) displayMessage("Found "+count+" tiddlers in "+src);\n if (callback) callback(src,filter,quiet,ask);\n }\n return;\n }\n // REMOTE FILE\n var x; // XML object\n try {x = new XMLHttpRequest()}\n catch(e) {\n try {x = new ActiveXObject("Msxml2.XMLHTTP")}\n catch (e) {\n try {x = new ActiveXObject("Microsoft.XMLHTTP")}\n catch (e) { return }\n }\n }\n x.onreadystatechange = function() {\n if (x.readyState == 4) {\n if (x.status == 200) {\n var sa="<html><body>"+x.responseText.substr(x.responseText.indexOf('<div id="storeArea">'));\n if (!quiet) displayMessage(x.responseText.length+" bytes in document. ("+sa.length+" bytes used for tiddler storage)");\n config.macros.importTiddlers.inbound = readImportedTiddlers(sa);\n var count=config.macros.importTiddlers.inbound?config.macros.importTiddlers.inbound.length:0;\n if (!quiet) displayMessage("Found "+count+" tiddlers in "+src);\n if (callback) callback(src,filter,quiet,ask);\n }\n else\n if (!quiet) displayMessage("Could not open remote document:"+ src+" (error="+x.status+")");\n }\n }\n if (document.location.protocol=="file:") { // UniversalBrowserRead only works from a local file context\n try {netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead')}\n catch (e) { if (!quiet) displayMessage(e.description?e.description:e.toString()); }\n }\n if (!quiet) displayMessage("Opening remote document: "+ src);\n try {\n var url=src+(src.indexOf('?')<0?'?':'&')+'nocache='+Math.random();\n x.open("GET",url,true);\n x.overrideMimeType('text/html');\n x.send(null);\n }\n catch (e) {\n if (!quiet) {\n displayMessage("Could not open remote document: "+src);\n displayMessage(e.description?e.description:e.toString());\n }\n }\n}\n\nfunction readImportedTiddlers(txt)\n{\n var importedTiddlers = [];\n // create frame\n var f=document.getElementById("importFrame");\n if (f) document.body.removeChild(f);\n f=document.createElement("iframe");\n f.id="importFrame";\n f.style.width="0px"; f.style.height="0px"; f.style.border="0px";\n document.body.appendChild(f);\n // get document\n var d=f.document;\n if (f.contentDocument) d=f.contentDocument; // For NS6\n else if (f.contentWindow) d=f.contentWindow.document; // For IE5.5 and IE6\n // load source into document\n d.open(); d.writeln(txt); d.close();\n // read tiddler DIVs from storeArea DOM element \n var importStore = [];\n var importStoreArea = d.getElementById("storeArea");\n if (!importStoreArea || !(importStore=importStoreArea.childNodes) || (importStore.length==0)) { return null; }\n importStoreArea.normalize();\n for(var t = 0; t < importStore.length; t++) {\n var e = importStore[t];\n var title = null;\n if(e.getAttribute)\n title = e.getAttribute("tiddler");\n if(!title && e.id && (e.id.substr(0,5) == "store"))\n title = e.id.substr(5);\n if(title && title != "") {\n var theImported = new Tiddler();\n theImported.loadFromDiv(e,title);\n importedTiddlers.push(theImported);\n }\n }\n return importedTiddlers;\n}\n//}}}\n\n// // ''NON-INTERACTIVE IMPORT''\n\n// // import all/new/changed tiddlers into store, replacing or adding tiddlers as needed\n//{{{\nfunction autoImportTiddlers(src,filter,quiet,ask)\n{\n var count=0;\n if (config.macros.importTiddlers.inbound) for (var t=0;t<config.macros.importTiddlers.inbound.length;t++) {\n var theImported = config.macros.importTiddlers.inbound[t];\n var theExisting = store.getTiddler(theImported.title);\n\n // only import tiddlers if tagged with "importPublic"\n if (theImported.tags && theImported.tags.find("importPublic")==null)\n { config.macros.importTiddlers.inbound[t].status=""; continue; } // status=="" means don't show in report\n\n // never import the "ImportedTiddlers" history from the other document...\n if (theImported.title=='ImportedTiddlers')\n { config.macros.importTiddlers.inbound[t].status=""; continue; } // status=="" means don't show in report\n\n // check existing tiddler for importReplace, or systemConfig tags\n config.macros.importTiddlers.inbound[t].status="added"; // default - add any tiddlers not filtered out\n if (store.tiddlerExists(theImported.title)) {\n config.macros.importTiddlers.inbound[t].status="replaced";\n if (!theExisting.tags||(theExisting.tags.find("importReplace")==null))\n { config.macros.importTiddlers.inbound[t].status="not imported - tiddler already exists (use importReplace to allow changes)"; continue; }\n if ((theExisting.tags.find("systemConfig")!=null)||(theImported.tags.find("systemConfig")!=null))\n config.macros.importTiddlers.inbound[t].status+=" - WARNING: an active systemConfig plugin has been added or updated";\n }\n\n // apply the all/new/changes/updates filter \n if (filter!="all") {\n if ((filter=="new") && store.tiddlerExists(theImported.title))\n { config.macros.importTiddlers.inbound[t].status="not imported - tiddler already exists"; continue; }\n if ((filter=="changes") && !store.tiddlerExists(theImported.title))\n { config.macros.importTiddlers.inbound[t].status="not imported - new tiddler"; continue; }\n if (store.tiddlerExists(theImported.title) && ((theExisting.modified.getTime()-theImported.modified.getTime())>=0))\n { config.macros.importTiddlers.inbound[t].status="not imported - tiddler is unchanged"; continue; }\n }\n\n // get confirmation if required\n if (ask && !confirm("Import "+(theExisting?"updated":"new")+" tiddler '"+theImported.title+"'\snfrom "+src))\n { config.macros.importTiddlers.inbound[t].status="skipped - cancelled by user"; continue; }\n\n // DO THE IMPORT!!\n store.addTiddler(theImported); count++;\n }\n importReport(quiet); // generate a report (as needed) and display it if not 'quiet'\n if (count) store.setDirty(true); \n // always show final message when tiddlers were actually imported\n if (!quiet||count) displayMessage("Imported "+count+" tiddler"+(count!=1?"s":"")+" from "+src);\n}\n//}}}\n\n// // ''REPORT GENERATOR''\n\n//{{{\nfunction importReport(quiet)\n{\n if (!config.macros.importTiddlers.inbound) return;\n // DEBUG alert('importReport: start');\n\n // if import was not completed, the Ask panel will still be open... close it now.\n var askpanel=document.getElementById('importAskPanel'); if (askpanel) askpanel.style.display='none'; \n // get the alphasorted list of tiddlers\n var tiddlers = config.macros.importTiddlers.inbound;\n tiddlers.sort(function (a,b) {if(a['title'] == b['title']) return(0); else return (a['title'] < b['title']) ? -1 : +1; });\n // gather the statistics\n var count=tiddlers.length;\n var added=0; var replaced=0; var renamed=0; var skipped=0; var merged=0;\n for (var t=0; t<count; t++)\n if (tiddlers[t].status)\n {\n if (tiddlers[t].status=='added') added++;\n if (tiddlers[t].status.substr(0,7)=='skipped') skipped++;\n if (tiddlers[t].status.substr(0,6)=='rename') renamed++;\n if (tiddlers[t].status.substr(0,7)=='replace') replaced++;\n if (tiddlers[t].status.substr(0,6)=='merged') merged++;\n }\n var omitted=count-(added+replaced+renamed+skipped+merged);\n // DEBUG alert('stats done: '+count+' total, '+added+' added, '+skipped+' skipped, '+renamed+' renamed, '+replaced+' replaced, '+merged+' merged');\n // skip the report if nothing was imported\n if (added+replaced+renamed+merged==0) return;\n // skip the report if not desired by user\n if (!config.options.chkImportReport) {\n // reset status flags\n for (var t=0; t<count; t++) config.macros.importTiddlers.inbound[t].status="";\n // refresh display since tiddlers have been imported\n store.notifyAll();\n // quick message area summary report\n var msg=(added+replaced+renamed+merged)+' of '+count+' tiddler'+((count!=1)?'s':"");\n msg+=' imported from '+config.macros.importTiddlers.src.replace(/\s\s/g,'/')\n displayMessage(msg);\n return;\n }\n // create the report tiddler (if not already present)\n var tiddler = store.getTiddler('ImportedTiddlers');\n if (!tiddler) // create new report tiddler if it doesn't exist\n {\n tiddler = new Tiddler();\n tiddler.title = 'ImportedTiddlers';\n tiddler.text = "";\n }\n // format the report header\n var now = new Date();\n var newText = "";\n newText += "On "+now.toLocaleString()+", "+config.options.txtUserName+" imported tiddlers from\sn";\n newText += "[["+config.macros.importTiddlers.src+"|"+config.macros.importTiddlers.src+"]]:\sn";\n newText += "<"+"<"+"<\sn";\n newText += "Out of "+count+" tiddler"+((count!=1)?"s ":" ")+" in {{{"+config.macros.importTiddlers.src.replace(/\s\s/g,'/')+"}}}:\sn";\n if (added+renamed>0)\n newText += (added+renamed)+" new tiddler"+(((added+renamed)!=1)?"s were":" was")+" added to your document.\sn";\n if (merged>0)\n newText += merged+" tiddler"+((merged!=1)?"s were":" was")+" merged with "+((merged!=1)?"":"an ")+"existing tiddler"+((merged!=1)?"s":"")+".\sn"; \n if (replaced>0)\n newText += replaced+" existing tiddler"+((replaced!=1)?"s were":" was")+" replaced.\sn"; \n if (skipped>0)\n newText += skipped+" tiddler"+((skipped!=1)?"s were":" was")+" skipped after asking.\sn"; \n if (omitted>0)\n newText += omitted+" tiddler"+((omitted!=1)?"s":"")+((omitted!=1)?" were":" was")+" not imported.\sn";\n if (config.macros.importTiddlers.addTags && config.macros.importTiddlers.newTags.trim().length)\n newText += "imported tiddlers were tagged with: \s""+config.macros.importTiddlers.newTags+"\s"\sn";\n // output the tiddler detail and reset status flags\n for (var t=0; t<count; t++)\n if (tiddlers[t].status!="")\n {\n newText += "#["+"["+tiddlers[t].title+"]"+"]";\n newText += ((tiddlers[t].status!="added")?("^^\sn"+tiddlers[t].status+"^^"):"")+"\sn";\n config.macros.importTiddlers.inbound[t].status="";\n }\n newText += "<"+"<"+"<\sn";\n // output 'discard report' link\n newText += "<html><input type=\s"button\s" href=\s"javascript:;\s" ";\n newText += "onclick=\s"story.closeTiddler('"+tiddler.title+"'); store.deleteTiddler('"+tiddler.title+"');\s" ";\n newText += "value=\s"discard report\s"></html>";\n // update the ImportedTiddlers content and show the tiddler\n tiddler.text = newText+((tiddler.text!="")?'\sn----\sn':"")+tiddler.text;\n tiddler.modifier = config.options.txtUserName;\n tiddler.modified = new Date();\n store.addTiddler(tiddler);\n if (!quiet) story.displayTiddler(null,"ImportedTiddlers",1,null,null,false);\n story.refreshTiddler("ImportedTiddlers",1,true);\n // refresh the display\n store.notifyAll();\n}\n//}}}\n\n// // ''INTERFACE DEFINITION''\n\n// // Handle link click to create/show/hide control panel\n//{{{\nfunction onClickImportMenu(e)\n{\n if (!e) var e = window.event;\n var parent=resolveTarget(e).parentNode;\n var panel = document.getElementById("importPanel");\n if (panel==undefined || panel.parentNode!=parent)\n panel=createImportPanel(parent);\n var isOpen = panel.style.display=="block";\n if(config.options.chkAnimate)\n anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,"none"));\n else\n panel.style.display = isOpen ? "none" : "block" ;\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n return(false);\n}\n//}}}\n\n// // Create control panel: HTML, CSS, register for notification\n//{{{\nfunction createImportPanel(place) {\n var panel=document.getElementById("importPanel");\n if (panel) { panel.parentNode.removeChild(panel); }\n setStylesheet(config.macros.importTiddlers.css,"importTiddlers");\n panel=createTiddlyElement(place,"span","importPanel",null,null)\n panel.innerHTML=config.macros.importTiddlers.html;\n store.addNotification(null,refreshImportList); // refresh listbox after every tiddler change\n refreshImportList();\n return panel;\n}\n//}}}\n\n// // CSS\n//{{{\nconfig.macros.importTiddlers.css = '\s\n#importPanel {\s\n display: none; position:absolute; z-index:11; width:35em; right:105%; top:3em;\s\n padding: 0.5em; margin:0em; text-align:left; font-size: 8pt;\s\n background-color: #eee; color:#000000; \s\n border:1px solid black; border-bottom-width: 3px; border-right-width: 3px; -moz-border-radius:1em;\s\n}\s\n#importPanel a { color:#009; }\s\n#importPanel input { width: 98%; margin: 1px; font-size:8pt; }\s\n#importPanel select { width: 98%; margin: 1px; font-size:8pt; }\s\n#importPanel .importButton { padding: 0em; margin: 0px; font-size:8pt; }\s\n#importPanel .importListButton { padding:0em 0.25em 0em 0.25em; color: #000000; display:inline }\s\n#importAskPanel { display:none; margin:0.5em 0em 0em 0em; }\s\n';\n//}}}\n\n// // HTML\n//{{{\nconfig.macros.importTiddlers.html = '\s\n<span style="float:left; padding:1px; white-space:nowrap">\s\n import from source document\s\n</span>\s\n<span style="float:right; padding:1px; white-space:nowrap">\s\n <input type=checkbox id="chkImportReport" checked style="height:1em; width:auto"\s\n onClick="config.options[\s'chkImportReport\s']=this.checked;">create a report\s\n</span>\s\n<input type="file" id="fileImportSource" size=56\s\n onKeyUp="config.macros.importTiddlers.src=this.value"\s\n onChange="config.macros.importTiddlers.src=this.value;">\s\n<span style="float:left; padding:1px; white-space:nowrap">\s\n select:\s\n <a href="JavaScript:;" id="importSelectAll"\s\n onclick="onClickImportButton(this)" title="select all tiddlers">\s\n &nbsp;all&nbsp;</a>\s\n <a href="JavaScript:;" id="importSelectNew"\s\n onclick="onClickImportButton(this)" title="select tiddlers not already in destination document">\s\n &nbsp;added&nbsp;</a> \s\n <a href="JavaScript:;" id="importSelectChanges"\s\n onclick="onClickImportButton(this)" title="select tiddlers that have been updated in source document">\s\n &nbsp;changes&nbsp;</a> \s\n <a href="JavaScript:;" id="importSelectDifferences"\s\n onclick="onClickImportButton(this)" title="select tiddlers that have been added or are different from existing tiddlers">\s\n &nbsp;differences&nbsp;</a> \s\n <a href="JavaScript:;" id="importToggleFilter"\s\n onclick="onClickImportButton(this)" title="show/hide selection filter">\s\n &nbsp;filter&nbsp;</a> \s\n</span>\s\n<span style="float:right; padding:1px; white-space:nowrap">\s\n <a href="JavaScript:;" id="importListSmaller"\s\n onclick="onClickImportButton(this)" title="reduce list size">\s\n &nbsp;&#150;&nbsp;</a>\s\n <a href="JavaScript:;" id="importListLarger"\s\n onclick="onClickImportButton(this)" title="increase list size">\s\n &nbsp;+&nbsp;</a>\s\n <a href="JavaScript:;" id="importListMaximize"\s\n onclick="onClickImportButton(this)" title="maximize/restore list size">\s\n &nbsp;=&nbsp;</a>\s\n</span>\s\n<select id="importList" size=8 multiple\s\n onchange="setTimeout(\s'refreshImportList(\s'+this.selectedIndex+\s')\s',1)">\s\n <!-- NOTE: delay refresh so list is updated AFTER onchange event is handled -->\s\n</select>\s\n<input type=checkbox id="chkAddTags" checked style="height:1em; width:auto"\s\n onClick="config.macros.importTiddlers.addTags=this.checked;">add new tags &nbsp;\s\n<input type=checkbox id="chkImportTags" checked style="height:1em; width:auto"\s\n onClick="config.macros.importTiddlers.importTags=this.checked;">import source tags &nbsp;\s\n<input type=checkbox id="chkKeepTags" checked style="height:1em; width:auto"\s\n onClick="config.macros.importTiddlers.keepTags=this.checked;">keep existing tags\s\n<input type=text id="txtNewTags" size=15 onKeyUp="config.macros.importTiddlers.newTags=this.value" autocomplete=off>\s\n<div align=center>\s\n <input type=button id="importOpen" class="importButton" style="width:32%" value="open"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importStart" class="importButton" style="width:32%" value="import"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importClose" class="importButton" style="width:32%" value="close"\s\n onclick="onClickImportButton(this)">\s\n</div>\s\n<div id="importAskPanel">\s\n tiddler already exists:\s\n <input type=text id="importNewTitle" size=15 autocomplete=off">\s\n <div align=center>\s\n <input type=button id="importSkip" class="importButton" style="width:23%" value="skip"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importRename" class="importButton" style="width:23%" value="rename"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importMerge" class="importButton" style="width:23%" value="merge"\s\n onclick="onClickImportButton(this)">\s\n <input type=button id="importReplace" class="importButton" style="width:23%" value="replace"\s\n onclick="onClickImportButton(this)">\s\n </div>\s\n</div>\s\n';\n//}}}\n\n// // refresh listbox\n//{{{\nfunction refreshImportList(selectedIndex)\n{\n var theList = document.getElementById("importList");\n if (!theList) return;\n // if nothing to show, reset list content and size\n if (!config.macros.importTiddlers.inbound) \n {\n while (theList.length > 0) { theList.options[0] = null; }\n theList.options[0]=new Option('please open a document...',"",false,false);\n theList.size=config.macros.importTiddlers.listsize;\n return;\n }\n // get the sort order\n if (!selectedIndex) selectedIndex=0;\n if (selectedIndex==0) config.macros.importTiddlers.sort='title'; // heading\n if (selectedIndex==1) config.macros.importTiddlers.sort='title';\n if (selectedIndex==2) config.macros.importTiddlers.sort='modified';\n if (selectedIndex==3) config.macros.importTiddlers.sort='tags';\n if (selectedIndex>3) {\n // display selected tiddler count\n for (var t=0,count=0; t < theList.options.length; t++) count+=(theList.options[t].selected&&theList.options[t].value!="")?1:0;\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n return; // no refresh needed\n }\n\n // get the alphasorted list of tiddlers (optionally, filter out unchanged tiddlers)\n var tiddlers=config.macros.importTiddlers.inbound;\n tiddlers.sort(function (a,b) {if(a['title'] == b['title']) return(0); else return (a['title'] < b['title']) ? -1 : +1; });\n // clear current list contents\n while (theList.length > 0) { theList.options[0] = null; }\n // add heading and control items to list\n var i=0;\n var indent=String.fromCharCode(160)+String.fromCharCode(160);\n theList.options[i++]=new Option(tiddlers.length+' tiddler'+((tiddlers.length!=1)?'s are':' is')+' in the document',"",false,false);\n theList.options[i++]=new Option(((config.macros.importTiddlers.sort=="title" )?">":indent)+' [by title]',"",false,false);\n theList.options[i++]=new Option(((config.macros.importTiddlers.sort=="modified")?">":indent)+' [by date]',"",false,false);\n theList.options[i++]=new Option(((config.macros.importTiddlers.sort=="tags")?">":indent)+' [by tags]',"",false,false);\n // output the tiddler list\n switch(config.macros.importTiddlers.sort)\n {\n case "title":\n for(var t = 0; t < tiddlers.length; t++)\n theList.options[i++] = new Option(tiddlers[t].title,tiddlers[t].title,false,false);\n break;\n case "modified":\n // sort descending for newest date first\n tiddlers.sort(function (a,b) {if(a['modified'] == b['modified']) return(0); else return (a['modified'] > b['modified']) ? -1 : +1; });\n var lastSection = "";\n for(var t = 0; t < tiddlers.length; t++) {\n var tiddler = tiddlers[t];\n var theSection = tiddler.modified.toLocaleDateString();\n if (theSection != lastSection) {\n theList.options[i++] = new Option(theSection,"",false,false);\n lastSection = theSection;\n }\n theList.options[i++] = new Option(indent+indent+tiddler.title,tiddler.title,false,false);\n }\n break;\n case "tags":\n var theTitles = {}; // all tiddler titles, hash indexed by tag value\n var theTags = new Array();\n for(var t=0; t<tiddlers.length; t++) {\n var title=tiddlers[t].title;\n var tags=tiddlers[t].tags;\n for(var s=0; s<tags.length; s++) {\n if (theTitles[tags[s]]==undefined) { theTags.push(tags[s]); theTitles[tags[s]]=new Array(); }\n theTitles[tags[s]].push(title);\n }\n }\n theTags.sort();\n for(var tagindex=0; tagindex<theTags.length; tagindex++) {\n var theTag=theTags[tagindex];\n theList.options[i++]=new Option(theTag,"",false,false);\n for(var t=0; t<theTitles[theTag].length; t++)\n theList.options[i++]=new Option(indent+indent+theTitles[theTag][t],theTitles[theTag][t],false,false);\n }\n break;\n }\n theList.selectedIndex=selectedIndex; // select current control item\n if (theList.size<config.macros.importTiddlers.listsize) theList.size=config.macros.importTiddlers.listsize;\n if (theList.size>theList.options.length) theList.size=theList.options.length;\n}\n//}}}\n\n// // Control interactions\n//{{{\nfunction onClickImportButton(which)\n{\n // DEBUG alert(which.id);\n var theList = document.getElementById('importList');\n if (!theList) return;\n var thePanel = document.getElementById('importPanel');\n var theAskPanel = document.getElementById('importAskPanel');\n var theNewTitle = document.getElementById('importNewTitle');\n var count=0;\n switch (which.id)\n {\n case 'fileImportSource':\n case 'importOpen': // load import source into hidden frame\n importReport(); // if an import was in progress, generate a report\n config.macros.importTiddlers.inbound=null; // clear the imported tiddler buffer\n refreshImportList(); // reset/resize the listbox\n if (config.macros.importTiddlers.src=="") break;\n // Load document into hidden iframe so we can read it's DOM and fill the list\n loadImportFile(config.macros.importTiddlers.src,"all",null,null,function(src,filter,quiet,ask){window.refreshImportList(0);});\n break;\n case 'importSelectAll': // select all tiddler list items (i.e., not headings)\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n if (theList.options[t].value=="") continue;\n theList.options[t].selected=true;\n count++;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importSelectNew': // select tiddlers not in current document\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n theList.options[t].selected=false;\n if (theList.options[t].value=="") continue;\n theList.options[t].selected=!store.tiddlerExists(theList.options[t].value);\n count+=theList.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importSelectChanges': // select tiddlers that are updated from existing tiddlers\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n theList.options[t].selected=false;\n if (theList.options[t].value==""||!store.tiddlerExists(theList.options[t].value)) continue;\n for (var i=0; i<config.macros.importTiddlers.inbound.length; i++) // find matching inbound tiddler\n { var inbound=config.macros.importTiddlers.inbound[i]; if (inbound.title==theList.options[t].value) break; }\n theList.options[t].selected=(inbound.modified-store.getTiddler(theList.options[t].value).modified>0); // updated tiddler\n count+=theList.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importSelectDifferences': // select tiddlers that are new or different from existing tiddlers\n importReport(); // if an import was in progress, generate a report\n for (var t=0,count=0; t < theList.options.length; t++) {\n theList.options[t].selected=false;\n if (theList.options[t].value=="") continue;\n if (!store.tiddlerExists(theList.options[t].value)) { theList.options[t].selected=true; count++; continue; }\n for (var i=0; i<config.macros.importTiddlers.inbound.length; i++) // find matching inbound tiddler\n { var inbound=config.macros.importTiddlers.inbound[i]; if (inbound.title==theList.options[t].value) break; }\n theList.options[t].selected=(inbound.modified-store.getTiddler(theList.options[t].value).modified!=0); // changed tiddler\n count+=theList.options[t].selected?1:0;\n }\n clearMessage(); displayMessage(config.macros.importTiddlers.countMsg.format([count]));\n break;\n case 'importToggleFilter': // show/hide filter\n case 'importFilter': // apply filter\n alert("coming soon!");\n break;\n case 'importStart': // initiate the import processing\n importReport(); // if an import was in progress, generate a report\n config.macros.importTiddlers.index=0;\n config.macros.importTiddlers.index=importTiddlers(0);\n importStopped();\n break;\n case 'importClose': // unload imported tiddlers or hide the import control panel\n // if imported tiddlers not loaded, close the import control panel\n if (!config.macros.importTiddlers.inbound) { thePanel.style.display='none'; break; }\n importReport(); // if an import was in progress, generate a report\n config.macros.importTiddlers.inbound=null; // clear the imported tiddler buffer\n refreshImportList(); // reset/resize the listbox\n break;\n case 'importSkip': // don't import the tiddler\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n theImported.status='skipped after asking'; // mark item as skipped\n theAskPanel.style.display='none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index+1); // resume with NEXT item\n importStopped();\n break;\n case 'importRename': // change name of imported tiddler\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n theImported.status = 'renamed from '+theImported.title; // mark item as renamed\n theImported.set(theNewTitle.value,null,null,null,null); // change the tiddler title\n theItem.value = theNewTitle.value; // change the listbox item text\n theItem.text = theNewTitle.value; // change the listbox item text\n theAskPanel.style.display='none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index); // resume with THIS item\n importStopped();\n break;\n case 'importMerge': // join existing and imported tiddler content\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n var theExisting = store.getTiddler(theItem.value);\n var theText = theExisting.text+'\sn----\sn^^merged from: [['+config.macros.importTiddlers.src+'#'+theItem.value+'|'+config.macros.importTiddlers.src+'#'+theItem.value+']]^^\sn^^'+theImported.modified.toLocaleString()+' by '+theImported.modifier+'^^\sn'+theImported.text;\n var theDate = new Date();\n var theTags = theExisting.getTags()+' '+theImported.getTags();\n theImported.set(null,theText,null,theDate,theTags);\n theImported.status = 'merged with '+theExisting.title; // mark item as merged\n theImported.status += ' - '+theExisting.modified.formatString("MM/DD/YYYY hh:mm:ss");\n theImported.status += ' by '+theExisting.modifier;\n theAskPanel.style.display='none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index); // resume with this item\n importStopped();\n break;\n case 'importReplace': // substitute imported tiddler for existing tiddler\n var theItem = theList.options[config.macros.importTiddlers.index];\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==theItem.value) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n var theExisting = store.getTiddler(theItem.value);\n theImported.status = 'replaces '+theExisting.title; // mark item for replace\n theImported.status += ' - '+theExisting.modified.formatString("MM/DD/YYYY hh:mm:ss");\n theImported.status += ' by '+theExisting.modifier;\n theAskPanel.style.display='none';\n config.macros.importTiddlers.index=importTiddlers(config.macros.importTiddlers.index); // resume with THIS item\n importStopped();\n break;\n case 'importListSmaller': // decrease current listbox size, minimum=5\n if (theList.options.length==1) break;\n theList.size-=(theList.size>5)?1:0;\n config.macros.importTiddlers.listsize=theList.size;\n break;\n case 'importListLarger': // increase current listbox size, maximum=number of items in list\n if (theList.options.length==1) break;\n theList.size+=(theList.size<theList.options.length)?1:0;\n config.macros.importTiddlers.listsize=theList.size;\n break;\n case 'importListMaximize': // toggle listbox size between current and maximum\n if (theList.options.length==1) break;\n theList.size=(theList.size==theList.options.length)?config.macros.importTiddlers.listsize:theList.options.length;\n break;\n }\n}\n//}}}\n\n// // re-entrant processing for handling import with interactive collision prompting\n//{{{\nfunction importTiddlers(startIndex)\n{\n if (!config.macros.importTiddlers.inbound) return -1;\n\n var theList = document.getElementById('importList');\n if (!theList) return;\n var t;\n // if starting new import, reset import status flags\n if (startIndex==0)\n for (var t=0;t<config.macros.importTiddlers.inbound.length;t++)\n config.macros.importTiddlers.inbound[t].status="";\n for (var i=startIndex; i<theList.options.length; i++)\n {\n // if list item is not selected or is a heading (i.e., has no value), skip it\n if ((!theList.options[i].selected) || ((t=theList.options[i].value)==""))\n continue;\n for (var j=0;j<config.macros.importTiddlers.inbound.length;j++)\n if (config.macros.importTiddlers.inbound[j].title==t) break;\n var theImported = config.macros.importTiddlers.inbound[j];\n var theExisting = store.getTiddler(theImported.title);\n // avoid redundant import for tiddlers that are listed multiple times (when 'by tags')\n if (theImported.status=="added")\n continue;\n // don't import the "ImportedTiddlers" history from the other document...\n if (theImported.title=='ImportedTiddlers')\n continue;\n // if tiddler exists and import not marked for replace or merge, stop importing\n if (theExisting && (theImported.status.substr(0,7)!="replace") && (theImported.status.substr(0,5)!="merge"))\n return i;\n // assemble tags (remote + existing + added)\n var newTags = "";\n if (config.macros.importTiddlers.importTags)\n newTags+=theImported.getTags() // import remote tags\n if (config.macros.importTiddlers.keepTags && theExisting)\n newTags+=" "+theExisting.getTags(); // keep existing tags\n if (config.macros.importTiddlers.addTags && config.macros.importTiddlers.newTags.trim().length)\n newTags+=" "+config.macros.importTiddlers.newTags; // add new tags\n theImported.set(null,null,null,null,newTags.trim());\n // set the status to 'added' (if not already set by the 'ask the user' UI)\n theImported.status=(theImported.status=="")?'added':theImported.status;\n // do the import!\n store.addTiddler(theImported);\n store.setDirty(true);\n }\n return(-1); // signals that we really finished the entire list\n}\n//}}}\n\n//{{{\nfunction importStopped()\n{\n var theList = document.getElementById('importList');\n var theNewTitle = document.getElementById('importNewTitle');\n if (!theList) return;\n if (config.macros.importTiddlers.index==-1)\n importReport(); // import finished... generate the report\n else\n {\n // DEBUG alert('import stopped at: '+config.macros.importTiddlers.index);\n // import collision... show the ask panel and set the title edit field\n document.getElementById('importAskPanel').style.display='block';\n theNewTitle.value=theList.options[config.macros.importTiddlers.index].value;\n }\n}\n//}}}\n
/***\n''InlineJavascriptPlugin for ~TiddlyWiki version 1.2.x and 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#InlineJavascriptPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nInsert Javascript executable code directly into your tiddler content. Lets you ''call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.\n!!!!!Usage\n<<<\nWhen installed, this plugin adds new wiki syntax for surrounding tiddler content with {{{<script>}}} and {{{</script>}}} markers, so that it can be treated as embedded javascript and executed each time the tiddler is rendered.\n\n''Deferred execution from an 'onClick' link''\nBy including a label="..." parameter in the initial {{{<script>}}} marker, the plugin will create a link to an 'onclick' script that will only be executed when that specific link is clicked, rather than running the script each time the tiddler is rendered.\n\n''External script source files:''\nYou can also load javascript from an external source URL, by including a src="..." parameter in the initial {{{<script>}}} marker (e.g., {{{<script src="demo.js"></script>}}}). This is particularly useful when incorporating third-party javascript libraries for use in custom extensions and plugins. The 'foreign' javascript code remains isolated in a separate file that can be easily replaced whenever an updated library file becomes available.\n\n''Defining javascript functions and libraries:''\nAlthough the external javascript file is loaded while the tiddler content is being rendered, any functions it defines will not be available for use until //after// the rendering has been completed. Thus, you cannot load a library and //immediately// use it's functions within the same tiddler. However, once that tiddler has been loaded, the library functions can be freely used in any tiddler (even the one in which it was initially loaded).\n\nTo ensure that your javascript functions are always available when needed, you should load the libraries from a tiddler that will be rendered as soon as your TiddlyWiki document is opened. For example, you could put your {{{<script src="..."></script>}}} syntax into a tiddler called LoadScripts, and then add {{{<<tiddler LoadScripts>>}}} in your MainMenu tiddler.\n\nSince the MainMenu is always rendered immediately upon opening your document, the library will always be loaded before any other tiddlers that rely upon the functions it defines. Loading an external javascript library does not produce any direct output in the tiddler, so these definitions should have no impact on the appearance of your MainMenu.\n\n''Creating dynamic tiddler content''\nAn important difference between this implementation of embedded scripting and conventional embedded javascript techniques for web pages is the method used to produce output that is dynamically inserted into the document:\n* In a typical web document, you use the document.write() function to output text sequences (often containing HTML tags) that are then rendered when the entire document is first loaded into the browser window.\n* However, in a ~TiddlyWiki document, tiddlers (and other DOM elements) are created, deleted, and rendered "on-the-fly", so writing directly to the global 'document' object does not produce the results you want (i.e., replacing the embedded script within the tiddler content), and completely replaces the entire ~TiddlyWiki document in your browser window.\n* To allow these scripts to work unmodified, the plugin automatically converts all occurences of document.write() so that the output is inserted into the tiddler content instead of replacing the entire ~TiddlyWiki document.\n\nIf your script does not use document.write() to create dynamically embedded content within a tiddler, your javascript can, as an alternative, explicitly return a text value that the plugin can then pass through the wikify() rendering engine to insert into the tiddler display. For example, using {{{return "thistext"}}} will produce the same output as {{{document.write("thistext")}}}.\n\n//Note: your script code is automatically 'wrapped' inside a function, {{{_out()}}}, so that any return value you provide can be correctly handled by the plugin and inserted into the tiddler. To avoid unpredictable results (and possibly fatal execution errors), this function should never be redefined or called from ''within'' your script code.//\n\n''Accessing the ~TiddlyWiki DOM''\nThe plugin provides one pre-defined variable, 'place', that is passed in to your javascript code so that it can have direct access to the containing DOM element into which the tiddler output is currently being rendered.\n\nAccess to this DOM element allows you to create scripts that can:\n* vary their actions based upon the specific location in which they are embedded\n* access 'tiddler-relative' information (use findContainingTiddler(place))\n* perform direct DOM manipulations (when returning wikified text is not enough)\n<<<\n!!!!!Examples\n<<<\nan "alert" message box:\n{{{\n<script>alert('InlineJavascriptPlugin: this is a demonstration message');</script>\n}}}\n<script>alert('InlineJavascriptPlugin: this is a demonstration message');</script>\n\ndynamic output:\n{{{\n<script>return (new Date()).toString();</script>\n}}}\n<script>return (new Date()).toString();</script>\n\nwikified dynamic output:\n{{{\n<script>return "link to current user: [["+config.options.txtUserName+"]]";</script>\n}}}\n<script>return "link to current user: [["+config.options.txtUserName+"]]";</script>\n\ndynamic output using 'place' to get size information for current tiddler\n{{{\n<script>\n if (!window.story) window.story=window;\n var title=story.findContainingTiddler(place).id.substr(7);\n return title+" is using "+store.getTiddlerText(title).length+" bytes";\n</script>\n}}}\n<script>\n if (!window.story) window.story=window;\n var title=story.findContainingTiddler(place).id.substr(7);\n return title+" is using "+store.getTiddlerText(title).length+" bytes";\n</script>\n\ncreating an 'onclick' button/link that runs a script\n{{{\n<script label="click here">\n if (!window.story) window.story=window;\n alert("Hello World!\snlinktext='"+place.firstChild.data+"'\sntiddler='"+story.findContainingTiddler(place).id.substr(7)+"'");\n</script>\n}}}\n<script label="click here">\n if (!window.story) window.story=window;\n alert("Hello World!\snlinktext='"+place.firstChild.data+"'\sntiddler='"+story.findContainingTiddler(place).id.substr(7)+"'");\n</script>\n\nloading a script from a source url\n{{{\n<script src="demo.js">return "loading demo.js..."</script>\n<script label="click to execute demo() function">demo()</script>\n}}}\nwhere http://www.TiddlyTools.com/demo.js contains:\n>function demo() { alert('this output is from demo(), defined in demo.js') }\n>alert('InlineJavascriptPlugin: demo.js has been loaded');\n<script src="demo.js">return "loading demo.js..."</script>\n<script label="click to execute demo() function">demo()</script>\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''InlineJavascriptPlugin'' (tagged with <<tag systemConfig>>)\n<<<\n!!!!!Revision History\n<<<\n''2006.01.05 [1.4.0]''\nadded support 'onclick' scripts. When label="..." param is present, a button/link is created using the indicated label text, and the script is only executed when the button/link is clicked. 'place' value is set to match the clicked button/link element.\n''2005.12.13 [1.3.1]''\nwhen catching eval error in IE, e.description contains the error text, instead of e.toString(). Fixed error reporting so IE shows the correct response text. Based on a suggestion by UdoBorkowski\n''2005.11.09 [1.3.0]''\nfor 'inline' scripts (i.e., not scripts loaded with src="..."), automatically replace calls to 'document.write()' with 'place.innerHTML+=' so script output is directed into tiddler content\nBased on a suggestion by BradleyMeck\n''2005.11.08 [1.2.0]''\nhandle loading of javascript from an external URL via src="..." syntax\n''2005.11.08 [1.1.0]''\npass 'place' param into scripts to provide direct DOM access \n''2005.11.08 [1.0.0]''\ninitial release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.inlineJavascript= {major: 1, minor: 4, revision: 0, date: new Date(2006,1,5)};\n\nconfig.formatters.push( {\n name: "inlineJavascript",\n match: "\s\s<script",\n lookahead: "\s\s<script(?: src=\s\s\s"((?:.|\s\sn)*?)\s\s\s")?(?: label=\s\s\s"((?:.|\s\sn)*?)\s\s\s")?\s\s>((?:.|\s\sn)*?)\s\s</script\s\s>",\n\n handler: function(w) {\n var lookaheadRegExp = new RegExp(this.lookahead,"mg");\n lookaheadRegExp.lastIndex = w.matchStart;\n var lookaheadMatch = lookaheadRegExp.exec(w.source)\n if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {\n if (lookaheadMatch[1]) { // load a script library\n // make script tag, set src, add to body to execute, then remove for cleanup\n var script = document.createElement("script"); script.src = lookaheadMatch[1];\n document.body.appendChild(script); document.body.removeChild(script);\n }\n if (lookaheadMatch[2] && lookaheadMatch[3]) { // create a link to an 'onclick' script\n // add a link, define click handler, save code in link (pass 'place'), set link attributes\n var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",lookaheadMatch[2]);\n link.onclick=function(){try{return(eval(this.code))}catch(e){alert(e.description?e.description:e.toString())}}\n link.code="function _out(place){"+lookaheadMatch[3]+"};_out(this);"\n link.setAttribute("href","javascript:;"); link.setAttribute("title",""); link.style.cursor="pointer";\n }\n else if (lookaheadMatch[3]) { // run inline script code\n var code="function _out(place){"+lookaheadMatch[3]+"};_out(w.output);"\n code=code.replace(/document.write\s(/gi,'place.innerHTML+=(');\n try { var out = eval(code); } catch(e) { out = e.description?e.description:e.toString(); }\n if (out && out.length) wikify(out,w.output);\n }\n w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;\n }\n }\n} )\n//}}}\n
//{{{\n\nwindow.applyPageTemplate_orig_ads = window.applyPageTemplate;\n\nwindow.applyPageTemplate = function(title) {\n\n applyPageTemplate_orig_ads(title);\n\n var box = document.getElementById('adsenseBox');\n var bar = document.getElementById('adsenseBar');\n\n var sidebar = document.getElementById('sidebar');\n var sidebarOptions = document.getElementById('sidebarOptions');\n var displayArea = document.getElementById('displayArea');\n var tiddlerDisplay = document.getElementById('tiddlerDisplay');\n\n if (false && sidebar && sidebarOptions && box) {\n sidebar.insertBefore(box,sidebarOptions.nextSibling);\n box.style.display = 'block';\n }\n else if (sidebar && box) {\n sidebar.insertBefore(box,sidebar.childNodes[0]);\n box.style.display = 'block';\n }\n\n if (displayArea && bar) {\n //displayArea.insertBefore(bar,displayArea.childNodes[0]);\n displayArea.appendChild(bar);\n bar.style.display = 'block';\n }\n\n};\nsetStylesheet(\n'#adsenseBox { background:#eee; }\sn'+\n'#adsenseBar { background:#eee; padding-left:1em; }\sn'+\n'',\n'adsenseStyles');\n\n//}}}
/***\n| Name:|QuickOpenTagPlugin|\n| Purpose:|Makes tag links into a Taggly style open tag plus a normal style drop down menu|\n| Creator:|SimonBaird|\n| Source:|http://simonbaird.com/mptw/#QuickOpenTagPlugin|\n| Requires:|TW 2.x|\n| Version|1.1 (7-Feb-06)|\n\n!History\n* Version 1.1 (07/02/2006)\n** Fix Firefox crashes\n** Updated by ~BidiX[at]~BidiX.info\n* Version 1.0 (?/01/2006)\n** First release\n\n***/\n//{{{\n\n//⊻ ⊽ ⋁ ▼ \n\nwindow.createTagButton_orig_mptw = createTagButton;\nwindow.createTagButton = function(place,tag,excludeTiddler) {\n var sp = createTiddlyElement(place,"span",null,"quickopentag");\n createTiddlyLink(sp,tag,true,"button");\n var theTag = createTiddlyButton(sp,config.macros.miniTag.dropdownchar,config.views.wikified.tag.tooltip.format([tag]),onClickTag);\n theTag.setAttribute("tag",tag);\n if(excludeTiddler)\n theTag.setAttribute("tiddler",excludeTiddler);\n return(theTag);\n};\n\nconfig.macros.miniTag = {handler:function(place,macroName,params,wikifier,paramString,tiddler) {\n var tagged = store.getTaggedTiddlers(tiddler.title);\n if (tagged.length > 0) {\n var theTag = createTiddlyButton(place,config.macros.miniTag.dropdownchar,config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);\n theTag.setAttribute("tag",tiddler.title);\n theTag.className = "miniTag";\n }\n}};\n\nconfig.macros.miniTag.dropdownchar = (document.all?"▼":"▾"); // the fat one is the only one that works in IE\n\nconfig.macros.allTags.handler = function(place,macroName,params)\n{\n var tags = store.getTags();\n var theDateList = createTiddlyElement(place,"ul",null,null,null);\n if(tags.length === 0)\n createTiddlyElement(theDateList,"li",null,"listTitle",this.noTags);\n for (var t=0; t<tags.length; t++)\n {\n var theListItem =createTiddlyElement(theDateList,"li",null,null,null);\n var theLink = createTiddlyLink(theListItem,tags[t][0],true);\n var theCount = " (" + tags[t][1] + ")";\n theLink.appendChild(document.createTextNode(theCount));\n\n var theDropDownBtn = createTiddlyButton(theListItem," "+config.macros.miniTag.dropdownchar,this.tooltip.format([tags[t][0]]),onClickTag);\n theDropDownBtn.setAttribute("tag",tags[t][0]);\n }\n};\n\n\nsetStylesheet(\n ".quickopentag { margin-right:1.2em; border:1px solid #eee; padding:2px; padding-right:0px; padding-left:1px; }\sn"+\n ".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }\sn"+\n ".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}\sn"+\n "a.miniTag {font-size:150%;}\sn"+\n "",\n"QuickOpenTagStyles");\n\n//}}}\n\n/***\n<html>&#x22bb; &#x22bd; &#x22c1; &#x25bc; &#x25be;</html>\n***/\n
/***\n''SearchOptionsPlugin for TiddlyWiki version 2.0''\n^^author: Eric Shulman - ELS Design Studios\nsource: http://www.TiddlyTools.com/#SearchOptionsPlugin\nlicense: [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]^^\n\nThe TiddlyWiki search function normally looks in both tiddler titles and tiddler body content ('text'). However, narrowing the search so that it examines only titles or only text, or expanding the search to include text contained in tiddler tags can be very helpful, especially when searching on common words or phrases. In addition, it is often useful for the search results to show tiddlers with matching titles before tiddlers that contain matching text or tags.\n\n!!!!!Usage\n<<<\nThis plugin adds checkboxes (see below and in AdvancedOptions) to let you selectively configure the TiddlyWiki search function to just examine any combination of tiddler titles, text, or tags. It also provides an option to switch the search results order between 'titles mixed in' (default) and 'titles shown first', as well as an option display the search results as a list of links (in an auto-generated "SearchResults" tiddler), rather than actually displaying all matching tiddlers. You can also enable/disable the "incremental search" (key-by-key searching), so that a search is only initiated when you press the ENTER key or click on the "search:" prompt text.\n<<<\n!!!!!Configuration\n<<<\nIn additional to the checkboxes in AdvancedOptions, a self-contained control panel is included here for your convenience:\n<<option chkSearchTitles>> Search tiddler titles\n<<option chkSearchText>> Search tiddler text\n<<option chkSearchTags>> Search in tiddler tags\n<<option chkSearchTitlesFirst>> Show title matches first\n<<option chkSearchList>> Show list of matching tiddlers\n<<option chkSearchIncremental>> Incremental searching\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''SearchOptionsPlugin'' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for SearchOptionsPlugin handling^^\n\nWhen installed, this plugin automatically adds checkboxes in the AdvancedOptions shadow tiddler so you can enable/disable the extended search behavior. However, if you have customized your AdvancedOptions, you will need to manually add {{{<<option chkSearchTitles>>}}}, {{{<<option chkSearchText>>}}} and {{{<<option chkSearchTitlesFirst>>}}} (with suitable prompt text) to your customized tiddler.\n<<<\n!!!!!Revision History\n<<<\n''2006.02.03 [2.2.1]''\nrewrite timeout clearing code and blank search text handling to match 2.0.4 core release changes. note that core no longer permits "blank=all" searches, so neither does this plugin. To search for all, use "." with text patterns enabled.\n''2006.02.02 [2.2.0]''\nin search.handler(), KeyHandler() function clears 'left over' timeout when search input is < 3 chars. Prevents searching on shorter text when shortened by rapid backspaces (<500msec)\n''2006.02.01 [2.1.9]''\nin Story.prototype.search(), correct inverted logic for using/not using regular expressions when searching\nalso, blank search text now presents "No search text. Continue anyway?" confirm() message box, so search on blank can still be processed if desired by user.\n''2006.02.01 [2.1.8]''\nin doSearch(), added alert/return if search text is blank\n''2006.01.20 [2.1.7]''\nfixed setting of config.macros.search.reportTitle so that Tweaks can override it.\n''2006.01.19 [2.1.6]''\nimproved SearchResults formatting, added a "search again" form to the report (based on a suggestion from MorrisGray)\ndefine results report title using config.macros.search.reportTitle instead of hard-coding the tiddler title\n''2006.01.18 [2.1.5]''\nCreated separate functions for reportSearchResults(text,matches) and discardSearchResults(), so that other developers can create alternative report generators.\n''2006.01.17 [2.1.4]''\nUse regExp.search() instead of regExp.test() to scan for matches. Correctd the problem where only half the matching tiddlers (the odd-numbered ones) were being reported.\n''2006.01.15 [2.1.3]''\nAdded information (date/time, username, search options used) to SearchResults output\n''2006.01.10 [2.1.2]''\nuse displayTiddlers() to render matched tiddlers. This lets you display multiple matching tiddlers, even if SinglePageModePlugin is enabled.\n''2006.01.08 [2.1.1]''\ncorrected invalid variable reference, "txt.value" to "text" in story.search()\n''2006.01.08 [2.1.0]''\nre-write to match new store.search(), store.search.handler() and story.search() functions.\n''2005.12.30 [2.0.0]''\nUpgraded to TW2.0\nwhen rendering SearchResults tiddler, closeTiddler() first to ensure display is refreshed.\n''2005.12.26 [1.4.0]''\nadded option to search for matching text in tiddler tags\n''2005.12.21 [1.3.7]''\nuse \s\s to 'escape' single quotes in tiddler titles when generating "Open all matching tiddlers" link. Also, added access key: "O", to trigger "open all" link.\nBased on a suggestion by UdoBorkowski.\n''2005.12.18 [1.3.6]''\ncall displayMessage() AFTER showing matching tiddlers so message is not cleared too soon\n''2005.12.17 [1.3.5]''\nif no matches found, just display message and delete any existing SearchResults tiddler.\n''2005.12.17 [1.3.4]''\nuse """{{{""" and """}}}""" to 'escape' display text in SearchResults tiddler to ensure that formatting contained in search string is not rendered \nBased on a suggestion by UdoBorkowski.\n''2005.12.14 [1.3.3]''\ntag SearchResults tiddler with 'excludeSearch' so it won't list itself in subsequent searches\nBased on a suggestion by UdoBorkowski.\n''2005.12.14 [1.3.2]''\nadded "open all matching tiddlers..." link to search results output.\nBased on a suggestion by UdoBorkowski.\n''2005.12.10 [1.3.1]''\nadded "discard search results" link to end of search list tiddler output for quick self-removal of 'SearchResults' tiddler.\n''2005.12.01 [1.3.0]''\nadded chkSearchIncremental to enable/disable 'incremental' searching (i.e., search after each keystroke) (default is ENABLED).\nadded handling for Enter key so it can be used to start a search.\nBased on a suggestion by LyallPearce\n''2005.11.25 [1.2.1]''\nrenamed from SearchTitleOrTextPlugin to SearchOptionsPlugin\n''2005.11.25 [1.2.0]''\nadded chkSearchList option\nBased on a suggestion by RodneyGomes\n''2005.10.19 [1.1.0]''\nadded chkSearchTitlesFirst option.\nBased on a suggestion by ChristianHauck\n''2005.10.18 [1.0.0]''\nInitial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].\nBased on a suggestion by LyallPearce.\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.SearchTitleOrText = {major: 2, minor: 2, revision: 1, date: new Date(2006,2,3)};\n//}}}\n\n//{{{\nif (config.options.chkSearchTitles==undefined) config.options.chkSearchTitles=true;\nif (config.options.chkSearchText==undefined) config.options.chkSearchText=true;\nif (config.options.chkSearchTags==undefined) config.options.chkSearchTags=true;\nif (config.options.chkSearchTitlesFirst==undefined) config.options.chkSearchTitlesFirst=false;\nif (config.options.chkSearchList==undefined) config.options.chkSearchList=false;\nif (config.options.chkSearchIncremental==undefined) config.options.chkSearchIncremental=true;\n\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchTitles>> Search in tiddler titles";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchText>> Search in tiddler text";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchTags>> Search in tiddler tags";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchTitlesFirst>> Search results show title matches first";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchList>> Search results show list of matching tiddlers";\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSearchIncremental>> Incremental searching";\n//}}}\n\n//{{{\nif (config.macros.search.reportTitle==undefined)\n config.macros.search.reportTitle="SearchResults";\n//}}}\n\n//{{{\nconfig.macros.search.handler = function(place,macroName,params)\n{\n var lastSearchText = "";\n var searchTimeout = null;\n var doSearch = function(txt)\n {\n if (txt.value.length>0)\n {\n story.search(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);\n lastSearchText = txt.value;\n }\n };\n var clickHandler = function(e)\n {\n doSearch(this.nextSibling);\n return false;\n };\n var keyHandler = function(e)\n {\n if (!e) var e = window.event;\n switch(e.keyCode)\n {\n case 13: // ELS: handle enter key\n doSearch(this);\n break;\n case 27:\n this.value = "";\n clearMessage();\n break;\n }\n if (config.options.chkSearchIncremental)\n {\n if(this.value.length > 2)\n {\n if(this.value != lastSearchText)\n {\n if(searchTimeout) clearTimeout(searchTimeout);\n var txt = this;\n searchTimeout = setTimeout(function() {doSearch(txt);},500);\n }\n }\n else\n if(searchTimeout) clearTimeout(searchTimeout);\n }\n };\n var focusHandler = function(e)\n {\n this.select();\n };\n var btn = createTiddlyButton(place,this.label,this.prompt,clickHandler);\n var txt = createTiddlyElement(place,"input",null,null,null);\n if(params[0])\n txt.value = params[0];\n txt.onkeyup = keyHandler;\n txt.onfocus = focusHandler;\n txt.setAttribute("size",this.sizeTextbox);\n txt.setAttribute("accessKey",this.accessKey);\n txt.setAttribute("autocomplete","off");\n if(config.browser.isSafari)\n {\n txt.setAttribute("type","search");\n txt.setAttribute("results","5");\n }\n else\n txt.setAttribute("type","text");\n}\n//}}}\n\n//{{{\nStory.prototype.search = function(text,useCaseSensitive,useRegExp)\n{\n highlightHack = new RegExp(useRegExp ? text : text.escapeRegExp(),useCaseSensitive ? "mg" : "img");\n var matches = store.search(highlightHack,"title","excludeSearch");\n var q = useRegExp ? "/" : "'";\n clearMessage();\n if (!matches.length) {\n if (config.options.chkSearchList) discardSearchResults();\n displayMessage(config.macros.search.failureMsg.format([q+text+q]));\n } else {\n if (config.options.chkSearchList) \n reportSearchResults(text,matches);\n else {\n var titles = []; for(var t=0; t<matches.length; t++) titles.push(matches[t].title);\n this.closeAllTiddlers(); story.displayTiddlers(null,titles);\n displayMessage(config.macros.search.successMsg.format([matches.length, q+text+q]));\n }\n }\n highlightHack = null;\n}\n//}}}\n\n//{{{\nTiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag)\n{\n var candidates = this.reverseLookup("tags",excludeTag,false,sortField);\n\n // scan for matching titles\n var title_results = [];\n if (config.options.chkSearchTitles)\n for(var t=0; t<candidates.length; t++)\n if(candidates[t].title.search(searchRegExp)!=-1)\n title_results.push(candidates[t]);\n\n // scan for matching text\n var text_results = [];\n if (config.options.chkSearchText)\n for(var t=0; t<candidates.length; t++)\n if(candidates[t].text.search(searchRegExp)!=-1)\n text_results.push(candidates[t]);\n\n // scan for matching tags\n var tag_results = [];\n if (config.options.chkSearchTags)\n for(var t=0; t<candidates.length; t++)\n if(candidates[t].tags.join(" ").search(searchRegExp)!=-1)\n tag_results.push(candidates[t]);\n\n // merge the results, eliminating redundant matches\n var results = [];\n for(var t=0; t<title_results.length; t++) results.pushUnique(title_results[t]);\n for(var t=0; t<text_results.length; t++) results.pushUnique(text_results[t]);\n for(var t=0; t<tag_results.length; t++) results.pushUnique(tag_results[t]);\n\n // if not 'titles first', re-sort results to so titles, text and tag matches are mixed together\n if(!sortField) sortField = "title";\n var bySortField=function (a,b) {if(a[sortField] == b[sortField]) return(0); else return (a[sortField] < b[sortField]) ? -1 : +1; }\n if (!config.options.chkSearchTitlesFirst) results.sort(bySortField);\n return results;\n}\n//}}}\n\n// // ''REPORT GENERATOR''\n//{{{\nif (!window.reportSearchResults) window.reportSearchResults=function(text,matches)\n{\n var title=config.macros.search.reportTitle\n var q = config.options.chkRegExpSearch ? "/" : "'";\n var body="";\n\n // summary: nn tiddlers found matching '...', options used\n body+="''"+config.macros.search.successMsg.format([matches.length,q+"{{{"+text+"}}}"+q])+"''\sn";\n body+="^^//searched in:// ";\n body+=(config.options.chkSearchTitles?"''titles'' ":"");\n body+=(config.options.chkSearchText?"''text'' ":"");\n body+=(config.options.chkSearchTags?"''tags'' ":"");\n if (config.options.chkCaseSensitiveSearch||config.options.chkRegExpSearch) {\n body+=" //with options:// ";\n body+=(config.options.chkCaseSensitiveSearch?"''case sensitive'' ":"");\n body+=(config.options.chkRegExpSearch?"''text patterns'' ":"");\n }\n body+="^^";\n\n // numbered list of links to matching tiddlers\n body+="\sn<<<";\n for(var t=0;t<matches.length;t++) body+="\sn# [["+matches[t].title+"]]";\n body+="\sn<<<\sn";\n\n // open all matches button\n body+="<html><input type=\s"button\s" href=\s"javascript:;\s" ";\n body+="onclick=\s"story.displayTiddlers(null,["\n for(var t=0;t<matches.length;t++)\n body+="'"+matches[t].title.replace(/\s'/mg,"\s\s'")+"'"+((t<matches.length-1)?", ":"");\n body+="],1);\s" ";\n body+="accesskey=\s"O\s" ";\n body+="value=\s"open all matching tiddlers\s"></html> ";\n\n // discard search results button\n body+="<html><input type=\s"button\s" href=\s"javascript:;\s" ";\n body+="onclick=\s"story.closeTiddler('"+title+"'); store.deleteTiddler('"+title+"');\s" ";\n body+="value=\s"discard "+title+"\s"></html>";\n\n // search again\n body+="\sn\sn----\sn";\n body+="<<search \s""+text+"\s">> ";\n body+="<<option chkSearchTitles>>titles ";\n body+="<<option chkSearchText>>text ";\n body+="<<option chkSearchTags>>tags";\n body+="<<option chkCaseSensitiveSearch>>case-sensitive ";\n body+="<<option chkRegExpSearch>>text patterns";\n\n // create/update the tiddler\n var tiddler=store.getTiddler(title); if (!tiddler) tiddler=new Tiddler();\n tiddler.set(title,body,config.options.txtUserName,(new Date()),"excludeLists excludeSearch");\n store.addTiddler(tiddler); story.closeTiddler(title);\n\n // use alternate "search again" label in <<search>> macro\n var oldprompt=config.macros.search.label;\n config.macros.search.label="search again";\n\n // render tiddler\n story.displayTiddler(null,title,1); // force refresh\n\n // restore standard search label\n config.macros.search.label=oldprompt;\n\n}\n\nif (!window.discardSearchResults) window.discardSearchResults=function()\n{\n // remove the tiddler\n story.closeTiddler(config.macros.search.reportTitle);\n store.deleteTiddler(config.macros.search.reportTitle);\n}\n//}}}\n\n\n
/***\n| Name:|SiteMapMacro|\n| Author:|Simon Baird|\n| Location:|http://simonbaird.com/mptw/#SiteMapMacro|\n| Version:|1.0.3, 15-Mar-06|\n\n!!Examples\nSee SiteMap and SliderSiteMap for example usage.\n\n!!Parameters\n* Name of tiddler to start at\n* Max depth (a number) \n* Format (eg, nested, see formats below)\n* Don't show root flag (anything other than null turns it on)\n* Tags - a string containing a bracketed list of tags that we are interested in\n\n!!History\n* 1.0.3 (15-Mar-06)\n** added tag filtering\n* 1.0.2 (15-Mar-06)\n** Added json format and dontshowroot option\n* 1.0.1 (9-Mar-06)\n** Added selectable formats and fixed nested slider format\n* 1.0.0 (8-Mar-06)\n** first release\n\n***/\n//{{{\n\nversion.extensions.SiteMapMacro = {\n major: 1,\n minor: 0,\n revision: 3,\n date: new Date(2006,3,15),\n source: "http://simonbaird.com/mptw/#SiteMapMacro"\n};\n\nconfig.macros.siteMap = {\n\n formats: {\n bullets: {\n formatString: "%0[[%1]]\sn%2",\n indentString: "*"\n },\n\n // put this in your StyleSheet to make it look good.\n // .sliderPanel { margin-left: 2em; }\n\n sliders: {\n formatString: "[[%1]]+++\sn%2===\sn\sn",\n formatStringLeaf: "[[%1]]\sn"\n },\n\n openSliders: {\n formatString: "[[%1]]++++\sn%2===\sn\sn",\n formatStringLeaf: "[[%1]]\sn"\n },\n\n popups: {\n formatString: "[[%1]]+++^\sn%2===\sn\sn",\n formatStringLeaf: "[[%1]]\sn"\n },\n\n // these don't work too well\n openPopups: {\n formatString: "[[%1]]++++^\sn%2===\sn\sn",\n formatStringLeaf: "[[%1]]\sn"\n },\n \n // this is a little nuts but it works\n json: {\n formatString: '\sn%0{"%1":[%2\sn%0]}',\n formatStringLeaf: '\sn%0"%1"',\n indentString: " ",\n separatorString: ","\n }\n\n\n },\n\n defaultFormat: "bullets",\n\n treeTraverse: function(title,depth,maxdepth,format,dontshowroot,tags,excludetags) {\n\n var tiddler = store.getTiddler(title);\n var tagging = store.getTaggedTiddlers(title);\n\n if (dontshowroot)\n depth = 0;\n\n var indent = "";\n if (this.formats[format].indentString)\n for (var j=0;j<depth;j++)\n indent += this.formats[format].indentString;\n\n var childOutput = "";\n if (!maxdepth || depth < parseInt(maxdepth)) \n for (var i=0;i<tagging.length;i++)\n if (tagging[i].title != title) {\n if (this.formats[format].separatorString && i != 0)\n childOutput += this.formats[format].separatorString;\n childOutput += this.treeTraverse(tagging[i].title,depth+1,maxdepth,format,null,tags,excludetags);\n }\n\n if (childOutput == "" && (\n (tags && tags != "" && !tiddler.tags.containsAll(tags.readBracketedList())) ||\n (excludetags && excludetags != "" && tiddler.tags.containsAny(excludetags.readBracketedList()))\n )\n ) {\n // so prune it cos it doesn't have the right tags and neither do any of it's children\n return "";\n }\n\n if (dontshowroot)\n return childOutput;\n\n if (this.formats[format].formatStringLeaf && childOutput == "") {\n // required for nestedSliders\n return this.formats[format].formatStringLeaf.format([indent,title,childOutput]);\n }\n\n return this.formats[format].formatString.format([indent,title,childOutput]);\n },\n\n handler: function (place,macroName,params,wikifier,paramString,tiddler) {\n wikify(this.treeTraverse(\n params[0] && params[0] != '.' ? params[0] : tiddler.title, 1, \n params[1] && params[1] != '.' ? params[1] : null, // maxdepth\n params[2] && params[2] != '.' ? params[2] : this.defaultFormat, // format\n params[3] && params[3] != '.' ? params[3] : null, // dontshowroot\n params[4] && params[4] != '.' ? params[4] : null, // tags\n params[5] && params[5] != '.' ? params[5] : null // excludetags\n ),place);\n }\n\n}\n\n//}}}\n
/***\n\n''Inspired by [[TiddlyPom|http://www.warwick.ac.uk/~tuspam/tiddlypom.html]]''\n\n|Name|SplashScreenPlugin|\n|Created by|SaqImtiaz|\n|Location|http://lewcid.googlepages.com/lewcid.html#SplashScreenPlugin|\n|Version|0.21 |\n|Requires|~TW2.08+|\n!Description:\nProvides a simple splash screen that is visible while the TW is loading.\n\n!Installation\nCopy the source text of this tiddler to your TW in a new tiddler, tag it with systemConfig and save and reload. The SplashScreen will now be installed and will be visible the next time you reload your TW.\n\n!Customizing\nOnce the SplashScreen has been installed and you have reloaded your TW, the splash screen html will be present in the MarkupPreHead tiddler. You can edit it and customize to your needs.\n\n!History\n* 20-07-06 : version 0.21, modified to hide contentWrapper while SplashScreen is displayed.\n* 26-06-06 : version 0.2, first release\n\n!Code\n***/\n//{{{\nvar old_lewcid_splash_restart=restart;\n\nrestart = function()\n{ if (document.getElementById("SplashScreen"))\n document.getElementById("SplashScreen").style.display = "none";\n if (document.getElementById("contentWrapper"))\n document.getElementById("contentWrapper").style.display = "block";\n \n old_lewcid_splash_restart();\n \n if (splashScreenInstall)\n {if(config.options.chkAutoSave)\n {saveChanges();}\n displayMessage("TW SplashScreen has been installed, please save and refresh your TW.");\n }\n}\n\n\nvar oldText = store.getTiddlerText("MarkupPreHead");\nif (oldText.indexOf("SplashScreen")==-1)\n {var siteTitle = store.getTiddlerText("SiteTitle");\n var splasher='\sn\sn<style type="text/css">#contentWrapper {display:none;}</style><div id="SplashScreen" style="border: 3px solid #ccc; display: block; text-align: center; width: 320px; margin: 100px auto; padding: 50px; color:#000; font-size: 28px; font-family:Tahoma; background-color:#eee;"><b>'+siteTitle +'</b> is loading<blink> ...</blink><br><br><span style="font-size: 14px; color:red;">Requires Javascript.</span></div>';\n if (! store.tiddlerExists("MarkupPreHead"))\n {var myTiddler = store.createTiddler("MarkupPreHead");}\n else\n {var myTiddler = store.getTiddler("MarkupPreHead");}\n myTiddler.set(myTiddler.title,oldText+splasher,config.options.txtUserName,null,null);\n store.setDirty(true);\n var splashScreenInstall = true;\n}\n//}}}
config.macros.listTags = { text: "Hello" };\nconfig.macros.listTags.handler = function(place,macroName,params)\n{\n var tagged = store.getTaggedTiddlers(params[0]);\n var ul = createTiddlyElement(place,"ul",null,null,"");\n for(var r=0;r<tagged.length;r++)\n {\n var li = createTiddlyElement(ul,"li",null,null,"");\n createTiddlyLink(li,tagged[r].title,true);\n }\n}
This is a list of Plugins that are currently installed and in use at [[TiddlyWikiTips.com]].\n\nClicking a Plugin on the left will open it for you to view. \n\nIf you want to use any of these Plugins on //your// TiddlyWiki, just edit the Plugin, Copy and Paste the text into a new Tiddler in your TiddlyWiki file, and Tag it as "systemConfig". The next time you reload your TiddlyWiki file, the Plugin will be active...simple as that!
If you visit TiddlyWiki sites, be sure to click your browser's refresh/renew button. This will ensure that you're viewing the __Most Current Version__ of the site. Old cache and cookie data can sometimes prevent you from seeing the latest changes.\n\n(Thanks to Alvin Orzechowski for the tip!)
Here is an incomplete list of some excellent TiddlyWiki resource pages. If you want to be listed here, just email me at "jim at barr dot net" and I will gladly add your site!\n\n|[[TiddlyWiki|http://TiddlyWiki.com]] |Jeremy Ruston's official home of TiddlyWiki |\n|[[TiddlyForge|http://www.tiddlyforge.net]] |A news and Plugin/macro resource site from Devon Jones |\n|[[Monkey Pirate TiddlyWiki|http://simonbaird.com/mptw/]] |Simon Baird's excellent [[TagglyTagging|http://simonbaird.com/mptw1/#TagglyTagging]] site |\n|[[TiddlyTools|http://www.elsdesign.com/tiddlywiki/tiddlytools.html]] |ELS Design Studios' Tools page featuring lots of excellent Plugins |\n|[[Tutorial|http://www.blogjones.com/TiddlyWikiTutorial.html]] |A hands-on Tutorial|\n|[[Overview|http://euicho.com/index.php?p=123]] |A great overview of TiddlyWiki by Euicho|\n|[[TiddlyWikiTips|http://TiddlyWikiTips.com]] |TiddlyWiki Tips Resource (This site!) |\n|[[zRenard's TiddlyWiki Tips|http://www.zrenard.com/tiddlywiki/]] |Some Tips, Tools, and Styles for TiddlyWiki |\n|[[TiddlyWiki discussion forum|http://groups.google.com/group/TiddlyWiki]] |A Google Group devoted to all things TiddlyWiki |\n|[[Developer discussion forum|http://groups.google.com/group/TiddlyWikiDev]] |A Google Group focusing on TiddlyWiki development |\n|[[TiddlyWikiRequests|http://groups.google.com/group/TiddlyWikiRequests?lnk=li]] |A Google Group managing feature request discussions |\n
Click on any of the resources listed at the left to discover lots of links to more information, more uses, and more resoruces to broaden your TiddlyWiki experience!
Changes to this site are currently securely managed by [[Upload Plugin by BidiX|Plugin Upload]]. You cannot directly update this site without proper authentication. If you want to play around with this site to discover how TiddlyWiki works, either visit the TiddlyWiki site, or download this site directly to your PC by right-clicking [[this link|http://tiddlywikitips.com/index.html]] and selecting "Save link as..."
''24 tiddlers found matching '{{{dow}}}'''\n^^//searched in:// ''titles'' ''text'' ''tags'' ^^\n<<<\n# [[Bandwidth]]\n# [[Download]]\n# [[IdentityTheft]]\n# [[Link to folder]]\n# [[MainMenu]]\n# [[Monospace Text]]\n# [[NewDocumentPlugin]]\n# [[PageTemplate]]\n# [[Plugin HoverMenu]]\n# [[Plugin ImportTiddlers]]\n# [[Plugin InlineJavascript]]\n# [[Plugin PositionAdsense]]\n# [[Plugin QuickOpenTag]]\n# [[Plugin SearchOptions]]\n# [[SaveChanges]]\n# [[Site News 2006-02-15]]\n# [[Site News 2006-03-02]]\n# [[StyleSheet]]\n# [[Tip #08: Easy MainMenu editing]]\n# [[Tip #11: Linking to a Tiddler without using the full WikiWord *]]\n# [[Tip #14: Installing Plugins is as easy as 1-2-3!]]\n# [[UploadPlugin]]\n# [[Web Site Saving Changes]]\n# [[setDefaults]]\n<<<\n<html><input type="button" href="javascript:;" onclick="story.displayTiddlers(null,['Bandwidth', 'Download', 'IdentityTheft', 'Link to folder', 'MainMenu', 'Monospace Text', 'NewDocumentPlugin', 'PageTemplate', 'Plugin HoverMenu', 'Plugin ImportTiddlers', 'Plugin InlineJavascript', 'Plugin PositionAdsense', 'Plugin QuickOpenTag', 'Plugin SearchOptions', 'SaveChanges', 'Site News 2006-02-15', 'Site News 2006-03-02', 'StyleSheet', 'Tip #08: Easy MainMenu editing', 'Tip #11: Linking to a Tiddler without using the full WikiWord *', 'Tip #14: Installing Plugins is as easy as 1-2-3!', 'UploadPlugin', 'Web Site Saving Changes', 'setDefaults'],1);" accesskey="O" value="open all matching tiddlers"></html> <html><input type="button" href="javascript:;" onclick="story.closeTiddler('SearchResults'); store.deleteTiddler('SearchResults');" value="discard SearchResults"></html>\n\n----\n<<search "dow">> <<option chkSearchTitles>>titles <<option chkSearchText>>text <<option chkSearchTags>>tags<<option chkCaseSensitiveSearch>>case-sensitive <<option chkRegExpSearch>>text patterns
One of the neatest features of TiddlyWiki is that it is entirely self-contained in a single HTML file. It contains the actual hypertext document, and the JavaScript, CascadingStyleSheets and HTML necessary to both view and edit the document. This means that it is trivial to host a TiddlyWiki on a website, or to distribute one by email. And anyone with a reasonably recent web browser will be able to read and edit it.
<<search>><<closeAll>><<permaview>><<newTiddler>><<saveChanges>><<upload http://tiddlywikitips.com/store.php index.html backup>><<slider chkSliderOptionsPanel OptionsPanel 'options »' 'Change TiddlyWiki advanced options'>><<slider chkSliderContents [[TabContents]] 'contents »' 'contents'>><html><form action="https://www.paypal.com/cgi-bin/webscr" method="post">\n<input type="hidden" name="cmd" value="_s-xclick">\n<input type="image" src="https://www.paypal.com/en_US/i/btn/x-click-but21.gif" border="0" name="submit" alt="Make payments with PayPal - it's fast, free and secure!">\n<img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1">\n<input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----MIIHNwYJKoZIhvcNAQcEoIIHKDCCByQCAQExggEwMIIBLAIBADCBlDCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20CAQAwDQYJKoZIhvcNAQEBBQAEgYAiQffknGby4zuxPf7g/xNHdri4B3dyCat435jgdS8+NP7q/lNnKb/WNwx9wl5UMLBpvdu1VUVBvawARmridWx2APKXRpQt+FxhIdpUOVTnu9n68GmyqUS30ZUHFDWPwO4BUvhXDTX9pfR9LiOieNCOHEYh8nRm5Nl7cxSl8plH7jELMAkGBSsOAwIaBQAwgbQGCSqGSIb3DQEHATAUBggqhkiG9w0DBwQIGJ4GD0Kvgo2AgZCLbLc2oCrvxzJkpU/t3V1QupOem1Vhf7EZEFLREzX6twyL8aA/D3XEoNPPLETduystBKdy2/+l8SRblijS2OM08mTQsMT+lBcOGYdmjcdwqE/LvIn0tv60OljZJOmlOIfw+tfEplaudGZjVuXRF1xTjfckfLZh00JMiIZZCdOV3jGe2Z/SJFCzW+kjEUSSXuCgggOHMIIDgzCCAuygAwIBAgIBADANBgkqhkiG9w0BAQUFADCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20wHhcNMDQwMjEzMTAxMzE1WhcNMzUwMjEzMTAxMzE1WjCBjjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UEAxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMFHTt38RMxLXJyO2SmS+Ndl72T7oKJ4u4uw+6awntALWh03PewmIJuzbALScsTS4sZoS1fKciBGoh11gIfHzylvkdNe/hJl66/RGqrj5rFb08sAABNTzDTiqqNpJeBsYs/c2aiGozptX2RlnBktH+SUNpAajW724Nv2Wvhif6sFAgMBAAGjge4wgeswHQYDVR0OBBYEFJaffLvGbxe9WT9S1wob7BDWZJRrMIG7BgNVHSMEgbMwgbCAFJaffLvGbxe9WT9S1wob7BDWZJRroYGUpIGRMIGOMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxFDASBgNVBAoTC1BheVBhbCBJbmMuMRMwEQYDVQQLFApsaXZlX2NlcnRzMREwDwYDVQQDFAhsaXZlX2FwaTEcMBoGCSqGSIb3DQEJARYNcmVAcGF5cGFsLmNvbYIBADAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBAIFfOlaagFrl71+jq6OKidbWFSE+Q4FqROvdgIONth+8kSK//Y/4ihuE4Ymvzn5ceE3S/iBSQQMjyvb+s2TWbQYDwcp129OPIbD9epdr4tJOUNiSojw7BHwYRiPh58S1xGlFgHFXwrEBb3dgNbMUa+u4qectsMAXpVHnD9wIyfmHMYIBmjCCAZYCAQEwgZQwgY4xCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLUGF5UGFsIEluYy4xEzARBgNVBAsUCmxpdmVfY2VydHMxETAPBgNVBAMUCGxpdmVfYXBpMRwwGgYJKoZIhvcNAQkBFg1yZUBwYXlwYWwuY29tAgEAMAkGBSsOAwIaBQCgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0wNjA3MTAxNzQ2MTdaMCMGCSqGSIb3DQEJBDEWBBRvjIR6il4FXmeBtAABT40cFMACITANBgkqhkiG9w0BAQEFAASBgADwU58Yk0129fbrzk2/ewC/bH10v6xAEKgknDs494bQo8e6YGv/S6wZ/VL6og01XpG1eaw0Vb8Hc1zm82KU5Fu2nOWO2ginzhw7Hm1hG7vgqtmU5rEISc/Zo+xyKKp/LY9doxF+l9JM7UGbA7GUbdhj8e+J3cs4cAJjDMZ4cv+c-----END PKCS7-----\n">\n</form></html>
TiddlyWiki presents data in an easy to read and easy to manage way. There are no fancy editors and no complex administration screens. The learning curve is really quite low. "Out of the box", TiddlyWiki is completely usable with virtually zero instructions.
!Latest Site News - 2006-12-06:\n<<tiddler "Site News 2006-12-06">>\n\nClick the [[About]] link for more info on [[TiddlyWikiTips.com]]!!
''20-JUL-2005:'' I've added some additional content including some more Tips, a FAQ section, and a Definitions section, all of which I'll be expanding soon. Please contact me if you have any suggestions!
''21-JUL-2005:'' I've added a new SelectStyleSheetHelp Tiddler which contains instructions on how to add StyleSheet selection! This was developed by EricShulman from ELS Design Studios. Clicking on the options link on the Sidebar will reveal a new Stylesheets Selector!
''22-JUL-2005:'' Those who tried out the various TiddlyWikiAdaptations have probably tried Simon Baird's version. It implements Tagging very well, and since the introduction of Macros in TW, Simon converted most of his version mods into Plugin Tiddlers. Check out MonkeyPirateTiddlyWiki to see some great Plugin additions! Soon, I will be incorporating many of these into [[TiddlyWikiTips.com]].
''26-JUL-2005:'' "Alvin" gave me some suggestions for few minor "tweaks" to [[TiddlyWikiTips.com]]:\n*First, I made a simple modification to Simon Baird's excellent "TagglyWiki Style Tagging" Plugin so that lists now sort alphabetically by Title instead of by Modified Date. This makes lists like [[Definitions]] more readable.\n*Second, I added Wikipedia page links to several of the definitions. Some of the definitions are from Wikipedia, but Wikipedia's pages go into a lot more depth, so I suggest you check them out.\n*Finally, I added a definition for [[Tiddler]]. Amazingly, Wikipedia had one!\n\nThanks Alvin for your feedback!
''01-AUG-2005:'' Alvin Orzechowski submitted a great Tip on creating a "tabbed, self-referenceing To Do list" that not only looks great, but is easy to create. The Tip contains instructions as well as a link to a working example! Ina ddition, I built upon that Tip and created an extended version in another Tip! I also upgraded the site to the latest version, 1.2.29.
''02-AUG-2005:'' I made a few tweaks to the StyleSheet to (in my opinion) improve the look of the site. I also removed several Plugin Tiddlers that were not really useful for a Web site.
''05-AUG-2005:'' Thanks to Peter Organisciak for pointing out a StyleSheet error. It is now fixed. I also cleaned up some of the Tiddlers and removed several no longer needed Plugins. <<tiddler Plugins>>
''07-AUG-2005:'' Posted a new Tip dealing with creating "pretty" Tiddler Names. Thanks to the guys on the TiddlyWiki Group over at [[Google Groups|http://groups.google.com]] for this one!
''17-AUG-2005:'' I've added a [[new Tip|Tip #12: TiddlyWiki Internal Macros]] that documents TiddlyWiki's many Internal Macros. Most are undocumented--until now! They can provide you with some excellent features and opportunities when customizing your TiddlyWiki!
Well, it's been several months since [[TiddlyWikiTips.com]] has been updated, but some new content and some changes are coming. Stay tuned!\n\n''What's Been Happening''\nFirst off, TiddlyWiki has been upgraded to v2. This new version adds a number of excellent core features that really make TiddlyWiki shine. I'll detail these shortly. Also, several new Plugins have been developed that make TiddlyWiki stand out. Notably is the new [[Upload Plugin by BidiX|Plugin Upload]]. This plugin, combined with a simple PHP script, makes updating to the Web a snap! No more saving files locally, editing, and then FTP'ing back to the site. A simple click of the "save to web" button auto-saves back to the Web! Very nice!\n\n''What's coming''\nI've upgraded [[TiddlyWikiTips.com]] to v2.0.3, and have re-done the layout and design. (A special thanks goes to Simon Baird for his site style. I really like the clean and professional look, so I incorporated several of his elements into [[TiddlyWikiTips.com]]. His site is at: http://simonbaird.com/mptw/)\n\nStay tuned for some updated news and tips!
Version 2 of TiddlyWiki has proven to be an incredibly powerful upgrade. While it has required a re-write of many Plugins, the Plugin developers have been working 'round the clock to update them. Do check it out at http://TiddlyWiki.com!\n!!Some quick updates:\nI re-worked the Style of [[TiddlyWikiTips.com]] based on Simon Baird's [[MonkeyPirate|http://simonbaird.com/mptw/]] site. I hope you like it! I've also added a [[Resources]] page to provide lots of links to all things TiddlyWiki. Finally, I put together a proof-of-concept TiddlyWiki Adaptation called [[TiddlyWikiTasks|http://TiddlyWikiTips.com/TiddlyWikiTasks.html]] to demonstrate how to use TiddlyWiki as a Task Manager by leveraging just a couple excellent Plugins. It still ahs some rough edges, but it is fully functional and completely customizable!\n
Chris Rechtsteiner requested an "empty" TiddlyWiki file that contains all the styling and function of TiddlyWIkiTips.com without all the data, so here it is:\n\nhttp://TiddlyWikiTips.com/tiddlywikitips_empty.html\n\nClick on the link to view it, or right-click on the link to download the file.\n\nHave fun!
After receiving some great feedback on the [[TiddlyWiki Google Group|http://groups.google.com/group/TiddlyWiki?lnk=li]], I found that the "Breadcrumbs" plugin was causing Firefox v1.5.0.1 to crash, so I removed it. If a new version becomes available, I'll move it back in. In the mean time, I added the "defaultHome" Macro in the MainMenu, so clicking the Home button will always remove all displayed Tiddlers and re-display the default Tiddlers.\n\nI have included some new StyleSheet updates to help improve the overall look and function of this site, as well as improving Internet Explorer compatibility. I also "modularized" the StyleSheet so that I can more easily tailor specific sections. Look at the [[Styles]] Tiddler for a list of all Style-related Tiddlers.\n\nFinally, I updated the "empty" version of this site. Click the [[Download]] link to see how to get it!
I added two more Tips detailing how to install a Plugin, and how to customize buttons to create customized Tiddlers using an excellent Plugin (thanks to Jona Jeffords for the inspiration for this one!)\n\nTiddlyWiki continues to develop and mature, and [[TiddlyWikiTips.com]] will try to keep up with the progress. I will be adding a few more Tips and re-working some of the older ones that by now are not as accurate as they could be.\n\nAnd in the infamous words of [[Veronica Corningstone|http://www.imdb.com/title/tt0357413/]], "Thanks for stopping by!"\n
<<tiddler "TiddlyWikiTips.com is 1 year old!">>
Well, the year is quickly coming to a close. I hope you have had a blessed year.\n\n[[Dave Gifford|http://giffmex.org/]] has created an excellent TiddlyWiki tutorial called "[[TiddlyWiki For The Rest of Us|http://giffmex.org/twfortherestofus.html]]" that walks you through the basics of the why, what, and how of TiddlyWiki. New and seasoned users alike will glean lots of great information from this tutorial. Do check it out!\n\nIf you have any suggestions or tips for this site, please feel free to [[contact me|Jim Barr]]!
\n|<<siteMap "Site News">><<siteMap Help>>|\n|noBorder threeCol|k\n
Your TiddlyWiki [[Tips]] Resource! (TW v<<version>>)
[img[http://g04.com/images/avatar.gif]] [[TiddlyWikiTips.com]]
A Sparkline is a graphic image displaying lines of varying heights depending on the numeric value of the data.\n\n<<sparkline 163 218 231 236 232 266 176 249 289 1041 1835 2285 3098 2101 1755 3283 3353 3335 2898 2224 1404 1354 1825 1839 2142 1942 1784 1145 979 1328 1611 49 289 1041 1835 2285 3098 2101 1755 3283 3353 3335 2898 2224 1404 1354 1825 1839 2142 1942 1784 1145 979 1328 1611 49 289 1041 1835 2285 3098 2101 1755 3283 3353 3335 2898 2224 1404 1354 1825 1839 2142 1942 1784 1145 979 1328 1611 49 289 1041 1835 2285 3098 2101 1755 3283 3353 3335 2898 2224 1404 1354 1825 1839 2142 1942 1784 1145 979 1328 1611>>\n\nThe following:\n<<sparkline 163 218 231 236 232 266>>\nwas created using this code:\n{{{\n<<sparkline 163 218 231 236 232 266>>\n}}}\nTiddlyWiki uses Wiki style markup, a way of lightly "tagging" plain text so it can be transformed into HTML. Edit this Tiddler to see samples.
/***\nIncluded Styles\n***/\n/*{{{*/\n[[Styles TagglyTagging]]\n[[Styles HorizontalMainMenu]]\n[[Styles MessageArea]]\n[[Styles SideBarOptions]]\n[[Styles Calendar]]\n[[Styles Editor]]\n[[Styles Breadcrumbs]]\n/*}}}*/\n\n/***\nCosmetic fixes\n***/\n/*{{{*/\nh1,h2,h3,h4,h5 { color: #000; background: transparent; }\n\nbody { \n background: #eee; }\n\n.headerShadow {\n padding: 1.0em; }\n\n.headerForeground {\n padding: 1.0em; }\n\n.selected .tagging, .selected .tagged {\n padding: 0.5em;\n background-color: #eee;\n border-top: 1px solid #ccc; \n border-left: 1px solid #ccc; \n border-bottom: 3px solid #ccc; \n border-right: 3px solid #ccc; \n -moz-border-radius: 1em; }\n\n.shadow .title {\n color: #999; }\n\n.siteTitle {\n font-size: 2.5em; }\n\n.siteSubtitle {\n font-size: 1.0em; }\n\n.tabSelected{\n padding-top: 0.0em;\n padding-left: 1em;\n padding-right: 1em;\n -moz-border-radius-topleft: 0.5em; \n -moz-border-radius-topright: 0.5em;}\n\n.tabUnselected {\n padding-top: 0.0em;\n padding-left: 1em;\n padding-right: 1em;\n -moz-border-radius-topleft: 0.5em; \n -moz-border-radius-topright: 0.5em;}\n\n.tabContents {\n margin: 0px;\n padding-top: 0px;\n padding-bottom: 0px;\n padding-left: 2px;\n padding-right: 2px;\n -moz-border-radius: 1em; }\n\n.tagging, .tagged {\n padding: 0.5em;\n background-color: #eee;\n border-top: 1px solid #ccc; \n border-left: 1px solid #ccc; \n border-bottom: 3px solid #ccc; \n border-right: 3px solid #ccc; \n -moz-border-radius: 1em; }\n\n.tiddler {\n border-top: 1px solid #ccc; \n border-left: 1px solid #ccc; \n border-bottom: 3px solid #ccc; \n border-right: 3px solid #ccc; \n margin: 0.5em; \n background:#fff; \n padding: 0.5em; \n -moz-border-radius: 1em; }\n\n.title {\n color:black; \n font-size: 2em; }\n\n.viewer .listTitle { \n list-style-type: none; \n margin-left: -2em; }\n\n.viewer pre { \n background-color: #f8f8ff; \n border-color: #ddf }\n\n/*}}}*/\n
@media print {\n#mainMenu, #sidebar, #messageArea, #breadCrumbs, #topMenu, .siteTitle, .siteSubtitle {display: none ! important;}\n#displayArea {margin: 0.5em 0.5em 0em 0.5em;}\n}\n
These Styles represent all of the CSS Style data that control the look and feel of this site.\n\nNote that I recently "modularized" the StyleSheet Tiddler so that "Styles xxxx" Tiddlers are "called" by StyleSheet. This makes for better troubleshooting.\n\nIf you wish to use these Styles, please be sure to copy them all, because they are all called from within StyleSheet.
/***\nBreadcrumbs\n***/\n/*{{{*/\n#breadCrumbs {\n background: #fff;\n margin: 0px;\n}\n\n#breadCrumbs .button,\n#breadCrumbs .tiddlyLinkExisting, \n#breadCrumbs .tiddlyLinkNonExisting { \n background: #fff;\n color: #3399AA; \n font-weight: bold;\n border-top: 1px solid #ccc; \n border-left: 1px solid #ccc; \n border-bottom: 2px solid #ccc; \n border-right: 2px solid #ccc; \n margin: 0px;\n padding-top: 0px;\n padding-bottom: 0px;\n padding-left: 5px;\n padding-right: 5px; }\n\n#breadCrumbs .button:hover,\n#breadCrumbs .tiddlyLinkExisting:hover, \n#breadCrumbs .tiddlyLinkNonExisting:hover {\n border-top: 2px solid #ccc; \n border-left: 2px solid #ccc; \n border-bottom: 1px solid #ccc; \n border-right: 1px solid #ccc; \n margin: 0px;\n padding-top: 0px;\n padding-bottom: 0px;\n padding-left: 5px;\n padding-right: 5px; }\n/*}}}*/\n
/***\nCalendar\n***/\n/*{{{*/\n.calendar a { margin:0px !important; padding:0px !important; } \n/*}}}*/\n
/***\nStyles Editor\n***/\n/*{{{*/\n.editor textarea {height:200px;background-color:#F2F2F2;}\n\n.editorFooter .button { \n padding-top: 0px; \n padding-bottom:0px; \n background: #fff;\n color: #000; \n border-top: 1px solid #ccc; \n border-left: 1px solid #ccc; \n border-bottom: 2px solid #ccc; \n border-right: 2px solid #ccc; \n margin-left: 3px;\n padding-top: 1px;\n padding-bottom: 1px;\n padding-left: 5px;\n padding-right: 5px; }\n \n.editorFooter .button:hover { \n border-top: 2px solid #ccc; \n border-left: 2px solid #ccc; \n border-bottom: 1px solid #ccc; \n border-right: 1px solid #ccc; \n margin-left: 3px;\n padding-top: 1px;\n padding-bottom: 1px;\n padding-left: 5px;\n padding-right: 5px; }\n/*}}}*/\n
/***\nTo use, add {{{[[Styles HorizontalMainMenu]]}}} to your StyleSheet tiddler, or you can just paste the CSS in directly. See also HorizontalMainMenu and PageTemplate.\n***/\n/*{{{*/\n\n#topMenu br {display:none; }\n#topMenu { background: #39a; }\n#topMenu { padding:2px; }\n#topMenu .button, #topMenu .tiddlyLink { padding-left:1em; padding-right:1em; color:white; font-size:115%;}\n#displayArea { margin: 1em 15.7em 0em 1em; }\n\n/* just in case want some QuickOpenTags in your topMenu */\n#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }\n#topMenu .quickopentag .tiddlyLink { padding-right:1px; }\n#topMenu .quickopentag .button { padding-left:1px; border:0px; }\n\n\n/*}}}*/
/***\nStyle Message Area\n***/\n/*{{{*/\n#messageArea { \n background-color: #eee; \n border-color: #8ab; \n border-width: 4px; \n border-style: dotted; \n font-size: 90%; \n padding: 0.5em; \n -moz-border-radius: 1em; }\n#messageArea .button { text-decoration:none; font-weight:bold; background:transparent; border:0px; }\n#messageArea .button:hover {background: #acd; }\n/*}}}*/\n
/***\nStyles SideBarOptions\n***/\n/*{{{*/\n#sidebarOptions .sliderPanel {\n border: 0px solid #ccc; \n background-color: #eee;\n margin: 0px;\n margin-left: 0.5em;\n padding: 0px;\n -moz-border-radius: 1em; }\n\n#sidebarOptions .sliderPanel .tabSelected{\n border: 1px solid #ccc; \n background-color: #fff;\n margin: 0px;\n padding-top: 5px;\n padding-bottom: 0px;\n padding-left: 2px;\n padding-right: 2px;\n -moz-border-radius-topleft: 1em; \n -moz-border-radius-topright: 1em;}\n\n#sidebarOptions .sliderPanel .tabUnselected{\n border: 1px solid #ccc; \n background-color: #eee;\n margin: 0px;\n padding-top: 5px;\n padding-bottom: 0px;\n padding-left: 2px;\n padding-right: 2px;\n -moz-border-radius-topleft: 1em; \n -moz-border-radius-topright: 1em;}\n\n#sidebarOptions { \n border-top: 1px solid #ccc; \n border-left: 1px solid #ccc; \n border-bottom: 3px solid #ccc; \n border-right: 3px solid #ccc; \n padding: 0.5em; \n margin: 0.5em; \n -moz-border-radius: 1em; }\n\n#sidebarOptions .button {\n margin: 1px;\n border-color:white;\n border-top: 1px solid #ccc; \n border-left: 1px solid #ccc; \n border-bottom: 2px solid #ccc; \n border-right: 2px solid #ccc; \n}\n\n#sidebarOptions .button:hover {\n color: #000;\n background: #fff;\n border-top: 2px solid #ccc; \n border-left: 2px solid #ccc; \n border-bottom: 1px solid #ccc; \n border-right: 1px solid #ccc; \n}\n\n#sidebarOptions .button:active {\n color: #000;\n background: #fff;\n}\n/*}}}*/\n
/***\nTo use, add {{{[[Styles TagglyTagging]]}}} to your StyleSheet tiddler, or you can just paste the CSS in directly. See also ViewTemplate, EditTemplate and TagglyTagging.\n***/\n/*{{{*/\n.tagglyTagged li.listTitle { display:none;}\n.tagglyTagged li { display: inline; font-size:90%; }\n.tagglyTagged ul { margin:0px; padding:0px; }\n.tagglyTagging { padding-top:0.5em; }\n.tagglyTagging li.listTitle { display:none;}\n.tagglyTagging ul { margin-top:0px; padding-top:0.5em; padding-left:2em; margin-bottom:0px; padding-bottom:0px; }\n\n/* .tagglyTagging .tghide { display:inline; } */\n\n.tagglyTagging .button { display:none; margin-left:3px; margin-right:3px; }\n.tagglyTagging .button, .hidebutton { color:#aaa; font-size:90%; border:0px; padding-left:0.3em;padding-right:0.3em;}\n.tagglyTagging .button:hover, .hidebutton:hover { background:#eee; color:#888; }\n.selected .tagglyTagging .button { display:inline; }\n\n.tagglyLabel { color:#aaa; font-size:90%; }\n\n\n.editLabel { font-size:90%; padding-top:0.5em; }\n/*}}}*/\n
<<tabs txtMainTab Timeline Timeline TabTimeline All 'All tiddlers' TabAll Tags 'All tags' TabTags More 'More lists' TabMore>>
You can create a table by enclosing text in sets of vertical bars (||, or shift-backslash on your keyboard). \n|!Headings: add an exclamation point (!) right after the vertical bar.|!Heading2|!Heading3|\n|Row 1, Column 1|Row 1, Column 2|Row 1, Column 3|\n|>|>|Have one row span multiple columns by using a >|\n|Have one column span multiple rows by using a ~|>| Use a space to right-align text in a cell|\n|~|>| Enclose text in a cell with spaces to center it |\n|>|>|bgcolor(#6699CC):Add color to a cell using bgcolor(yourcolorhere):|\n|Add a caption by ending the table with a vertical bar followed by a c|c\n\nThe following code generated the Table above:\n{{{\n|!Headings: add an exclamation point (!) right after the vertical bar.|!Heading2|!Heading3|\n|Row 1, Column 1|Row 1, Column 2|Row 1, Column 3|\n|>|>|Have one row span multiple columns by using a >|\n|Have one column span multiple rows by using a ~|>| Use a space to right-align text in a cell|\n|~|>| Enclose text in a cell with spaces to center it |\n|>|>|bgcolor(#6699CC):Add color to a cell using bgcolor(yourcolorhere):|\n|Add a caption by ending the table with a vertical bar followed by a c|c\n}}}\nTiddlyWiki uses Wiki style markup, a way of lightly "tagging" plain text so it can be transformed into HTML. Edit this Tiddler to see samples.
Managing tasks can be very cumbersome or very easy depending on how you approach it. While I certaniy am not a very organized person, at least I understand the concepts! ;-) Using TiddlyWiki is a suprisingly effective way to manage Tasks. There are several versions among the [[Alternative TiddlyWiki sites]] that try to address Task management. Do check them out. \n\nThe latest versions of TiddlyWiki includes a Macro capability that lets you significantly extend TiddlyWiki's capabilities. One excellent example is leveraging the Tag function to categorize Tiddlers usina a summary "Tag Listing" to display the Tiddler Titles. This lets you create a Tiddler that automatically populates itself with the Titles of all Tiddlers with a specific Tag. (See [[Tip #4|Tip #4: Tag Listing *]] for specific details on creating a Tag Listing.) \n\nHere's what I did:\n*First, I created two Tiddlers, one titled "Pending Tasks" and the other titled "Completed Tasks". The first has a Macro {{{<}}}{{{<listTags Todo>>}}} embeded in the body and the second has the Macro {{{<}}}{{{<listTags Todo/done>>}}}.\n*I then created my Task Tiddlers by creating separate Tiddlers for each Task with the Tiddler Title identifying the task, the Tiddler Body describing the task, and the Tag set to Todo which categorizes the Task.\nNow, when I display the "Pending Tasks" Tiddler, it automatically displays all Tasks tagged as Todo. When I complete a Task, I just edit its Tiddler and change its Tag to Todo/done and it drops out of the "Pending Tasks" Tiddler and shows up on the "Completed Tasks" Tiddler.\n\nIt's still in its infancy, but it does work well and devlopment is continuing to help refine the concept of managing Tasks.
Tiddler\n[[Wikipedia|http://en.wikipedia.org/wiki/Wiki]] defines a "Tiddler" as: \n>A Tiddler (sometimes called a Tiddle) is an entry in a TiddlyWiki. It is equivalent to a wiki page and uses a simplified markup language very similar to that used by Wikipedia. In fact the source text for this entry was entered in a TiddlyWiki and yielded pretty much the same display. Compared to a Wikipedia page though, there are some interesting differences:\n>* When a Tiddler is created or edited in an original TiddlyWiki found online, it cannot be saved online. Some, but not all, TiddlyWiki Adaptations do allow their Tiddlers to be saved online.\n>* Selected Tiddlers are all displayed on the same page.\n>* Anything written in CamelCase is assumed to be a Tiddler and is rendered as a link into the TiddlyWiki. If it exists, the link will display as bold. If it does not exist, clicking on the unbolded link will cause TiddlyWiki to create the Tiddler and go into Edit mode.\n>\n>When a user wishes to update their TiddlyWiki copy from the originating TiddlyWiki, either to get a bug-fix or new functionality, the standard update procedure never changes Tiddlers. This discipline ensures that the user never loses their own TiddlyWiki's content.\n>\n>And there are a number of special Tiddlers that control parts of the TiddlyWiki display, like the header, the subheader, the main menu, and the Tiddlers that will be displayed when the TiddlyWiki first comes up. Changing the text of these Tiddlers allows the TiddlyWiki owner to very easily customize how their TiddlyWiki looks without any knowledge of web page understructure. But if the user has a good working knowledge of CSS or JavaScript, there are even special Tiddlers that allow the user to override the original CSS code and to insert JavaScript code to further customize functionality (add Macros). Because these customizations are enclosed in Tiddlers, users do not have to worry about losing them if they ever need to upgrade.\n\n(Click [[here|http://en.wikipedia.org/wiki/Tiddler]] for Wikipedia's page)
To create a Tiddler link, just use mixed-case WikiWord, or use [[brackets]] for NonWikiWordLinks.\n\nNote that existing Tiddlers are in bold and empty Tiddlers are in italics. See CreatingTiddlers for details.\nYou can prefix a WikiWord with a tilde character so as to not wikify a word like. For example, {{{~ThisOne}}} yields: ~ThisOne.\n\nYou can also use brackets to specify the displayed text of a tiddler reference. For example, [[a link like this one|TiddlyWiki]] points to the TiddlyWiki tiddler.\n\nTiddlyWiki uses Wiki style markup, a way of lightly "tagging" plain text so it can be transformed into HTML. Edit this Tiddler to see samples.
This is an example of Tiddler content that is displayed inline. This content exists in a separate Tiddler called TiddlerExample. To edit the content, you must edit the TiddlerExample Tiddler.
A TiddlyWiki is like a blog because it's divided up into neat little chunks, but it encourages you to read it by hyperlinking rather than sequentially: if you like, a non-linear blog analogue that binds the individual microcontent items into a cohesive whole. I think that TiddlyWiki represents a novel medium for writing, and will promote it's own distinctive WritingStyle. This is the ThirdVersion of TiddlyWiki, which adds several NewFeatures. There are also several TiddlyWikiAdaptations by other developers based on earlier versions.
Here is an incomplete list of some excellent TiddlyWiki Adaptations. If you want to be listed here, just email me at "jim at barr dot net" and I will gladly add your site!\n|~JimBarr's ~TiddlyWikiTasks |http://TiddlyWikiTips.com/TiddlyWikiTasks.html|\n|~KeithHodges' ~TiddlyPom |http://www.warwick.ac.uk/~tuspam/tiddlypom.html|\n|~RodneyGomes' ~RoWiki, based on PyTW |http://rodney.gotdns.com/|\n|~LarsEnglund's ~TiddlyWikiRDF |http://larsenglund.com/TiddlyWikiRDF/|\n|~BramChen's ~PrinceTiddlyWiki |http://ptw.sf.net/index-en.html|\n|~JoshGoebel's ~ServerSideWiki |http://www.serversidewiki.com|\n|~MasakiYatsu's ~LesserWiki |http://lesserwiki.org/|\n|~MichaelBridgen's ~StickyWiki |http://www.squaremobius.net/~mikeb/Darcs/sticky-wiki/|\n|~DavidHarper's ~BloTid |http://www.spacecoastweb.net/BloTid/Tiddly/|\n|~EricShulman's ELS Design site |http://www.elsdesign.com/tiddlywiki/|\n|~JacquesTurbé's ~TidliPo, in French |http://avm.free.fr/tidlipo.html|\n|~JoeRaii's pytw |http://www.cs.utexas.edu/~joeraii/pytw/ |\n|and his Siglet |http://www.cs.utexas.edu/~joeraii/siglet/|\n|~JároliJózsef's ~MagyarTiddlyWiki |http://innen.hu/MagyarTiddlyWiki in Hungarian|\n|Yoshimov's ~EncryptedTiddlyWiki |http://wiki.yoshimov.com/?page=EncryptedTiddlyWiki|\n|~TiagoDionizio's ~TsWiki using Tcl and ~SQLite |http://mega.ist.utl.pt/~tngd/wiki/|\n|~TimMorgan's ~ZiddlyWiki based on Zope |http://timmorgan.org/ZiddlyWiki/|\n|~SteveRumsby's ~YetAnotherTiddlyWikiAdaptation |http://www.rumsby.org/yatwa/|\n|~PhonoHawk's ~PerlTiddlyWiki |http://ccm.sherry.jp/tiddly/|\n|~NathanBower's ~GTDTiddlyWiki |http://shared.snapgrid.com/gtd_tiddlywiki.html|\n|~SimonBaird's ~MonkeyPirateTiddlyWiki |http://simonbaird.com/mptw/|\n|~GeetDuggal's ~PileTiddly |http://www.geetduggal.com/PileTiddly/|\n|~DanPhiffer's ~TiddlyWikiRemote |http://phiffer.org/tiddly/|\n|~JonnyLeRoy's ~TiddlyTagWiki |http://www.digitaldimsum.co.uk/|\n|~JodyFoo's ~TagglyWiki |http://informationality.com/tagglywiki/tagglywiki.html|\n|~ChristianHauck's |http://www.christianhauck.net/html/14300.html|\n|~TonyLownds's ~TiddlyHacks |http://tony.lownds.com/tiddly/dev/cgi/index.cgi|\n|~AlanHecht's ~QwikiWeb |http://snipurl.com/qwikiweb|\n|~TimCuthbertson and ~MattGiuca's ~TiddlyWikiCSS |http://codestar.lidonet.net/misc/tiddlywikicss.html|\n|~PeterLazarev's further improvements |http://petka.webhop.net/#NiceTiddlyWiki|\n|~PatrickCurry and ~GabrielJeffrey's ~PhpTiddlyWiki |http://www.patrickcurry.com/tiddly/|\n|~KevemBuangga's ~TiddlyWikiClone |http://www.kevembuangga.com/hwk/hailiwiki.htm|\n|Inspired by ~TiddlyWiki, Dr ~MichaelRees' ~DotWikIE |http://comet.it.bond.edu.au/dotsoft/Pages/dotwikiehome.aspx|\n
[[TiddlyWikiTips.com]] is a tips site developed by [[Jim Barr]] to provide Tips for TiddlyWiki users. [[TiddlyWikiTips.com]] is hosted on [[Flexihostings.net|http://flexihostings.net]] and uses TiddlyWiki.
~TiddlyWikiTips.com launched on July 15, 2005!\n\nThanks to ''Jeremy'' for creating TiddlyWiki...\nThanks to all of the TiddlyWiki ''devotees'' for improving it...\nThanks to all the ''visitors'' to TiddlyWikiTips.com!\n\n[img[http://myspaceontheweb.com/images/TWBirthday.gif]]
Don't forget that in most cases, alternate StyleSheet settings are simply replacements to existing style elements. Because of that, you do not need to include the entire style in your new StyleSheet. This can save you significant space.\n\nFor example, say you want to change the font size in the body. The default style setting looks like this:\n\nbody {\n background-color: #ffffff;\n font-size: 9pt;\n font-family: verdana,arial,helvetica;\n margin: 0em 0em 0em 0em;\n padding: 0em 0em 0em 0em;\n position: relative;\n z-index: 0;\n}\n\nYou only need to include the replaced element like this:\n\nbody {\n font-size: 10pt;\n}\n\ninstead of including the entire style like this:\n\nbody {\n background-color: #ffffff;\n font-size: 10pt;\n font-family: verdana,arial,helvetica;\n margin: 0em 0em 0em 0em;\n padding: 0em 0em 0em 0em;\n position: relative;\n z-index: 0;\n}\n\nThe only time this wouldn't work is if the default styles in TiddlyWiki change.
One idiosyncracy that I noticed about the TiddlyWiki backup strategy is that it writes full versions of itself using filenames containing date and time stamps. \n\nFor example: index.20050715.1434310359.html\n\nWhile this provides full tracability, it can fill a directory with files very quickly if you make lots of content updates.\n\nIf you don't need the full tracability of complete backups every time a change is made, but still want a backup, just make this small patch to the TW code:\n\nLook for this line of code at about line 2217 beginning with:\n\nvar backupPath = localPath.substr(0,localPath.lastIndexOf(".")) + "." + \n\nReplace this part:\n\n+ "." + (new Date()).convertToYYYYMMDDHHMMSSMMM() + ".html";\n\nwith this:\n\n+ ".backup.html";\n\nThis results in a single backup file named with a ".backup.html" extension.\n\nFor example: index.backup.html\n\nThis can really save you some space on a ThumbDrive.\n\nObviously, any change history is only retained back one revision.
Here's a TiddlyWiki Tip submitted by "Lourens of Quadsk8" concerning StyleSheet formtting:\n\nThe StyleSheet tiddler can be nicely formatted using some special coding. Edit this Tiddler to view the code.\n\n/*\n{{{\n*/\n...CSS...\n}}}\n\nYou replace the "...CSS..." with your customized code.\n\nI also put\n\n.viewer pre { width: 100%; overflow: auto; }\n\nin the StyleSheet so the CSS will remain in (behind) the tiddler-text area.\n\n* Thanks to "Lourens of Quadsk8" for this tip!
How would you like to create a Tiddler that contains an automatically updated listing of all the titles of Tiddlers with a specific Tag?\n\nAs an example, let's look at two lists that [[TiddlyWikiTips.com]] uses: [[The Tips]] and [[Formatting]]. Previously, I created a "master" Tiddler for each and then manually added the Tiddler Titles to each list. Initially, this was no big deal because the number of items is very small, but as the list grows, this will become increasingly tedious.\n\nNow, using the [[listAll]] Macro, it's a simple matter of including a single line of code in the Tiddler:\n\n{{{<}}}<listTags Tagname>>\n\nwhere Tagname is the name of the Tag assigned to the Tiddler group, in this case, "Tips" or "Formatting".\n\n''How to set up and use the listAll macro''\nYou first create a new Tiddler and include the code found in the [[listAll]] Tiddler. You call it listAll, and give it a Tag of systemConfig. SaveChanges, and reload the HTML file. the [[listAll]] code will integrate itself as the page loads. \n\nNext, create a new Tiddler and include the following code:\n\n{{{<}}}<listTags Tagname>>\n\nreplacing "Tagname" with any valid Tag. Your list will now auto-generate!\n\nThe huge advantage of this is that you don't have to manually update the master Tiddler. It gets updated automatically as tags are assigned or removed from Tiddlers. And you can include multiple [[listAll]] macros in your Tiddler!\n\nHere are some UsefulListAllMacroAplications.\n\n* Thanks to Joseph Reisinger for offering the components for this tip!
I found a great link to a simple .php application used to generate code to display Calendars in TiddlyWiki:\n\n http://zrenard.com/tiddlywiki/cal.php\n\nYou can create Monthly or Yearly calendars. by tweaking the many excellent options, you can tailor the resulting calendar to your needs. \n\nKuddos to zRenard for providing such an excellent app!\n\nOne small caveat: When generating a calendar with Week Numbers shown, be sure to check the "Monday First" checkbox, otherwise the Week numbers may be off. Also, if you postfix the Year to the Week number, you may have to manually edit the Year on the first week displayed in January and the last week in December because it displays the current year instead of the prior or next years.
The mouse is a great invention, but sometimes, you want quicker access to some basic functions. TiddlyWiki has some KeyboardShortcuts\n\nWhile editing a tiddler:\n* Control-Enter or Control-Return accepts your changes and switches out of editing mode\n* Escape abandons your changes and reverts the tiddler to it's previous state\n* Tab and Shift-Tab move you among the fields on the page, but specifically lets you easily move among the Tiddler's Title, Body, and Tag fields.\n\nIn the search box:\n* Escape clears the search term
TiddlyWiki is a very useful application, but please be aware that because all content you enter is stored //within// the HTML file itself, this can also present several concerns:\n\n''Security''\nData is currently stored in plan text, so don't store //anything// that is sensitive in nature unless you are securely storing the HTML file (such as on a secure Thumb Drive or on your local PC.) If you do store sensitive data and access it through a public terminal, be sure to clear the cache after accessing the file. Identity theft is a growing problem, so cool apps like TiddlyWiki unfortunatly have the potential for being abused if not used properly. You should always make security a high priority when dealing with any computers. See the [[Is TiddlyWiki secure?]] [[FAQ]] for more information.\n\n''File Size''\nAs I said above, data is stored //within// the HTML file, so as you add content, the file will slowly grow in size. I don't know if there is any real HTML file size limitation, but there may be. TiddlyWiki is not suited for large data repositories, so consider more traditional Wiki implementations for that kind of implementation.\n\n''Data Size''\nI don't know if there is any real limit to the size of an individual Tiddler, but there may be. Your best bet is to try to grasp the MicroContent concept and learn to "chunk" your data into smaller, manageable chunks. It also makes reading and finding information easier.
If you edit your MainMenu frequently, sometimes it can be cumbersome findint the Tiddler to edit. Here's a quick tip to make editing it easier.\n#Open the MainMenu Tiddler. You should be able to find it on the All tab on the SideBar. \n#Scroll down to the bottom and add the following line of code:\n{{{^}}}{{{^[}}}{{{[edit menu|M}}}{{{ainMenu]]^^}}}\n#Click Done to save the Tiddler\n#Close the Tiddler\n#SaveChanges\n\nYou now have a simple, unobtrusive entry on your MainMenu to quickly and easily edit it. I chose to use the small superscript font and I renamed the link. Of course, you could format it however you want.
Here's a Tip describing how to create a tabbed, self-referencing To Do list submitted by Alvin Orzechowski. It's a simple, elegant solution. Go to [[THIS LINK|http://tiddlywikitips.com/Tip9example.html]] to see an example of this in action!\n \nTiddlyWiki's Tag macro is a very handy way to create a Tiddler that displays the contents of two or more other Tiddlers. In the original [[TiddlyWiki|http://TiddlyWiki.com/]] you can see how this macro is being used in the right column, under options. But using Tags is bothersome if the contents of the Tiddlers are expected to change regularly. For example, in a To Do list.\n\nTypically a To Do list is a list of three lists grouped by priority, say 1 (most important), 2 (important), and 3 (not so important). Begin by creating a Tiddler for each of these priority lists:\n\nTiddler "~ToDo1" contains:\n{{{\n![[Urgent|ToDo1]]\n*Item 1\n*Item 2\n}}}\n\nTiddler "~ToDo2" contains:\n{{{\n![[Important|ToDo2]]\n*Item 1\n*Item 2\n}}}\n\nTiddler "~ToDo3" contains:\n{{{\n![[Need To Do|ToDo3]]\n*Item 1\n*Item 2\n}}}\n\nEach of the above Tiddlers begins with a title:\n{{{\n![[list identifier|Tiddler id]]\n}}}\n\nThis is followed by an unordered list. The formatting can be altered to suite.\n\nThen create a Tiddler to combine these lists:\n\nTiddler "~ToDoList" contains:\n{{{\n<<tabs txtFavourite\nUrgent "Priority 1" ToDo1\nImportant "Priority 2" ToDo2\n"Need To Do" "Priority 3" ToDo3\n>>\n}}}\n\nNow when you open the ~ToDoList Tiddler you will see tabs for each of your priority lists, and each list will have its own title. Click on a list's title to bring up that list's Tiddler and edit as needed.
After reviewing Alvin Orzechowski's [[Tip #09: Tabbed Self-referencing To Do List *]], I was simply stunned! Self-referencing Tiddlers...Tabs...very cool. It got me thinking. I like Tags, so U thought, "Could this be expanded by utilizing Tags?" The answer is yes! \n\nThis Tip builds directly upon [[Tip #09|Tip #09: Tabbed Self-referencing To Do List *]] A working example of this Tip can be found by clicking [[THIS LINK|http://TiddlyWikiTips.com/Tip10example.html]]. This is a long one, so settle in...\n\nFirst off, I do understand the desire not to use Tags: It's much simpler to set up and manage. But what if you want to associate additional information with a To Do Tiddler? Let's take this [[Tabbed Self-referencing To Do List|Tip #9: Tabbed Self-referencing To Do List *]] concept to another level (using Tags, of course!) Tags do add a level of complexity, but once set up, they provide what I feel is excellent extended functionality. Here we go...\n\nFirst, install the [[listAll]] Plugin Tiddler. This enables a new Macro called "listTags" which lets you list within a Tiddler, the Titles of all Tiddlers containing a specific Tag. (This is key to this Tip.)\n\nNext, create the Tiddlers found in [[Tip #09|Tip #09: Tabbed Self-referencing To Do List *]]. Click [[THIS LINK|http://TiddlyWikiTips.com/Tip9example.html]] to see that in action.\n\nNow create a separate Tiddler for each ToDo Item, and assign to each a Tag related to the "Priority" Tiddler's title. For example, create a new Tiddler. Give it a Title of "Contact Alvin", put some text in the body (if you want), and Tag it as "Urgent". Continue creating a few of these ToDo items, Tagging each as "Urgent", "Important", or "NeedToDo" as desired. (Note that once you have created a Tiddler with a new Tag, you can select that tag from a PopUp by clicking on the "Tags" button below the Tag input field for new Tiddlers.)\n\nNext, edit each of the ToDo1, ToDo2, and ToDo3 Tiddlers that you created in [[Tip #9|Tip #9: Tabbed Self-referencing To Do List *]], and include the Macro {{{<}}}{{{<listTags "Urgent">>}}}, {{{<}}}{{{<listTags "Important">>}}}, and {{{<}}}{{{<listTags "NeedToDo">>}}} respectively in each. (By the way, I also added a "Completed" Tab to the ToDoList Tiddler that displays all Tiddlers Tagged "Completed" using the Macro {{{<}}}{{{<listTags "Completed">>}}}...but more on that in a moment.)\n\nFinally, re-load the ToDoList Tiddler, and you should now see your Tabs, each formatted like you had them before, but now with a list of the Titles of all Tiddlers with the associated Tags.\n\nThis accomplishes three things:\n\n1. The "inline" ToDo's are still there as in [[Tip #09|Tip #09: Tabbed Self-referencing To Do List *]], usable as you like. If you want inline ToDo items, you can have them. If you want links to separate Tiddlers, you can have them, mixing as desired.\n\n2. As new Tasks (Tiddlers) are created or removed, they automatically show up on or drop off of the appropriate ToDoList Tab that is associated with the Tag they were given.\n\n3. Simply updating a Tiddler's Tag determines on what Tab it resides, so "moving" or "completing" a task is as simple as changing its Tiddler's Tag.\n\nYes, this impose some Tag management, but you might find the added flexibility worth it. And the same concept can be used for ANY Tiddler. The Tabbed Interface just makes it very intuitive for a Task list.
Thanks to the guys on the TiddlyWiki Group over at [[Google Groups|http://groups.google.com]] for this one. This has been stumping me for the longest time, but now seems so simple.\n\nBasically, say you have a Tiddler with an ugly name such as UglyTiddlerName but when you reference it in your text, you want to pretty it up to something like [[Pretty Tiddler Name|UglyTiddlerName]]. The answer is to use the standard reference substitution syntax:\n\n{{{[}}}{{{[Pretty Tiddler Name|}}}{{{U}}}{{{glyTiddlerName]]}}}\n\nThis really extends your flexibility in creating content. But there's a catch. The UglyTiddlerName Tiddler must be created //before// you try to access it through the created link, otherwise, if you have not yet defined the Tiddler, when you click on the link, your browser will open a new window and try to load an external file referenced by the link. \n\nFor example, {{{[}}}{{{[Existing Tiddler Name|}}}{{{U}}}{{{glyTiddlerName]]}}} looks like this: [[Existing Tiddler Name|UglyTiddlerName]] linking to an existing Tiddler, while {{{[}}}{{{[NonExisting Tiddler Name|}}}{{{N}}}{{{onExistantTiddlerName]]}}} looks like this [[Pretty Tiddler Name|NonExistantTiddlerName]] referencing an external link.
<<tiddler "Internal Macros">>
Most TiddlyWiki coding tends to be done using the ~FireFox browser, but we must not forget that the majority of the Web is viewed using Internet Explorer. Unfortunatly, Internet Explorer exhibits several odd behaviors when rendering a TiddlyWiki file. Add the following code to your StyleSheet Tiddler to correct some of this wierd IE behavior:\n\n/***\nClint's fix for weird IE behaviour\n***/\n/*{{{*/\nbody {position:static;}\n.tagClear{margin-top:1em;clear:both;}\n/*}}}*/ \n\nThanks to Simon Baird for contributing this tip!
One of the amazing features of TiddlyWiki is its extendibility using Javascript. TiddlyWiki is written to "process" Javascript code embeded in Tiddlers. This opens the door to developers to create "Plugins" that add new and innovative features and functions to [[TiddlyWiki]]--just by including Javascript code in a Tiddler!\n\nBy adding a few Plugins, you can transform a basic TiddlyWiki file (which is, in itself powerful) into a customized, feature-rich application!\n\nBut how do you install these cool Plugins? Installing a Plugin takes three simple steps:\n#Open and Copy the Plugin\n#Paste the Plugin and Tag it systemConfig\n#Reload yout TiddlyWiki file\nBut these steps do require some explanation, so here's some more detail:\n\n!1. Open and Copy the Plugin\nFirst, open two browser windows (or two Tabs if you are using Firefox.) \n\nIn the first window or tab, open the TiddlyWiki file that contains the Plugin that you want to install. Navigate to the Plugin Tiddler and click "Edit" to open the Tiddler. Place the cursor in the body of the text, and do a "Select All" by either presing [Ctrl][A], clicking "Edit" in the Menu bar and selecting "Select All", or right-clicking in the body and selecting "Select All" from the context menu.\n\nCopy the text by pressing [CTRL][C], clicking "Edit" in the Menu bar and selecting "Copy", or right-clicking in the body and selecting "Copy" from the context menu.\n\n!2. Paste the Plugin and Tag it systemConfig\nNow, go to the other browser window or tab and open the TiddlyWiki file into which you want to install the new Plugin. Click the "New Tiddler" button to open a new Tiddler edit window, and clear out all text in the body of the Tiddler (if any.)\n\n"Paste" the copied text into the body of the Tiddler by pressing [Ctrl][V], clicking "Edit in the Menu bar and selecting "Paste", or right-clicking in the body and selecting "Paste" from the context menu.\n\nNext, click in the Title field and enter the name of the Plugin. You can copy and paste as before if you want, or just type it in.\n\nNext, click in the Tags field and enter a tag of: systemConfig\n\nNote that you //must// spell the Tag exactly as "systemConfig" (without quotes), and you //must// make sure that the first "s" in systemConfig is lowercase, and the "C" is uppercase.\n\nClick "Done" to close the Editor, and then click on "Save Changes" to save what you entered.\n\n!3. Reload yout TiddlyWiki file\nNow, the important step: Reload the TiddlyWiki file! When TiddlyWiki reloads, it will "process" the Plugin code that you installed, and the functionality of the Plugin will be available.\n\nPlease be sure to read any included or accompanying documentation that comes with plugins.
Clicking the "New Tiddler" button opens a new Tiddler for you to edit. It's useful, but can be pretty boring. Clicking "New Journal" creates a new Tiddler with the date auto-filled in. Again, useful, but not too flexible. Did you ever want some buttons that would create very specific and tailored types of new Tiddlers?\n\nThe answer is Paul Petterson's excellent ~NewerTiddler Plugin found here:\n\nhttp://www.thepettersons.org/PaulsNotepad.html#NewerTiddlerPlugin\n\nThis plugin lets you insert into any Tiddler, "Button Macro code" that creates a button, that when clicked, will create a new Tiddler pre-defined with custom Title, Tags, and content. You can even create and use "templates" to generate complex Tiddlers!\n\nLet's say, for example, that you want want a button similar to the "New Journal" button, but you want it to not only auto-fill in the date in the Title, but you want to have it auto-Tagged with a "Journal" Tag, and you want the body to contain the text "New stuff for today: ".\n\nGo to Paul's site and install the ~NewerTiddler Plugin. Open any Tiddler in which you want to include the Button Macro code, and insert the following code:\n{{{\n<<newerTiddler button:"Journal Entry" name:"Journal for YYYY/MM/DD" tags:"Journal" text:"New stuff for today:">>\n}}}\nClick "Done" and you will see a button labeled "Journal Entry". Click this new button, and a new Tiddler will open with a Title of "Journal for 2006/03/27" (where the date gets auto-filled in), a Tag of "Journal", and the body containing the text "New stuff for today:".\n\nThe following parameters let you customize the button and the resulting editable Tiddler:\n\n|name|"Name of Tiddler"|\n|tags|"Tag1, Tag2, Tag3" - tags for new tiddler, comma seperated don't use square brackets ({{{[[}}}) for tags!|\n|button|"name for button" - the name to display instead of "new tiddler"|\n|body|"what to put in the tiddler body"|\n|template|"Name of a tiddler containing the text to use as the body of the new tiddler"|\n\nThe Plugin has brief documentation about how to use it, so be sure to read it. It details the available options, and has some examples. \n\nThe Button Macro code can be placed just about anywhere. I suggest putting it in SideBarOptions, or MainMenu, but it could be incorporated in any Tiddler.\n\nThanks to Jona Jeffords for the inspiration for this tip!
This isn't so much a tip as a recommendation...\n\n[[Dave Gifford|http://giffmex.org/]] has created an excellent TiddlyWiki tutorial called "[[TiddlyWiki For The Rest of Us|http://giffmex.org/twfortherestofus.html]]" that walks you through the basics of the why, what, and how of TiddlyWiki.\n\nNew and seasoned users alike will glean lots of great information from this tutorial. Do check it out!
Macro: [[allTags|TipAllTags]]\nSyntax: {{{<}}}{{{<allTags>>}}}\n\nThis Macro displays a bulleted list of all Tags used in all Tiddlers. The Tags are listed as links that display ~PopUps. Each ~PopUp lists all Tiddlers associated with the selected Tag. Clicking on one of the Tiddler links in the ~PopUp will open that Tiddler. Each ~PopUp also displays a link that will open all Tiddlers with the Tag. This is the same content that is found in the standard Tags tab on the ~SideBar.\n!!!!!Entering this code...\n{{{<}}}{{{<allTags>>}}}\n!!!!!...produces this:\n<<allTags>>\n
Macro: [[closeAll|TipCloseAll]]\nSyntax: {{{<}}}{{{<closeAll>>}}}\n\nThis Macro creates a "close all" link that will close all displayed Tiddlers that are not being edited, including the Tiddler that contains the Macro.\n\n!!!!!Entering this code...\n{{{<}}}{{{<closeAll>>}}}\n!!!!!...produces this:\n<<closeAll>>\n\nLike most Macros, the <<closeAll>> Macro can be embedded within Tiddler content.
To the left is a list of [[Internal Macros]] that provide additional functionality to TiddlyWiki.\n\nClick on a Macro Title at the left to see the details!\n\n!Please note: This sections needs to be updated!
Macro: [[list: All|TipListAll]]\nSyntax: {{{<}}}{{{<list all>>}}}\n\nThis macro creates a list of all Tiddlers in your TiddlyWiki. It is the same function as the More All Tab on the ~SideBar. This can be useful to provide an alternate view of all of your Tiddlers. It can also be used to create a printable version of all of your Tiddler Titles because it displays as Tiddler content (which prints) as opposed to ~SideBar content (which does not print.)\n!!!!!Entering this code...\n{{{<}}}{{{<list all>>}}}\n!!!!!...produces this:\n<<list all>>
Macro: [[list: Missing|TipListMissing]]\nSyntax: {{{<}}}{{{<list missing>>}}}\n\nThis Macro lists all WikiWords that do not have associated Tiddlers. This displays the same information as the More Orphans Tab on the ~SideBar. Clicking on a link in the list opens a new Tiddler for you to edit.\n\nThis list can be useful for finding "holes" in content that could be filled in by creating new Tiddlers. Obviously, not all entries listed by this Macro require a Tiddler. It's up to you to determine the detail you need to provide.\n\n!!!!!Entering the code...\n{{{<}}}{{{<list missing>>}}}\n!!!!!...produces this:\n<<list missing>>
Macro: [[list: Orphans|TipListOrphans]]\nSyntax: {{{<}}}{{{<list orphans>>}}}\n\nThis Macro lists all Tiddler Titles that are not referenced by any other Tiddlers. This can be useful for finding "lost" Tiddlers. This displays the same information as the More Orphans Tab on the ~SideBar.\n\n!!!!!Entering the code...\n{{{<}}}{{{<list orphans>>}}}\n!!!!!...produces this:\n<<list orphans>>
Macro: [[newJournal|TipNewJournal]]\nSyntax: {{{<}}}{{{<newJournal "~DD-MMM-YYYY">>}}}\n\nSimilar to the [[newJournal|TipNewJournal]] Macro, this Macro inserts a "new journal" link into your Tiddler. It is the same function as the standard "new journal" link in the MainMenu. It creates a new Tiddler with the current date as the Tiddler Title. This Macro could be inserted into the SiteSubtitle Tiddler, the ~SideBar, or in any Tiddler you want the user to have the ability to create a new Journal Tiddler. //Note that it requires the date format string parameter.//\n!!!!!Entering this code...\n{{{<}}}{{{<newJournal "~DD-MMM-YYYY">>}}}\n!!!!!...produces this:\n<<newJournal "DD-MMM-YYYY">>
Macro: [[newTiddler|TipNewTiddler]]\nSyntax: {{{<}}}{{{<newTiddler>>}}}\n\nThis Macro inserts a "new tiddler" link into your Tiddler. It is the same function as the standard "new tiddler" link in the MainMenu. This Macro could be inserted into the SiteSubtitle Tiddler, the ~SideBar, or in any Tiddler you want the user to have the ability to create a new Tiddler.\n!!!!!Entering this code...\n{{{<}}}{{{<newTiddler>>}}}\n!!!!!...produces this:\n<<newTiddler>>\n
Macro: [[permaview|TipPermaView]]\nSyntax: {{{<}}}{{{<permaview>>}}}\n\nThis Macro places in your browser's Address Bar a URL that will open all currently displayed Tiddlers in your TiddlyWiki. This can be useful for sharing a specific "display state" with other users. This Macro It is the same function as the "permaview" link on the ~SideBar.\n!!!!!Entering this code...\n{{{<}}}{{{<permaview>>}}}\n!!!!!...produces something like this:\nfile:///h:/Notes/tiddlywiki.html#~TipSaveChanges%20TipPermaView\n\nIn this case, the TiddlyWiki file is a local file saved to a shared network drive H:, and I had the TipSaveChanges and TipPermaView Tiddlers open. By entering the above URL into a Web Browser on my PC, my TiddlyWiki file would open with the TipSaveChanges and TipPermaView Tiddlers open. //(Note that this bypasses the DefaultTiddlers Tiddler.)//
Macro: [[saveChanges|TipSaveChanges]]\nSyntax: {{{<}}}{{{<saveChanges>>}}}\n\nThis Macro saves all TiddlyWiki changes to disk. It has the same function as the "save changes" link found on the ~Sidebar. With this Macro, you now have ths flexibility to place this functionality either within a Tiddler or in other locations such as the SiteSubtitle or the MainMenu.\n!!!!!Entering this code...\n{{{<}}}{{{<saveChanges>>}}}\n!!!!!...produces this:\n<<saveChanges>>\n
Macro: [[search|TipSearch]]\nSyntax: {{{<}}}{{{<search>>}}}\n\nThis Macro inserts a Search box within the Tiddler. It's functionality is the same as the standard Search box in the ~SideBar. \n!!!!!Entering this code...\n{{{<}}}{{{<search>>}}}\n!!!!!...produces this:\n<<search>>\n\nLike most Macros, this can be embedded to suit your needs.\n\nFor example, you can include it within content to provide <<search>> capabilities from within a Tiddler.\n\n(//See SearchTips for more information on searching.//)
Macro: [[slider|TipSlider]]\nSyntax: {{{<}}}{{{<slider sliderID sliderTiddler sliderLabel>>}}}\n\nThis versitile Macro lets you create expandable links containing Tiddler content. This can be very useful for including other Tiddler content within a Tiddler while keeping the display compact. It displays the content right in context with the surrounding content. \n\nClicking the link expands the content. A vertical line is drawn along the right margin of the Tiddler along side the expanded content to indicate that it is expanded. Clicking the link again collapses the content.\n!!!!!Entering thie code...\n{{{\n<<slider 1 [[TipSlider Example 1]] "Example Link 1">> \n<<slider 2 [[TipSlider Example 2]] "Example Link 2">> \n<<slider 3 [[TipSlider Example 3]] "Example Link 3">> \n}}}\n!!!!!...produces this:\n<<slider 1 [[TipSlider Example 1]] "Example Link 1">> \n<<slider 2 [[TipSlider Example 2]] "Example Link 2">> \n<<slider 3 [[TipSlider Example 3]] "Example Link 3">> \n\n\nThe links can be arranged and embedded however you want. For example, here are the same Slider links arranged horizontally and in a different order:\n\n<<slider 3 [[TipSlider Example 3]] "Example Link 3">><<slider 1 [[TipSlider Example 1]] "Example Link 1">><<slider 2 [[TipSlider Example 2]] "Example Link 2">> \n\n\nHere is another example of embedded Slider links. The <<slider 1 [[TipSlider Example 1]] "Example Link 1">> is in this sentance along with <<slider 2 [[TipSlider Example 2]] "Example Link 2">>, which is also in this sentence. <<slider 3 [[TipSlider Example 3]] "Example Link 3">> is in this sentence. Notice how the content opens up righ tin context when you click on the link!
Macro: [[version|TipTWVersion]]\nSyntax: {{{<}}}{{{<version>>}}}\n\nThis Macro is used to display the TiddlyWiki's version number. This can be useful in troubleshooting. An example of this can be found near the bottom of the MainMenu.\n!!!!!Entering this code...\n {{{<}}}{{{<version>>}}}\n!!!!!...produces this:\n<<version>>\n\nLike most macros, it can be embedded:\n\nYou are using version <<version>> of TiddlyWiki.
Macro: [[tabs|TipTabbedContent]]\nSyntax: {{{<}}}{{{<tabs indentifier tabLabel tabName Tiddler>>}}}\n\nThis Macro displays Tabs, each containing Tiddler content. This can be useful to save space and categorize your content. The content is any standard Tiddler content including formatted text, lists, Tables, etc. Click on the Tabs below to see some examples.\n!!!!!Entering this code...\n{{{\n<<tabs txtFavourite\n"Tab #1" "Priority 1" "Tab 1"\n"Tab #2" "Priority 2" "Tab 2"\n"Tab #3" "Priority 3" "Tab 3"\n>>\n}}}\n!!!!!...produces this:\n<<tabs txtFavourite\n"Tab #1" "Priority 1" "Tab 1"\n"Tab #2" "Priority 2" "Tab 2"\n"Tab #3" "Priority 3" "Tab 3"\n>>
Macro: [[tag|TipTagPopUp]]\nSyntax: {{{<}}}{{{<tag tagName>>}}}\n\nThis Macro inserts a Tag ~PopUp link that will display a ~PopUp listing all Tiddlers associated with the specified Tag. Clicking on one of the Tiddler links will open that Tiddler. It also displays a link that will open all Tiddlers with the Tag.\n!!!!!Entering this code...\n{{{<}}}{{{<tag Tips>>}}}\n!!!!!...produces this:\n<<tag Tips>>\n\nClick on the above link to view the ~PopUp
Macro: [[tiddler|TipTiddlerContents]]\nSyntax: {{{<}}}{{{<tiddler TiddlerTitle>>}}}\n\nWith this Macro, you can embed the contents of another Tiddler inline instead of just a link to that Tiddler. This can be useful for creating consolidated content that can be easily updated by editing the specific Tiddlers.\n!!!!!Entering this code...\n {{{<}}}{{{<tiddler ~TiddlerExample>>}}}\n!!!!!...produces this:\n<<tiddler TiddlerExample>>\n\n
Macro: [[timeline|TipTimeline]]\nSyntax: {{{<}}}{{{<timeline>>>}}}\n\nThis Macro displays the Timeline information from the Timeline Tab in the ~SideBar. //Note that any Plugins that affect the ~SideBar Timeline will also affect the display of this Macro.//\n!!!!!Entering this code...\n{{{<}}}{{{<timeline>>}}}\n!!!!!...produces this:\n<<timeline>>\n
Macro: [[today|TipToday]]\nSyntax: {{{<}}}{{{<today>>}}}\n\nThis macro displays today's date and time. You could place this Macro in the SiteSubtitle Tiddler to display the date and time TiddlyWiki's header, or you could put it in a Tasks Tiddler to give you the current date and time at a glance. (//Note that this macro does not auto-update. You need to refresh the Tiddler to see the latest date & time.//)\n!!!!!Entering this code...\n {{{<}}}{{{<today>>}}}\n!!!!!...produces this:\n<<today>>\n\nLike most macros, it can be embedded:\n\nThe current date and time is <<today>>.
Here are The TiddlyWiki Tips! \n\nClick on a Tip title at the left to open it. \n\nTips marked with a {{{*}}} were either submitted or inspired by [[TiddlyWikiTips.com]] visitors!
* Lists are where it's at\n* Just use an asterisk and you're set\n** To nest lists just add more asterisks...\n***...like this\n* The circle makes a great bullet because once you've printed a list you can mark off completed items\n* You can also nest mixed list types\n## Like this\n\nHere's how it's done:\n{{{\n* Lists are where it's at\n* Just use an asterisk and you're set\n** To nest lists just add more asterisks...\n***...like this\n* The circle makes a great bullet because once you've printed a list you can mark off completed items\n* You can also nest mixed list types\n## Like this\n}}}\nTiddlyWiki uses Wiki style markup, a way of lightly "tagging" plain text so it can be transformed into HTML. Edit this Tiddler to see samples.
|!Date|!url|!toFilename|!backupDir|!user|!status|\n| 2/3/2006 17:45:7 | [[store.php|http://tiddlywikitips.com/store.php]] | [[index.html|http://tiddlywikitips.com/index.html]] | backup | YourName |\n| 2/3/2006 22:18:11 | [[store.php|http://tiddlywikitips.com/store.php]] | [[index.html|http://tiddlywikitips.com/index.html]] | backup | YourName |\n| 6/3/2006 11:47:6 | [[store.php|http://tiddlywikitips.com/store.php]] | [[index.html|http://tiddlywikitips.com/index.html]] | backup | YourName |\n| 6/3/2006 11:48:15 | [[store.php|http://tiddlywikitips.com/store.php]] | [[index.html|http://tiddlywikitips.com/index.html]] | backup | YourName |\n| 6/3/2006 11:52:49 | [[store.php|http://tiddlywikitips.com/store.php]] | [[index.html|http://tiddlywikitips.com/index.html]] | backup | YourName | ok |\n| 6/3/2006 14:15:44 | [[store.php|http://tiddlywikitips.com/store.php]] | [[index.html|http://tiddlywikitips.com/index.html]] | backup | YourName |\n| 6/3/2006 14:16:49 | [[store.php|http://tiddlywikitips.com/store.php]] | [[index.html|http://tiddlywikitips.com/index.html]] | backup | YourName |\n| 7/3/2006 11:27:13 | [[store.php|http://tiddlywikitips.com/store.php]] | [[index.html|http://tiddlywikitips.com/index.html]] | backup | YourName |\n| 15/3/2006 14:20:21 | [[store.php|http://tiddlywikitips.com/store.php]] | [[index.html|http://tiddlywikitips.com/index.html]] | backup | YourName | ok |\n| 15/3/2006 14:23:34 | [[store.php|http://tiddlywikitips.com/store.php]] | [[index.html|http://tiddlywikitips.com/index.html]] | backup | YourName |\n| 15/3/2006 14:25:55 | [[store.php|http://tiddlywikitips.com/store.php]] | [[index.html|http://tiddlywikitips.com/index.html]] | backup | YourName |\n| 16/3/2006 14:16:37 | [[store.php|http://tiddlywikitips.com/store.php]] | [[index.html|http://tiddlywikitips.com/index.html]] | backup | YourName |\n| 16/3/2006 14:19:14 | [[store.php|http://tiddlywikitips.com/store.php]] | [[index.html|http://tiddlywikitips.com/index.html]] | backup | YourName |\n| 16/3/2006 14:22:5 | [[store.php|http://tiddlywikitips.com/store.php]] | [[index.html|http://tiddlywikitips.com/index.html]] | backup | YourName |\n| 16/3/2006 14:24:24 | [[store.php|http://tiddlywikitips.com/store.php]] | [[index.html|http://tiddlywikitips.com/index.html]] | backup | YourName |\n| 27/3/2006 10:39:30 | [[store.php|http://tiddlywikitips.com/store.php]] | [[index.html|http://tiddlywikitips.com/index.html]] | backup | YourName |\n| 27/3/2006 10:44:50 | [[store.php|http://tiddlywikitips.com/store.php]] | [[index.html|http://tiddlywikitips.com/index.html]] | backup | YourName |\n| 27/3/2006 10:49:37 | [[store.php|http://tiddlywikitips.com/store.php]] | [[index.html|http://tiddlywikitips.com/index.html]] | backup | YourName |\n| 27/3/2006 10:54:48 | [[store.php|http://tiddlywikitips.com/store.php]] | [[index.html|http://tiddlywikitips.com/index.html]] | backup | YourName |\n| 28/3/2006 8:22:41 | [[store.php|http://tiddlywikitips.com/store.php]] | [[index.html|http://tiddlywikitips.com/index.html]] | backup | YourName |\n| 5/4/2006 14:40:34 | [[store.php|http://tiddlywikitips.com/store.php]] | [[index.html|http://tiddlywikitips.com/index.html]] | backup | YourName |\n| 2/5/2006 16:4:18 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 2/5/2006 16:15:8 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 10/7/2006 13:43:51 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 10/7/2006 13:47:6 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 10/7/2006 13:48:39 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 10/7/2006 13:51:57 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 15/7/2006 10:8:50 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 7/8/2006 11:41:3 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 7/8/2006 11:44:29 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 7/8/2006 11:45:2 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 7/8/2006 11:46:48 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 7/8/2006 11:59:4 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 7/8/2006 12:0:7 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 10/8/2006 14:2:39 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 10/8/2006 14:5:14 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 10/8/2006 14:6:22 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 30/11/2006 15:35:6 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 30/11/2006 15:37:18 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 30/11/2006 16:6:0 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 1/12/2006 10:4:39 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 1/12/2006 10:6:44 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 1/12/2006 10:12:9 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 1/12/2006 10:13:28 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 6/12/2006 8:59:55 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup | Ok |\n| 6/12/2006 9:1:11 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 6/12/2006 9:8:7 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 6/12/2006 9:12:24 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 13/7/2011 0:45:52 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 21/7/2011 21:55:36 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 14/8/2011 20:57:35 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 19/8/2011 19:10:4 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |\n| 23/8/2011 21:10:42 | YourName | [[/|http://tiddlywikitips.com/]] | [[store.php|http://tiddlywikitips.com/store.php]] | | index.html | backup |
/***\n<<tiddler UploadPluginDoc>>\n!Code\n***/\n//{{{\nversion.extensions.UploadPlugin = {\n major: 3, minor: 3, revision: 1, \n date: new Date(2006,3,30),\n type: 'macro',\n source: 'http://tiddlywiki.bidix.info/#UploadPlugin',\n docs: 'http://tiddlywiki.bidix.info/#UploadPluginDoc'\n};\n//}}}\n\n////+++!![config.lib.file]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.file) config.lib.file= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\nconfig.lib.file.dirname = function (filePath) {\n var lastpos;\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};\nconfig.lib.file.basename = function (filePath) {\n var lastpos;\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};\nwindow.basename = function() {return "@@deprecated@@";};\n//}}}\n////===\n\n////+++!![config.lib.log]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.log) config.lib.log= {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\nconfig.lib.Log = function(tiddlerTitle, logHeader) {\n if (version.major < 2)\n this.tiddler = store.tiddlers[tiddlerTitle];\n else\n this.tiddler = store.getTiddler(tiddlerTitle);\n if (!this.tiddler) {\n this.tiddler = new Tiddler();\n this.tiddler.title = tiddlerTitle;\n this.tiddler.text = "| !date | !user | !location |" + logHeader;\n this.tiddler.created = new Date();\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[tiddlerTitle] = this.tiddler;\n else\n store.addTiddler(this.tiddler);\n }\n return this;\n};\n\nconfig.lib.Log.prototype.newLine = function (line) {\n var now = new Date();\n var newText = "| ";\n newText += now.getDate()+"/"+(now.getMonth()+1)+"/"+now.getFullYear() + " ";\n newText += now.getHours()+":"+now.getMinutes()+":"+now.getSeconds()+" | ";\n newText += config.options.txtUserName + " | ";\n var location = document.location.toString();\n var filename = config.lib.file.basename(location);\n if (!filename) filename = '/';\n newText += "[["+filename+"|"+location + "]] |";\n this.tiddler.text = this.tiddler.text + "\sn" + newText;\n this.addToLine(line);\n};\n\nconfig.lib.Log.prototype.addToLine = function (text) {\n this.tiddler.text = this.tiddler.text + text;\n this.tiddler.modifier = config.options.txtUserName;\n this.tiddler.modified = new Date();\n if (version.major < 2)\n store.tiddlers[this.tiddler.tittle] = this.tiddler;\n else {\n store.addTiddler(this.tiddler);\n story.refreshTiddler(this.tiddler.title);\n store.notify(this.tiddler.title, true);\n }\n if (version.major < 2)\n store.notifyAll(); \n};\n//}}}\n////===\n\n////+++!![config.lib.options]\n\n//{{{\nif (!config.lib) config.lib = {};\nif (!config.lib.options) config.lib.options = {\n author: 'BidiX',\n version: {major: 0, minor: 1, revision: 0}, \n date: new Date(2006,3,9)\n};\n\nconfig.lib.options.init = function (name, defaultValue) {\n if (!config.options[name]) {\n config.options[name] = defaultValue;\n saveOptionCookie(name);\n }\n};\n//}}}\n////===\n\n////+++!![PasswordTweak]\n\n//{{{\nversion.extensions.PasswordTweak = {\n major: 1, minor: 0, revision: 2, date: new Date(2006,3,11),\n type: 'tweak',\n source: 'http://tiddlywiki.bidix.info/#PasswordTweak'\n};\n//}}}\n/***\n!!config.macros.option\n***/\n//{{{\nconfig.macros.option.passwordCheckboxLabel = "Save this password on this computer";\nconfig.macros.option.passwordType = "password"; // password | text\n\nconfig.macros.option.onChangeOption = function(e)\n{\n var opt = this.getAttribute("option");\n var elementType,valueField;\n if(opt) {\n switch(opt.substr(0,3)) {\n case "txt":\n elementType = "input";\n valueField = "value";\n break;\n case "pas":\n elementType = "input";\n valueField = "value";\n break;\n case "chk":\n elementType = "input";\n valueField = "checked";\n break;\n }\n config.options[opt] = this[valueField];\n saveOptionCookie(opt);\n var nodes = document.getElementsByTagName(elementType);\n for(var t=0; t<nodes.length; t++) {\n var optNode = nodes[t].getAttribute("option");\n if (opt == optNode) \n nodes[t][valueField] = this[valueField];\n }\n }\n return(true);\n};\n\nconfig.macros.option.handler = function(place,macroName,params)\n{\n var opt = params[0];\n var size = 15;\n if (params[1])\n size = params[1];\n if(config.options[opt] === undefined) {\n return;}\n var c;\n switch(opt.substr(0,3)) {\n case "txt":\n c = document.createElement("input");\n c.onkeyup = this.onChangeOption;\n c.setAttribute ("option",opt);\n c.size = size;\n c.value = config.options[opt];\n place.appendChild(c);\n break;\n case "pas":\n // input password\n c = document.createElement ("input");\n c.setAttribute("type",config.macros.option.passwordType);\n c.onkeyup = this.onChangeOption;\n c.setAttribute("option",opt);\n c.size = size;\n c.value = config.options[opt];\n place.appendChild(c);\n // checkbox link with this password "save this password on this computer"\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option","chk"+opt);\n place.appendChild(c);\n c.checked = config.options["chk"+opt];\n // text savePasswordCheckboxLabel\n place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));\n break;\n case "chk":\n c = document.createElement("input");\n c.setAttribute("type","checkbox");\n c.onclick = this.onChangeOption;\n c.setAttribute("option",opt);\n place.appendChild(c);\n c.checked = config.options[opt];\n break;\n }\n};\n//}}}\n/***\n!! Option cookie stuff\n***/\n//{{{\nwindow.loadOptionsCookie_orig_PasswordTweak = window.loadOptionsCookie;\nwindow.loadOptionsCookie = function()\n{\n var cookies = document.cookie.split(";");\n for(var c=0; c<cookies.length; c++) {\n var p = cookies[c].indexOf("=");\n if(p != -1) {\n var name = cookies[c].substr(0,p).trim();\n var value = cookies[c].substr(p+1).trim();\n switch(name.substr(0,3)) {\n case "txt":\n config.options[name] = unescape(value);\n break;\n case "pas":\n config.options[name] = unescape(value);\n break;\n case "chk":\n config.options[name] = value == "true";\n break;\n }\n }\n }\n};\n\nwindow.saveOptionCookie_orig_PasswordTweak = window.saveOptionCookie;\nwindow.saveOptionCookie = function(name)\n{\n var c = name + "=";\n switch(name.substr(0,3)) {\n case "txt":\n c += escape(config.options[name].toString());\n break;\n case "chk":\n c += config.options[name] ? "true" : "false";\n // is there an option link with this chk ?\n if (config.options[name.substr(3)]) {\n saveOptionCookie(name.substr(3));\n }\n break;\n case "pas":\n if (config.options["chk"+name]) {\n c += escape(config.options[name].toString());\n } else {\n c += "";\n }\n break;\n }\n c += "; expires=Fri, 1 Jan 2038 12:00:00 UTC; path=/";\n document.cookie = c;\n};\n//}}}\n/***\n!! Initializations\n***/\n//{{{\n// define config.options.pasPassword\nif (!config.options.pasPassword) {\n config.options.pasPassword = 'defaultPassword';\n window.saveOptionCookie('pasPassword');\n}\n// since loadCookies is first called befor password definition\n// we need to reload cookies\nwindow.loadOptionsCookie();\n//}}}\n////===\n\n////+++!![config.macros.upload]\n\n//{{{\nconfig.macros.upload = {\n accessKey: "U",\n formName: "UploadPlugin",\n contentType: "text/html;charset=UTF-8",\n defaultStoreScript: "store.php"\n};\n\n// only this two configs 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 mainFileUploaded: "Main TiddlyWiki file uploaded to %0",\n urlParamMissing: "url param missing",\n rssFileNotUploaded: "RssFile %0 NOT uploaded",\n rssFileUploaded: "Rss File uploaded to %0"\n};\n\nconfig.macros.upload.label = {\n promptOption: "Save and Upload this TiddlyWiki with UploadOptions",\n promptParamMacro: "Save and Upload this TiddlyWiki in %0",\n saveLabel: "save to web", \n saveToDisk: "save to disk",\n uploadLabel: "upload" \n};\n\nconfig.macros.upload.handler = function(place,macroName,params){\n // parameters initialization\n var storeUrl = params[0];\n var toFilename = params[1];\n var backupDir = params[2];\n var uploadDir = params[3];\n var username = params[4];\n var password; // for security reason no password as macro parameter\n var label;\n if (document.location.toString().substr(0,4) == "http")\n label = this.label.saveLabel;\n else\n label = this.label.uploadLabel;\n var prompt;\n if (storeUrl) {\n prompt = this.label.promptParamMacro.toString().format([this.dirname(storeUrl)]);\n }\n else {\n prompt = this.label.promptOption;\n }\n createTiddlyButton(place, label, prompt, \n function () {\n config.macros.upload.upload(storeUrl, toFilename, uploadDir, backupDir, username, password); \n return false;}, \n null, null, this.accessKey);\n};\nconfig.macros.upload.UploadLog = function() {\n return new config.lib.Log('UploadLog', " !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |" );\n};\nconfig.macros.upload.UploadLog.prototype = config.lib.Log.prototype;\nconfig.macros.upload.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir, backupDir) {\n var line = " [[" + config.lib.file.basename(storeUrl) + "|" + storeUrl + "]] | ";\n line += uploadDir + " | " + toFilename + " | " + backupDir + " |";\n this.newLine(line);\n};\nconfig.macros.upload.UploadLog.prototype.endUpload = function() {\n this.addToLine(" Ok |");\n};\nconfig.macros.upload.basename = config.lib.file.basename;\nconfig.macros.upload.dirname = config.lib.file.dirname;\nconfig.macros.upload.upload = function(storeUrl, toFilename, uploadDir, backupDir, username, password)\n{\n // parameters initialization\n storeUrl = (storeUrl ? storeUrl : config.options.txtUploadStoreUrl);\n toFilename = (toFilename ? toFilename : config.options.txtUploadFilename);\n if (toFilename === '') {\n toFilename = config.lib.file.basename(document.location.toString());\n }\n backupDir = (backupDir ? backupDir : config.options.txtUploadBackupDir);\n uploadDir = (uploadDir ? uploadDir : config.options.txtUploadDir);\n username = (username ? username : config.options.txtUploadUserName);\n password = config.options.pasUploadPassword; // for security reason no password as macro parameter\n\n clearMessage();\n // only for forcing the message to display\n if (version.major < 2)\n store.notifyAll();\n if (!storeUrl) {\n alert(config.macros.upload.messages.urlParamMissing);\n return;\n }\n \n var log = new this.UploadLog();\n log.startUpload(storeUrl, toFilename, uploadDir, backupDir);\n if (document.location.toString().substr(0,5) == "file:") {\n saveChanges();\n }\n displayMessage(config.macros.upload.messages.aboutToUpload.format([this.dirname(storeUrl)]), this.dirname(storeUrl));\n this.uploadChanges(storeUrl, toFilename, uploadDir, backupDir, username, password);\n if(config.options.chkGenerateAnRssFeed) {\n //var rssContent = convertUnicodeToUTF8(generateRss());\n var rssContent = generateRss();\n var rssPath = toFilename.substr(0,toFilename.lastIndexOf(".")) + ".xml";\n this.uploadContent(rssContent, storeUrl, rssPath, uploadDir, '', username, password, \n function (responseText) {\n if (responseText.substring(0,1) != '0') {\n displayMessage(config.macros.upload.messages.rssFileNotUploaded.format([rssPath]));\n }\n else {\n if (uploadDir) {\n rssPath = uploadDir + "/" + config.macros.upload.basename(rssPath);\n } else {\n rssPath = config.macros.upload.basename(rssPath);\n }\n displayMessage(config.macros.upload.messages.rssFileUploaded.format(\n [config.macros.upload.dirname(storeUrl)+"/"+rssPath]), config.macros.upload.dirname(storeUrl)+"/"+rssPath);\n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n });\n }\n return;\n};\n\nconfig.macros.upload.uploadChanges = function(storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\n var original;\n if (document.location.toString().substr(0,4) == "http") {\n original = this.download(storeUrl, toFilename, uploadDir, backupDir, username, password);\n return;\n }\n else {\n // standard way : Local file\n \n original = loadFile(getLocalPath(document.location.toString()));\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 = "UTF-8";\n original = converter.ConvertToUnicode(original);\n }\n catch(e) {\n }\n }\n }\n //DEBUG alert(original);\n this.uploadChangesFrom(original, storeUrl, toFilename, uploadDir, backupDir, \n username, password);\n};\n\nconfig.macros.upload.uploadChangesFrom = function(original, storeUrl, toFilename, uploadDir, backupDir, \n username, password) {\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 var revised = original.substr(0,posOpeningDiv + startSaveArea.length) + \n allTiddlersAsHtml() + "\sn\st\st" +\n original.substr(posClosingDiv);\n var newSiteTitle;\n if(version.major < 2){\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 = this.uploadContent(revised, storeUrl, toFilename, uploadDir, backupDir, \n username, password, function (responseText) {\n if (responseText.substring(0,1) != '0') {\n alert(responseText);\n displayMessage(config.macros.upload.messages.fileNotUploaded.format([getLocalPath(document.location.toString())]));\n }\n else {\n if (uploadDir !== '') {\n toFilename = uploadDir + "/" + config.macros.upload.basename(toFilename);\n } else {\n toFilename = config.macros.upload.basename(toFilename);\n }\n displayMessage(config.macros.upload.messages.mainFileUploaded.format(\n [config.macros.upload.dirname(storeUrl)+"/"+toFilename]), config.macros.upload.dirname(storeUrl)+"/"+toFilename);\n var log = new config.macros.upload.UploadLog();\n log.endUpload();\n store.setDirty(false);\n }\n // for debugging store.php uncomment last line\n //DEBUG alert(responseText);\n }\n );\n};\n\nconfig.macros.upload.uploadContent = function(content, storeUrl, toFilename, uploadDir, backupDir, \n username, password, callbackFn) {\n var boundary = "---------------------------"+"AaB03x"; \n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n if (window.netscape){\n try {\n if (document.location.toString().substr(0,4) != "http") {\n netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');}\n }\n catch (e) { }\n } \n //DEBUG alert("user["+config.options.txtUploadUserName+"] password[" + config.options.pasUploadPassword + "]");\n // compose headers data\n var sheader = "\sr\sn";\n sheader += "--" + boundary + "\sr\snContent-disposition: form-data;name=\s"";\n sheader += config.macros.upload.formName +"\s"\sr\sn\sr\sn";\n sheader += "backupDir="+backupDir\n +";user=" + username \n +";password=" + password\n +";uploaddir=" + uploadDir\n + ";;\sr\sn"; \n sheader += "\sr\sn" + "--" + boundary + "\sr\sn";\n sheader += "Content-disposition: form-data;name=\s"userfile\s";filename=\s""+toFilename+"\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", storeUrl, true, username, password);\n request.open("POST", storeUrl, true);\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 request.setRequestHeader("Content-Length",data.length);\n request.setRequestHeader("Content-Type","multipart/form-data; boundary="+boundary);\n request.send(data); \n};\n\n\nconfig.macros.upload.download = function(uploadUrl, uploadToFilename, uploadDir, uploadBackupDir, \n username, password) {\n var request;\n try {\n request = new XMLHttpRequest();\n } \n catch (e) { \n request = new ActiveXObject("Msxml2.XMLHTTP"); \n }\n try {\n if (uploadUrl.substr(0,4) == "http") {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");\n }\n else {\n netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");\n }\n } catch (e) { }\n //request.open("GET", document.location.toString(), true, username, password);\n request.open("GET", document.location.toString(), true);\n request.onreadystatechange = function () {\n if (request.readyState == 4) {\n if(request.status == 200) {\n config.macros.upload.uploadChangesFrom(request.responseText, uploadUrl, \n uploadToFilename, uploadDir, uploadBackupDir, username, password);\n }\n else\n alert(config.macros.upload.messages.errorDownloading.format(\n [document.location.toString()]));\n }\n };\n request.send(null);\n};\n\n//}}}\n////===\n\n////+++!![Initializations]\n\n//{{{\nconfig.lib.options.init('txtUploadStoreUrl','store.php');\nconfig.lib.options.init('txtUploadFilename','');\nconfig.lib.options.init('txtUploadDir','');\nconfig.lib.options.init('txtUploadBackupDir','');\nconfig.lib.options.init('txtUploadUserName',config.options.txtUserName);\nconfig.lib.options.init('pasUploadPassword','');\nconfig.shadowTiddlers.UploadPluginDoc = "[[Full Documentation|http://tiddlywiki.bidix.info/l#UploadPluginDoc ]]\sn"; \n\n\n//}}}\n////===\n\n////+++!![Core Hijacking]\n\n//{{{\nconfig.macros.saveChanges.label_orig_UploadPlugin = config.macros.saveChanges.label;\nconfig.macros.saveChanges.label = config.macros.upload.label.saveToDisk;\n//}}}\n////===
/***\n|''Name:''|UploadPlugin|\n|''Type:''|Plugin|\n|''Version:''|3.3.1 (30/03/2006)|\n|''Source:''|[[TiddlyWiki.BidiX.info/#UploadPlugin|http://tiddlywiki.BidiX.info/#UploadPlugin]]|\n|''Documentation:''|[[TiddlyWiki.BidiX.info/#UploadPluginDoc|http://tiddlywiki.BidiX.info/#UploadPluginDoc]]|\n|''Author:''|BidiX[at]BidiX.info |\n|''Required:''|TW 2.0.6 |\n\n!Description\nUploadPlugin, with [[store.php]], provides @@upload@@ and @@save to web@@ functions. See HowToUpload ([[HowToUpload|http://TiddlyWiki.bidix.info/#HowToUpload]]).\nUploadPlugin uses Username and Password from UploadOptions stored in cookies to authenticate itself to [[store.php]].\nFrench translation available as a separate tiddler UploadPluginMsgFR\n\n!!UploadPlugin\n*If the TiddlyWiki is viewed 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 is viewed from @@website@@ and is @@readOnly@@ (in core TiddlyWiki since 2.0.6) :\n**{{{<<saveChanges>>}}} \n***print nothing\n***has been disabled\n**{{{<<upload>>}}}\n***display as '''save to web''\n***save in the uploadDir directory.\n*If GenerateAnRssFeed in AdvancedOptions is set :\n**generate the content of the RSSFeed \n**upload the RssFile in uploadDir directory\n**Caution : use the SiteUrl tiddler to specify the right url of the TiddlyWiki in the generated RssFile\n*DisplayMessage\n*Log upload action 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*UserVariables to set :\n//{{{\n$AUTHENTICATE_USER = true; // true | false\n$USERS = array(\n 'UserName1'=>'Password1', \n 'UserName2'=>'Password2', \n 'UserName3'=>'Password3'); // set usernames and strong passwords\n$DEBUG = false; // true | false\n//}}}\n*method GET\n**display an information page\n*method POST\n**if $~AUTHENTICATE_USER is ''true''\n***presence and value of user and password are checked with $USER and $PASSWORD \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\n!Usage : \n{{{\n<<upload>>\n uses UploadOptions saved in cookies :\n txtUploadUserName: username\n pasUploadPassword : password\n txtUploadStoreUrl : store script\n txtUploadDir : relative path for upload directory\n txtUploadFilename : upload filename\n txtUploadBackupDir : relative path for backup directory\n\n<<upload [storeUrl [toFilename [backupDir [uploadDir [username]]]]]>>\n optional positional parameters can be passed to overwrite UploadOptions in this order. \n}}}\n\nInstall the {{{<<upload ... >>}}} macro in SideBarOptions just below {{{<<saveChanges>>}}} macro.\n\n\n!User manual\nSee HowToUpload\n\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 server against malicious upload. Two approaches :\n**set $~AUTHENTICATE_USER to true in the [[store.php]] script\n***configure $USER and $PASSWORD in the [[store.php]] script on your webserver\n***set UploadOptions in conformity with [[store.php]]\n**Use server protection :\n***for Apache web server ([[for detail see Apache documentation|http://httpd.apache.org/docs/1.3/howto/htaccess.html]]) : \n****configure and upload the [[.htaccess]] [[.passwd]]\n***for other web servers see the appropriate documentation\n*Configure an upload button, for example in the SideBarOptions\n!Suppported Browser\n*Firefox : tested Ok\n*Internet Explorer : tested Ok\n*Safari : reported ok on OS X\n*Others : Not tested, please report status.\n\n!Revision history\n*V 3.3.1 (30/03/2006)\n**bug in backup folder when uploading rssfile fixed\n*V 3.3.0 (12/03/2006)\n**Code refactoring\n**suppress saveChanges hijacking\n*V3.2.2 (25/02/2006)\n**Use PasswordTweak 1.0.1\n**uploaddir is a relative path\n**backupdir is a relative path\n+++[previous revisions]\n*V3.2.1 (13/02/2006)\n**name and password added to open.request (Thanks to TedPavlic)\n*V3.2.0 (14/02/2006)\n**Use PassworDTweak (http://tiddlyWiki.bidix.info/#PasswordTweak) for password\n*V3.1.0 (12/02/2006)\n**UploadOptions in Cookies\n**Username and password from UploadOptions pass to store.php script for authentification check\n*V3.0.3 (03/02/2006)\n**Firefox crashes due to global var fixed\n*V3.0.2 (25-Jan-2006)\n**HTTPS compatible\n*V3.0.1 (18-Jan-2006)\n**UTF8toUnicode conversion problem in Firefox\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*V2.0.2 (8-Jan-2006)\n**conversion of SiteTitle and SiteSubtitle in web page Title\n*V2.0.1 (8-Jan-2006)\n**Compatibilty with TiddlyWiki 2.0.1\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*v1.1.0 (27-Dec-2005)\n**Upload RSS File\n*v1.0.3 (26-Dec-2005)\n**UploadLog tiddler\n*v1.0.2 (24-Dec-2005)\n**Optional parameter toFilename\n**Optional parameter backupDir\n*v1.0.1 (23-Dec-2005)\n**reformatting code\n* v1.0.0 (17-Dec-2005)\n** first public working version\n===\n\n
<div class='toolbar' macro='toolbar -closeTiddler closeOthers +editTiddler permalink references jump newHere'></div>\n<div class='title' macro='view title'></div>\n<div class='subtitle'>modified <span macro='view modified date [[DD MMM YYYY]]'></span>, created <span macro='view created date [[DD MMM YYYY]]'></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>
Yes, you //can// use TiddlyWiki as a Web site! In fact, this site runs soley on a single TiddlyWiki file. Here are some points to consider when using TiddlyWiki as a Web site:\n*[[Bandwidth]]\n*[[Web Site Portability]]\n*[[Web Site Saving Changes]]\n*[[Web Site Security|Is TiddlyWiki secure?]]
If you allow your TiddlyWiki site to be saved in its entirety (ie: //not// checking the SaveEmptyTemplate under AdvancedOptions) the visitor can keep a local version of your site for offline or portable reference. And remember, we're talking about sites composed of files weighing in typically well under 200K in size, so on a very cheap 256MB Thumb Drive, you could keep //huge// quantities of TiddlyWiki information! Install [[Firefox|http://www.mozilla.org/products/firefox/]] along with it, and you have an excellent portable browsing environment.\n
One key issue to understand is that you //cannot// directly edit Web-hosted TiddlyWiki files. Though you can seemingly create and edit Tiddlers online, the TiddlyWiki file //must exist locally// in order to edit and save changes. \n\nThis means the file must be downloaded, (which is trivial) but once changes are made, it must also be uploaded //back// to the Web host. This can be difficult, cumbersome, and confusing depending on your environment and 'net experience. There is no simple method of securely uploading an edited TiddlyWiki File built into TiddlyWiki. you must use some sort of Web hosted file manager or a local FTP client. \n\nFor file managers, consider some of the simple PHP File Manager scripts found a http://www.hotscripts.com for uploading files. Just understand that these apps need to be secured to protect your site, and they can be more complicated to set up for new users. I'll probably add some tips concerning this later...\n\nIf your Web host offers FTP access, then you are in luck, at least if you are using the [[Firefox|http://www.mozilla.org/products/firefox/]] browser. Just install the [[FireFTP|https://addons.mozilla.org/extensions/moreinfo.php?id=684]] extension, and you will have have easy "in-browser" transfer capability back and forth, to and from your Web host. In fact, installing [[Portable Firefox|http://johnhaller.com/jh/mozilla/portable_firefox/]] on a Thumb Drive makes the whole site maintenance environment truely portable and easy.\n
TiddlyWiki has lots of uses. Here are some examples of some possible uses. \n\nIf you can think of more, please [[contact me|Jim Barr]], and I'll add them to this list!\n<<listTags Cando>>\n[[Cando]]
I really like TiddlyWiki for its sheer [[elegance|Elegant]]. I have tried out literally dozens of [[Wiki]] and [[CMS]] implementations (go to http://OpenSourceCMS.com, and you'll see what I mean) and though there are certainly some very powerful solutions out there, the fact remains that for certain specific applications, TiddlyWiki's [[Wiki-like Interface]] implementation really has them beat. \n\nTiddlyWiki shines because of three main charactaristics: [[Simplicity]], [[Compactness]], and its [[Elegant]] [[Wiki-like Interface]]. Other tools may someday surface that surpass TiddlyWiki, but for now, it is an excellent, elegant solution that's sure to please many people.\n
It seems to me that TiddlyWiki was designed with the goal of providing a SelfContained, portable, personal notes repository. Being a single file, it can be emailed, stored on a Thumb Drive, or stored on a local or shared hard drive. As functionality has been added, it has retained that goal, yet it has grown to be very useful as a complete Web site environment. In fact, this site runs soley on a single TiddlyWiki file. Really, there isn't much to it other than leveraging the [[elegance|Elegant]] of TiddlyWiki.\n\nIts framework also allows for some easy customization. Several TiddlyWikiAdaptations exist that extend TiddlyWiki's function while retaining the [[Simplicity]] and [[Elegance|Elegant]] of TiddlyWiki. As core TiddlyWiki development continues, TiddlyWikiAdaptations will become easier to manage and create.
[[Wikipedia|http://en.wikipedia.org/wiki/Wiki]] defines "wiki" as:\n\n>...a web application that allows users to add content, as on an Internet forum, but also allows anyone to edit the content. The term Wiki also refers to the collaborative software used to create such a website....\n>\n>Wiki (with an upper case W) and WikiWikiWeb are both used to refer specifically to the Portland Pattern Repository, the first wiki ever created. Wiki proponents often spell 'wiki' with a lower case "w". The name is based on the Hawaiian term wiki wiki, meaning "quick" or "informal". Sometimes wikiwiki (or Wikiwiki) is used instead of wiki.\n>\n>A wiki enables documents to be written collectively (co-authoring) in a simple markup language using a web browser. A single page in a wiki is referred to as a "wiki page", while the entire body of pages, which are usually highly interconnected via hyperlinks, is called "the wiki"; in effect, a very simple database.\n>\n>A defining characteristic of wiki technology is the ease with which pages can be created and updated. Generally, there is no review before modifications are accepted. Most wikis are open to the general public without the need to register any user account. \n(Click [[here|http://en.wikipedia.org/wiki/Wiki]] for Wikipedia's page)\n\nNote that currently TiddlyWiki, when implemented as a Web site, does not allow for collaborative editing due to the technical limitations of SaveChanges. There are several ServerSide implementations that do provide for colaborative editing.
Though TiddlyWiki tends to follow Wiki concepts, it diverges in one key area: Presentation. Most Wikis are page-oriented: They present content and WikiWord links, but when you click on a link, the Wiki opens a new page of content. You view content a page at a time. To go back to the calling page, you click the Back button on your browser. This is very useful for long articles. The [[Wikipedia|http://www.wikipedia.org]] is an excellent example of this concept.\n\nTiddlyWiki is more element-oriented. TiddlyWiki presents content and WikiWord links, but when you click a link, the content pops open in its own space //on the same page//. The huge advantage of this is that you are seeing the linked content //in context// along with the content of the calling link. It really makes working with the content more intuitive because you see not only the related information, but you see it with what it's related to. This is especially useful when using TiddlyWiki for Notes and Documentation. The caveat to this is that it doesn't work that well for long articles. TiddlyWiki is more suited to MicroContent or short, related chunks of information.
A WikiWord is a word composed of a bunch of other words slammed together with each of their first letters capitalised. WikiWord notation in a conventional WikiWikiWeb is used to name individual pages while TiddlyWiki uses WikiWord titles for smaller chunks of MicroContent. Referring to a page with a WikiWord automatically creates a link to it. Clicking on a link jumps to that page or, if it doesn't exist, to an editor to create it. This ThirdVersion of TiddlyWiki also adds NonWikiWordLinks.
/***\n|''Name:''|Plugin setDefaults|\n|''Version:''|1.0.1 (2006-03-16)|\n|''Source:''|http://tiddlywikitips.com/#%5B%5BPlugin%20setDefaults%5D%5D|\n|''Author:''|Jim Barr (jim [at] barr [dot] net)|\n|''Licence:''|[[BSD open source license]]|\n|''TiddlyWiki:''|2.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n!Description\n\nThese settings simply set "default" values for several system features and Plugins.\n***/\n\n/***\nStandard settings:\n***/\n//{{{\nconfig.options.chkRegExpSearch = false; // default false\nconfig.options.chkCaseSensitiveSearch = false; // default false\nconfig.options.chkAnimate = true; // default true\nconfig.options.txtUserName = "YourName"; // default "YourName"\nconfig.options.chkSaveBackups = true; // default true\nconfig.options.chkAutoSave = true; // default false\nconfig.options.chkGenerateAnRssFeed = false; // default false\nconfig.options.chkSaveEmptyTemplate = false; // default false\nconfig.options.chkOpenInNewWindow = true; // default true\nconfig.options.chkToggleLinks = false; // default false\nconfig.options.chkHttpReadOnly = false; // default true\nconfig.options.chkForceMinorUpdate = false; // default false\nconfig.options.chkConfirmDelete = true; // default true\nconfig.options.txtBackupFolder = ""; // default ""\nconfig.options.txtMainTab = "tabTimeline"; // default "tabTimeline"\nconfig.options.txtMoreTab = "moreTabAll"; // default "moreTabAll"\nconfig.options.txtMaxEditRows = "20"; // default "30"\n//}}}\n\n/***\nCustom Plugin settings:\n***/\n//{{{\nconfig.options.chkSinglePageMode = false; // default "true"\nconfig.options.chkSearchList = true; // default "false"\nconfig.messages.messageClose.text = "X"; // default "close"\nconfig.views.wikified.defaultText = ""; // default "The tiddler '%0' doesn't yet exist. Double-click to create it"\nconfig.options.chkStepWiseNavigationOn = true; // default "false"\n//}}}
<?php\n/***\n! User settings\nEdit these lines according to your need\n***/\n//{{{\n$AUTHENTICATE_USER = true; // true | false\n$USER = 'UsernameToCheck'; // set a Username\n$PASSWORD = 'PasswordToCheck'; // set a strong password\n$DEBUG = false; // true | false\n//}}}\n/***\n!Code\nNo change needed under\n***/\n//{{{\n\n/***\n * store.php - upload a file in this directory\n * version :1.2 - 12/02/2006 - BidiX@BidiX.info\n * \n * see : \n * http://tiddlywiki.bidi.info/#UploadPlugin for usage\n * http://www.php.net/manual/en/features.file-upload.php \n * for détails on uploading files\n * usage : \n * POST \n * UploadPlugin[backupDir=<backupdir>;user=<user>;password=<password>;]\n * userfile <file>\n * GET\n *\n * Revision history\n * v 1.2 - 12/02/2006 : \n * POST \n * UploadPlugin[backupDir=<backupdir>;user=<user>;password=<password>;]\n * userfile <file>\n* if $AUTHENTICATE_USER\n * presence and value of user and password are checked with \n * $USER and $PASSWORD\n * v 1.1 - 23/12/2005 : \n * POST UploadPlugin[backupDir=<backupdir>] userfile <file>\n * v 1.0 - 12/12/2005 : \n * POST userfile <file>\n *\n * Copyright (c) BidiX@BidiX.info 2005-2006\n ***/\n//}}}\n\n//{{{\n\nif ($_SERVER['REQUEST_METHOD'] == 'GET') {\n?>\n<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\n<html>\n <head>\n <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >\n <title>BidiX.info - TiddlyWiki UploadPlugin - Store script</title>\n </head>\n <body>\n <p>\n <p>store.php V 1.2\n <p>BidiX@BidiX.info\n <p>&nbsp;</p>\n <p>&nbsp;</p>\n <p>&nbsp;</p>\n <p align="center">This page is designed to upload a <a href="http://www.tiddlywiki.com/">TiddlyWiki<a>.</p>\n <p align="center">for details see : <a href="http://www.bidix.info/TiddlyWiki/BidiXTW.html#HowToUpload">www.bidix.info/TiddlyWiki/BidiXTW.html#HowToUpload<a>.</p> \n </body>\n</html>\n<?php\n}\nelse {\n $uploaddir = './';\n $backuperror = false;\n $optionStr = $_POST['UploadPlugin'];\n $optionArr=explode(';',$optionStr);\n $options = array();\n $backupFilename = '';\n foreach($optionArr as $o) {\n list($key, $value) = split('=', $o);\n $options[$key] = $value;\n }\n if ((!$AUTHENTICATE_USER) \n || (($options['user']) && ($options['user'] == $USER) && ($options['password']) && ($options['password'] == $PASSWORD))) {\n if (file_exists($uploaddir . $_FILES['userfile']['name']) && ($options['backupDir'] != '')) {\n if (! file_exists($options['backupDir'])) {\n mkdir($options['backupDir']) or ($backuperror = "mkdir error");\n }\n $filename = $_FILES['userfile']['name'];\n $backupFilename = $options['backupDir'].'/'.substr($filename, 0, strpos($filename, '.'))\n .date('.Ymd.His').substr($filename,strpos($filename,'.'));\n rename($filename, $backupFilename) or ($backuperror = "rename error");\n }\n if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir . $_FILES['userfile']['name'])) {\n if (!$backuperror) {\n if($DEBUG) {\n echo "debug mode \sn\sn";\n }\n echo "0 - File successfully loaded in " .$uploaddir . $_FILES['userfile']['name']. "\sn";\n if ($backupFilename)\n echo "backupFile=$backupFilename;\sn";\n } else {\n echo "BackupError : $backuperror - File successfully loaded in " .$uploaddir . $_FILES['userfile']['name']. "\sn";\n }\n } \n else {\n echo "Error : " . $_FILES['error']." - File NOT uploaded !\sn";\n }\n }\n else {\n echo "Error : UserName or Password do not match \sn";\n echo "UserName : [".$options['user']. "] Password : [". $options['password'] . "]\sn";\n }\n if ($DEBUG) {\n echo '\snHere is some more debugging info : \sn';\n print ("\s$_FILES : \sn");\n print_r($_FILES);\n print ("\s$options : \sn");\n print_r($options);\n }\n}\n//}}}\n?>