Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}-->
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
<<importTiddlers>>
<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser

Your username for signing your edits. Write it as a [[WikiWord]] (eg [[JoeBloggs]])

<<option txtUserName>>
<<option chkSaveBackups>> [[SaveBackups]]
<<option chkAutoSave>> [[AutoSave]]
<<option chkRegExpSearch>> [[RegExpSearch]]
<<option chkCaseSensitiveSearch>> [[CaseSensitiveSearch]]
<<option chkAnimate>> [[EnableAnimations]]

----
Also see [[AdvancedOptions]]
<!--{{{-->
<div class='header' role='banner' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' role='navigation' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' role='navigation' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' role='complementary' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea' role='main'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected {color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}
.readOnly {background:[[ColorPalette::TertiaryPale]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:alpha(opacity=60);}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0 1em 1em; left:0; top:0;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 0.3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0 0; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0;}
.wizardFooter .status {padding:0 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0 0 0.5em;}
.tab {margin:0 0 0 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0 0.25em; padding:0 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0 3px 0 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0; font-size:.9em;}
.editorFooter .button {padding-top:0; padding-bottom:0;}

.fieldsetFix {border:0; padding:0; margin:1px 0px;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0; right:0;}
#backstageButton a {padding:0.1em 0.4em; margin:0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin-left:3em; padding:1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
#displayArea {margin: 1em 1em 0em;}
noscript {display:none;} /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
}
/*}}}*/
<!--{{{-->
<div class='toolbar' role='navigation' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
This is a problem with Firebug for Firefox.
{{annotation{
Forget the below workaround: You can keep Firebug enabled. Switch to Firebug's "Net" tab and in the ''Options'' menu select "Disable Network Monitoring". This stops the problem from recurring when you try upload.
}}}
Firebug's console interferes with the browser's handling of ~XMLHttpRequest functions. The problem is triggered by selecting "Show ~XMLHttpRequests" from the Firebug Console "Options" menu (open Firebug to access the menu).

In the previous version of Firebug, disabling this menu option avoided the problem. However, as of Firebug v1.0.1, it seems that isn't enough, and the problem can appear even if the "Show..." menu it unchecked.

One workaround is to completely disable Firebug until needed. Another temporarily workaround is to toggle (i.e., set and then clear) the "Show ~XMLHttpRequests" menu item just before doing the upload. This stops Firebug from interferring in the NEXT ~XMLHttpRequest. Curiously, even though the menu item remains unchecked, any subsequent ~XMLHttpRequests will again fail until you toggle the menu again.
----
I did a test (2013-09-23) with:

* FireBug Version: 1.12.1
* FireFox Version: 24.0
* OS ubuntu 13.04
* http://a-pm-experimental.tiddlyspot.com/
** TW core version: 2.5.3
* FireBug is open
** Network tab is open, to see what's going on

I did create a new tiddler. 
I did "save to web" -> Everything works as expected. 
-pmario
----
@TiddlyWiki
@TiddlyWikiDev
See [[Welcome]]...
{{annotation{
''Note:'' The old wiki is still accessible via [[web.archive.org|http://web.archive.org/web/20101129095145/http://tiddlywiki.org/wiki/Special:AllPages]].
}}}
This is tiddlywiki.org on the new platform "TiddlySpace".
Some information is already migrated from the old wikipedia but there is still a lot to do.
The old dot-org wikipedia was littered with spam and not well maintained so there are some benefits to move over to the TiddlySpace platform.
# cleanup during migration
# update of the information
# write and display examples in our own markup

''You can also contribute to this wiki!''
To do so, you need to signup for TiddlySpace.
If you signup you will get your own Tiddly"Space"Wiki (your first space-name is also your editor-name) where you can write and publish, private and public tiddlers.
You will also be able to contribute on this @tiddlywiki space. (every TiddlySpace member can).

After you signed-up you can login on TiddlySpace (via your own space or here) and start contributing.
;Some guidelines for this wiki:
* language is English (create other languages in other spaces...you can link them here)
* test/check content before posting

;Things you can do:
* migrate articles from the old wikipedia [[here|http://web.archive.org/web/20101129095145/http://tiddlywiki.org/wiki/Special:AllPages]] (but first please check if the information is still accurate and up to date -- if you are not sure about something, try to test or ask in the [[community forum|The community forum]], and adjust before publishing here)
* write new content

Don't know where to start?
Check your bookmarks in your browser...any links to articles in the old wikipedia? (might be good content!)
Dead links (from everywhere) to articles in the old wikipedia might be an indication that some info is missing here.
or...
...improve this tiddler...
!References
* in [[this google groups discussion|https://groups.google.com/forum/?fromgroups#!topic/tiddlywiki/wAW1pQABu8k]] it was announced to move the [[old MediaWiki documentation|http://web.archive.org/web/20101129095145/http://tiddlywiki.org/wiki/Special:AllPages]] here to TiddlySpace.
<<tiddler "Keyboard Shortcuts">>
Tiddlers tagged <<tag Accessibility>> give more information on how TiddlyWiki tries to be and provide an accessible platform.
TiddlyWiki's architecture for interacting with servers allows it to be plugged into a wide variety of servers.

This is done through the addition of plugins containing custom server adaptors.
Server adaptors are designed to allow for UseCases like importing tiddlers, loading missing tiddlers on the fly and synchronizing changes with a server.
Separate macros and core extensions implement such features by accessing the facilities provided by server adaptors.

*[[ccTiddly|http://svn.tiddlywiki.org/Trunk/contributors/SimonMcManus/adaptors/ccTiddlyAdaptorPlugin.js]]
* [[ConfabbNotes|http://svn.tiddlywiki.org/Trunk/contributors/PhilHawksworth/adaptors/ConfabbNotesAdaptorPlugin.js]]
* [[Confluence|http://svn.tiddlywiki.org/Trunk/contributors/MartinBudden/adaptors/ConfluenceAdaptorPlugin.js]]
* [[DAV|http://svn.tiddlywiki.org/Trunk/contributors/MartinBudden/adaptors/DavAdaptorPlugin.js]]
* [[FacebookFriends|http://svn.tiddlywiki.org/Trunk/contributors/SimonMcManus/adaptors/FacebookFriendsAdaptorPlugin.js]]
*[[FacebookNews|http://svn.tiddlywiki.org/Trunk/contributors/SimonMcManus/adaptors/FacebookNewsAdaptorPlugin.js]]
* [[JSP Wiki|http://svn.tiddlywiki.org/Trunk/contributors/MartinBudden/adaptors/JSPWikiAdaptorPlugin.js]]
* [[MediaWiki|http://svn.tiddlywiki.org/Trunk/contributors/MartinBudden/adaptors/MediaWikiAdaptorPlugin.js]]
* [[RawText|http://svn.tiddlywiki.org/Trunk/association/adaptors/RawTextAdaptor.js]]
* [[RSS|http://svn.tiddlywiki.org/Trunk/contributors/JonathanLister/adaptors/RSSAdaptor.js]]
*[[Socialtext|http://svn.tiddlywiki.org/Trunk/contributors/MartinBudden/adaptors/SocialtextAdaptorPlugin.js]]
* [[Synchrotron|http://svn.tiddlywiki.org/Trunk/contributors/MartinBudden/adaptors/synchrotronAdaptorPlugin.js]]
*[[TiddlyWeb|https://github.com/tiddlyweb/tiddlywebwikiclient]]
* [[Trac|http://svn.tiddlywiki.org/Trunk/contributors/FND/adaptors/TracAdaptor.js]]
* [[TWiki|http://svn.tiddlywiki.org/Trunk/contributors/MartinBudden/adaptors/TWikiAdaptorPlugin.js]]
* [[Twitter|http://svn.tiddlywiki.org/Trunk/contributors/FND/adaptors/TwitterAdaptor.js]]
* [[WikispacesSOAP|http://svn.tiddlywiki.org/Trunk/contributors/SaqImtiaz/verticals/POLS250/common/plugins/WikispacesSoapAdaptorPlugin.js]]
* [[Wordpress|http://svn.tiddlywiki.org/Trunk/contributors/MartinBudden/adaptors/WordpressAdaptorPlugin.js]]
*[[ZiddlyWiki|http://svn.tiddlywiki.org/Trunk/contributors/MartinBudden/adaptors/WordpressAdaptorPlugin.js]]

!!See Also

* [[ServerAdaptorMechanism]]
A [[User]] who is a [[Member]] of a [[Space]] may add another [[User]] as a [[Member]] of the [[Space]].

Caution is advised when adding another [[Member]] to a [[Home Space]] as both now are co-owners enjoying the same privileges to [[edit|Edit Tiddler]], [[publish|Publish Tiddler]], [[delete|Deleting A Tiddler]] a tiddler or [[remove any member|Remove Member]] including the initial [[Owner]]. For this reason, all [[members|Member]] of  a [[Space]] are siad to form a [[Small Trusted Group]].
Open MainMenu for editing. Position the cursor where the item is to appear and type in the name of the tiddler. If the tiddler's name is a WikiWord it will work automatically as a link. If not, insert two square brackets either side of the tiddler name: <code><nowiki>[[tiddler name]]</nowiki></code>.

Close MainMenu. You should now see the new item displayed.
HTML entities provide a way to encode special characters.

'' Commonly Used Symbols ''


| !Code | !Symbol | !Description |h
| &amp;eacute; | &eacute; | acute accent|
| &amp;rarr; | &rarr; | right arrow|
| &amp;larr; | &larr;  | left arrow|
| &amp;rArr; | &rArr; | double right arrow|
| &amp;lArr; | &lArr; | double left arrow|
| &amp;there4; | &there4; | therefore (mathematical)|


'' See Also ''

* [[Use of other languages such as XML, HTML]]

'' External Resources ''

* [http://de.selfhtml.org/html/referenz/zeichen.htm HTML entities reference] (DE)
* [http://www.tiddlywiki.com/#HtmlEntities HTML Entities]
* [http://www.w3schools.com/TAGS/ref_entities.asp HTML Entities Reference]
* [http://www.w3schools.com/TAGS/ref_symbols.asp HTML Symbol Entities Reference]
* [http://piddlytots.tiddlyspot.com/#HTMLEntityReference HTML Entities Reference, in TiddlyWiki markup]
!Summary
The shadow tiddler AdvancedOptions provides access to several advanced options and accessible via the OptionsPanel in the [[Sidebar]] or the {{button{tweaks}}} command in the [[Backstage Area]] -- also see [[options macro|options]].
!Default Contents
{{{
<<options>>
}}}
<<options>>
Using a standard TiddlyWiki the shadow tiddler ViewTemplate defines how an individual tiddler is displayed. You are not able to use alternative layouts for different tiddlers. All will show a title, some subtitle, a toolbar, etc... depending on how your ViewTemplate is set up.

To display different layouts for diferent tiddlers, you can use third-party plugins.
!"""TaggedTemplateTweak"""
[[TaggedTemplateTweak|http://www.TiddlyTools.com/#TaggedTemplateTweak]] by [[Eric Shulman / TiddlyTools|http://www.TiddlyTools.com]] allows you to create alternative templates, e.g. an ''"""AlternativeViewTemplate"""''. 

If you then tag a tiddlers with "Alternative" (or even "alternative") the ''"""AlternativeViewTemplate"""'' will be used to display the tiddler instead of the ViewTemplate.

The same mechanism can also be used to create an alternative EditTemplate, e.g., e.g. ''"""AlternativeEditTemplate"""''.
See [[Alternative Tiddler Layouts]]...
See [[Alternative Tiddler Layouts]]...
Apps are adaptations of TiddlyWiki which provide full blown applications, e.g. for...
*Notes
*Tasks and [[GTD|http://en.wikipedia.org/wiki/Getting_Things_Done]]
*[[PIM|http://en.wikipedia.org/wiki/Personal_information_management]]
*etc...
Looking for a [[old version|Archive]] of TiddlyWiki? Check out the [[Archive|http://classic.tiddlywiki.com/archive]] embedded below...
<html>
<div style="overflow:hidden;position:relative;clear:both;height:250px;width:100%;">
<iframe style="overflow:auto;position:absolute;margin:0 0 0 -10px;top:-130px; width:100%;height:380px;border:0;" src="http://classic.tiddlywiki.com/archive"/>
</div>
</html>
To make TiddlyWiki save itself whenever you save edits to a tiddler, go to the ''options'' section in the sidebar and tick off ''autosave''.

When AutoSave is disabled, save your changes manually using [[saveChanges]] macro.
<<<
The ''"""BT Group"""'' is one of the largest telecommunication services companies in the world with operations in over 170 countries.
<<<
{{source{[[...from Wikipedia|http://en.wikipedia.org/wiki/BT_Group]]}}}
Also see...
*[[bt.com|http://www.bt.com]]
*[[btplc.com|http://www.btplc.com]]
!SpaceUnplugged
{{unpluggedSpaceTab{
{{wizard{
<<image unsyncedIcon width:48>> Sync is currently unavailable in ~TiddlyWiki due to security constraints in modern browsers. Research is being done to build a suitable alternative. In the meantime if you have changed content in an offline ~TiddlyWiki, you can get your content back into ~TiddlySpace by using the ''import'' functionality from the backstage of the online wiki.
}}}
}}}

!Menu
<<message messages.memberStatus>> <<homeLink>>
{{unsyncedList{<<message messages.syncListHeading>> <<list filter [is[unsynced]]>>}}}

running TiddlySpace@glossary version <<message extensions.tiddlyweb.status.tiddlyspace_version>>
{{autotable{
<<tiddler Backstage##Resources>>
}}}

!Resources
[[blog|@@blog]] [[documentation|@@docs]] [[featured spaces|@@featured]] 

!ImportExport
<<fileImport>>
You can download this TiddlySpace as an offline TiddlyWiki:

{{chunkyButton{<<exportSpace>>}}}

!BackstageTiddlers
|upload a <<message messages.privacySetting>> file: <<binaryUpload>>|<<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<saveChanges>>|
|>|<<search>>|
|>|<<tiddler Backstage##Tiddlers>>|

!Tiddlers
<<tabs
	txtMainTab
	"Recent" "Recently edited tiddlers" TabTimeline
	"All" "All tiddlers" TabAll
	"Public" "All public tiddlers" [[TiddlySpaceTabs##Public]]
	"Private" "All private tiddlers" [[TiddlySpaceTabs##Private]]
	"Tags" "All tags" TabTags
	"Spaces" "Tiddlers grouped by space" [[TiddlySpaceTabs##Spaces]]
	"Missing" "Missing tiddlers" TabMoreMissing
	"Orphans" "Orphaned tiddlers" TabMoreOrphans
	"Shadows" "Shadowed tiddlers" TabMoreShadowed
>>

!BatchOps
<<tabs
	txtPublisherTab
	"Private" "Move tiddlers from private to public" Backstage##BatchPrivate
	"Public" "Move tiddlers from public to private" Backstage##BatchPublic
>>

!BatchPrivate
<<TiddlySpacePublisher type:private>>

!BatchPublic
<<TiddlySpacePublisher type:public>>

!Plugins
''Note:'' Many of these plugins are core TiddlySpace plugins and cannot be changed unless first cloned.

<<tiddler PluginManager>>

!Tweaks
These options change behavior in TiddlyWiki //only// and may be ineffective in TiddlySpace.

<<tiddler AdvancedOptions>>
Every TiddlyWiki or [[TiddlySpace|Space]] provides a [[Backstage Area]] usualle in the top right corner providing management tools.

In TiddlyWiki, the default Backstage Area gives you...
* a button to [[save changes|saveChanges]]
* a [[SynchronizationWizard]]
* an [[ImportWizard|ImportTiddlers...]]
* [[AdvancedOptions|AdvancedOptions...]]
* an [[UpgradeWizard]]
* a [[PluginManager|PluginManager...]]

In TiddlySpace the [[Backstage Area]] allows you to...
*manage your user account
*create new spaces
*include other spaces or remove included spaces
*add new members or remove members
*perform various actions related to content tiddlers
[[Bag]] is a name used in TiddlyWeb for a collection of uniquely named [[tiddlers|Tiddler]].

Each [[bag|Bag]] has a separate [[Policy]] for [[Access Control]] by [[Users|User]]. A bag may also have a description field, typically containing text stating the purpose of the bag.

A TiddlySpace [[space|Space]] has a pair of [[Public]] and [[Private]] bags. [[Users|User]] can create additional bags for a [[space|Space]] and manage the corresponding policies via the [[TiddlySpace API]].
!Summary
//''Emphasizing''// @@text@@ __is easy__!
!Markup
| !Style | !Markup |h
|<html><b><i>bold</i></b></html>|{{{''bold''}}} -- two single-quotes|
|//italics//|{{{//italics//}}}|
|<html><b><i>bold italics</i></b></html>|{{{''//bold italics//''}}}|
|__underline__|{{{__underline__}}}|
|--strikethrough--|{{{--Strikethrough--}}}|
|super^^script^^|{{{super^^script^^}}}|
|sub~~script~~|{{{sub~~script~~}}}|
|@@Highlight@@|{{{@@Highlight@@}}}|
|{{{plain text}}}|<html><code>{{{PlainText No ''Formatting''}}}</code></html>|
|/%this text will be invisible%/hidden text|{{{/%this text will be invisible%/}}}|
|foo -- bar|{{{use two dashes -- between two words to create an Em dash}}}|

Binary tiddlers are tiddlers which have the field "server.content-type" set to a //Content Type// or //MIME Type//, see [[Wikipedia on MIME Types|http://en.wikipedia.org/wiki/MIME]].

When served via the HTML [[Serialization]] tiddlers are rendered using this MIME type, e.g. [[Image Tiddlers|image tiddlers]]@faq.
/***
|''Name''|BinaryTiddlersPlugin|
|''Description''|renders base64-encoded binary tiddlers as images or links|
|''Author''|FND|
|''Version''|0.3.2|
|''Status''|@@beta@@|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/BinaryTiddlersPlugin.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5|
!Code
***/
//{{{
(function($) {

"use strict";

var ctfield = "server.content-type";

var plugin = config.extensions.BinaryTiddlersPlugin = {
	isWikiText: function(tiddler) {
		var ctype = tiddler.fields[ctfield];
		if(ctype) {
			if (ctype === 'text/x-tiddlywiki') {
				return true;
			}
			return !this.isBinary(tiddler) && !this.isTextual(ctype);
		} else {
			return true;
		}
	},
	// NB: pseudo-binaries are considered non-binary here
	isBinary: function(tiddler) {
		var ctype = tiddler.fields[ctfield];
		return ctype ? !this.isTextual(ctype) : false;
	},
	isTextual: function(ctype) {
		return ctype.indexOf("text/") === 0
			|| this.endsWith(ctype, "+xml")
			|| ctype === 'application/json'
			|| ctype === 'application/javascript';
	},
	endsWith: function(str, suffix) {
		return str.length >= suffix.length &&
			str.substr(str.length - suffix.length) === suffix;
	},
	isLink: function(tiddler) {
		return this.isBinary(tiddler) && tiddler.text.indexOf("<html>") !== -1;
	}
};

// Disable edit for linked tiddlers (for now)
// This will be changed to a GET then PUT
config.commands.editTiddler.isEnabled = function(tiddler) {
    var existingTest = config.commands.editTiddler.isEnabled;
    if (existingTest) {
        return existingTest && !plugin.isLink(tiddler);
    } else {
        return !plugin.isLink(tiddler);
    }
};

// hijack text viewer to add special handling for binary tiddlers
var _view = config.macros.view.views.wikified;
config.macros.view.views.wikified = function(value, place, params, wikifier,
		paramString, tiddler) {
	var ctype = tiddler.fields["server.content-type"];
	if(params[0] === "text" && ctype && ctype !== 'text/x-tiddlywiki' &&
			!tiddler.tags.contains("systemConfig") && !plugin.isLink(tiddler)) {
		var el;
		if(plugin.isBinary(tiddler)) {
			var uri = "data:%0;base64,%1".format([ctype, tiddler.text]); // TODO: fallback for legacy browsers
			if(ctype.indexOf("image/") === 0) {
				el = $("<img />").attr("alt", tiddler.title).attr("src", uri);
			} else {
				el = $("<a />").attr("href", uri).text(tiddler.title);
			}
		} else {
			el = $("<pre />").text(tiddler.text);
		}
		el.appendTo(place);
	} else {
		_view.apply(this, arguments);
	}
};

// hijack edit macro to disable editing of binary tiddlers' body
var _editHandler = config.macros.edit.handler;
config.macros.edit.handler = function(place, macroName, params, wikifier,
		paramString, tiddler) {
	if(params[0] === "text" && plugin.isBinary(tiddler)) {
		return false;
	} else {
		_editHandler.apply(this, arguments);
	}
};

// hijack autoLinkWikiWords to ignore binary tiddlers
var _autoLink = Tiddler.prototype.autoLinkWikiWords;
Tiddler.prototype.autoLinkWikiWords = function() {
	return plugin.isWikiText(this) ? _autoLink.apply(this, arguments) : false;
};

}(jQuery));
//}}}
/***
|''Name''|BinaryUploadPlugin|
|''Version''|0.3.16|
|''Author''|Ben Gillies and Jon Robson|
|''Type''|plugin|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/BinaryUploadPlugin.js|
|''Description''|Upload a binary file to TiddlyWeb|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig TiddlyWebConfig|
!Usage
{{{
<<binaryUpload bag:<name> edit:tags edit:title tags:<default tags> title:<title> >>
}}}
* {{{bag:<name>}}}: optional; if left out, the file will be saved to the current workspace
* {{{edit:tags}}}: specifies that you want to tag the file being uploaded
* {{{edit:title}}}: specifies that you want to set the title to something other than the filename
* {{{tags:<default tags>}}}: specifies a default set of tags to apply to the file (requires {{{edit:tags}}} to be set)
* {{{title:<title>}}}: predefines the title of the binary tiddler
!Requires
TiddlyWeb
tiddlywebplugins.form
!Code
***/
//{{{
(function($) {

var tiddlyspace = config.extensions.tiddlyspace;

var macro = config.macros.binaryUpload = {
	locale: {
		titleDefaultValue: "Please enter a title...",
		tagsDefaultValue: "Please enter some tags...",
		titlePrefix: "title: ",
		tagsPrefix: "tags: ",
		loadSuccess: 'Tiddler %0 successfully uploaded',
		loadError: "An error occurred when uploading the tiddler %0",
		uploadInProgress: "Please wait while the file is uploaded...",
		membersOnly: "Only members can upload."
	},
	renderInputFields: function(container, options) {
		var locale = macro.locale;
		var editableFields = options.edit;
		var includeFields = {
			tags:  editableFields && editableFields.contains("tags") ? true : false,
			title: editableFields && editableFields.contains("title") ? true : false
		};
		var fields = ["title", "tags"];
		for(var i = 0; i < fields.length; i++) {
			var fieldName = fields[i];
			var userDefault = options[fieldName];
			var defaultValue = userDefault ? userDefault[0] : false;
			if(includeFields[fieldName] || defaultValue) {
				var localeDefault = locale["%0DefaultValue".format(fieldName)];
				var className = defaultValue ? "userInput" : "userInput notEdited";
				var inputEl;
				var val = defaultValue || localeDefault || "";
				var iContainer = $("<div />").addClass("binaryUpload%0".format(fieldName)).
					appendTo(container);
				if(defaultValue && !includeFields[fieldName]) {
					var label = locale["%0Prefix".format(fieldName)];
					$("<span />").text(label).appendTo(iContainer);
					$("<span />").addClass("disabledInput").text(val).appendTo(iContainer);
					inputEl = $("<input />").attr("type", "hidden");
				} else {
					inputEl = $("<input />").attr("type", "text");
				}
				inputEl.attr("name", fieldName).
					addClass("%0Edit".format(fieldName)).
					val(val).addClass(className).appendTo(iContainer);
			}
		}
	},
	getTiddlerName: function(fileName) {
		var fStart = fileName.lastIndexOf("\\");
		var fStart2 = fileName.lastIndexOf("/");
		fStart = fStart < fStart2 ? fStart2 : fStart;
		fileName = fileName.substr(fStart+1);
		return fileName;
	},
	errorHandler: function(fileName) {
		displayMessage("upload of file %0 failed".format(fileName));
	},
	uploadFile: function(place, baseURL, workspace, options) {
		var pleaseWait = $(".uploadProgress", place);
		var iframeName = options.target;
		var form = $("form", place);
		var existingVal = $("input[name=title]", form).val();
		var fileName = existingVal || $('input:file', form).val();
		if(!fileName) {
			return false; // the user hasn't selected a file yet
		}
		fileName = macro.getTiddlerName(fileName);
		$("input[name=title]", place).val(fileName);
		// we need to go somewhere afterwards to ensure the onload event triggers
		var redirectTo = "/%0/tiddlers.txt?select=title:%1".
			format(workspace, fileName);
		var token = tiddlyspace ? tiddlyspace.getCSRFToken() : "";
		var action = "%0?csrf_token=%1&redirect=%2"
			.format(baseURL, token, redirectTo);
		form[0].action = action; // dont use jquery to work with ie
		form[0].target = iframeName;
		// do not refactor following line... won't work in IE6 otherwise
		$(place).append($('<iframe name="' + iframeName + '" id="' + iframeName + '"/>').css('display','none'));
		macro.iFrameLoader(iframeName, function() {
			var content = document.getElementById(iframeName).contentWindow.document.documentElement;
			if($(content).text().indexOf(fileName) > -1) {
				options.callback(place, fileName, workspace, baseURL);
			} else {
				macro.errorHandler(fileName);
			}
			form.show(1000);
			pleaseWait.hide(1000);
		});
		form.hide(1000);
		pleaseWait.show(1000);
		return true;
	},
	createUploadForm: function(place, options) {
		var locale = macro.locale;
		if(readOnly) {
			$('<div class="annotation" />').text(locale.membersOnly).
				appendTo(place);
			return;
		}
		var bag = options.bag;
		options.callback = options.callback ? options.callback :
			function(place, fileName, workspace, baseurl) {
				macro.displayFile(place, fileName, workspace);
				displayMessage(locale.loadSuccess.format(fileName));
				$("input[type=text]", place).val("");
			};
		var defaults = config.defaultCustomFields;
		place = $("<div />").addClass("container").appendTo(place)[0];
		var workspace = bag ? "bags/%0".format(bag) : config.defaultCustomFields["server.workspace"];
		var baseURL = defaults["server.host"];
		baseURL += (baseURL[baseURL.length - 1] !== "/") ? "/" : "";
		baseURL = "%0%1/tiddlers".format(baseURL, workspace);
		//create the upload form, complete with invisible iframe
		var iframeName = "binaryUploadiframe%0".format(Math.random());
		// do not refactor following line of code to work in IE6.
		var form = $('<form action="%0" method="POST" enctype="multipart/form-data" />'.
					format(baseURL)).addClass("binaryUploadForm").
			appendTo(place)[0];
		macro.renderInputFields(form, options);
		$(form).
			append('<div class="binaryUploadFile"><input type="file" name="file" /></div>').
			append('<div class="binaryUploadSubmit"><input type="submit" value="Upload" disabled /></div>').
			submit(function(ev) {
				this.target = iframeName;
				options.target = iframeName;
				macro.uploadFile(place, baseURL, workspace, options);
			})
			.find('[type="file"]').bind('change', function() {
				$(form).find('[type="submit"]').prop('disabled', false);
			}).end();
		$('<div />').addClass("uploadProgress").text(locale.uploadInProgress).hide().appendTo(place);
		$("input[name=file]", place).change(function(ev) {
			var target = $(ev.target);
			var fileName = target.val();
			var title = $("input[type=text][name=title]", place);
			if(!title.val()) {
				title.val(fileName);
			}
		});
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		params = paramString.parseParams(null, null, true);
		macro.createUploadForm(place, params[0]);
	},
	iFrameLoader: function(iframeName, callback) {
		var iframe = document.getElementById(iframeName); //jQuery doesn't seem to want to do this!?
		var locale = macro.locale;
		$(".userInput").addClass("notEdited"); // reset editing
		var finishedLoading = function() {
			callback();
		};
		var iFrameLoadHandler = function() {
			finishedLoading.apply();
			return;
		};

		iframe.onload = iFrameLoadHandler;
		//IE
		completeReadyStateChanges = 0;
		iframe.onreadystatechange = function() {
			if (++(completeReadyStateChanges) == 3) {
				iFrameLoadHandler();
			}
		};
	},
	displayFile: function(place, title, workspace) {
		var adaptor = store.getTiddlers()[0].getAdaptor();
		var context = {
			workspace: workspace,
			host: config.defaultCustomFields['server.host']
		};
		adaptor.getTiddler(title, context, null, function(context) {
			if(context.status) {
				store.addTiddler(context.tiddler);
				story.displayTiddler(place, title);
				var image = config.macros.image;
				if(image && image.refreshImage) {
					image.refreshImage("/%0/tiddlers/%1".format(workspace, title));
					image.refreshImage(title);
					image.refreshImage("/%0".format(title));
					image.refreshImage("%0/%1/tiddlers/%2".format(config.extensions.tiddlyweb.host, workspace, title));
				}
			} else {
				displayMessage(macro.locale.loadError.format(title));
			}
		});
	}
};

if(tiddlyspace) {
	config.macros.binaryUploadPublic = {
		handler: function(place, macroName, params, wikifier, paramString, tiddler) {
			var options = paramString.parseParams(null, null, true)[0];
			var bag = tiddlyspace.getCurrentBag("public");
			options.bag = bag;
			macro.createUploadForm(place, options);
		}
	};
	config.messages.privacySetting = config.options.chkPrivateMode ?
		"private" : "public";
	config.macros.binaryUpload.defaultWorkspace = tiddlyspace.
		getCurrentWorkspace(config.messages.privacySetting);
}

})(jQuery);
//}}}
!Summary
Use quotations to cite other sources or simply indent content.
!!Blockquotes
Text can be displayed as quotations using three less-than signs:
{{{
<<<
Steve Jobs: "computers are like a bicycle for our minds"
<<<
}}}
<<<
Steve Jobs: "computers are like a bicycle for our minds"
<<<
!Nested Blockquotes 
Quotes can be displayed with multi-levels:
{{{
> blockquote, level 1
>> blockquote, level 2
>>> blockquote, level 3
}}}
> blockquote, level 1
>> blockquote, level 2
>>> blockquote, level 3
!!Mixed Blockquotes
{{{
<<<
Steve Jobs: "computers are like a bicycle for our minds"
> blockquote, level 1
Some more text.
<<<
}}}
<<<
Steve Jobs: "computers are like a bicycle for our minds"
> blockquote, level 1
Some more text.
<<<
[[Bookmarklets]] are small chunks of JavaScript that you can save as a bookmark in your browser. When opened in the context of a TiddlyWiki, they act as a plugin that is saved in the browser, independent of the TiddlyWiki documents itself.

See [[Bookmarklets]]...
TiddlyWiki bookmarklets are small chunks of JavaScript that you can save as bookmarks in your browser.

When you open a bookmarklet in the context of an open TiddlyWiki, it acts as a plugin run by the browser without being stored in TiddlyWiki itself. This can be very convenient, as you can use a bookmarklet on any TiddlyWiki without a need to install a plugin in each one.
!"""Saving A Bookmarklet"""
To save a bookmarklet, simply add it to the Favourites or Bookmarks in your browser. To keep things tidy, add them to a dedicated folder for TiddlyWiki bookmarklets.
!"""Bookmarklet Sources"""
*[[TiddlyTools.com/#InstantBookmarklets|http://tiddlytools.com/#InstantBookmarklets]] by ''Eric Shulman''
*[[TiddlyWiki.com/#TiddlyBookmarklets|http://tiddlywiki.com/#TiddlyBookmarklets]] by ''Jeremy Ruston''
*[[Lewcid.org/tiddlywiki-bookmarklets on web.archives.org|http://goo.gl/dGDPf]] by ''Saq Imtiaz''
!"""Bookmarklet Reference"""
Simply add the {{bookmarklet{green links}}} to your browsers bookmarks.
!!!"""Bookmarklets Loading Remote Plugins On-Demand""" -- """by""" [[Eric Shulman|http://www.tiddlytools.com/#InstantBookmarklets]]
*<html><a
	class="bookmarklet"
	onclick="
	try { if (version.extensions.ImportTiddlersPlugin!=undefined) {
		clearMessage();
		try {window.story.displayTiddler(null,'ImportTiddlers');} catch(e) {window.story.displayTiddler(null,'ImportTiddlers');}
		displayMessage('ImportTiddlersPlugin is already installed.');
		return false;
	} } catch(e){;}
	var s=document.createElement('script');
	s.src='http://svn.tiddlywiki.org/Trunk/contributors/EricShulman/plugins/ImportTiddlersPlugin.js';
	s.onerror=function() {
		clearMessage();
		displayMessage('Could not load ImportTiddlersPlugin from');
		displayMessage(this.src,this.src);
	};
	s.onload=function() {
		clearMessage();
		{window.story.displayTiddler(null,'ImportTiddlers');}
		try { eval(store.getTiddlerText('ImportTiddlersPluginConfig','')); }
		catch(e) { displayMessage(e.description||e.toString()); }
		displayMessage('ImportTiddlersPlugin has been loaded from');
		displayMessage(this.src,this.src);
	};
	s.onreadystatechange=function()  /* for IE */
		{ if(this.readyState=='complete') this.onload(); };
	document.getElementsByTagName('head')[0].appendChild(s);
	return false;"
  onmouseover="
	this.href='javascript:void(eval(decodeURIComponent(%22(function(){try{('
	+encodeURIComponent(encodeURIComponent(this.onclick))
	+')()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))';"
	title="Load ImportTiddlersPlugin from svn.TiddlyWiki.org repository"
	href="javascript:void(eval(decodeURIComponent(%22(function(){try{(function%2520onclick(event)%2520%257B%250A%250A%2509try%2520%257B%2520if%2520(version.extensions.ImportTiddlersPlugin!%253Dundefined)%2520%257B%250A%2509%2509clearMessage()%253B%250A%2509%2509try%2520%257Bwindow.story.displayTiddler(null%252C'ImportTiddlers')%253B%257D%2520catch(e)%2520%257Bwindow.story.displayTiddler(null%252C'ImportTiddlers')%253B%257D%250A%2509%2509displayMessage('ImportTiddlersPlugin%2520is%2520already%2520installed.')%253B%250A%2509%2509return%2520false%253B%250A%2509%257D%2520%257D%2520catch(e)%257B%253B%257D%250A%2509var%2520s%253Ddocument.createElement('script')%253B%250A%2509s.src%253D'http%253A%252F%252Fsvn.tiddlywiki.org%252FTrunk%252Fcontributors%252FEricShulman%252Fplugins%252FImportTiddlersPlugin.js'%253B%250A%2509s.onerror%253Dfunction()%2520%257B%250A%2509%2509clearMessage()%253B%250A%2509%2509displayMessage('Could%2520not%2520load%2520ImportTiddlersPlugin%2520from')%253B%250A%2509%2509displayMessage(this.src%252Cthis.src)%253B%250A%2509%257D%253B%250A%2509s.onload%253Dfunction()%2520%257B%2520%250A%2509%2509clearMessage()%253B%250A%2509%2509%257Bwindow.story.displayTiddler(null%252C'ImportTiddlers')%253B%257D%250A%2509%2509try%2520%257B%2520eval(store.getTiddlerText('ImportTiddlersPluginConfig'%252C''))%253B%2520%257D%250A%2509%2509catch(e)%2520%257B%2520displayMessage(e.description%257C%257Ce.toString())%253B%2520%257D%250A%2509%2509displayMessage('ImportTiddlersPlugin%2520has%2520been%2520loaded%2520from')%253B%250A%2509%2509displayMessage(this.src%252Cthis.src)%253B%250A%2509%257D%253B%250A%2509s.onreadystatechange%253Dfunction()%2520%2520%252F*%2520for%2520IE%2520*%252F%250A%2509%2509%257B%2520if(this.readyState%253D%253D'complete')%2520this.onload()%253B%2520%257D%253B%250A%2509document.getElementsByTagName('head')%255B0%255D.appendChild(s)%253B%250A%2509return%2520false%253B%250A%250A%257D)()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))">

ImportTiddlersPlugin</a>
</html> -- plugin by [[Eric Shulman|http://www.tiddlytools.com]]
*<html><a
	class="bookmarklet"
	onclick="
	try { if (version.extensions.TiddlerTweakerPlugin!=undefined) {
		clearMessage();
		try {$6;} catch(e) {window.story.displayTiddler(null,'TiddlerTweaker');}
		displayMessage('TiddlerTweakerPlugin is already installed.');
		return false;
	} } catch(e){;}
	var s=document.createElement('script');
	s.src='http://svn.tiddlywiki.org/Trunk/contributors/EricShulman/plugins/TiddlerTweakerPlugin.js';
	s.onerror=function() {
		clearMessage();
		displayMessage('Could not load TiddlerTweakerPlugin from');
		displayMessage(this.src,this.src);
	};
	s.onload=function() {
		clearMessage();
		{window.story.displayTiddler(null,'TiddlerTweaker');}
		try { eval(store.getTiddlerText('$7','')); }
		catch(e) { displayMessage(e.description||e.toString()); }
		displayMessage('TiddlerTweakerPlugin has been loaded from');
		displayMessage(this.src,this.src);
	};
	s.onreadystatechange=function()  /* for IE */
		{ if(this.readyState=='complete') this.onload(); };
	document.getElementsByTagName('head')[0].appendChild(s);
	return false;"
  onmouseover="
	this.href='javascript:void(eval(decodeURIComponent(%22(function(){try{('
	+encodeURIComponent(encodeURIComponent(this.onclick))
	+')()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))';"
	title="Load TiddlerTweakerPlugin from svn.TiddlyWiki.org repository"
	href="javascript:;">
TiddlerTweakerPlugin</a>
</html> -- plugin by [[Eric Shulman|http://www.tiddlytools.com]]
*<html><a
	class="bookmarklet"
	onclick="
	try { if (Story.prototype.rearrangeTiddlersHijack_refreshTiddler!=undefined) {
		clearMessage();
		try {$6;} catch(e) {window.story.forEachTiddler(function(t,e){window.story.refreshTiddler(t,null,true)}); window.refreshDisplay();}
		displayMessage('RearrangeTiddlersPlugin is already installed.');
		return false;
	} } catch(e){;}
	var s=document.createElement('script');
	s.src='http://www.TiddlyTools.com/plugins/RearrangeTiddlersPlugin.js';
	s.onerror=function() {
		clearMessage();
		displayMessage('Could not load RearrangeTiddlersPlugin from');
		displayMessage(this.src,this.src);
	};
	s.onload=function() {
		clearMessage();
		{window.story.forEachTiddler(function(t,e){window.story.refreshTiddler(t,null,true)}); window.refreshDisplay();}
		try { eval(store.getTiddlerText('$7','')); }
		catch(e) { displayMessage(e.description||e.toString()); }
		displayMessage('RearrangeTiddlersPlugin has been loaded from');
		displayMessage(this.src,this.src);
	};
	s.onreadystatechange=function()  /* for IE */
		{ if(this.readyState=='complete') this.onload(); };
	document.getElementsByTagName('head')[0].appendChild(s);
	return false;"
  onmouseover="
	this.href='javascript:void(eval(decodeURIComponent(%22(function(){try{('
	+encodeURIComponent(encodeURIComponent(this.onclick))
	+')()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))';"
	title="Load RearrangeTiddlersPlugin from www.TiddlyTools.com"
	href="javascript:;">
RearrangeTiddlersPlugin</a>
</html> -- plugin by [[Eric Shulman|http://www.tiddlytools.com]]
*<html><a
	class="bookmarklet"
	onclick="
	try { if (version.extensions.YourSearchPlugin!=undefined) {
		clearMessage();
		try {$6;} catch(e) {window.refreshPageTemplate();}
		displayMessage('YourSearchPlugin is already installed.');
		return false;
	} } catch(e){;}
	var s=document.createElement('script');
	s.src='http://tiddlywiki.abego-software.de/archive/YourSearchPlugin/latest/YourSearchPlugin.js';
	s.onerror=function() {
		clearMessage();
		displayMessage('Could not load YourSearchPlugin from');
		displayMessage(this.src,this.src);
	};
	s.onload=function() {
		clearMessage();
		{window.refreshPageTemplate();}
		try { eval(store.getTiddlerText('$7','')); }
		catch(e) { displayMessage(e.description||e.toString()); }
		displayMessage('YourSearchPlugin has been loaded from');
		displayMessage(this.src,this.src);
	};
	s.onreadystatechange=function()  /* for IE */
		{ if(this.readyState=='complete') this.onload(); };
	document.getElementsByTagName('head')[0].appendChild(s);
	return false;"
  onmouseover="
	this.href='javascript:void(eval(decodeURIComponent(%22(function(){try{('
	+encodeURIComponent(encodeURIComponent(this.onclick))
	+')()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))';"
	title="Load YourSearchPlugin from tiddlywiki.abego-software.de"
	href="javascript:;">
YourSearchPlugin</a>
</html> -- plugin by [[Udo Borowski|http://tiddlywiki.abego-software.de]]
*<html><a
	class="bookmarklet"
	onclick="
	try { if (config.macros.firefoxPrivileges!=undefined) {
		clearMessage();
		try {backstage.switchTab('firefoxPrivileges');} catch(e) {config.macros.firefoxPrivileges.onload();}
		displayMessage('Firefox Privilege Manager is already installed.');
		return false;
	} } catch(e){;}
	var s=document.createElement('script');
	s.src='http://svn.tiddlywiki.org/Trunk/contributors/XavierVerges/plugins/FirefoxPrivilegesPlugin.js';
	s.onerror=function() {
		clearMessage();
		displayMessage('Could not load Firefox Privilege Manager from');
		displayMessage(this.src,this.src);
	};
	s.onload=function() {
		clearMessage();
		{config.macros.firefoxPrivileges.onload();}
		try { eval(store.getTiddlerText('$7','')); }
		catch(e) { displayMessage(e.description||e.toString()); }
		displayMessage('Firefox Privilege Manager has been loaded from');
		displayMessage(this.src,this.src);
	};
	s.onreadystatechange=function()  /* for IE */
		{ if(this.readyState=='complete') this.onload(); };
	document.getElementsByTagName('head')[0].appendChild(s);
	return false;"
  onmouseover="
	this.href='javascript:void(eval(decodeURIComponent(%22(function(){try{('
	+encodeURIComponent(encodeURIComponent(this.onclick))
	+')()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))';"
	title="Load Firefox Privilege Manager from svn.TiddlyWiki.org repository"
	href="javascript:void(eval(decodeURIComponent(%22(function(){try{(function%2520onclick(event)%2520%257B%250A%250A%2509try%2520%257B%2520if%2520(config.macros.firefoxPrivileges!%253Dundefined)%2520%257B%250A%2509%2509clearMessage()%253B%250A%2509%2509try%2520%257Bbackstage.switchTab('firefoxPrivileges')%253B%257D%2520catch(e)%2520%257Bconfig.macros.firefoxPrivileges.onload()%253B%257D%250A%2509%2509displayMessage('Firefox%2520Privilege%2520Manager%2520is%2520already%2520installed.')%253B%250A%2509%2509return%2520false%253B%250A%2509%257D%2520%257D%2520catch(e)%257B%253B%257D%250A%2509var%2520s%253Ddocument.createElement('script')%253B%250A%2509s.src%253D'http%253A%252F%252Fsvn.tiddlywiki.org%252FTrunk%252Fcontributors%252FXavierVerges%252Fplugins%252FFirefoxPrivilegesPlugin.js'%253B%250A%2509s.onerror%253Dfunction()%2520%257B%250A%2509%2509clearMessage()%253B%250A%2509%2509displayMessage('Could%2520not%2520load%2520Firefox%2520Privilege%2520Manager%2520from')%253B%250A%2509%2509displayMessage(this.src%252Cthis.src)%253B%250A%2509%257D%253B%250A%2509s.onload%253Dfunction()%2520%257B%2520%250A%2509%2509clearMessage()%253B%250A%2509%2509%257Bconfig.macros.firefoxPrivileges.onload()%253B%257D%250A%2509%2509try%2520%257B%2520eval(store.getTiddlerText('%25247'%252C''))%253B%2520%257D%250A%2509%2509catch(e)%2520%257B%2520displayMessage(e.description%257C%257Ce.toString())%253B%2520%257D%250A%2509%2509displayMessage('Firefox%2520Privilege%2520Manager%2520has%2520been%2520loaded%2520from')%253B%250A%2509%2509displayMessage(this.src%252Cthis.src)%253B%250A%2509%257D%253B%250A%2509s.onreadystatechange%253Dfunction()%2520%2520%252F*%2520for%2520IE%2520*%252F%250A%2509%2509%257B%2520if(this.readyState%253D%253D'complete')%2520this.onload()%253B%2520%257D%253B%250A%2509document.getElementsByTagName('head')%255B0%255D.appendChild(s)%253B%250A%2509return%2520false%253B%250A%250A%257D)()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))">
Firefox Privilege Manager</a>
</html> -- plugin by [[Xavier Vergés|http://firefoxprivileges.tiddlyspot.com]]
*<html><a
	class="bookmarklet"
	onclick="
	try { if (window.jash!=undefined) {
		clearMessage();
		try {$6;} catch(e) {window.jash.close();}
		displayMessage('Jash (JAvascript SHell) is already installed.');
		return false;
	} } catch(e){;}
	var s=document.createElement('script');
	s.src='http://www.billyreisinger.com/jash/source/latest/Jash.js';
	s.onerror=function() {
		clearMessage();
		displayMessage('Could not load Jash (JAvascript SHell) from');
		displayMessage(this.src,this.src);
	};
	s.onload=function() {
		clearMessage();
		{window.jash.close();}
		try { eval(store.getTiddlerText('$7','')); }
		catch(e) { displayMessage(e.description||e.toString()); }
		displayMessage('Jash (JAvascript SHell) has been loaded from');
		displayMessage(this.src,this.src);
	};
	s.onreadystatechange=function()  /* for IE */
		{ if(this.readyState=='complete') this.onload(); };
	document.getElementsByTagName('head')[0].appendChild(s);
	return false;"
  onmouseover="
	this.href='javascript:void(eval(decodeURIComponent(%22(function(){try{('
	+encodeURIComponent(encodeURIComponent(this.onclick))
	+')()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))';"
	title="Load Jash (JAvascript SHell) from www.billyreisinger.com/jash"
	href="javascript:;">
Jash (JAvascript SHell)</a>
</html> -- console by [[Billy Reisinger|http://www.billyreisinger.com/jash]]
!!!"""TiddlyWiklets""" by [[Eric Shulman|http://TiddlyTools.com#InstantBookmarklets]]
*<html><a
	class="bookmarklet"
	onclick="
	var c=document.getElementById('contentWrapper');  if (!c) return;
	for (var i=0; i&lt;c.childNodes.length; i++)
		if (hasClass(c.childNodes[i],'header')) { var h=c.childNodes[i]; break; }
	if (!h) return;
	config.options.chkHideSiteTitles=h.style.display!='none';
	h.style.display=config.options.chkHideSiteTitles?'none':'block';
	saveOptionCookie('chkHideSiteTitles');
	return false;"
  onmouseover="
	this.href='javascript:void(eval(decodeURIComponent(%22(function(){try{('
	+encodeURIComponent(encodeURIComponent(this.onclick))
	+')()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))';"
	title="show/hide SiteTitle and SiteSubtitle (header) content"
	href="javascript:void(eval(decodeURIComponent(%22(function(){try{(function%2520onclick(event)%2520%257B%250A%250A%2509var%2520c%253Ddocument.getElementById('contentWrapper')%253B%2520%2520if%2520(!c)%2520return%253B%250A%2509for%2520(var%2520i%253D0%253B%2520i%253Cc.childNodes.length%253B%2520i%252B%252B)%250A%2509%2509if%2520(hasClass(c.childNodes%255Bi%255D%252C'header'))%2520%257B%2520var%2520h%253Dc.childNodes%255Bi%255D%253B%2520break%253B%2520%257D%250A%2509if%2520(!h)%2520return%253B%250A%2509config.options.chkHideSiteTitles%253Dh.style.display!%253D'none'%253B%250A%2509h.style.display%253Dconfig.options.chkHideSiteTitles%253F'none'%253A'block'%253B%250A%2509saveOptionCookie('chkHideSiteTitles')%253B%250A%2509return%2520false%253B%250A%250A%257D)()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))">
▲ Toggle Site Titles</a>
</html>
*<html><a
	class="bookmarklet"
	onclick="
	var co=config.options;
	var opt='chkShowLeftSidebar';
	var show=co[opt]=!co[opt];
	var mm=document.getElementById('mainMenu');
	var da=document.getElementById('displayArea');
	if (mm) {
		mm.style.display=show?'block':'none';
		da.style.marginLeft=show?'':'1em';
	}
	saveOptionCookie(opt);
	var labelShow=co.txtToggleLeftSideBarLabelShow||'►';
	var labelHide=co.txtToggleLeftSideBarLabelHide||'◄';
	if (this.innerHTML==labelShow||this.innerHTML==labelHide)
		this.innerHTML=show?labelHide:labelShow;
	this.title=(show?'hide':'show')+' left sidebar';
	var sm=document.getElementById('storyMenu');
	if (sm) config.refreshers.content(sm);
	return false;"
  onmouseover="
	this.href='javascript:void(eval(decodeURIComponent(%22(function(){try{('
	+encodeURIComponent(encodeURIComponent(this.onclick))
	+')()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))';"
	title="hide left sidebar"
	href="javascript:void(eval(decodeURIComponent(%22(function(){try{(function%2520onclick(event)%2520%257B%250A%250A%2509var%2520co%253Dconfig.options%253B%250A%2509var%2520opt%253D'chkShowLeftSidebar'%253B%250A%2509var%2520show%253Dco%255Bopt%255D%253D!co%255Bopt%255D%253B%250A%2509var%2520mm%253Ddocument.getElementById('mainMenu')%253B%250A%2509var%2520da%253Ddocument.getElementById('displayArea')%253B%250A%2509if%2520(mm)%2520%257B%250A%2509%2509mm.style.display%253Dshow%253F'block'%253A'none'%253B%250A%2509%2509da.style.marginLeft%253Dshow%253F''%253A'1em'%253B%250A%2509%257D%250A%2509saveOptionCookie(opt)%253B%250A%2509var%2520labelShow%253Dco.txtToggleLeftSideBarLabelShow%257C%257C'%25E2%2596%25BA'%253B%250A%2509var%2520labelHide%253Dco.txtToggleLeftSideBarLabelHide%257C%257C'%25E2%2597%2584'%253B%250A%2509if%2520(this.innerHTML%253D%253DlabelShow%257C%257Cthis.innerHTML%253D%253DlabelHide)%2520%250A%2509%2509this.innerHTML%253Dshow%253FlabelHide%253AlabelShow%253B%250A%2509this.title%253D(show%253F'hide'%253A'show')%252B'%2520left%2520sidebar'%253B%250A%2509var%2520sm%253Ddocument.getElementById('storyMenu')%253B%250A%2509if%2520(sm)%2520config.refreshers.content(sm)%253B%250A%2509return%2520false%253B%250A%250A%257D)()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))">
◄ Toggle Left Sidebar</a>
</html>
*<html><a
	class="bookmarklet"
	onclick="
	var co=config.options;
	var opt='chkShowRightSidebar';
	var show=co[opt]=!co[opt];
	var sb=document.getElementById('sidebar');
	var da=document.getElementById('displayArea');
	if (sb) {
		sb.style.display=show?'block':'none';
		da.style.marginRight=show?'':'1em';
	}
	saveOptionCookie(opt);
	var labelShow=co.txtToggleRightSideBarLabelShow||'◄';
	var labelHide=co.txtToggleRightSideBarLabelHide||'►';
	if (this.innerHTML==labelShow||this.innerHTML==labelHide)
		this.innerHTML=show?labelHide:labelShow;
	this.title=(show?'hide':'show')+' right sidebar';
	var sm=document.getElementById('storyMenu');
	if (sm) config.refreshers.content(sm);
	return false;"
  onmouseover="
	this.href='javascript:void(eval(decodeURIComponent(%22(function(){try{('
	+encodeURIComponent(encodeURIComponent(this.onclick))
	+')()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))';"
	title="show right sidebar"
	href="javascript:void(eval(decodeURIComponent(%22(function(){try{(function%2520onclick(event)%2520%257B%250A%250A%2509var%2520co%253Dconfig.options%253B%250A%2509var%2520opt%253D'chkShowRightSidebar'%253B%250A%2509var%2520show%253Dco%255Bopt%255D%253D!co%255Bopt%255D%253B%250A%2509var%2520sb%253Ddocument.getElementById('sidebar')%253B%250A%2509var%2520da%253Ddocument.getElementById('displayArea')%253B%250A%2509if%2520(sb)%2520%257B%250A%2509%2509sb.style.display%253Dshow%253F'block'%253A'none'%253B%250A%2509%2509da.style.marginRight%253Dshow%253F''%253A'1em'%253B%250A%2509%257D%250A%2509saveOptionCookie(opt)%253B%250A%2509var%2520labelShow%253Dco.txtToggleRightSideBarLabelShow%257C%257C'%25E2%2597%2584'%253B%250A%2509var%2520labelHide%253Dco.txtToggleRightSideBarLabelHide%257C%257C'%25E2%2596%25BA'%253B%250A%2509if%2520(this.innerHTML%253D%253DlabelShow%257C%257Cthis.innerHTML%253D%253DlabelHide)%2520%250A%2509%2509this.innerHTML%253Dshow%253FlabelHide%253AlabelShow%253B%250A%2509this.title%253D(show%253F'hide'%253A'show')%252B'%2520right%2520sidebar'%253B%250A%2509var%2520sm%253Ddocument.getElementById('storyMenu')%253B%250A%2509if%2520(sm)%2520config.refreshers.content(sm)%253B%250A%2509return%2520false%253B%250A%250A%257D)()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))">
► Toggle Right Sidebar</a>
</html>
*<html><a
	class="bookmarklet"
	onclick="
	var opt='chkAnimate';
	config.macros.option.propagateOption(opt,'checked',!config.options[opt],'input');
	displayMessage('Animation effects are: '+(config.options[opt]?'ON':'OFF'));
	return false;"
  onmouseover="
	this.href='javascript:void(eval(decodeURIComponent(%22(function(){try{('
	+encodeURIComponent(encodeURIComponent(this.onclick))
	+')()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))';"
	title="enable/disable animation effects"
	href="javascript:void(eval(decodeURIComponent(%22(function(){try{(function%2520onclick(event)%2520%257B%250A%250A%2509var%2520opt%253D'chkAnimate'%253B%250A%2509config.macros.option.propagateOption(opt%252C'checked'%252C!config.options%255Bopt%255D%252C'input')%253B%250A%2509displayMessage('Animation%2520effects%2520are%253A%2520'%252B(config.options%255Bopt%255D%253F'ON'%253A'OFF'))%253B%250A%2509return%2520false%253B%250A%250A%257D)()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))">
∞ Toggle Animation Effects</a>
</html>
*<html><a
	class="bookmarklet"
	onclick="
	window.setFullScreen(!config.options.chkFullScreen); // toggle setting
	this.innerHTML=!config.options.chkFullScreen?'◊ - Toggle fullscreen ON':'◊ - Toggle fullscreen OFF'; // set command text
	return false;"
  onmouseover="
	this.href='javascript:void(eval(decodeURIComponent(%22(function(){try{('
	+encodeURIComponent(encodeURIComponent(this.onclick))
	+')()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))';"
	title="FULLSCREEN: toggle sidebars and page header"
	href="javascript:void(eval(decodeURIComponent(%22(function(){try{(function%2520onclick(event)%2520%257B%250A%250A%2509window.setFullScreen(!config.options.chkFullScreen)%253B%2520%252F%252F%2520toggle%2520setting%250A%2509this.innerHTML%253D!config.options.chkFullScreen%253F'%25E2%2597%258A%2520-%2520Toggle%2520fullscreen%2520ON'%253A'%25E2%2597%258A%2520-%2520Toggle%2520fullscreen%2520OFF'%253B%2520%252F%252F%2520set%2520command%2520text%250A%2509return%2520false%253B%250A%250A%257D)()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))">
◊ Toggle Fullscreen ON</a>
</html>
*<html><a
	class="bookmarklet"
	onclick="
	config.options.chkHideTiddlerTitles=!config.options.chkHideTiddlerTitles;
	var show=config.options.chkHideTiddlerTitles?'none':'block';
	setStylesheet('.tiddler .title, .tiddler .subtitle { display:'+show+'; }','toggleTiddlerTitles')"
	title="show/hide tiddler titles"
	href="javascript:;">
T Toggle Tiddler Titles</a>
</html>
*<html><a
	class="bookmarklet"
	onclick="
	config.options.chkHideTiddlerTags=!config.options.chkHideTiddlerTags;
	var show=config.options.chkHideTiddlerTags?'none':'block';
	setStylesheet('.tiddler .tagged { display:'+show+'; }','toggleTiddlerTags');"
	title="show/hide tiddler tags"
	href="javascript:;">
# Toggle Tiddler Tags</a>
</html>
*<html><a
	class="bookmarklet"
	onclick="
	story.closeAllTiddlers(); restart(); refreshPageTemplate();
 	return false;" onmouseover="
	this.href='javascript:void(eval(decodeURIComponent(%22(function(){try{('
	+encodeURIComponent(encodeURIComponent(this.onclick))
	+')()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))';"
	title="Restart initial page content WITHOUT RELOADING!"
	href="javascript:;">
⌂ Home</a>
</html>
*<html><a
	class="bookmarklet"
	onclick="
	story.forEachTiddler(function(t,e){story.refreshTiddler(t,null,true)});
	refreshDisplay();
 	return false;" onmouseover="
	this.href='javascript:void(eval(decodeURIComponent(%22(function(){try{('
	+encodeURIComponent(encodeURIComponent(this.onclick))
	+')()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))';"
	title="Redisplay current page content WITHOUT RESTARTING!"
	href="javascript:void(eval(decodeURIComponent(%22(function(){try{(function%2520onclick(event)%2520%257B%250A%250A%2509story.forEachTiddler(function(t%252Ce)%257Bstory.refreshTiddler(t%252Cnull%252Ctrue)%257D)%253B%250A%2509refreshDisplay()%253B%250A%2520%2509return%2520false%253B%250A%257D)()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))">
≈ Refresh Current Display</a>
</html>
*<html><a
	class="bookmarklet"
	onclick="
	if(typeof version==undefined||version.title!='TiddlyWiki')
		{alert(document.location.href+'\n\nis not a TiddlyWiki document');return false;}
	var ver=version.major+'.'+version.minor+'.'+version.revision;
	var tids=window.store.getTiddlers('modified').reverse();
	var plugins=window.store.getTaggedTiddlers('systemConfig','modified').reverse();
	var msg='TiddlyWiki version: '+ver
		+'\nDocument modified: '+document.lastModified
		+'\nLast tiddler changed: '+tids[0].title
		+'\n\nThere are a total of '+tids.length+' tiddlers,'
		+' including '+plugins.length+' plugins:\n\n';
	var fmt='YYYY.0MM.0DD 0hh:0mm:0ss'
	msg+=plugins.map(function(t){return t.modified.formatString(fmt)+' | '+t.title;}).join('\n');
	alert(msg);
 	return false;" onmouseover="
	this.href='javascript:void(eval(decodeURIComponent(%22(function(){try{('
	+encodeURIComponent(encodeURIComponent(this.onclick))
	+')()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))';"
	title="Show TiddlyWiki version, filedate and tiddler summary"
	href="javascript:void(eval(decodeURIComponent(%22(function(){try{(function%2520onclick(event)%2520%257B%250A%250A%2509if(typeof%2520version%253D%253Dundefined%257C%257Cversion.title!%253D'TiddlyWiki')%250A%2509%2509%257Balert(document.location.href%252B'%255Cn%255Cnis%2520not%2520a%2520TiddlyWiki%2520document')%253Breturn%2520false%253B%257D%250A%2509var%2520ver%253Dversion.major%252B'.'%252Bversion.minor%252B'.'%252Bversion.revision%253B%250A%2509var%2520tids%253Dwindow.store.getTiddlers('modified').reverse()%253B%250A%2509var%2520plugins%253Dwindow.store.getTaggedTiddlers('systemConfig'%252C'modified').reverse()%253B%250A%2509var%2520msg%253D'TiddlyWiki%2520version%253A%2520'%252Bver%250A%2509%2509%252B'%255CnDocument%2520modified%253A%2520'%252Bdocument.lastModified%250A%2509%2509%252B'%255CnLast%2520tiddler%2520changed%253A%2520'%252Btids%255B0%255D.title%250A%2509%2509%252B'%255Cn%255CnThere%2520are%2520a%2520total%2520of%2520'%252Btids.length%252B'%2520tiddlers%252C'%250A%2509%2509%252B'%2520including%2520'%252Bplugins.length%252B'%2520plugins%253A%255Cn%255Cn'%253B%250A%2509var%2520fmt%253D'YYYY.0MM.0DD%25200hh%253A0mm%253A0ss'%250A%2509msg%252B%253Dplugins.map(function(t)%257Breturn%2520t.modified.formatString(fmt)%252B'%2520%257C%2520'%252Bt.title%253B%257D).join('%255Cn')%253B%250A%2509alert(msg)%253B%250A%2520%2509return%2520false%253B%250A%250A%257D)()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))">
[i] Show TiddlyWiki Document Info</a>
</html>
*<html><a
	class="bookmarklet"
	onclick="
	// if removeCookie() function is not defined by TW core, define it here.
	if (window.removeCookie===undefined) {
		window.removeCookie=function(name) {
			document.cookie = name+'=; expires=Thu, 01-Jan-1970 00:00:01 UTC; path=/;';
		}
	}
	var opts=new Array(); var p=document.cookie.split('; ');
	for (var i=0;i&lt;p.length;i++){
		var c=p[i]; var v=''; var pos=p[i].indexOf('=');
		if (pos!=-1) { c=p[i].substr(0,pos); v=unescape(p[i].slice(pos+1)); }
		if (config.options[c]!==undefined) opts.push(c);
	} opts.sort();
	var msg='There are '+opts.length+' option cookies:\n\n'+opts.join(', ');
	msg+='\n\nPress OK to proceed, or press CANCEL to keep options unchanged';
	if (!confirm(msg)) return false;
	var msg='OK: reset all options at once, CANCEL: confirm each option, one at a time';
	var quiet=confirm(msg);
	for (var i=0;i&lt;opts.length;i++)
		if (quiet || confirm('Press OK to reset option: '+opts[i]))
			removeCookie(opts[i]);
 	return false;" onmouseover="
	this.href='javascript:void(eval(decodeURIComponent(%22(function(){try{('
	+encodeURIComponent(encodeURIComponent(this.onclick))
	+')()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))';"
	title="Clear all TiddlyWiki options stored in browser cookies (w/confirmation)"
	href="javascript:;">
∗ Reset All Cookie Options</a>
</html>
*<html><a
	class="bookmarklet"
	onclick="
	var msg='Are you sure you want to remove the change counters from these tiddlers:\n\n';
	var t=store.getTiddlers('title'); var tids=[];
	for (var i=0;i&lt;t.length;i++) {
		var v=store.getValue(t[i],'changecount');
		if (v) { msg+=t[i].title+' ('+v+')\n'; tids.push(t[i]); }
	}
	msg+='\nPress OK to proceed';
	if (!confirm(msg)) return false;
	for (var i=0;i&lt;tids.length;i++) tids[i].clearChangeCount();
	displayMessage('Change counters have been reset to 0');
	displayMessage('Don\'t forget to save your document!');
	return false;"
  onmouseover="
	this.href='javascript:void(eval(decodeURIComponent(%22(function(){try{('
	+encodeURIComponent(encodeURIComponent(this.onclick))
	+')()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))';"
	title="remove change counters from all tiddlers in this document"
	href="javascript:void(eval(decodeURIComponent(%22(function(){try{(function%2520onclick(event)%2520%257B%250A%250A%2509var%2520msg%253D'Are%2520you%2520sure%2520you%2520want%2520to%2520remove%2520the%2520change%2520counters%2520from%2520these%2520tiddlers%253A%255Cn%255Cn'%253B%250A%2509var%2520t%253Dstore.getTiddlers('title')%253B%2520var%2520tids%253D%255B%255D%253B%250A%2509for%2520(var%2520i%253D0%253Bi%253Ct.length%253Bi%252B%252B)%2520%257B%250A%2509%2509var%2520v%253Dstore.getValue(t%255Bi%255D%252C'changecount')%253B%250A%2509%2509if%2520(v)%2520%257B%2520msg%252B%253Dt%255Bi%255D.title%252B'%2520('%252Bv%252B')%255Cn'%253B%2520tids.push(t%255Bi%255D)%253B%2520%257D%250A%2509%257D%250A%2509msg%252B%253D'%255CnPress%2520OK%2520to%2520proceed'%253B%250A%2509if%2520(!confirm(msg))%2520return%2520false%253B%250A%2509for%2520(var%2520i%253D0%253Bi%253Ctids.length%253Bi%252B%252B)%2520tids%255Bi%255D.clearChangeCount()%253B%250A%2509displayMessage('Change%2520counters%2520have%2520been%2520reset%2520to%25200')%253B%250A%2509displayMessage('Don%255C't%2520forget%2520to%2520save%2520your%2520document!')%253B%250A%2509return%2520false%253B%250A%250A%257D)()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))">
∅ Reset Tiddler Change Counters</a>
</html>
*<html><a
	class="bookmarklet"
	onclick="
	if(typeof version==undefined||version.title!='TiddlyWiki')
		{alert(document.location.href+'\n\nis not a TiddlyWiki document');return false;}

	window.saveToClipboard=function(success,params,txt,url,xhr) {
		function copy(out) {
			if(window.Components) { // FIREFOX
				netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
				var id='@mozilla.org/widget/clipboardhelper;1';
				var clip=Components.classes[id].getService(Components.interfaces.nsIClipboardHelper);
				clip.copyString(out);
			} else if(window.clipboardData) { // IE
				window.clipboardData.setData('text',out);
			} else if(document.execCommand) { // CHROME, SAFARI, IE6
				var ta=document.createElement('textarea');
				ta.style.position='absolute';
				ta.style.left='-100%';
				document.body.appendChild(ta);
				ta.value=out; ta.select();
				document.execCommand('Copy',false,null);
				document.body.removeChild(ta);
			} else throw('cannot access clipboard');
		}
		var pos=locateStoreArea(txt||'');
		if(success&amp;&amp;pos) {
			displayMessage(txt.length+' bytes read, adding new/revised tiddlers...');
			var out=updateOriginal(txt,pos,url);
		} else {
			if (!confirm('cannot load source file.\ncopy tiddler \x22store area\x22 only?')) return;
			var pre='&lt;!--POST-SHADOWAREA--&gt;\n&lt;div id=\x22storeArea\x22&gt;\n';
			var post='&lt;/div&gt;/n&lt;!--POST-STOREAREA--&gt;\n';
			var out=pre+store.allTiddlersAsHtml()+post;
		}
		var msg=out.length+' bytes copied to ';
		try	 { copy(out); msg+='clipboard'; }
		catch(e) { // FALLBACK
			alert('Sorry, direct clipboard access is not currently available.\n\n'
				+'The output will be displayed in another browser tab/window.\n'
				+'Select the entire text there and copy/paste into a local file');
			var t='&lt;html&gt;&lt;body&gt;&lt;pre&gt;'+out.htmlEncode()+'&lt;/pre&gt;&lt;/body&gt;&lt;/'+'html&gt;';
			var w=window.open(); var d=w.document; d.open(); d.write(t); d.close();
			msg+='another tab/window';
		}
		displayMessage(msg);
	}
	var url=document.location.href;
	clearMessage(); displayMessage('loading TiddlyWiki code from'); displayMessage(url);
	if (document.location.protocol!='file:') loadRemoteFile(url, window.saveToClipboard);
	else window.saveToClipboard(true,null,loadOriginal(getLocalPath(url)),url,null);
 	return false;"
  onmouseover="
	this.href='javascript:void(eval(decodeURIComponent(%22(function(){try{('
	+encodeURIComponent(encodeURIComponent(this.onclick))
	+')()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))';"
	title="save current document to clipboard"
	href="javascript:void(eval(decodeURIComponent(%22(function(){try{(function%2520onclick(event)%2520%257B%250A%250A%2509if(typeof%2520version%253D%253Dundefined%257C%257Cversion.title!%253D'TiddlyWiki')%250A%2509%2509%257Balert(document.location.href%252B'%255Cn%255Cnis%2520not%2520a%2520TiddlyWiki%2520document')%253Breturn%2520false%253B%257D%250A%250A%2509window.saveToClipboard%253Dfunction(success%252Cparams%252Ctxt%252Curl%252Cxhr)%2520%257B%250A%2509%2509function%2520copy(out)%2520%257B%250A%2509%2509%2509if(window.Components)%2520%257B%2520%252F%252F%2520FIREFOX%250A%2509%2509%2509%2509netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect')%253B%250A%2509%2509%2509%2509var%2520id%253D'%2540mozilla.org%252Fwidget%252Fclipboardhelper%253B1'%253B%250A%2509%2509%2509%2509var%2520clip%253DComponents.classes%255Bid%255D.getService(Components.interfaces.nsIClipboardHelper)%253B%250A%2509%2509%2509%2509clip.copyString(out)%253B%250A%2509%2509%2509%257D%2520else%2520if(window.clipboardData)%2520%257B%2520%252F%252F%2520IE%250A%2509%2509%2509%2509window.clipboardData.setData('text'%252Cout)%253B%250A%2509%2509%2509%257D%2520else%2520if(document.execCommand)%2520%257B%2520%252F%252F%2520CHROME%252C%2520SAFARI%252C%2520IE6%250A%2509%2509%2509%2509var%2520ta%253Ddocument.createElement('textarea')%253B%250A%2509%2509%2509%2509ta.style.position%253D'absolute'%253B%250A%2509%2509%2509%2509ta.style.left%253D'-100%2525'%253B%250A%2509%2509%2509%2509document.body.appendChild(ta)%253B%250A%2509%2509%2509%2509ta.value%253Dout%253B%2520ta.select()%253B%250A%2509%2509%2509%2509document.execCommand('Copy'%252Cfalse%252Cnull)%253B%250A%2509%2509%2509%2509document.body.removeChild(ta)%253B%250A%2509%2509%2509%257D%2520else%2520throw('cannot%2520access%2520clipboard')%253B%250A%2509%2509%257D%250A%2509%2509var%2520pos%253DlocateStoreArea(txt%257C%257C'')%253B%250A%2509%2509if(success%2526%2526pos)%2520%257B%250A%2509%2509%2509displayMessage(txt.length%252B'%2520bytes%2520read%252C%2520adding%2520new%252Frevised%2520tiddlers...')%253B%250A%2509%2509%2509var%2520out%253DupdateOriginal(txt%252Cpos%252Curl)%253B%250A%2509%2509%257D%2520else%2520%257B%250A%2509%2509%2509if%2520(!confirm('cannot%2520load%2520source%2520file.%255Cncopy%2520tiddler%2520%255Cx22store%2520area%255Cx22%2520only%253F'))%2520return%253B%250A%2509%2509%2509var%2520pre%253D'%253C!--POST-SHADOWAREA--%253E%255Cn%253Cdiv%2520id%253D%255Cx22storeArea%255Cx22%253E%255Cn'%253B%250A%2509%2509%2509var%2520post%253D'%253C%252Fdiv%253E%252Fn%253C!--POST-STOREAREA--%253E%255Cn'%253B%250A%2509%2509%2509var%2520out%253Dpre%252Bstore.allTiddlersAsHtml()%252Bpost%253B%250A%2509%2509%257D%250A%2509%2509var%2520msg%253Dout.length%252B'%2520bytes%2520copied%2520to%2520'%253B%250A%2509%2509try%2509%2520%257B%2520copy(out)%253B%2520msg%252B%253D'clipboard'%253B%2520%257D%250A%2509%2509catch(e)%2520%257B%2520%252F%252F%2520FALLBACK%250A%2509%2509%2509alert('Sorry%252C%2520direct%2520clipboard%2520access%2520is%2520not%2520currently%2520available.%255Cn%255Cn'%250A%2509%2509%2509%2509%252B'The%2520output%2520will%2520be%2520displayed%2520in%2520another%2520browser%2520tab%252Fwindow.%255Cn'%250A%2509%2509%2509%2509%252B'Select%2520the%2520entire%2520text%2520there%2520and%2520copy%252Fpaste%2520into%2520a%2520local%2520file')%253B%250A%2509%2509%2509var%2520t%253D'%253Chtml%253E%253Cbody%253E%253Cpre%253E'%252Bout.htmlEncode()%252B'%253C%252Fpre%253E%253C%252Fbody%253E%253C%252F'%252B'html%253E'%253B%250A%2509%2509%2509var%2520w%253Dwindow.open()%253B%2520var%2520d%253Dw.document%253B%2520d.open()%253B%2520d.write(t)%253B%2520d.close()%253B%250A%2509%2509%2509msg%252B%253D'another%2520tab%252Fwindow'%253B%250A%2509%2509%257D%250A%2509%2509displayMessage(msg)%253B%250A%2509%257D%250A%2509var%2520url%253Ddocument.location.href%253B%250A%2509clearMessage()%253B%2520displayMessage('loading%2520TiddlyWiki%2520code%2520from')%253B%2520displayMessage(url)%253B%250A%2509if%2520(document.location.protocol!%253D'file%253A')%2520loadRemoteFile(url%252C%2520window.saveToClipboard)%253B%250A%2509else%2520window.saveToClipboard(true%252Cnull%252CloadOriginal(getLocalPath(url))%252Curl%252Cnull)%253B%250A%2520%2509return%2520false%253B%250A%250A%257D)()}catch(e){alert(e.description?e.description:e.toString())}})()%22)))">
∑ Save Current StoreArea Contents To Clipboard</a>
</html>
!!!"""Bookmarklets For Editing"""
;<html><a
	class="bookmarklet"
	href="javascript:(function(){if(window.version&&window.version.title=='TiddlyWiki'){readOnly=false;if(window.backstage){if(!backstage.button)backstage.init();backstage.show();}config.options.chkAnimate=false;refreshDisplay();}})()">
EnableEdit</a>
</html> -- by [[Saq Imtiaz|http://goo.gl/dGDPf]]
:enables editing for an online TiddlyWiki without the need to reload while also disabling animations, and enabling the backstage area
;<html><a
	class="bookmarklet"
	href="javascript:(function(){if(window.version&&window.version.title=='TiddlyWiki'){var g=prompt('Enter the desired user name',config.options.txtUserName);var t=store.getTiddlers();store.suspendNotifications();for(var i=0;i<t.length;i++)t[i].modifier=g;store.resumeNotifications();story.refreshAllTiddlers();}})()">
SetUserName</a>
</html> -- by [[Saq Imtiaz|http://goo.gl/dGDPf]]
:changes the ''modifier'' field for all tiddlers to the specified value
;<html><a
	class="bookmarklet"
	href="javascript:(function(){if(window.version&&window.version.title=='TiddlyWiki'){var oldTag=prompt('Enter the tag to rename','oldTag');var newTag=prompt('Rename tag '+oldTag+' to:','newTag');var t=store.getTaggedTiddlers(oldTag);store.suspendNotifications();for(var i=0;i<t.length;i++){t[i].tags.remove(oldTag);t[i].tags.pushUnique(newTag);}store.resumeNotifications();refreshDisplay();}})()">
RenameTag</a>
</html> -- by [[Saq Imtiaz|http://goo.gl/dGDPf]]
:renames all occurrences of a specified tag
;<html><a
	class="bookmarklet"
	href="javascript:void(eval(decodeURIComponent(&quot;(function()%257B%250A%2509if(window.version%2520%2526%2526%2520window.version.title%2520%253D%253D%2520'TiddlyWiki')%257B%250A%2509%2509var%2520tag%2520%253D%2520prompt('Delete%2520tiddlers%2520with%2520the%2520tag%253A'%252C'')%253B%250A%2509%2509store.suspendNotifications()%253B%250A%2509%2509var%2520t%2520%253D%2520store.getTaggedTiddlers(tag)%253B%250A%2509%2509for(var%2520i%253D0%253Bi%253Ct.length%253Bi%252B%252B)%250A%2509%2509%2509store.removeTiddler(t%255Bi%255D.title)%253B%250A%2509%2509store.resumeNotifications()%253B%250A%2509%2509refreshDisplay()%253B%2509%2509%250A%2509%257D%250A%257D)()&quot;)))">
DeleteAllTagged</a>
</html> -- by [[Saq Imtiaz|http://goo.gl/dGDPf]]
:deletes all tiddlers with a specified tag
;<html><a
	class="bookmarklet"
	href="javascript:void(eval(decodeURIComponent(&quot;(function()%257Bif(window.version%2526%2526window.version.title%253D%253D'TiddlyWiki')%257Bvar%2520shadow%253Dprompt('View%2520the%2520shadow%2520tiddler%2520called%253A')%253Bvar%2520w%253Dwindow.open()%253Bw.document.open()%253Bw.document.write('%253Chtml%253E%253Cbody%253E')%253Bw.document.write('%253Cpre%253E'%252Bconfig.shadowTiddlers%255Bshadow%255D.htmlEncode()%252B'%253C%252Fpre%253E')%253Bw.document.write('%253C%252Fbody%253E%253C%252Fhtml%253E')%253Bw.document.close()%253B%257D%257D)()&quot;)))">
ViewShadow</a>
</html> -- by [[Saq Imtiaz|http://goo.gl/dGDPf]]
:displays the default contents of a shadow tiddler
!!!"""Bookmarklets For Rescue And Maintenance"""
;<html><a
	class="bookmarklet"
	href="javascript:(function(){if(window.version&&window.version.title=='TiddlyWiki'){for(var n in config.shadowTiddlers){store.suspendNotifications();store.removeTiddler(n);store.resumeNotifications();refreshAll();}}})()">
NukeShadows</a>
</html> -- by [[Saq Imtiaz|http://goo.gl/dGDPf]] / aka '"""Scrub Shadow Tiddlers"""' by [[Jeremy Ruston|http://tiddlywiki.com/#TiddlyBookmarklets]]
:restores all shadow tiddlers to their default values; handy when you’ve gone mad with PageTemplate customisations and your TiddlyWiki document won’t display properly
;<html><a
	class="bookmarklet"
	href="javascript:(function(){if(window.version&&window.version.title=='TiddlyWiki'){window.location.hash='start:safe';window.location.reload(true);}})()">
SafeMode</a>
</html> -- by [[Saq Imtiaz|http://goo.gl/dGDPf]]
:reloads the current document in safe mode
;<html><a
	class="bookmarklet"
	href="javascript:(function(){if(window.version&&window.version.title=='TiddlyWiki'){window.location.hash='start:safe';window.location.reload(true);for(var n in config.shadowTiddlers){store.suspendNotifications();store.removeTiddler(n);store.resumeNotifications();refreshAll();}}})()">
SuperSafeMode</a>
</html> -- by [[Saq Imtiaz|http://goo.gl/dGDPf]]
:reloads the current document in safe mode and resets all shadow tiddlers, see ''NukeShadows''
;<html><a
	class="bookmarklet"
	href="javascript:void(eval(decodeURIComponent(&quot;(function()%257BC%253Ddocument.cookie.split(%2522%253B%2520%2522)%253Bfor(d%253D%2522.%2522%252Blocation.host%253Bd%253Bd%253D(%2522%2522%252Bd).substr(1).match(%252F%255C..*%2524%252F))for(sl%253D0%253Bsl%253C2%253B%252B%252Bsl)for(p%253D%2522%252F%2522%252Blocation.pathname%253Bp%253Bp%253Dp.substring(0%252Cp.lastIndexOf('%252F')))for(i%2520in%2520C)if(c%253DC%255Bi%255D)%257Bdocument.cookie%253Dc%252B%2522%253B%2520domain%253D%2522%252Bd.slice(sl)%252B%2522%253B%2520path%253D%2522%252Bp.slice(1)%252B%2522%252F%2522%252B%2522%253B%2520expires%253D%2522%252Bnew%2520Date((new%2520Date).getTime()-1e11).toGMTString()%257D%257D)()%250A&quot;)))">
NukeAllCookies</a>
</html> -- by [[Saq Imtiaz|http://goo.gl/dGDPf]]
:deletes all cookies for the current document
;<html><a
	class="bookmarklet"
	href="javascript:(function(){if(window.version&&window.version.title=='TiddlyWiki'){store.forEachTiddler(function(title,tiddler){tiddler.fields={};});refreshDisplay();}})()">
ScrubTiddlerFields</a>
</html>-- by [[Jeremy Ruston|http://tiddlywiki.com/#TiddlyBookmarklets]]
:deletes all extended fields from a TiddlyWiki
!!!"""Miscellaneous Bookmarklets"""
;<html><a
	class="bookmarklet"
	href="javascript:(function(){if(window.version&&window.version.title=='TiddlyWiki'){alert('TiddlyWiki version: '+version.major+'.'+version.minor+'.'+version.revision+(version.beta?' (beta '+version.beta+')':'')+'\nLast modified: '+document.lastModified);}})()">
TiddlyInfo</a>
</html> -- by [[Saq Imtiaz|http://goo.gl/dGDPf]]
:displays the current document’s version number and """last-modified""" date
;<html><a
	class="bookmarklet"
	href="javascript:void(eval(decodeURIComponent(&quot;(function()%257Bif(window.version%2526%2526window.version.title%253D%253D'TiddlyWiki')%257Bvar%2520w%253Dwindow.open()%253Bw.document.open()%253Bw.document.write('%253Chtml%253E%253Cbody%253E%253Cpre%253E')%253Bw.document.write(store.allTiddlersAsHtml().htmlEncode())%253Bw.document.write('%253C%252Fpre%253E%253C%252Fbody%253E%253C%252Fhtml%253E')%253Bw.document.close()%253B%257D%257D)()&quot;)))">
RescueRawTWContent</a>
</html> -- by [[Jeremy Ruston|http://jermolene.wordpress.com/2007/05/05/tiddlybookmarklets11111111]]
:opens a new window containing the raw content of the current document
;<html><a
	class="bookmarklet"
	href="javascript:void(eval(decodeURIComponent(&quot;(function()%257Bif(window.version%2526%2526window.version.title%253D%253D'TiddlyWiki')%257Bvar%2520title%253Dprompt('Tiddler%2520to%2520view%2520as%2520html%253A')%253Bvar%2520t%253Dstore.getTiddler(title)%253Bvar%2520stat%253DwikifyStatic(t.text%252Cnull%252Ct)%253Bvar%2520w%253Dwindow.open()%253Bw.document.open()%253Bw.document.write('%253Chtml%253E%253Cbody%253E')%253Bw.document.write('%253Cpre%253E'%252Bstat.htmlEncode()%252B'%253C%252Fpre%253E')%253Bw.document.write('%253C%252Fbody%253E%253C%252Fhtml%253E')%253Bw.document.close()%253B%257D%257D)()&quot;)))">
ViewTiddlerAsHtml</a>
</html> -- by [[Saq Imtiaz|http://goo.gl/dGDPf]]
:displays a tiddler as raw HTML
;<html><a
	class="bookmarklet"
	href="javascript:void(eval(decodeURIComponent(&quot;%250A%2509if(window.version%2520%2526%2526%2520window.version.title%2520%253D%253D%2520'TiddlyWiki')%257B%250A%2509%2509var%2520title%2520%253D%2520prompt('Tiddler%2520to%2520view%2520as%2520JavaScript%2520string%253A')%253B%250A%2509%2509var%2520text%2520%253D%2520store.getTiddlerText(title).replace(%252F%2522%252Fg%252C'%255C%255C%2522').split(%2522%255Cn%2522).join('%255C%255Cn%2522%252B%255Cn%2520%2522')%253B%250A%2509%2509var%2520w%253Dwindow.open()%253B%250A%2509%2509w.document.open()%253B%250A%2509%2509w.document.write('%253Chtml%253E%253Cbody%253E')%253B%250A%2509%2509w.document.write('%253Cpre%253E'%252Btext.htmlEncode()%252B'%253C%252Fpre%253E')%253B%250A%2509%2509w.document.write('%253C%252Fbody%253E%253C%252Fhtml%253E')%253B%250A%2509%2509w.document.close()%253B%2509%2509%250A%2509%257D&quot;)))">
ViewTiddlerAsJs</a>
</html> -- by [[Saq Imtiaz|http://goo.gl/dGDPf]]
:displays a tiddler as a JavaScript string, e.g. for developers to use as shadow tiddler
;<html>
  <a
	class="bookmarklet"
	href="javascript:(function(){
    if (window.version && window.version.title == 'TiddlyWiki') {
      var t = 'Plugins used:\n';
      var p = store.getTaggedTiddlers('systemConfig');
      for (var i = 0; i < p.length; i++) {
        var n = store.getTiddlerSlice(p[i].title, 'Name');
        var u = store.getTiddlerSlice(p[i].title, 'Source');
        t += (n ? n : p[i].title) + (u ? ' - ' + u : '') + ' ' + p[i].text.length / 1024 + 'kb' + '\n';
      }
      var w = window.open();
      var d = w.document;
      d.open();
      d.write('<html><body>');
      d.write('<pre>' + t.htmlEncode() + '</pre>');
      d.write('</body></'+'html>');
      d.close();
    }
  })()">
ExportPluginList</a>
</html> -- by [[Saq Imtiaz|http://goo.gl/dGDPf]]
:exports a list of plugins installed in the current document
''Double Brackets in Links Are Not Rendered Properly''

* [[replace|http://groups.google.com/group/TiddlyWiki/browse_thread/thread/90af118e1dc2fb1c]] the double brackets with their encoded equivalents, %5B and %5D respectively (see [[Firefox|Firefox#Permalinks]]).
Here is a table of web browsers that work with ~TiddlyWiki. For details, click on the browser name...
|!Browser |!Version |!Allows changes to be saved locally?|
|InternetExplorer |6.0+ |Yes |
|Firefox |1.0+ |Yes |
|Safari |1.0+ |Yes, using TiddlySaver.jar|
|Opera |? |Yes, using TiddlySaver.jar|
|Netscape Navigator |7.0+ |Yes |
|Camino |1.0+ |Yes |
|Chrome |All |Yes, using TiddlySaver.jar|
|iPhone |All |Yes. See [[iTW|http://www.apple.com/webapps/productivity/itwatiddlywikiforiphone.html]]|
|Wii |All |No |
|luakit |All |Yes |

See also [[TiddlyWiki apps available for smartphones|Mobile]]. Please [[let us know|http://groups.google.com/group/TiddlyWiki]] of any additions or corrections

Some macros render a button or link which performs a dedicated action when clicked...
<<get ##Description filter:[tag[Button]] format:'!!![[%1]]
<<<
%0
<<<'>>
!Summary
You can directly apply CSS rules inline or use custom classes.
!Markup
!!!Inline Styles
Enclose text using two double @ signs and let the first two follow by your CSS rules.
{{{
@@color:#4bbbbb;Some random text@@
}}}
''Displays as:''
@@color:red;Some random text@@

!!!CSS Classes
CSS classes can be applied to text blocks.

To wrap your text inline in a HTML {{{<span>}}} element use...
{{{
before » {{customClassName{inline content}}} « after
}}}
''Displays as:''
before » {{customClassName{inline content}}} « after

To wrap your text as a block level element -- a HTML {{{<div>}}} -- use line-breaks...
<html><pre>
before » {{customClassName{
box content
}}} « after
</pre></html>''Displays as:''
before » {{customClassName{
box content
}}} « after
See WikiWord...
This behaviour requires a plugin to be installed. Install SinglePageModePlugin from http://tiddlytools.com. See [[How do I install a plugin?]] for more info.
{{annotation{
''Important'': As of ''05. Sep, 2013'' all links to Martin's work are broken! Also, these plugins have been in alpha-state throughout their existence and must be considered outdated.
}}}
You can with Martin's new plugin support for diffrent markups. See:

http://www.martinswiki.com/#MediaWikiFormatterPlugin for MediaWiki markup

and http://www.martinswiki.com for other markup.

See also [[google groups discussion|http://groups.google.com/group/TiddlyWikiDev/browse_thread/thread/a8b1e3cc62ae9268/53149b6d2b5c3427]].
Martin Budden has created formatter plugins that allow you to use markups other than TiddlyWiki, e.g.:
;MediaWiki Markup
:&raquo; [[MediaWikiFormatterPlugin|http://www.martinswiki.com/#MediaWikiFormatterPlugin]]
;More Markup Formatters
:&raquo; [[MartinsWiki.com|http://www.martinswiki.com]]
Also see [[this discussion on Google Groups|http://groups.google.com/group/TiddlyWikiDev/browse_thread/thread/a8b1e3cc62ae9268]]...
This question gets asked regularly on the mailing list. The answer is complicated. I'm going to attempt to write a definitive answer here.

''Standard TiddlyWiki''
Imagine you have a local shared network drive with a TiddlyWiki file on it. Now suppose in the morning you open the TiddlyWiki file and make some changes then save them. Then in the afternoon someone else opens the file and makes some more changes and saves them. This all works fine. If you have set your user name cookies, it will even show who edited each tiddler.

But now suppose you both open the file at the same time. If you edit some tiddlers then save the other user won't know about those edits. Then when she saves her TiddlyWiki it will overwrite your edits. This is obviously a major limitation and means that multi-user with a standard TiddlyWiki is not very useful. (see [[TiddlyLock|Can I use TiddlyWiki as a multi-user/collaborative/server based wiki?#TiddlyLock]] below for a simple solution to this problem)

''Server-side adaptations of TiddlyWiki''
There are a number of server side adaptations of TiddlyWiki. See [[here|http://tiddlywiki.com/#ServerSide]] for more information. These server-side adaptations require that you setup and configure the appropriate web servers and databases to store tiddlers on the server, like a conventional wiki. Then as the adminstrator you can create users who must authenticate in order to edit tiddlers.

Depending on the version there might be additional features like access control settings and version history. The advantage of this type of setup is that you have a proper multi-user collaborative environment. The disadvantage is that there's quite a bit more work and technical skill required to setup, configure and administer the system, and you lose the ability to work offline, eg on a USB drive.
{{Quote|1=DaveG|2=
If I recall correctly in this situation you can use the export plugin (from Eric Shulman see [[ExportTiddlersPlugin|http://www.TiddlyTools.com/#ExportTiddlersPlugin]] ) which can make a static html exported file for offline reading
}}

The two most active server-side adaptations seem to be [[TiddlyWeb]], which runs on Python, and [[ccTiddly]], which runs on PHP and MySQL.

''Standard TiddlyWiki via http, using UploadPlugin''
[[BidiX|http://tiddlywiki.bidix.info]] has written a plugin that lets you upload your TiddlyWiki to a web server.  You need to copy a single PHP file onto your web server, so there is less setup than a full serverside.

This situation is basically the same as a standard TiddlyWiki -- when there are multiple users editing, whoever saves last will overwrites any previous saves.  [[Tiddlyspot|http://tiddlyspot.com]] uses the UploadPlugin, so this applies for Tiddlyspot sites as well as sites where you use UploadPlugin on your own web server.

''Standard TiddlyWiki via http, using UploadPlugin and GroupAuthoringPlugin''
BidiX, the creator of UploadPlugin, has also written a tool called GroupAuthoringPlugin that can be used for allowing multi-user editing on a standard TiddlyWiki via http using UploadPlugin. The way it works is that if you want to do some editing you first "lock" the TiddlyWiki file. This creates a lock file on the server which prevents anyone else from uploading until you release the lock. For more information see [[here|http://tiddlywiki.bidix.info]]. GroupAuthoringPlugin requires that you install some scripts on your web server (as does UploadPlugin) to handle the locking. 

(Currently GroupAuthoringPlugin is not available on Tiddlyspot but there are plans to make it available some time in the future).

''Other Solutions to Investigate''
'' [[MiniTiddlyServer|http://minitiddlyserver.com]] '' 
[[MiniTiddlyServer|http://minitiddlyserver.com]] (Project no longer available on this link) is a lightweight php based server side that is similar to UploadPlugin in that the TiddlyWiki on the server is a stock-standard TiddlyWiki, but includes some more advanced saving techniques, for example it can save only changed tiddlers. There is also some support for preventing overwritten data in a multi-user situation.

'' [[TiddlyHome|http://tiddlyhome.bidix.info]] ''
[[TiddlyHome|http://tiddlyhome.bidix.info]] from BidiX is based on UploadPlugin but allows easy creation of entire new sites and provides a way to provide update access to groups of users.

'' [[TiddlyLock|http://www.minormania.com/tiddlylock/tiddlylock.html]] ''
[[TiddlyLock|http://www.minormania.com/tiddlylock/tiddlylock.html]], by Richard Hobbis, uses a simple lock file mechanism to allow a TiddlyWiki to be stored on a shared network drive and viewed & edited by multiple users without fear of overwriting other users' changes or losing their own!

It works by maintaining a simple lock file (by default, in the same location as the TiddlyWiki file) that identifies who locked the TiddlyWiki, and when. Whilst the TiddlyWiki is being edited, other users are automatically put into Read-Only mode. As soon as the editing user has saved the TiddlyWiki it becomes available to other users for editing again, although they do have to reload the TiddlyWiki in order to see the changes made.

The location of the lock file can now be changed so that it is stored in a location separate from the TiddlyWiki file.

'' [[ServerLockPlugin|http://www.gentleknowledge.com/tiddlyplugins#ServerLockPlugin]] ''
[[TiddlyLock|http://www.minormania.com/tiddlylock/tiddlylock.html]] (see website for differences) but prevents overwriting when editing a wiki over http.

''Note''
Multi-user collaboration is not really TiddlyWiki's strong point. Many of the solutions mentioned above are experimental. If you need a serious multi-user wiki then perhaps you should consider using something other than TiddlyWiki, eg MediaWiki.

'' See Also ''

* [[Server-Side Solutions]]

[[Category:FAQ]]
[[Category:Basics]]
A number of TiddlyWiki adaptations have been developed specially for this purpose...
|!Name|!Author|!Link|h
|mGSD|Simon Baird|http://mgsd.tiddlyspot.com|
|tbGTD|Tobias Beer|http://tbGTD.tiddlyspot.com|
|dGSD|David Szego|http://thinkcreatesolve.biz|
|d³|Tom Otvos|http://www.dcubed.ca|

Also see [[What is GTD?]]...
Category:Adaptations
This page is still incomplete. You can help by contributing to its expansion.
Please improve the article, or discuss the issue on the talk page.

Adaptations (also called verticals or editions) are variants of TiddlyWiki created for specific purposes.
In earlier versions of TiddlyWiki, the term "adaptations" used to describe modifications of the TiddlyWiki core.
More recent versions support plugins though, so that adaptations now tend to consist of a collection of plugins on top of the standard TiddlyWiki core code.
Pages in category "Adaptations"

The following 17 pages are in this category, out of 17 total.
A

    AndTidWiki

E

    Editions

I

    IWantABlog

M

    MGSD
    MPTW

	
R

    RippleRap

S

    Server-Side Implementations

T

    TbGTD
    TeamTasks
    TiddlyChatter
    TiddlyFolio

	
T cont.

    TiddlyTimeJournal
    TiddlyWiki Address Book

V

    Vertical

W

    WebOS

Y

    YourFormBuilder
    YourTimeSheets
By default, selecting 'save changes' will also create a backup copy (by default) of the TiddlyWiki in the same folder as the TiddlyWiki file itself. To avoid the folder filling up with copious backup files, you can create a folder for them.   

* Go to 'options' on the right-hand top menu ([[Sidebar]]),
* Click on '[[AdvancedOptions]]',
* Where it says 'name of folder to use for backups', type in a name for the folder (not the address of the folder),
* Close the AdvancedOptions tiddler. 

Go to the folder you keep your TiddlyWiki in. You should now see a new folder with the name you just specified. From now on backups will be stored in this new folder.

The path is relative to the directory where the wiki is saved. For Windows computers, use the Windows backslash path separator (\).

To turn off the automatic backup function, got to 'options' and untick [[AutoSave]].

'' See Also ''

* [[AdvancedOptions]]
* [[AutoSave]]
* [[Sidebar]]

[[Category:FAQ]]
[[Category:Using TiddlyWiki]]
When you configure a classic TiddlyWiki using the OptionsPanel in the right sidebar or the AdvancedOptions in the [[Backstage Area]] your settings are stored as browser cookies.

When you lose your cookies or work with TiddlyWiki on several computers it can be tiresome to change the options time and time again.

This page explains how you can make your desired options permanent, e.g. having AutoSave always turned on. The way to achieve this is by actually creating a simple plugin, i.e. a tiddler that contains some executable javascript code that sets your options when TiddlyWiki starts.
<<<
''Note:'' There is an alternative, but less flexible method using [[Persistent Options]].
<<<
!"""Your First Config Tiddler"""
Create a new tiddler and tag it <<tag systemConfig>> -- this will turn it into a plugin.

Many people chose to name this tiddler [[zzConfig]] or ''zzTweaks''. As TiddlyWiki runs all plugins during startup in alhpabetical order, this takes care of your options plugin running last in the queue.

To permanently turn AutoSave on add the following line:
{{{
config.options.chkAutoSave = true;
}}}
Now save the tiddler, [[save changes|saveChanges]] and reload your TiddlyWiki. You will notice that AutoSave will be turned on again whenever TiddlyWiki starts, even if you decide to temporarily turn it off.
!"""Doing It Right"""
Just like any other plugin, you can add as many instructions to your configuration tiddler as you like, of course, avoiding JavaScript syntax errors:
;[[booleans|http://www.w3schools.com/js/js_obj_boolean.asp]]
:» a boolean value can only be set to {{{true}}} or {{{false}}}
:» usually options whose name starts with {{{chk}}}
;[[strings|http://www.w3schools.com/jsref/jsref_obj_string.asp]]
:» must be enclosed in either {{{'single quotes'}}} or {{{"double quotes"}}}
:» usually options whose name starts with {{{txt}}}
;[[comments|http://www.w3schools.com/js/js_comments.asp]]
:» {{{// a comment line starts with two slashes and will not be executed //}}}
!"""The Options List"""
Here are options you may find interesting, showing the default settings (there also is a version w/o comments below)...
{{{
// your desired UserName
config.options.txtUserName = "MyName"; 

// hide toolbar when viewed over HTTP
readOnly = false;

// hide editing features when viewed over HTTP
//config.options.chkHttpReadOnly = false; // esp. for TW < v2.2

// also save TiddlyWiki when a tiddler is saved
config.options.chkAutoSave = true;

// don't save backups
config.options.chkSaveBackups = false;

// relative path of backup folder
config.options.txtBackupFolder = "";

// allow regular expressions in search
config.options.chkRegExpSearch = false;

//search case sensitive
config.options.chkCaseSensitiveSearch = false;

// turn on animations
config.options.chkAnimate = true;

// generate an rss feed when saving
config.options.chkGenerateAnRssFeed = false;

// open external links in a new window
config.options.chkOpenInNewWindow = true;

// clicking a links to open a tiddlers causes the original tiddler to close
config.options.chkToggleLinks = false;

// don't update modifier and modified when editing tiddlers
config.options.chkForceMinorUpdate = false;

// require confirmation before deleting tiddlers
config.options.chkConfirmDelete = true;

// use the tab key to insert tab characters instead of moving between fields
config.options.chkInsertTabs = false;

// the default tab in the sidebar (= the tab name)
config.options.txtMainTab = "Timeline";

// the default more tab in the sidebar (= the tab name)
config.options.txtMoreTab = "Missing";

// max # of rows in edit boxes
config.options.txtMaxEditRows = "30";

// date format for created and modified in subtitle
config.views.wikified.dateFormat = "YYYY-0MM-0DD 0hh:0mm";

// date format timeline
config.macros.timeline.dateFormat = "YYYY-0MM-0DD (ddd)";
}}}
!Also see
*[[DateFormats]]...
!Options List w/o Comments
{{{
config.options.txtUserName = "MyName";
readOnly = false;
//config.options.chkHttpReadOnly = false; // esp. for TW < v2.2
config.options.chkAutoSave = true;
config.options.chkSaveBackups = false;
config.options.txtBackupFolder = "";
config.options.chkRegExpSearch = false;
config.options.chkCaseSensitiveSearch = false;
config.options.chkAnimate = true;
config.options.chkGenerateAnRssFeed = false;
config.options.chkOpenInNewWindow = true;
config.options.chkToggleLinks = false;
config.options.chkForceMinorUpdate = false;
config.options.chkConfirmDelete = true;
config.options.chkInsertTabs = false;
config.options.txtMainTab = "Timeline";
config.options.txtMoreTab = "Missing";
config.options.txtMaxEditRows = "30";
config.views.wikified.dateFormat = "YYYY-0MM-0DD 0hh:0mm";
config.macros.timeline.dateFormat = "YYYY-0MM-0DD (ddd)";
}}}
* ''[[TiddlySnip|http://tiddlysnip.com]]'' a firefox extension that allows you to use TiddlyWiki as a scrapbook!
* ''[[Tiddle|http://tiddle.sourceforge.net]]'' a desktop application which provides an indexed quick-search view into a TiddlyWiki file.
!Summary
You can render text monospaced text, e.g. using the font //Courier//, while preserving line breaks and not applying WikiText formating or turning WikiWords into links.
!!"""Monospaced Text Block"""
<html><pre>
{{{
Some plain text including WikiLinks
}}}
</pre></html>''Displays as:'' a HTML <pre> element
{{{
Some plain text including WikiLinks
}}}
<<<
''Note:'' Code blocks are displayed using a white-space 'as-is', fixed-width font without no word-wrapping -- displayed in a box.
<<<
!!"""Monospaced Inline Text"""
Alternatively, you can also display monospaced text __inline__ by wrapping the text in three braces <html><code>{{{...}}}</code></html>:
<html><pre>{{{inline //code//}}}</pre></html>''Displays as:''  a HTML <code> element
{{{inline //code//}}}
<<<
''Note:'' Inline code uses a white-space 'collapsed', word-wrapped, fixed-width font.
<<<
!"""Monospaced Code Blocks"""
In order to display processed code as monospaced blocks in tiddlers, the wiki markup needs to be escaped using the respective language's comments syntax. While this is not necessary for a plugin to function properly, it makes the wikified tiddler contents generally look more appealing and readable from the TiddlyWiki UI.
;HTML Code
:» e.g. in PageTemplate, ViewTemplate or EditTemplate
:{{sub{
{{{
<!--{{{-->
[HTML code]
<!--}}}-->
}}}
}}}
;CSS Code
:» e.g. in StyleSheets
:{{sub{
{{{
/*{{{*/
[CSS code]
/*}}}*/
}}}
}}}
;JavaScript Code
:» e.g. in [[Plugins]], i.e. tiddlers tagged <<tag systemConfig>>
:{{sub{
{{{
//{{{
[JavaScript code]
//}}}
}}}
}}}
!!Also see...
*[[Using WikiMarkup in CSS, JavsScript or HTML Code|Comment Formatting]]
*[[Comment Formatting|Comment Formatting]]
*[[Suppressing Formatting]]
<<tiddler Code>>
TiddlyWiki core code has been migrated to GitHub and can be found at http://github.com/tiddlywiki/tiddlywiki

Various plugins and support code is still in the older Subversion repository at http://svn.tiddlywiki.org.
/*{{{*/
Background: #fff
Foreground: #003366
PrimaryPale: #e8f1f9
PrimaryLight: #90bfe5
PrimaryMid: #398cd1
PrimaryDark: #091b29
SecondaryPale: #e8f1f9
SecondaryLight: #90bfe5
SecondaryMid: #398cd1
SecondaryDark: #091b29
TertiaryPale: #f9f9f9
TertiaryLight: #aaa
TertiaryMid: #888
TertiaryDark: #222
Error: #f88
ColorPaletteParameters: HSL([248|6], [0.67|0.53|0.43|0.06],[0.31|0.5|0.85|0.99])
/*}}}*/
!Summary
The shadow tiddler ColorPalette determines the overall colour scheme used within the TiddlyWiki.
!Default Contents
{{{
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
}}}
!TiddlySpace
In TiddlySpace, when a new space is created, the {{{<<randomColorPalette>>}}} macro generates a new palette, which however can be overwritten by modifying the ColorPalette tiddler or reset to defaults by deleting it.
!Summary
Occasionally you want to add notes to your tiddler markup yet don't want it displayed when the tiddler is rendered. To achieve this, wrap the text using {{{/% hidden %/}}}.
!Example
{{{
text before .../%
!HIDDEN SECTION
This is content of a hidden section.
!END%/ text after
}}}
''Display as:''
<<<
text before /%
!HIDDEN SECTION
This is content of a hidden section.
!END%/... text after
<<<
!Also see...
;[[Suppressing Formatting]]
:» when you just don't want that text to be TiddlyWiki markup
:» when you want to prevent WikiWords
:» when you copy & paste from other sources

!Code Comments
When you move to the design and development front of TiddlyWiki, you may want or need to //commented out// passage to prevent them from being interpreted as Javascript, CSS or HTML...
;HTML Comments
:» e.g. in PageTemplate, ViewTemplate, EditTemplate
:{{sub{
{{{
<!-- HTML Comment-->
<!-- 
possibly
multiple lines
-->
}}}
}}}
:» for displaying wikified content in HTML tiddlers:
:{{sub{
{{{
<!---
''Wikified'' HTML Comment
possibly multiple lines
--->
}}}
}}}
;CSS Comments
:» e.g. in StyleSheets
:{{sub{
{{{
/* CSS Comment */
/*
possibly
multiple lines
*/
}}}
}}}
:» for displaying wikified content in CSS tiddlers:
:{{sub{
{{{
/*** __Wikified__ CSS Comment ***/
/***
!Possibly
* multiple
* lines
***/
}}}
}}}
;JavaScript Comments
:» in plugins, i.e. tiddlers tagged <<tag systemConfig>>
:{{sub{
{{{
// JavaScript, Single-line Comment
}}}
}}}
:{{sub{
{{{
/* JavaScript Comment */
/*
possibly
multiple lines
*/
}}}
}}}
:» for displaying wikified content in JavaScript tiddlers:
:{{sub{
{{{
/*** __Wikified__ JavaScript Comment ***/
/***
; possibly
: multiple lines
***/
}}}
}}}
!Also see...
;[[Code Formatting|Code]]
:» for rendering code formatting
Not only thanks to its open source nature, TiddlyWiki is all about its community. The most active place for discussion are the <<slider chkCommunity "Discussion Groups" "TiddlyWiki Discussion Groups">>
Almost everything in [[TiddlyWiki]] is controlled via [[Tiddlers|Tiddler]]...
* [[Content|Tiddler]]
* [[HTML Templates]]
* [[Style Sheets]]
* [[Macros]]
* [[Plugins]]
* [[Cookies]] (used for storing certain user options)
Type the text for 'Configuration_Options'
To enable editing of the Tiddlywikis in...
'' Internet Explorer ''

'''Have to add an image here'''
* In IE, choose Tools > Internet Options
* Go to the Security tab and select "Local Intranet" Zone
* Click Default Level (to clear the Custom Level settings)
* Set the Security level to Low
* Close all open browsers
* You can now edit the wiki

Also Try:

If TiddlyWiki has been downloaded using Internet Explorer on Windows XP with Service Pack 2 and stored on an NTFS-formatted drive, any attempts to save changes will usually fail with the following error message: 

It's not possible to save changes. Possible reasons include: 

- your browser doesn't support saving (Firefox, Internet Explorer, Safari and Opera all work if properly configured) 

- the pathname to your TiddlyWiki file contains illegal characters 

- the TiddlyWiki HTML file has been moved or renamed 

The solution is to right-click on the TiddlyWiki HTML file and choose Properties. If the file is blocked, there will be an Unblock button on the resulting property sheet, which will remove the protection and allow the file to be saved.

'' Safari / Opera ''

The updated [[TiddlySaver|http://www.tiddlywiki.com/#TiddlySaver]] Java applet permits TiddlyWiki to save changes from Safari & Opera, eliminating the Java Policy step <br>
<br>
URL:  http://www.tiddlywiki.com/#TiddlySaver <br>
Filename:  TiddlySaver.jar <br>
File Type:  Java applet <br>
Location:  Saved in the same directory as the TiddlyWiki file <br>
Note:  TiddlySaver.jar is signed by UnaMesa Association, their certificate is signed by Thawte Code Signing CA intermediate certificate & is chained to the Thawte Premium Server CA root certificate.  The first time this applet runs, allow the browser to trust the certificate chain to be able to use the applet, even if the certificate is indicated as valid <br>
<br>
Note that there is no longer any need for a .java.policy file <br>
<br>
Ensure that if a backup directory is specified in AdvancedOptions, which does not exist, TiddlySaver will not run; due to a software bug <br>
<br>
Appreciation for the original TiddlySaver code: Andrew Gregory <br>
Appreciation for arranging the certificate magic:  BidiX

'' Opera Portable Edition ''
... cannot save. It cannot use TiddlySaver.jar, because it does not support Java.

'' Opera on Ubuntu ''
If your version of Ubuntu doesn't currently have Java installed, when you try to save changes you will receive a message that reads like the following:

 <localhost>
 It's not possible to save changes. Possible reasons include:
 - your browser doesn't support saving (Firefox, Internet Explorer, Safari and Opera all work if properly configured)
 - the pathname to your TiddlyWiki file contains illegal characters
 - the TiddlyWiki HTML file has been moved or renamed

To fix this:
#[[Download java|https://help.ubuntu.com/community/Java]].  
#Then update Opera to use the new Java libraries. [[Source Instructions|http://ubuntuforums.org/showthread.php?t=69275]]  
##First find the java library using "locate libjava.so".  
##In Opera, enable Java, set the "Java Options" folder to the java library folder.  
#Finally, reboot Opera.  

When you next try to save changes, you will be greeted by a permissions dialog to allow saving.  You should now be able to save your changes!

'' See Also ''

* [[It's not possible to save changes]]
[[Category:FAQ]]
[[Category:Getting Started]]
[[Category:Browser Issues]]
TiddlyWiki provides document authors with a relatively ubiquitous yet surprisingly malleable and extensible means of organizing content.

At a very simple level, [[tiddlers|Tiddler]] are named chunks of document content (information), potentially with some tags on them for cross-reference.

Think "named, tagged digital 3-by-5 cards", if you wish; it's almost that straightforward.  Unless artificially restricted by dumbed-down view and/or edit templates, [[tiddler|Tiddler]] content is normally malleable within an open TiddlyWiki document.  

TiddlyWiki documents are relatively unique in that respect; the TW core allows  end-users - document viewers - to actually modify the content they're viewing.

When you're viewing a TW document "server side" - with an http colon-slash-slash not a file-colon-slash-slash - the question then becomes, how can someone save any changed tiddlers they've created - where can they be put?  There are a few possibilities; TiddlyTools save-from-web can work in many cases, as can using an online server type TW document such as a TiddlySpot document, or using server-sides such as [[ccTiddly]] or [[TiddlyWeb]].

Tiddler importing and exporting is quite a bit more powerful and capable when you think about applying filters such as by-tag to inter-document tiddler transfers.

! Information in a tiddler
There are several optional information holders in a tiddler, i.e holders that allows access to the information from other tiddlers.
* Tags: Data entered in the tags field
* Slices: Data entered into a simple two column table. The first column lists the field name and the second column the respecive data. The typical example is the table in the beginning of plugins listing Name, Version etc.
* Sections: Are what are defined and separated by headings, i.e the "!" mark (!, !!, !!!)
* Fields: Can be seen when clicking the tiddler menu more>fields. This typically contains meta information about the tiddler but can contain any information.
In order to contribute to [[TiddlyWiki.org]] -- the TiddlyWiki community documentation -- all you need to do is register with TiddlySpace.

If you rather want to discuss some topic (first), head over to the [[Discussion Groups]].

Already logged in? Then you should find instructions right below...
<<tiddler "Documentation Space">>
To help contribute at [[TiddlyWiki.org|http://tiddlywiki.org]], please consider...
:» [[TiddlyWiki.org|CC - TiddlyWiki.org]]
:» [[Documentation Sources|CC - Documentation Sources]]
:» [[Stuff That Needs Reviewing|REVIEW]]
:» [[Who Does What?|CC - Who Does What]]
:» [[Deleting Tiddlers|CC - Deleting Tiddlers]]
:» [[Documentation Tools|CC - Documentation Tools]]
:» [[Finally Done|CC - Finally Done]]
Many thanks to the following contributors for keeping TiddlyWiki.org up to date:

{{inlineList{
<<groupBy modifier groupTemplate:Templates##Faces exclude:None>>
}}}

Get yourself in the above list by contributing to this page!
ControlView is the mechanism which TiddlySpace employs to prevent the serving of content from other [[spaces|Space]] which would otherwise be available via [[recipes|Recipe]] and [[bags|Bag]] sharing the same TiddlyWeb instance.

Without ControlView, it would be possible to construct a URI to serve content from {{{evilspace}}} which //appeared// to belong to the {{{goodspace}}} domain, e.g.:
<<<
http://goodspace.tiddlyspace.com/recipes/evilspace_public/tiddlers/all_good_is_evil
<<<
''Source'': [[google discussion group|http://groups.google.com/group/tiddlywiki/browse_thread/thread/a8922becd1f29938]] (Måns Mårtensson)
!Description
The following [[script|Scripts]] allows to convert lists to WikiLinks.
!Code
{{{
<script label="L2W" title="convert list to wikilinks">
var here=story.findContainingTiddler(place);
   if (!here) return;
   var title=here.getAttribute("tiddler");
   var tid=store.getTiddler(title);
   var t=store.getTiddlerText(tiddler.title) ;
   var target = store.getTiddler(tiddler.title) ;
var txt='[['+tid.text.split('\n').join(']]\n[[')+']]';
store.saveTiddler
(tid.title,tid.title,txt,tid.modifier,tid.modified,tid.tags,tid.fields);
</script> 
}}}
!Instructions
Paste a line-seperated list into a tiddler then "run" the script on the list to get double bracketed list items.
Cook is the build tool for [[TiddlyWiki]].
It utilizes [[recipes|Recipe]] to stitch together TiddlyWiki HTML files from their constituent chunks.
!!External Resources
* github [[Cooker|https://github.com/TiddlyWiki/cooker]]
* [[Cook|http://trac.tiddlywiki.org/wiki/Cook]] (old)
* [[Ginsu|http://trac.tiddlywiki.org/wiki/Ginsu]] (old)
!!!See Also
* [[Ginsu]]
* [[Recipes|Recipe]]
* [[Chef]]
TiddlyWiki uses browser [[Cookies|http://en.wikipedia.org/wiki/Magic_cookie]] to temporarily store settings that you can define as [[options|Options]] -- temporarily meaning: for as long as your browser is not asked to delete them.

This being an arguably fragile method of defining [[persisted options|Persistent Options]], please see [[Changing Default Options]] on how to make your configuration permanent.
The [[core|Core]]@tiddlywiki refers to a version of the TiddlyWiki standard distribution.
The TiddlyWiki core provides a number of <<tag [[Core Macros]]>> listed below by category...

!!"""Information Macros"""
macros providing system information
;[[<<today>>|today]]
:outputs the current day
;[[<<version>>|version]]
:outputs the TiddlyWiki version
;[[<<message>>|message]]
:outputs a core JavaScript message, i.e. hidden, functional texts that need translation
!!"""List Macros"""
macros providing listed tiddler information
;[[<<list>>|list]]
:provides various means for gathering tiddler lists
;[[<<timeline>>|timeline]]
:outputs a chronological list of recently edited tiddlers
;[[<<allTags>>|allTags]]
:outputs a list of all tiddlers
!!"""Tagging Macros"""
macros for querying and manipulate tags
;[[<<tag>>|tag]]
:provides a button to show a list of tiddlers tagging to a specified tag
;[[<<tags>>|tags]]
:provides a list of tags for a tiddler
;[[<<tagging>>|tagging]]
:provides a list of tiddlers tagging to a tag
!!"""Transclusion Macros"""
macros for including the contents of one tiddler in another, a process called transclusion
;[[<<tiddler>>|tiddler]]
:allows to embed (or [[transclude|Transclusion]]) content of one tiddler in another ith placeholder support
;[[<<slider>>|slider]]
:outputs a toggle button showing / hiding the content of another tiddler in a slider
;[[<<tabs>>|tabs]]
:outputs clickable tabs displaying content of other tiddlers
!!"""Editing Macros"""
macros aiding in editing Tiddlers
;[[<<newTiddler>>|newTiddler]]
:generates a button that creates a new tiddler when clicked
;[[<<newJournal>>|newJournal]]
:generates a button that creates a new journal tiddler when clicked
;[[<<saveChanges>>|saveChanges]]
:generates a button to save TiddlyWiki
!!"""Navigation Macros"""
macros for navigating in TiddlyWiki
;[[<<search>>|search]]
:provides ain input field to search in TiddlyWiki
;[[<<closeAll>>|closeAll]]
:provides a button to close all open tiddlers
;[[<<permaview>>|permaview]]
:provides a button to output a link to all currently open tiddlers
!"""Special Effects Macros"""
macros providing frontend effects
;[[<<gradient>>|gradient]]
:renders a gradient as a background to content
;[[<<refreshDisplay>>|refreshDisplay]]
:refreshes the visual display of TiddlyWiki
!"""Configuration Macros"""
;[[<<option>>|option]]
:renders inputs for editing option cookies, e.g.
:* checkboxes for boolean cookies
:* input fields for text cookies
;[[<<options>>|options]]
:outputs the same [[AdvancedOptions]] as in the [[Backstage Area]]
;[[<<plugins>>|plugins]]
:outputs the same [[PluginManager]] as in the [[Backstage Area]]
;[[<<importTiddlers>>|importTiddlers]]
:outputs the same [[ImportTiddlers]] as in the [[Backstage Area]]
;[[<<sync>>|sync]] {{deprecated{(deprecated)}}}
:outputs the same [[SynchronizationWizard]] as in the [[Backstage Area]]
;[[<<upgrade>>|upgrade]]
:outputs the same [[UpgradeWizard]] as in the [[Backstage Area]]
!"""Layout Macros"""
macros used by core layout functions
;[[<<view>>|view]]
:renders a tiddler field value in view mode
;[[<<edit>>|edit]]
:renders ain input field to edit a tiddler field value in edit mode
;[[<<toolbar>>|toolbar]]
:renders the tiddler toolbar; used in the shadow tiddler called ViewTemplate
;[[<<annotations>>|annotations]]
:renders a placeholder wher tiddler annotations are rendered; e.g. for a missing tiddler
;[[<<tagChooser>>|tagChooser]]
:renders a button in edit mode to chose an existing tag to add it to the current tiddler
<<tiddler "Core Macros">>
Click on 'new tiddler' (top right-hand menu). A new tiddler will open.

To name the tiddler, type over the words 'new tiddler' in the top text box.

Enter the tiddler's contents into the main text box.

Click on Done (grey menu at top right of tiddler). 

To add the tiddler to the menuu, see [[Add Menu Item]].
Custom fields are fields that are either created by a plugin or manually by an author for a dedicated purpose, e.g.:
* to aggregate all tiddlers that have a certain field or field value elsewhere
* to flag a tiddler and then trigger some macro or plugin to run when it's viewed
* etc...
[[Tiddlers|Tiddler]] can have attributes in the form of custom [[fields|Fields]]. A tiddler field can be any data that describe or extend the tiddler with dedicated information, e.g. geo data associated with a tiddler.

To view the fields of a tiddler, click on the more button in your toolbar and select the {{button{fields}}} option.
{{annotation{
''Note'': This tiddler has a custom field named {{{color}}} which could potentially be used by a plugin to set the text color.
}}}
In TiddlySpace you can programatically inspect tiddler fields via the [[TiddlySpace API]], e.g.:
* [[click to see the text serialization for this tiddler|http://tiddlywiki.tiddlyspace.com/bags/tiddlywiki_public/tiddlers/Custom Fields.txt]]
!"""Editing Fields"""
By default it is not possible to edit a custom field in TiddlyWiki. To enable editing install a plugin, e.g. [[FE2|http://tbgtd.tiddlyspot.com/#FE2]] or [[FieldsEditorPlugin|http://visualtw.ouvaton.org/VisualTW.html#FieldsEditorPlugin]]. In TiddlySpace, you can alternatively include the @first-class-fields space which as well provides field editing functions.
!"""Basic Viewing & Editing"""
First of all, custom field names must be all lower case in order to be stored and retrieved sucessfully.

The most simple way to create and edit a custom field is by modifying your shadow tiddlers called EditTemplate and ViewTemplate:
;EditTemplate
:{{{
<div>My Field: <span macro="edit my-field"></span></div>
}}}
;ViewTemplate
:{{{
<div>My Field: <span macro="view my-field"></span></div>
}}}
Now, when you view any tiddler, you will see the value of {{{my-field}}} for the corresponding tiddler and are able to edit and save a new value for it in edit mode.

If you want the values for your custom field to be rendered as wiki text, use the parameter {{{wikified}}} for the view macro in the ViewTemplate...
;ViewTemplate
:{{{
<div>My Field: <span macro="view my-field wikified"></span></div>
}}}
!"""Styling The Field Output"""
You can apply inline styles directly in your ViewTemplate, e.g.:
;ViewTemplate
:{{{
<div style="font-size:200%;">My Field: <span macro="view my-field"></span></div>
}}}
A better way is to use a class and to put the corresponding css code in your StyleSheet tiddler,e.g.:
;ViewTemplate
:{{{
<div class="my-field">My Field: <span macro="view mything"></span></div>
}}}
;StyleSheet
:{{sub{
{{{
.my-field {
  color:white;
  background: red;
  border:3px solid green;
}
}}}
}}}
!"""Changing The Edit Box"""
Use css to change the size that comes with the edit box by default. you can do it with CSS, e.g.:
;EditTemplate
:{{{
<div><span class="my-box" macro="edit mything"></span></div>
}}}
;StyleSheet
:{{sub{
{{{
.my-box input {
 width:100%;
}
}}}
}}}
!"""Display Fields Conditionally"""
To conditionally display custom fields you can install and use [[HideWhenPlugin|http://mptw.tiddlyspot.com/#HideWhenPlugin]].

Here's what you do to to conditionally show fields based on tags using  HideWhenPlugin. Let suppose you have a some tiddlers tagged <<tag friend>> and you use a custom field to maintain some information about them, say their favourite food. To view and edit your friends' favourite food, add the following:
;ViewTemplate
:{{sub{
{{{
<div macro="showWhen tiddler.tags.contains('friend')">
  Favourite food: <span macro="view favourite-food"></span>
</div>
}}}
}}}
;EditTemplate:
:{{sub{
{{{
<div macro="showWhen tiddler.tags.contains('friend')">
  Favourite Food: <span macro="edit favourite-food"></span>
</div>
}}}
}}}
!"""Gathering Field Data"""
To list all your friends whose favourite food is pizza, you can install and use [[ForEachTiddlerPlugin|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin]] from [[Udo Borowski|http://tiddlywiki.abego-software.de]].

Once installed, add this to a tiddler:
:{{sub{
{{{
<<forEachTiddler
   where
      ' store.getValue(tiddler,"favourite-food") == "pizza" '
>>
}}}
}}}
This displays a bulleted list of tiddlers tagged <<tag friends>> whose favourite food  is {{{pizza}}} -- saved in the custom field {{{favourite-food}}}.

For more information on how to customize the output, refer to the [[plugin documentation|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin]].
Custom macros are not part of the [[TiddlyWiki core|Core Macros]]. Instead they are written by user, or simply copied and reused from another site or repository.

Much of the power of TiddlyWiki <<version>> lies in the ease with which users can create macros and [[Plugins]] to customize their wikis, and share them with each other.

Information on how to write a custom macro can be found in @TiddlyWikiDev.
TiddlyWiki is inherently flexible; with some knowledge of HTML and CSS, the entire layout can be easily adjusted.

All layout and style definitions are stored in shadow tiddlers which come with a standard TiddlyWiki, and can be edited directly in TiddlyWiki...
!"""HTML Templates"""
The overall layout in TiddlyWiki is defined using HTML Template tiddlers...
| !Shadow Tiddler | !Description |h
|[[PageTemplate]] |HTML code for the composition of the overall page design.|
|[[ViewTemplate]] |HTML code for the individual [[Tiddler]] layout |
|[[EditTemplate]] |HTML code for the tiddler editing mode |
!"""StyleSheets"""
Styles in TiddlyWiki are defined using [[css|www.w3schools.com/css]] in various StyleSheets...
| !Shadow Tiddler | !Description |h
|[[StyleSheetColors]] |default color styles |
|[[StyleSheetLayout]] |default layout styles |
|[[StyleSheetLocale]] |locale-specific styles |
|[[StyleSheetPrint]] |default printing styles |
|[[StyleSheet]] |custom user styles |
''Note'': The color scheme of a TiddlyWiki is defined using [[Slices]] in the shadow tiddler called [[ColorPalette]].
Check tiddlers with the tag <<tag DELETE>> for deletion...
!Mission Statement
[[TiddlyWiki.org]] is a place and space intended to help people find the information they seek in order to meet a desired end in the vast open spaces of the TiddlyVerse.

See the [[checklist|DOC - Checklist]] to find things to get started.
!Developer Stuff
Goes to @TiddlyWikiDev!
!Discussions
[[TiddlyWiki.org]] is __not__ a [[discussion forum|Discussion Groups]] -- let the content here be instructive, informative and concise with as little prose as possible.
!Comments
Up until there is a workable comments plugin -- maybe using [[disqus|http://disqus.com]] -- which doesn't clutter this space or its timeline, please do not write things that sound like comments in tiddlers.
!Standard Elements
A few core elements follow certain conventions...
;Macros
:» <<tag Macro "tiddlers tagged 'Macro'">>
:» are (preferably) named exactly as the macro
:» are tagged [[Macro]] and [[Core Macros]], if applicable
;ShadowTiddler Documentation
:» <<tag ShadowTiddler "tiddlers tagged 'ShadowTiddler'">>
:» are named ''~ShadowTiddlerName...'', e.g. [[ViewTemplate...]]
;Plugin Documentation
:» <<tag Plugin "tiddlers tagged 'Plugin'">>
:» are named ''~PluginName...'', e.g. [[GotoPlugin...]]
:» have a plugin header [[PLUGIN TEMPLATE]]
!Tagging
Please do not use tags without intent, i.e. because some tag may "feel right". Every tag should have a tiddler! Think of tags in this space as things that are somewhat higher in the hierarchy which should therefore be referenced somewhere, e.g. the [[tiddler macro|tiddler]] is tagged [[Core Macros]] which in turn is tagged [[Macros]] which eventually is a term listed in the [[Welcome]] tiddler.
!Deleting Tiddlers
If you think that some tiddler should be deleted, please mark it with the tag <<tag DELETE>>. Admins will then review and possibly delete these tiddlers.
!Redirect
Instead of deleting, you can also redirect a tiddler, e.g. when merging duplicate topics replacing the contents of the abandonned tiddler with:
<<<
See [[New Tiddler|REDIRECTED]]...
<<<
...while tagging it: {{{REDIRECTED excludeLists excludeSearch}}}
If it makes sense for the old tiddler to still be found using search or lists, then don't add the excludeLists excludeSearch. However, the less results one gets, the easier it is to find something.
!Developer Documentation
The place for code developer documentation is @TiddlyWikiDev -- not @TiddlyWiki.
!Glossary
The @glossary space is no longer included here. To add a new ''term'' add either of the following tags:
;[[Glossary]]
:» for TiddlyWiki terms
;[[TiddlySpace Glossary]]
:» for TiddlySpace related terms
Please use the Glossary only when needed.
* Do not list things like shadow tiddlers or macros as a ''term''.<br>These things shoud instead have an actual context.
* Do not use the [[Glossary]] as fallback for lack of a better tag.
* Glossary entries should only provide a short summary, an entry point to a topic. Try to create a Glossary entry in a singular form, e.g. [[Field]] and document the topic using the plural form, e.g. [[Fields]]. To reference the glossary entry to the topic, use the method described in MorePlugin.
The following lists possible things to work on...
;[[Documentation Sources|DOC - Documentation Sources]]
:» lists topics that need to be analyzed for which content may need to be reviewed or created
;tiddlers tagged <<tag REVIEW>>
:» are tiddlers that may need improvements
;tiddlers tagged <<tag DELETE>>
:» have been flagged for deletion
;tiddlers tagged <<tag html>>
:» are used for the [[html representation|html]] of [[TiddlyWiki.org]]
;tiddlers tagged <<tag REDIRECTED>>
:» now point to a different tiddler; may later be resolved differently
;[[excludeLists]] / [[excludeSearch]]
:tiddlers hidden from default lists or search
;best practises
:» collect ideas for desirable structures and content of [[this wiki|Welcome]]@tiddlyspace
;missing contents?
:» referenced, yet not existing... <<tag excludeMissing>>
{{annotation{
''Heads Up:'' Please consider [[Who Does What?|DOC - Work In Progress]] when you consider moving (considerable parts of these) sources to [[TiddlyWiki.org]]!
}}}
There may still be some open topics around [[migrating the old TiddlyWiki documentation to this space|About the old and the new wikis]]. To start, check out the [[Main Page content from old wiki]].

The inclusion to @tiddlywikidev might as well be removed, once it is complete enough...

Other external sources that can nurture this space...
* [[TiddlyWiki.com|http://tiddlywiki.com]] -- see http://tiddlywiki-com.tiddlyspace.com
* [[TiddlyWiki Reference@hoster.peermore.com|http://hoster.peermore.com/bags/tiddlywiki-reference/tiddlers.wiki]]
* [[TWHelp|http://twhelp.tiddlyspot.com]]
* [[TiddlerToddler|http://tiddlertoddler.tiddlyspot.com]]
* [[TiddlyWikiGuides.org|http://tiddlywikiguides.org]]
* [[TiddlyWikiTutorial@blogjones|http://www.blogjones.com/TiddlyWikiTutorial.html]]
* [[TiddlyWiki For The Rest Of Us|http://www.giffmex.org/twfortherestofus.html]]
* and of course, the [[Discussion Groups]]

!Done
Sources that [[have been merged / migrated|DOC - Log]] here...
*2011-02-11: @WikiText
*2011-02-11: @tiddlywiki-com-ref
List below, when you are done documenting, migrating or otherwise bringing-in major contributions to topics so that other know what still needs doing. Add new entries to the top...

*15.02.2012 @tobibeer: included @TiddlyWiki in @TiddlyWikiDev instead
*15.02.2012 @tobibeer: unincluded @TiddlyWikiDev all development stuff should move there!
*15.02.2012 @tobibeer: moved [[Layout|TiddlyWiki Layout]] here from [[TiddlyWiki.com|http://tiddlywiki.com]]
*13.02.2012 @tobibeer: ported ''Dev:Comments'' & ''Escaping'' from [[OldWiki]]
*11.02.2012 @tobibeer: removed inclusion of @TiddlyWiki-com-ref
*11.02.2012 @tobibeer: [[Shadow Tiddlers]] -- moved all form @TiddlyWiki-com-ref here
*11.02.2012 @tobibeer: [[Startup Parameters]] -- complete review
*11.02.2012 @tobibeer: WikiText -- move & review<<tag Formatting>>from @WikiText & @TiddlyWiki-com-ref
*06.02.2012 @tobibeer: @ListFiltrPlugin -- included & added to [[FAQ]], [[Glossary]], [[Quick Search]]
*06.02.2012 @tobibeer: [[Mobile TiddlyWiki]] -- migrated from [[TiddlyWiki.com]]
*06.02.2012 @tobibeer: [[Option]], [[Options]] -- created
*06.02.2012 @tobibeer: [[Persistent Options]] -- migrated from [[tiddlywiki.com|http://tiddlywiki.com/#PersistentOptions]]
*06.02.2012 @tobibeer: [[Download]] -- added [[Download]], also to MainMenu
*06.02.2012 @tobibeer: [[Bookmarklets]] -- should be all that are availabe today
*06.02.2012 @tobibeer: [[Tiddler Templates]] -- created from old FAQ, reviewed
*06.02.2012 @tobibeer: [[Timeline]] -- more details on full timeline
*06.02.2012 @tobibeer: [[Contribution Central]] -- all reviewed / created
*06.02.2012 @tobibeer: [[Fields]] & [[Custom Fields]] -- created & reviewed, major edits
*06.02.2012 @tobibeer: [[Welcome]] -- created new front page
*06.02.2012 @tobibeer: [[Glossary]] -- created overview, all reviewed & migrated from @glossary
*06.02.2012 @tobibeer: [[Changing Default Options]] -- migrated from [[TiddlyWikiGuides.org|CC - Documentation Sources]]
*05.02.2012 @tobibeer: [[Discussion Groups]] -- new overview
*05.02.2012 @tobibeer: [[TiddlyWiki Markup]] -- new all-in-one overview
*05.02.2012 @tobibeer: [[Core Macros]] -- all reviewed / migrated from @macros
*04.02.2012 @tobibeer: @LinkifyPlugin -- included & added [[LinkifyConfig]]
*04.02.2012 @tobibeer: [[Date Formats]] -- migrated & beautified
*04.02.2012 @tobibeer: [[excludeLists]] / [[excludeSearch]] -- new list views by [[Bag]]
<<listfiltr>>
<<<
;[[TEMPLATES]]
:» some templates used with the [[<<list>> macro|list]] in [[TiddlyWiki.org]]
<<<
<<<
;[[PLUGIN TEMPLATE]]
:» a template to be used for plugins
<<<
<<<
!"""Dedicated Documentation Plugins"""
; OrgDocPlugin
:» <<tiddler "OrgDocPlugin::Description">>
; MorePlugin
:» <<tiddler "MorePlugin::Description">>
; TemplateTransclusionPlugin
:» <<tiddler "TemplateTransclusionPlugin::Description">>
!"""Included Plugins"""
; [[LinkifyConfig]]
:» automatically links matched tiddler titles 
; [[ListFiltrPlugin]]
:» quickly filters lists, e.g. [[FAQ]], [[Glossary]], [[Quick Search]]
<<<
<<<
;Binary / Image Upload
:<<binaryUpload edit:title>>
<<<
If you are going to work on some topic for longer, please list it under [[DOC - Review]] to indicate others that YOU are currently working on this. Remove when you're done.

!Topics for Review
The following topics may need to be created / reviewed...
*InterfaceOptions
*SpecialTags
*SpecialTiddlers
*IncrementalSearch
*RegExpSearch
*SaveEmptyTemplate
*CustomStyleSheet
*NestedStyleSheets
*NestedTemplates
*CustomMarkup
*MobileDevices

!Done?!?
*[[ToolbarButtons|Toolbar]]
*[[Tags]]
*[[TiddlerSlicing|Slices]]

!Final
*[[Startup Parameters]]
*[[HtmlEntities|HTML Entities]]
*[[PermaView]]
*[[KeyboardShortcuts|Keyboard Shortcuts]]
*[[SafeMode|Safe Mode]]
[[$1|$2]] <<tag [[$1]] »>>
 <<tiddler DateFormats>>
Either in the context of [[changing the default date formats|How do I change the default date formats for core macros?]] for core [[macros|Macros]] like [[today]], [[newJournal]], [[timeline]] and [[view]] or by using the corresponding date format parameters you can define a combination of ordinary text and special ''patterns'' substituted that will eventually with formatted with date values:
|!Pattern|!Description|!Example|
|{{{DDD}}}|weekday as text|<<today DDD>>|
|{{{ddd}}}|weekday as short text|<<today ddd>>|
|{{{DD}}}|day of month|<<today DD>>|
|{{{0DD}}}|day of month w/ leading zero|<<today 0DD>>|
|{{{DDth}}}|day of month w/ suffix|<<today DDth>>|
|{{{WW}}}|week number, see [[ISO-8601|http://de.wikipedia.org/wiki/ISO_8601]]|<<today WW>>|
|{{{WW}}}|week number w/ leading zero|<<today 0WW>>|
|{{{MMM}}}|month as text|<<today MMM>>|
|{{{mmm}}}|month as short text|<<today mmm>>|
|{{{MM}}}|month as number|<<today MM>>|
|{{{0MM}}}|month as number w/leading 0|<<today 0MM>>|
|{{{YYYY}}}|full year|<<today YYYY>>|
|{{{YYYY}}}|year, two digits|<<today YY>>|
|{{{wYYYY}}}|full year for current week|<<today wYYYY>>|
|{{{wYYYY}}}|year for current week, two digits|<<today wYY>>|
|{{{hh}}}|hours|<<today hh>>|
|{{{0hh}}}|hours w/ leading zero|<<today 0hh>>|
|{{{hh12}}}|hours in 12 hours cycle|<<today hh12>>|
|{{{0hh12}}}|hours in 12 hours cycle /w leading zero|<<today 0hh12>>|
|{{{mm}}}|minutes|<<today mm>>|
|{{{0mm}}}|minutes w/ leading zero|<<today 0mm>>|
|{{{ss}}}|seconds|<<today ss>>|
|{{{ss}}}|seconds w/ leading zero|<<today ss>>|
|{{{am}}} or {{{pm}}}|lower case am/pm indicator|<<today pm>>|
|{{{AM}}} or {{{PM}}}|upper case AM/PM indicator|<<today PM>>|
!!!Examples
;<nowiki>DDth MMM YYYY</nowiki>
:<<today "DDth MMM YYYY">>
;<nowiki>DDth mmm 0hh:0mm:0ss</nowiki>
:<<today "DDth mmm 0hh:0mm:0ss">>
<<tiddler DateFormats>>
/***
|''Name:''|DefaultOnEmptyPlugin|
|''Description:''|opens the default tiddlers when the story is empty.|
|''Author:''|[[Tobias Beer|http://tobibeer.tiddlyspace.com]]|
|''Version:''|0.1.0 (2015-01-22)|
|''~CoreVersion:''|2.5.2|
|''Documentation:''|http://defaultonempty.tiddlyspace.com|
|''Source:''|https://raw.github.com/tobibeer/TiddlyWikiPlugins/master/plugins/DefaultOnEmptyPlugin.min.js|
|''License''|Creative Commons 3.0|

!Code
***/
//{{{
(function(){var e=config.options;if(e["chkOpenDefaultOnEmpty"]===undefined){e["chkOpenDefaultOnEmpty"]=true}var t=Story.prototype;t.closeTiddlerDEFAULTONEMPTY=t.closeTiddler;t.closeTiddler=function(n,r,i){var s=n,o=e.chkOpenDefaultOnEmpty;if(o){var u=0;this.forEachTiddler(function(e){if(e!=s){u++}return u<2})}if(o&&u==0){r=false}t.closeTiddlerDEFAULTONEMPTY.apply(this,arguments);if(o&&u==0){story.displayTiddlers(null,store.getTiddlerText("DefaultTiddlers").readBracketedList())}}})()
//}}}
[[Welcome]]
!Summary
The shadow tiddler DefaultTiddlers contains a list of tiddlers which are opened automatically when TiddlyWiki starts. Define the tiddlers either using [[TiddlyLinks|TiddlyLink]] or using [[filters|Filters]].
!Default Contents
{{{
[[GettingStarted]]
}}}
!Examples
Open the tiddlers ''Welcome'' and ''About'' on startup...
{{{
[[Welcome]]
[[About]]
}}}
Use filters to open all tiddlers tagged with a given tag on startup, e.g.:
{{{
[tag[blog]]
}}}
See [[Deleting A Tiddler]]...
!Interactive Delete
Open the tiddler for editing, then click the delete command in te toolbar at the top right of a tiddler.
!~TrashPlugin
Consider installing [[TrashPlugin|http://ido-xp.tiddlyspot.com/#TrashPlugin]] by [[Ido Magal|TrashPlugin|http://ido-xp.tiddlyspot.com/#TrashPlugin]] which allow to undo a deletion. Empty the trash regularly since you cannot reuse a tiddler name before it's finally deleted.
!Deleting Tiddler That Is Tag
Consider installing [[RenameTagsPlugin|http://mptw.tiddlyspot.com/#RenameTagsPlugin]] from [[Simon Baird|http://monkeygtd.blogspot.com]]. It will prompt you whether or no you will also "Remove tag from N tiddlers?".
!Batch Delete
Deleting multiple tiddlers can be greatly simplified using either [[TiddlerTweakerPlugin|http://www.TiddlyTools.com/#TiddlerTweakerPlugin]] or [[ExportTiddlersPlugin|http://www.TiddlyTools.com/#ExportTiddlersPlugin]] by [[Eric Shulman|http://www.TiddlyTools.com]] or the [[Bookmarklet]] [[DelleteAllTagged]], a small piece of JavaScript code, that can be saved and run as a bookmark.
{{annotation{
TiddlyWiki development related topics are now [[@TiddlyWikiDev|http://tiddlywikidev.tiddlyspace.com/#Dev.Plugins]].
}}}
Tiddlers with information for developers tag here...
{{noTitle{<<tagging Developer>>}}}
/***
|''Name''|DiffFormatter|
|''Description''|highlighting of text comparisons|
|''Author''|FND|
|''Version''|0.9.0|
|''Status''|beta|
|''Source''|http://svn.tiddlywiki.org/Trunk/contributors/FND/formatters/DiffFormatter.js|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/contributors/FND/|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''Keywords''|formatting|
!Description
Highlights changes in a unified [[diff|http://en.wikipedia.org/wiki/Diff#Unified_format]].
!Notes
Based on Martin Budden's [[DiffFormatterPlugin|http://svn.tiddlywiki.org/Trunk/contributors/MartinBudden/formatters/DiffFormatterPlugin.js]].
!Usage
The formatter is applied to blocks wrapped in <html><code>{{{diff{..}}}</code></html> within tiddlers tagged with "diff".
!Revision History
!!v0.9 (2010-04-07)
* initial release; fork of DiffFormatterPlugin
!StyleSheet
.diff { white-space: pre; font-family: monospace; }
.diff ins, .diff del { display: block; text-decoration: none; }
.diff ins { background-color: #dfd; }
.diff del { background-color: #fdd; }
.diff .highlight { background-color: [[ColorPalette::SecondaryPale]]; }
!Code
***/
//{{{
(function() {

config.shadowTiddlers.StyleSheetDiffFormatter = store.getTiddlerText(tiddler.title + "##StyleSheet");
store.addNotification("StyleSheetDiffFormatter", refreshStyles);

var formatters = [{
		name: "diffWrapper",
		match: "^\\{\\{diff\\{\n", // XXX: suboptimal
		termRegExp: /(.*\}\}\})$/mg,
		handler: function(w) {
			var el = createTiddlyElement(w.output, "div", null, "diff");
			w.subWikifyTerm(el, this.termRegExp);
		}
	}, {
		name: "diffRange",
		match: "^(?:@@|[+\\-]{3}) ",
		lookaheadRegExp: /^(?:@@|[+\-]{3}) .*\n/mg,
		handler: function(w) {
			createTiddlyElement(w.output, "div", null, "highlight").
				innerHTML = "&#8230;";
			this.lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
			if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
				w.nextMatch = this.lookaheadRegExp.lastIndex;
			}
		}
	}, {
		name: "diffAdded",
		match: "^\\+",
		termRegExp: /(\n)/mg,
		handler: function(w) {
			var el = createTiddlyElement(w.output, "ins", null, "added");
			w.subWikifyTerm(el, this.termRegExp);
		}
	}, {
		name: "diffRemoved",
		match: "^-",
		termRegExp: /(\n)/mg,
		handler: function(w) {
			var el = createTiddlyElement(w.output, "del", null, "removed");
			w.subWikifyTerm(el, this.termRegExp);
		}
	}
];

config.parsers.diffFormatter = new Formatter(formatters);
config.parsers.diffFormatter.format = "diff";
config.parsers.diffFormatter.formatTag = "diff";

})();
//}}}
<<tiddler Help>>
See [[Alternative Tiddler Layouts]]...
<<<

<<closeAll>><<newTiddler>>

''@@color:red;Important:@@'' No development topics in [[TiddlyWiki.org]], please add or move those to @TiddlyWikiDev!
Not a member there yet? Ask in the [[Developer Discussion Group|Discussion Groups]].

![[Documentation Space]]
@@color:purple;Only visible to registered TiddlySpace users.@@

To help contribute at [[TiddlyWiki.org|http://tiddlywiki.org]], please consider...
:» [[TiddlyWiki.org — Documentation ABC|DOC - ABC]]
:» [[Documentation Sources|DOC - Documentation Sources]]
:» [[What To Do?|DOC - Checklist]]
:» [[Who Does What?|DOC - Work In Progress]]
:» [[Documentation Tools|DOC - Tools]]
:» [[Finally Done|DOC - Log]]

''Note:'' Please keep any tiddlers referenced above __private__ and tag them to <<tag "Documentation Space">>.

<<<

<<tabs
	txtAdminTab
	"Public" "All public tiddlers" [[TiddlySpaceTabs##Public]]
	"Private" "All private tiddlers" [[TiddlySpaceTabs##Private]]
	"Spaces" "Tiddlers grouped by space" [[TiddlySpaceTabs##Spaces]]
	"Missing" "Missing tiddlers" TabMoreMissing
	"Orphans" "Orphaned tiddlers" TabMoreOrphans
	"Shadows" "Shadowed tiddlers" TabMoreShadowed
>>
''iTW Beta by Bidix''
BidiX has a iPhone optimized version of TiddlyWiki available here: http://itw.bidix.info/

''TW on iPhone using a data url bookmark''
I believe it's possible if you sync the bookmark from safari via iTunes. But you can't save. (Though save to url should be possible. Anyone thought about this?)

''Saving using virtual disk''
It is possible to store TiddlyWiki documents on a [http://groups.google.com/group/TiddlyWiki/browse_thread/thread/35d17fdd24c43391 virtual disk] on the iPhone or iPod Touch.

''Notes from Jeremy''
{{Quote
|[http://groups.google.com/group/TiddlyWiki/browse_thread/thread/e7aa4c89cbb8c84f/3f79cea1ca1b52a7?#3f79cea1ca1b52a7 Jeremy]
|
I've had the chance to play with TiddlyWiki on an iPhone. It works as a pretty perfect clone of the desktop Safari experience, with iPhone pinch-zoom goodness to make it navigable on the tiny display. The problems are:

* it takes ages to load; over EDGE it's excruciating, but even over wifi you have to be pretty patient
* even once it's loaded, JavaScript intensive actions can be painfully slow. For example, clicking on a tiddler link can take more than a second to open the target tiddler
* it doesn't seem possible to load the TW file from a file:// URL; therefore there is no obvious avenue to explore for saving changes locally
* the desktop UI although usable doesn't really work well on the tiny screen; built in iPhone apps like Mail show a more iPhone-native way of accomplishing some of the same things

The planned stripping back of the core code should improve the performance situation. It's possible that a solution to the saving problem will come in the form of a native iPhone app that wraps WebKit to provide a custom host for TiddlyWiki.

In the short term, I've started investigating a plugin to attack the last problem, optimising the TiddlyWiki UI for the iPhone. (Inspired by http://www.joehewitt.com/iui/)

Cheers

Jeremy
}}

''Notes from Phil''
{{Quote
|[http://philhaigh.blogspot.com Phil]
|
Jeremy mentions that it isn't possible to load the TW file from a file:// URL. This is because the iPhone (and iPod Touch) do not have a 'publicly accessible' file system and therefore the browser does not support the file:// protocol on these platforms.

Cheers

Phil
}}

''Notes from Tim''
{{Quote
|Tim
|
It is possible to load a TW file from a file:// URL on jailbroken iPhones.  There is a package on ModMyi.com that contains the [[http://modmyi.com/cydia/package.php?id=1387 file schema]]. With jailbroken iPhones, the full filesystem is accessible, through programs such as [[http://www.appleiphoneschool.com/openssh/ SSH]] or [[http://iphone.heinelt.eu/?Applications:iFile iFile]].  If you do use SSH, make sure you change the root password!

Tim
}}

''Notes from Poul''
Some of us would argue that the iPhone is intended as a terminal for telephony and web access. You would store your notes on a server or 'in the cloud' using either of [[hosted|Server-Side Solutions]] solutions like TiddlyWeb or giewiki. That way, the sync problem is not a problem. I admit that with giewiki, I still need to focus on reducing the # of web requests.
Anyway, the biggest problem seems to be that since you don't have cursor keys, you can't scroll in edit boxes (or can you..yes: use 2 fingers & lors of patience).

[[Category:FAQ]]
[[Category:Using TiddlyWiki]]
[[Category:Platforms]]
You can download the latest version of classic TiddlyWiki from [[TiddlyWiki.com|http://classic.tiddlywiki.com]] below...
<html>
<div style="overflow:hidden;position:relative;clear:both;height:100px;width:200px;">
<iframe style="overflow:hidden;position:absolute;margin:0 0 0 -10px;top:-410px; width:2000px;height:2000px" src="http://classic.tiddlywiki.com"/>
</div>
</html>

<<tiddler Archive>>
{{annotation{
''Note:'' To be able to do this in TiddlySpace you will need to enable [[Evaluated Parameters]].
}}}
Should two [[users|User]] edit the same [[tiddler|Tiddler]] at the same time the first change will be saved and the second [[user|User]] will see the [[Edit Conflict]] error message.

The second [[user|User]] may then elect to reapply their changes to the latest revision of the tiddler, or discard their changes. Use the [[list of revisions|Revisions]] accessible via the tiddler toolbar to come to a decision.

An edit conflict may also occur when editing the same tiddler in two different browser, windows or tabs.

In case of an edit conflict a [[diff|http://en.wikipedia.org/wiki/Diff]] is provided to help generate the correct version of that tiddler.
The edit mode refers to the mode of editing a rendered tiddler.

By default, how a tiddler is displayed in edit mode is defined by one of the shadow tiddlers that control the layout of TiddlyWiki called [[EditTemplate]].
<!--{{{-->
<div class='toolbar'
	macro='toolbar [[ToolbarCommands::EditToolbar]] icons:yes'>
</div>
<div class='annotationsBox' macro='annotations'>
	<div class='editSpaceSiteIcon'
		macro='tiddlerOrigin height:24 width:24 label:yes interactive:no'>
	</div>
	<div class="privacyEdit" macro='setPrivacy no interactive:no'></div>
	<div class='tagClear'></div>
</div>
<div class='heading editorHeading'>
	<div class='editor title' macro='edit title'></div>
	<div class='tagClear'></div>
</div>
<div class='editor' macro='edit text'></div>
<div class='editorFooter'>
	<div class='tagTitle'>tags</div>
	<div class='editor' macro='edit tags'></div>
	<div class='tagAnnotation'>
		<span macro='message views.editor.tagPrompt'></span>
		<span macro='tagChooser excludeLists'></span>
	</div>
</div>
<div macro="editFields"></div>
<!--}}}-->
!Summary
The shadow tiddler EditTemplate contains the HTML markup used to display a tiddler in edit mode. With basic knowledge of HTML and CSS it is easy to change layout, contents, and design, e.g. in order to extend it for custom fields.
!Default Contents
{{{
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div>
<div class='editorFooter'>
  <span macro='message views.editor.tagPrompt'></span>
  <span macro='tagChooser excludeLists'></span>
</div>
<!--}}}-->
}}}
/***
|''Name''|EditTemplateFieldsPlugin|
|''Version''|0.4.6|
|''Status''|beta|
|''Author''|Jon Robson|
|''Description''|Provides editing of custom fields|
|''Requires''||
|''Source''||
!Usage
put {{{<div macro="editFields"></div>}}} into your EditTemplate.
or {{{<div macro="viewFields"></div>}}} into your ViewTemplate.
!Todo
Support newlines in input boxes.
!Code
***/
//{{{
(function($) {
var viewFields = config.macros.viewFields = {
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var fields = editFields.getFields(tiddler).concat(params);
		var done = {};
		for(var i = 0; i < fields.length; i++) {
			var name = fields[i];
			var val = tiddler.fields[name];
			if(!done[name] && val) {
				done[name] = true;
				$("<div class='fieldValue' />").text("%0 : %1".format(name, val)).appendTo(place);
			}
		}
	}
};

var editFields = config.macros.editFields = {
	fieldType: {
		images: ["image", "geo.marker"]
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var options = {
			fields: params
		};
		this.createInterface(place, tiddler, options);
	},
	getFields: function(tiddler) {
		var whitelisted = ["changecount"];
		var fields = [];
		for(var i in tiddler.fields) {
			var val = tiddler.fields[i];
			if(i.indexOf("server.") !== 0 && i.indexOf("_") !== 0 && typeof(val) == "string" && !whitelisted.contains(i) && val) {
				fields.push(i);
			}
		}
		return fields;
	},
	createInterface: function(place, tiddler, options) {
		var fieldContainer = $("<div class='tiddlerCustomFields' />").appendTo(place);
		var included = [];
		if(tiddler) {
			var fields = editFields.getFields(tiddler);
			for(var i = 0; i < fields.length; i++) {
				var name = fields[i];
				var val = tiddler.fields[name];
				this.addNewField(fieldContainer, name, val);
				included.push(name);
			}
		}
		for(var j = 0; j < options.fields.length; j++) {
			var field = options.fields[j];
			if(!included.contains(field)) {
				this.addNewField(fieldContainer, field, "");
			}
		}
		$("<button />").text("add new field").click(function() {
			editFields.addNewField(fieldContainer, "", "");
		}).appendTo(place);
	},
	addNewField: function(place, name, value) {
		var container = $("<div />").appendTo(place);
		if(editFields.fieldType.images.contains(name)) {
			valueInput = $("<select />");
			$("<option />").val("").text("").appendTo(valueInput);
			$.each(store.filterTiddlers("[is[image]]"), function(i, tiddler) {
				var opt = $("<option />").val(tiddler.title).text(tiddler.title).appendTo(valueInput)[0];
				if(value === tiddler.title) {
					$(opt).attr("selected", true);
				}
			});
		} else {
			type = value.indexOf("\n") > -1 ? "textarea" : "text";
			var valueInput = type == "text" ? $("<input type='text' />") : $("<textarea />");
		}
		valueInput.attr("edit", name).val(value).appendTo(container);
		$("<button class='delete' />").text("delete").click(function(ev) {
			var answer = confirm("Are you sure you want to remove this field?");
			if(answer) {
				var attr = $(ev.target).attr("field");
				var p = $(ev.target).parent();
				$("[edit]", p).val("");
				$(p).hide();
			}
		}).appendTo(container);
		var nameInput = $("<input class='fieldName' type='text' />").val(name).
			change(function(ev) {
				var el = $(ev.target);
				valueInput.attr("edit", el.val());
			}).prependTo(container);
	}
}
})(jQuery);
//}}}
Open the tiddler by clicking on Edit (grey menu at top right of tiddler) or double clicking on any of the text. Edit the tiddler as required. To format text (bold, italics etc), see [[Wiki Markup]].

To save the tiddler, click on Done. The tiddler will display in read mode. Click on Save Changes (top right-hand menu) before leaving the TiddlyWiki.
/***
|''Name''|ErrorHandlerPlugin|
|''Version''|0.4.3|
|''Author''|Jon Robson|
|''Description''|Localised tiddler save errors including edit conflict resolution.|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig|
***/
//{{{
(function($) {

var tiddlyspace = config.extensions.tiddlyspace;
var currentSpace = tiddlyspace.currentSpace.name;
tiddlyspace.getLocalTitle = function(title, workspace, suffix) {
	var endsWith = config.extensions.BinaryTiddlersPlugin.endsWith;
	if(!suffix) {
		var isPublic = endsWith(workspace, "_public");
		suffix = tiddlyspace.resolveSpaceName(workspace);
		if(currentSpace == suffix) {
			suffix = isPublic ? "public" : "private";
		} else {
			suffix = "@%0".format(suffix);
		}
	}
	return "%0 *(%1)*".format(title, suffix);
};

var sssp = config.extensions.ServerSideSavingPlugin;

var msgs = config.messages.editConflict = {
	loading: "Loading..",
	resolve: "[[Edit Conflict]]@glossary: this tiddler may have been changed by someone else.",
	reviewDiff: "review (recommended)",
	reviewDiffTooltip: "review changes made to this tiddler",
	reviewDiffError: "error retrieving revision.",
	save: "overwrite",
	saveTooltip: "make this revision the top revision of this tiddler",
	discard: "cancel",
	discardTooltip: "undo changes to this tiddler and get most recent version",
	diffTitle: "%0",
	diffFieldTitle: "%0 - fields",
	diffTextTitle: "%0 - text",
	updating: "updating your version...",
	diffHeader: ["Review the changes that have been made whilst you were editing this tiddler. ",
		"Fold relevant changes back into your version.\n",
		"{{removed{Red}}} highlight shows content removed. ",
		"{{added{Green}}} highlight shows content added.\n"].join(""),
	diffTextHeader: "View changes in text",
	diffFieldsHeader: "View changes in fields"
};

var plugin = config.extensions.errorHandler = {
	diffTags: ["excludeLists", "excludeMissing", "excludeSearch"],
	displayMessage: function(message, tiddler, context) {
		var desc = context && context.httpStatus ? context.statusText :
			sssp.locale.connectionError;
		var reportArea = plugin.reportError(tiddler.title);
		var msg = $("<div />").appendTo(reportArea);
		if(message == "saveConflict") {
			wikify(msgs.resolve, msg[0]);
			var choiceArea = $("<div />").appendTo(reportArea)[0];
			plugin.editConflictHandler(choiceArea, tiddler);
		} else {
			msg.text(sssp.locale[message].format(tiddler.title, desc));
		}
	},
	editConflictHandler: function(container, tiddler) {
		var title = tiddler.title;
		var myrev = tiddler.fields["server.page.revision"];
		// note user now needs to edit, fix problem and save. 
		// TODO: make sure this gets reset in save callback
		store.getTiddler(title).fields["server.page.revision"] = "false";

		var diffBtn = createTiddlyButton(container, msgs.reviewDiff, msgs.reviewDiffTooltip, function(ev) {
			var title = $(ev.target).data("title");
			plugin.displayDiff(ev.target, store.getTiddler(title), myrev);
		});
		var saveBtn = createTiddlyButton(container, msgs.save, msgs.saveTooltip, function(ev) {
				var title = $(ev.target).data("title");
				var tid = store.saveTiddler(store.getTiddler(title));
				autoSaveChanges(null, [tid]);
			});
		var ignoreBtn = createTiddlyButton(container, msgs.discard, msgs.discardTooltip, function(ev) {
			var title = $(ev.target).text(msgs.updating).data("title");
			plugin.resetToServerVersion(store.getTiddler(title));
		});
		$([diffBtn, ignoreBtn, saveBtn]).data("title", title);
	},
	getDiffTiddlerTexts: function(diffText) {
		var chunks = diffText.split("\n  \n");
		if(chunks.length < 2) {
			return [chunks[0], ""];
		} else {
			var diffFieldsText = "{{diff{\n%0\n}}}".format(chunks[0]);
			diffText = '{{diff{\n%0\n}}}'.format(chunks.splice(1, chunks.length).join("\n"));
			return [diffText, diffFieldsText];
		}
	},
	makeDiffTiddler: function(title, diff) {
		var newTiddler = new Tiddler(title);
		var tags = plugin.diffTags;
		newTiddler.text = msgs.loading;
		newTiddler.fields.doNotSave = true;
		newTiddler.tags = diff ? tags.concat(["diff"]) : tags;
		newTiddler = store.saveTiddler(newTiddler);
		$.extend(store.getTiddler(title).fields,
			config.defaultCustomFields); // allow option to save it
		return newTiddler;
	},
	displayDiff: function(src, tiddler, latestRevision) {
		var adaptor = tiddler.getAdaptor();
		var title = tiddler.title;
		var ts = new Date().formatString("0hh:0mm:0ss");
		var suffix = "edit conflict %0".format(ts);
		var diffTitle = tiddlyspace.getLocalTitle(msgs.diffTitle.format(title), "", suffix);
		var diffTextTitle = tiddlyspace.getLocalTitle(msgs.diffTextTitle.format(title), "", suffix);
		var diffFieldsTitle = tiddlyspace.getLocalTitle(msgs.diffFieldTitle.format(title), "", suffix);
		plugin.makeDiffTiddler(diffTextTitle, true);
		plugin.makeDiffTiddler(diffFieldsTitle, true);
		var newTiddler = plugin.makeDiffTiddler(diffTitle, false);
		newTiddler.text = ['%0\n<<slider chkViewDiffText "%1" "%2">>\n',
			'<<slider chkViewDiffField "%3" "%4">>'].join("").
			format(msgs.diffHeader, diffTextTitle, msgs.diffTextHeader,
				diffFieldsTitle, msgs.diffFieldsHeader);
		store.saveTiddler(newTiddler);

		var callback = function(r) {
			var text = plugin.getDiffTiddlerTexts(r);
			store.getTiddler(diffTextTitle).text = text[0];
			store.getTiddler(diffFieldsTitle).text = text[1];
			story.refreshTiddler(diffTitle, null, true);
		};
		var workspace = "bags/%0".format(tiddler.fields["server.bag"]);
		ajaxReq({
			type: "get",
			dataType: "text",
			url: "/diff?format=unified&rev1=%0/%1/%2&rev2=%0/%1".format(workspace, title, latestRevision),
			success: callback,
			error: function() {
				displayMessage(msgs.reviewDiffError);
			}
		});
		story.displayTiddler(src, diffTitle);
	},
	resetToServerVersion: function(tiddler) {
		var adaptor = tiddler.getAdaptor();
		var ctx = { 
			host: tiddler.fields["server.host"],
			workspace: "bags/" + tiddler.fields["server.bag"]
		};
		adaptor.getTiddler(tiddler.title, ctx, null, function(context) {
			store.saveTiddler(context.tiddler);
			story.refreshTiddler(tiddler.title);
			store.setDirty(false);
		});
	},
	reportError: function(title) {
		var el = story.getTiddler(title);
		if(!el) {
			el = story.displayTiddler(null, title);
		}
		return $("<div />").addClass("error annotation").prependTo(el)[0];
	}
};

sssp.reportFailure = function(message, tiddler, context) {
	config.options.chkViewDiffText = config.options.chkViewDiffText === undefined ?
		true : config.options.chkViewDiffText;
	config.options.chkViewDiffFields = config.options.chkViewDiffFields || false;
	plugin.displayMessage(message, tiddler, context);
};

})(jQuery);
//}}}
!"""Wiki Markup"""
Sometimes text can match TiddlyWiki formatting whether you want it to or not, e.g. program code, or conted pasted from elsewhere. To avoid this see section ''Avoiding Wikification'' in [[TiddlyWiki Markup]]...

!Code Comments
Individual tiddler passages can be "commented out" to prevent them from being processed and/or displayed by TiddlyWiki:
[cf. http://oldwiki.tiddlywiki.org/wiki/Escaping / http://oldwiki.tiddlywiki.org/wiki/Dev:Comments]
<<tiddler "Evaluated Parameters">>
You can use Javascript to dynamically calculate the value of a parameter which you actually want to pass down to a macro. This is called an evaluated parameter.
From the [[Glossary|Evaluated Parameter]]...
<<<
<<tiddler "Evaluated Parameter">>
<<<

To achieve this, use double braces{{{ {{code}} }}}to enclose the desired and tested JavaScript code -- the calcualted return value is then pass down to your macro, e.g.: {{{<<someMacro {{code}}>>}}}
!Example
For example, {{{<<tiddler {{ document.location.href }}>>}}} will try to display a tiddler by the same name as the address displayed in your browser address bar, i.e. {{{document.location.href}}} is evaluated via javascript and the result then passed down to the respective macro, in this case the [[tiddler macro|tiddler]].
![[Transclusion]]
Using the [[tiddler macro|tiddler]] with evaluated parameters is a form of [[parametric transclusion|Transclusion]].
!TiddlySpace
Due to security concerns, evaluated parameters are by default disabled on TiddlySpace.

{{alert{Caution!}}} To enable them nontheless, put this into a zzConfig tiddler tagged <<tag systemConfig>> and parameter evaluation for macros — especially the tiddler macro — will be reenabled:
{{{
config.evaluateMacroParameters = "full";
}}}
!Exporting Tiddlers
The following plugins allow to export selected tiddlers to a separate, stand-alone TiddlyWiki document or various reduced-size export formats w/o the TW core code...
;[[ExportTiddlersPlugin (TiddlyTools)|http://www.TiddlyTools.com/#ExportTiddlersPlugin]]
:» interactively select and extract tiddlers from your TiddlyWiki document using filters, and write them into another file, using one of several different file formats...
@@display:block;padding-left:2em;margin:-3em 0;
;TiddlyWiki
:» a complete, stand-alone, standard TiddlyWiki HTML document
;~PureStore
:» a small HTML archive file containing tiddler data only (no core code)
;~PlainText
:» a simple TXT text file with tiddler source listings
;Comma
:» a "Comma Separated Value" data/spreadsheet file
;~NewsFeed
:» an XML-format file that can be published for RSS syndication.
@@
;[[SaveAsPlugin|http://www.tiddlytools.com/#SaveAsPlugin]]
:» automatically adds a ''save as'' command to the TiddlyWiki ''backstage'' menu so you can quickly create an exact copy of the current TiddlyWiki document. The plugin also defines a macro that you can use to place a "save as..." command link into your sidebar/mainmenu/any tiddler (or wherever you like)
:» when the command link is clicked, a system-specific dialog box will be displayed so you can select/enter the desired target path and filename
:» allows the same file formats as [[ExportTiddlersPlugin|http://www.TiddlyTools.com/#ExportTiddlersPlugin]] and to restrict the exported tiddlers to those matching a filter expression
;[[NewDocumentList (TiddlyTools / requires InlineJavascriptPlugin)|http://www.tiddlytools.com/#NewDocumentList]]
:» a script providing right-click download links for a TiddlyWiki containing certain tagged tiddlers only
!Exporting HTML
Generally, you can select the HTML rendered by TiddlyWiki using your browser tools. To copy the underlying HTML source code, inspect the HTML rendered by TiddlyWiki using your browsers developer tools.

The following plugins allow to export the HTML output rendered by TiddlyWiki...
;[[SnapshotPlugin (TiddlyTools)|http://www.tiddlytools.com/#SnapshotPlugin]]
:provides a macro as well as tiddler toolbar commands to creates a file or opens a new browser window containing the rendered HTML and CSS style definitions that are being displayed for selected elements of the current document.
Extended HTML syntax is used in the [[Shadow Tiddlers|http://shadowtiddlers.tiddlyspace.com]] that define the structure and layout of a TW.  The main shadow tiddlers are PageTemplate, EditTemplate, ViewTemplate.

It allows users to use TW macros and plugins within their TW document and not just in their tiddlers. An example from the ViewTemplate would be:
{{{
<div class='title' macro='view title text'></div>
}}}
More generically:
{{{
<... macro='macroName param param' ..>>
}}}

When encountered it is often interpreted by the [[wikify()]] method. When [[wikify()]] recognizes the embedded macro syntax, it calls on [[invokeMacro()]], which automatically sets a ''global'' window.tiddler variable to point to the current tiddler object that is being rendered.  This enables the macro's parameter processing to use "evaluated parameters" that reference values within that tiddler object, like this:
{{{
<... someMacro ... {{tiddler.title}} ...>
}}}
@@Note: prior to TW2.4.3, you needed TiddlyTools' CoreTweaks #444, which added the global window.tiddler (and window.place) variables to the invokeMacro() function.  Starting with TW2.4.3, this functionality was added to the core.@@
@@Note: for security reasons evaluated parameters were turned off in TiddlySpace@@

If and when the calculation and substitution of evaluated parameters is complete, invokeMacro then passes the parameter values onward for further rendering by the appropriate [[macro handler function|Macro Handler]]:
{{{
config.macros.someMacro.handler(place,tiddler,params,wikifier,paramString,tiddler)
}}}
For example in the view title example this would be:
{{{
config.macros.view.handler(place,tiddler,params,wikifier,paramString,tiddler)
}}}
Note: Typically, the tiddler parameter passed to the macro handler function is the same as the 'current tiddler' that is being rendered. However, when you use the "<<tiddler TiddlerName>>" macro to [[transclude]] content from other tiddlers, the //tiddler// param that is passed to any macros ''within the transcluded tiddler'' will reference that transcluded tiddler, rather than the outer //current// tiddler that is being rendered.
Unlike a TiddlyLink, an external link references an external source or website.
| !Mode | !Description |width:220px;  !Markup |width:100px; !Example |h
| ''URL'' |a valid url is automatically rendered as an external link|{{{http://foo.com}}}|http://foo.com|
| ''Pretty Link'' |for links that need to be more readable or simply shorter|{{{[[foo|http://bar.com]]}}}|[[foo|http://bar.com]]|
Also see [[Internal Link|TiddlyLink]]...
The following questions and answers are mostly contributed from the [[Discussion Groups]] and hopefully help you with your TiddlyWiki project.

For a reference of questions and answers dedicated to TiddlySpace, check out the @faq TiddlySpace.

{{faqlist{
;Basics
:» [[What is TiddlyWiki?]]
:» [[What can I do with TiddlyWiki?]]
:» [[What do I need to run TiddlyWiki?]]
:» [[Can I use TiddlyWiki as a multi-user/collaborative/server based wiki?]]
;Getting Started
:» [[Getting your own TiddlyWiki file]]
:» [[Configuring your browser to allow saves to disk]]
:» [[I put my TiddlyWiki file on my web server and I can't save]]
;Using TiddlyWiki
:» [[How can I make TiddlyWiki save itself when I save a tiddler?]]
:» [[Add Menu Item]]
:» [[Special Characters and Symbols|Adding Special characters and symbols to TiddlyWiki content]]
:» [[Create Tiddler]]
:» [[Delete Tiddler]]
:» [[TiddlyWiki on the iPhone|Does TiddlyWiki work on an iPhone?]]
:» [[Change where backups are saved]]
:» [[Editing and saving a tiddler]]
:» [[Finding A Tiddler]]
:» [[How to deactivate automatic WikiWords?]]
:» [[How do I link to a tiddler without a wiki word name?]]
:» [[How do I make searching work better?|Finding A Tiddler]]
:» [[Insert a Picture]]
:» [[Is there a WYSIWYG version of TiddlyWiki?]]
:» [[Keyboard Shortcuts]]
:» [[Naming a TiddlyWiki]]
:» [[How do I persist cookie options in the long run?|Persistent Options]]
:» [[Resize Image]]
:» [[Saving the file]]
:» [[Tags]]
:» [[TiddlyWiki Markup]]
:» [[URL Parameters|Startup Parameters]]
:» [[What is a tiddler?|Tiddler]]
:» [[What is a wiki word?|WikiWord]]
:» [[Where can I get nightly builds of the TiddlyWiki trunk?]]
:» [[How do I know what version I'm running?]]
:» [[Broken links in Firefox]]
;Troubleshooting
:» [[How to manually upgrade TiddlyWiki?]]
:» [[TiddlyWiki won't save changes in Firefox?]]
:» [[How big can my file get before it gets too slow/doesn't work?|PerformanceIssues]]
:» [[How can I edit my UserName?]]
:» [[I keep getting "A script is making this page run slow" in Firefox]]
:» [[Import stopped working. How can I import my TiddlyWiki into the latest TiddlyWiki?]]
:» [[My settings don't get saved]]
:» [[Special characters are not displaying correctly]]
:» [[Lots of spaces get changed to one space|PreserveSpaces]]
:» [['Permission denied to call method XMLHttpRequest.open' when using UploadPlugin or ImportTiddlers]]
:» [[Getting "failed to save" in FF or "Permission Denied" in IE?]]
:» [[Why won't chrome save my options (cookies)?]]
;Mobile
:» [[How to get TiddlyFox running on Android?]]
;Configuration
:» [[Can I make it only show one tiddler at a time like a regular wiki?]]
:» [[Can I use MediaWiki, Twiki or Trac markup instead of TiddlyWiki Markup?]]
:» [[How do I change the date format for a new journal entry?]]
:» [[How do I change the default date formats for core macros?]]
:» [[How do I change how a tiddler looks?]]
:» [[How do I change how tiddler editing looks?]]
:» [[How do I change my default options?|http://tiddlywiki.com/#PersistentOptions]]
:» [[How do I change the colours and the fonts?]]
:» [[How do I change the layout of my TiddlyWiki?]]
:» [[How do I change the RSS behaviour, so that changing a tiddler creates a new RSS post]]
:» [[How do I have a different tiddler toolbar for web users?]]
:» [[How do I right-justify some text in a tiddler?]]
:» [[How do I justify all the text in every tiddler?]]
:» [[Shadow Tiddlers|ShadowTiddler]]
;Customization
:» [[Where do I store my created plugin?]]
:» [[How to create a dynamic MainMenu?]]
:» [[How to display different layouts for diferent tiddlers?|Alternative Tiddler Layouts]]
;Tips and Tricks
:» [[How do I right-justify some text in a tiddler?]]
:» [[How do I justify all the text in every tiddler?]]
:» [[How do I make my table cells vertically aligned?]]
:» [[How can I avoid all text being selected when I edit a tiddler?]]
:» [[How can I display my UserName somewhere?]]
:» [[How can I encrypt some of my data?]]
:» [[How can I export tiddlers and tiddler contents?|Export]]
:» [[How can I make a "home" button that opens just the default tiddlers?]]
:» [[How can I use my logo as the SiteTitle but still have text in the html page title?]]
:» [[How to have multiple journal entries per day?]]
;Design
:» [[How can I center an element?]]
:» [[How can I prevent trailing linebreaks to custom css blocks?]]
;Macros
:» [[What is a macro?]]
:» [[What macros are built in to TiddlyWiki?|Core Macros]]
:» [[What about commands?|ToolbarCommands...]]
;Plugins
:» [[How do I install a plugin?|Plugins]]
:» [[What is a plugin?|Plugins]]
:» [[Where do I find plugins?|http://customize.tiddlyspace.com]]
;For Developers
:» [[How do I use WikiText in CSS, JavsScript or HTML Code?]]
:» [[TiddlyWiki Development Spaces]]
;GTD - ''G''etting ''T''hings ''D''one
:» [[What is GTD?]]
:» [[Can I use TiddlyWiki for GTD?]]
}}}<<listfiltr>>
/***
|''Name''|FancyMissingPlugin|
|''Version''|0.1.0|
|''Description''|Orders the output in the Missing tab by how missing|
|''Author''|Frederik Dohr|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage
No explicit use require, just add the plugin and go to the Missing tab.

!Code
***/
//{{{
(function() {

// hijack getMissingLinks to sort by number of references
var getMissingLinks = TiddlyWiki.prototype.getMissingLinks;
TiddlyWiki.prototype.getMissingLinks = function(sortField) {
	var results = getMissingLinks.apply(this, arguments);
	var index = results.map(function(item, i) {
		return {
			title: results[i],
			count: store.getReferringTiddlers(results[i]).length
		};
	});
	return index.sort(function(a, b) {
		return b.count - a.count;
	}).map(function(item, i) {
		return item.title;
	});
};

})();
//}}}
While all is pure text in a TiddlyWiki, it may be helpful to understand it as a simple database where each tiddler is a record with a set of...
;[[Standard Fields|Standard Field]]
:» generated by the TiddlyWiki core
;[[Custom Fields|Custom Field]]
:» created by plugins
:» or manually edited by an author
From the [[Glossary|Field]]...
<<<

<<tiddler [[Field]]>>
<<<
!"""Standard Fields"""
Each tiddler provides a number of standard fields...
|width:100px; !"""Field Name""" | !Description | !Default |h
|''title''|the unique tiddler title|usually {{{config.macros.newTiddler.title}}}|
|''modifier'' |the user-name when last edited|{{{config.options.txtUsername}}}|
|''modified''|date/time when last modified|12-digit number with the format:<br> {{{YYYY0MM0DD0hh0mm}}}|
|''created''|date/time when created|12-digit number with the format:<br>{{{YYYY0MM0DD0hh0mm}}}|
|''tags''|set of space-separated keywords (tags); enclosed in square brackets when the tag contains a space, e.g. {{{[[some tag]]}}}||
|''text''|the tiddler body|{{{config.views.editor.defaultText}}}|
{{annotation{
''Note'': The {{{title}}} field serves as a unique identifier; i.e. there cannot be two tiddlers with identical titles.
}}}
!"""Additional Core Fields"""
TiddlyWiki may generate additional fields for a tiddler:
| !"""Field Name""" | !Description | !Default |h
|''changecount''|the number of times the tiddler was saved|1|
|''wikiformat''|indicates the markup used by a tiddler|{{{<blank>}}}<br>meaning [[TiddlyWiki Markup]]|
{{annotation{
''Note'': A tiddler with a format other than TiddlyWiki Format can be generated using the newTiddler macro via {{{<<newTiddler fields:"wikiformat:markdown">>}}}. However, for the tiddler to actually be rendered as markdown, a markdown formatter is required, usually provided by a plugin.
}}}
!!"""Server Fields"""
The following fields are created when tiddlers are imported with the built-in ImportTiddlers function.
| !"""Field Name""" | !Description | !Default |h
|''server.type''|the adaptor, usually {{{http}}} or {{{file}}}||
|''server.host''|originating URL||
|''server.workspace''|workspace||
|''server.page.revision''|last update|format: {{{YYYY0MM0DD0hh0mm}}}|
|''doNotSave''|temporarily used on tiddlers which wont be saved to file||
!"""Custom Fields"""
You can extend available tiddler fields using [[Custom Fields]].
The list macro provides a mechanism to aggregate tiddlers based on filter criteria, e.g. when you need a list of all tiddlers tagged <<tag [[Core Macros]]>>...
!Filter Support
Filters can be used...
#{{sub{
;with the [[list macro|list]]
:to create a filtered tiddler list
}}}
#{{sub{
;with the [[timeline macro|timeline]]
:to create a filtered timeline
}}}
#{{sub{
;in the shadow tiddler called [[DefaultTiddlers|DefaultTiddlers...]]
:to define which tiddlers open when TiddlyWiki starts
}}}
#{{sub{
;with the [[startup parameter|Startup Parameters]] called {{{filter}}}
:a URL parameter that defines which tiddlers open when TiddlyWiki starts
}}}
!"""Example Markup"""
The following shows the simple use of a filter with the [[list macro|list]].
:{{sub{
{{{
<<list filter "[tag[Core Macros]]">>
}}}
}}}
:&raquo; <<slider chkExampleFilter "Filters##EXAMPLE" "See the example output in a slider..."
"Click to see the example output in a slider...">>
Here, the second macro parameter defines a filter using the {{{[tag[Some Tag]]}}} filter.
!Filter Types
|width:220px; !Syntax | !Filter Name | !Description |h
|>|>|padding-left:5px;''~Set-Composing Filters'' |
|{{{[[tiddlerName]]}}} |tiddler |adds the tiddler {{{tiddlerName}}} to the set or if it doesn't exist an empty tiddler by that name|
|{{{[tag[tagName]]}}} |tag |adds all tiddlers with the tag {{{tagName}}} to the set|
|{{{[fieldName[fieldValue]]}}} |field |adds all tiddlers that have the corresponding standard field with the corresponding value, e.g. ({{{title}}}, {{{creator}}}, {{{modifier}}}, the dates {{{created}}}, {{{modified}}} and {{{changecount}}}) as well as any custom fields|
|{{{[custom[value]]}}} |custom |custom filters can be implemented via [[Plugins]], {{{custom}}} being the filter name and {{{value}}} the parameter passed to it|
|>|>|padding-left:5px;''~Set-Modifying Filters'' |
|{{{[sort[field]]}}} |sort |sorts the set by a {{{field}}} -- to sort in descending order, append a dash, e.g. {{{[sort[-modified]]}}} |
|{{{[limit[number]]}}} |limit |only takes the given {{{number}}} of items from the set|
Filters can be complex, e.g. {{{[tag[Core Macros]] [[Core Macros]]}}} defines the set of tiddlers tagged {{{Core Macros}}} including the tag itself.

Filters are applied from the left to the right, i.e. in the example above the {{{Core Macros}}} tiddler is added to the end of the set. To rather sort the whole set, add the {{{[sort[field]]}}} filter at the end.
{{annotation{
''Note:'' Apply {{{[sort[field]]}}} before {{{[limit[number]]}}} and wrap complex filters in quotes!
{{{
<<list filter "[tag[Core Macros]] [[Core Macros]]">>
}}}
<<slider "" [[Filters##COMPLEXEXAMPLE]] "Click to see the results..." "">>
}}}
!Custom Filters
Since the version 2.6.2 custom filters can be implemented in ~TiddlyWiki via [[Plugins]]...
* TiddlySpace introduced additional filters, see [[docs|http://docs.tiddlyspace.com/filters%20syntax]]
* [[MatchTagsPlugin|http://www.TiddlyTools.com/#MatchTagsPlugin]] by Eric Shulman introduces boolean logic to the {{{[tag[SomeTag]]}}} filter
* [[ExtraFiltersPlugin|http://yakovl.bplaced.net/TW/ExtraFilters.html#ExtraFiltersPluginInfo]] by Yakov
* the @filters space hosts experimental filters by Jon Robson, e.g. ~NumberSortFilterPlugin, ~RandomSortFilter and the set ~ExtraFiltersPlugin for TiddlySpace
** also see  [[AdvancedFilterTiddlersPlugin|http://jonrobson.me.uk/development/AdvancedFilterTiddlersPlugin]] by Jon Robson
* [[GetPlugin|GettingStarted]]@Get also provides filter support while introducing a {{{[get[SomeThing]]}}} filter
!For Developers...
* [[TiddlyWiki.prototype.filterTiddlers|http://tiddlywikidev.tiddlyspace.com/#TiddlyWiki.prototype.filterTiddlers]]/%
!EXAMPLE
<<list filter "[tag[Core Macros]]">>
!COMPLEXEXAMPLE
<<list filter "[tag[Core Macros]][[Core Macros]]">>
!END

REVIEW: IS THAT REALLY SO THAT YOU CAN USE ANY FIELD DIRECTLY AS A FILTER?
%/
/***
|''Name:''|FiltrPlugin|
|''Description:''|provides interactive tiddler filtering by date range, tags or modifers|
|''Documentation:''|http://filtr.tiddlyspace.com|
|''Author:''|[[Tobias Beer|http://tobibeer.tiddlyspace.com]]|
|''Version:''|1.4.5 (2013-10-07)|
|''Source''|https://raw.github.com/tobibeer/TiddlyWikiPlugins/master/plugins/FiltrPlugin.min.js|
|''License''|[[Creative Commons Attribution-Share Alike 3.0|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''CoreVersion:''|2.5|
<<filtr showTags exclude:''>>
/%***/
(function(e){var t=config.macros.filtr={};config.macros.filtr=e.extend(t,{exclude:"excludeLists",sortField:"-modified",showSpaces:false,showTags:false,showUsers:false,showValues:false,showDates:true,showMonths:true,showLabels:true,showCount:true,showNoTag:true,showNoValue:true,allYears:true,listfiltr:true,fmtHeaderCount:"%0",fmtHeaderField:"%0",fmtHeader:"",fmtItem:"\n*{{filtrDate{%modified}}}%hastags %tags",fmtCount:"",fmtField:"%0",fmtDate:"YYYY-0MM-0DD",fmtYear:"YYYY",fmtMonth:"mmm",fmtTags:'{{filtrTags{<<tags "%0">>}}}',fmtLabel:"%0:",txtSel:"select ",txtSet:"set or unset %0 filter to %1...",txtSpace:"space",txtTag:"tag",txtUser:"user",txtYear:"year",txtMonth:"month",txtEmpty:{tag:"<untagged>",user:"<missing>",space:"<missing>",field:"<undefined>"},spaces:"",users:"",tags:"",field:"",handler:function(n,r,i,s,o,u){var a,f,l,c,h=0,p,d,v,m={},g=0,y=[],b,w={},E,S,x,T,N=[],b=config.extensions.tiddlyspace,C=o.parseParams("anon",null,true),k=getParam(C,"template","");(store.getTiddlerText(k)||"").split("\n").map(function(e){var t=e.indexOf(":"),n=t<0?e:e.substr(0,t);w[n]=t<0?true:e.substr(t+1)});["exclude|x","sortField|sf","showSpaces|bS","showTags|bT","showUsers|bU","showValues|bF","showDates|bD","showMonths|bM","showLabels|bL","showCount|bC","showNoTag|nT","showNoValue|nV","allYears|aY","listfiltr|lf","fmtHeader|f0","fmtItem|f1","fmtCount|fc","fmtHeaderCount|fch","fmtDate|fd","fmtField|ff","fmtHeaderField|ffh","fmtYear|fy","fmtMonth|fm","fmtTags|fts","fmtLabel|fl","spaces","tags","users","field|fi"].map(function(e){e=e.split("|");var n=e[0],r=e[1]||e[0];m[r]=getParam(C,n,k&&w[n]?w[n]:t[n]!=undefined?t[n]:"");if(i.contains(n)){m[r]=true}});m.desc=0==m.sf.indexOf("-"),m.sf=m.desc?m.sf.substr(1):m.sf;p=createTiddlyElement(n,"div",null,"filtr");m.fi=m.fi.split("|");m.filbl=m.fi[0];m.fi=(m.fi[1]||m.fi[0]).toLowerCase();m.ex=[];m.x=m.x.readBracketedList();m.x.map(function(e){m.ex.push(e)});store.forEachTiddler(function(e,t){if(m.x.containsAny(t.tags)){m.ex.pushUnique(t.title)}else{y.push(t)}});["bS","bT","bU","bF","bD","bM","bL","bC","nT","nV","lf"].map(function(e){m[e]="true"==m[e].toString()});if(m.spaces&&b){l=true;m.spaces=m.spaces.readBracketedList()}else m.spaces=[];m.bS=b&&!l&&m.bS;if(m.tags)f=true;else m.tags=[];m.bT=!f&&m.bT;if(f){if(m.tags.substr(0,8).toUpperCase()=="TIDDLER=")m.tags=store.getTiddlerText(m.tags.substr(8))||"";m.tags=m.tags.readBracketedList()}if(m.users){c=true;m.users=m.users.readBracketedList()}else m.users=[];m.bU=!c&&m.bU;m.vals=[];while(g<y.length){a=1;tid=y[g];if(m.x.containsAny(tid.tags)){a=0}if(a&&b.resolveSpaceName&&(l||m.bS)){T=b.resolveSpaceName(store.getValue(tid.title,"server.bag"));if(l&&!m.spaces.contains(T))a=0}if(a&&f){if(!m.tags.containsAny(tid.tags))a=0}if(a&&m.bT){S=[];if(tid.tags.length==0){if(m.nT)S.push("");else a=0}tid.tags.map(function(e){if(config.macros.untagged&&(config.macros.untagged.hideTags+(readOnly?" "+config.macros.untagged.hideTagsReadOnly:"")).readBracketedList().contains(e))return true;if(!m.tags.contains(e)){var t=store.getTiddler(e);if(m.ex.contains(e)||m.ex.containsAny(t?t.tags:[])){a=0}else{S.push(e)}}})}if(a&&(c||m.bU)){x=tid.modifier;if(c&&!m.users.contains(x))a=0}if(a&&m.bF){E=store.getValue(tid.title,m.fi);if(!m.nV&&!E||m.vals.contains(E)){a=0}}if(a&&m.bD){if(0==h){d=t.isDate(tid[m.sf]);m.yMin=3e3;m.yMax=0;h=1}if(d){var L=(new Date(tid[m.sf])).getYear()+1900;m.yMin=Math.min(m.yMin,L);m.yMax=Math.max(m.yMax,L);N[L]=true}}if(a){if(T!=undefined)m.spaces.pushUnique(T);if(S!=undefined)S.map(function(e){m.tags.pushUnique(e)});if(x!=undefined)m.users.pushUnique(x);if(E!=undefined)m.vals.pushUnique(E);g++}else{y.splice(g,1)}}"Space|User|Tag|VAL|Year|Month".split("|").map(function(n){var r,i,s,o,u,a=n.toLowerCase(),f=m[a+"s"],l=n=="VAL"?m.filbl:t["txt"+n],c=m.bL?m["fl"].format([l.length<15?l:l.replace(/(\.|\_)/mg,".\n")]):"",r="filtr_"+(n=="VAL"?m.fi.replace(/\./mg,"_"):a),h=n=="VAL"?m.fi:a;if(f){if(f.length){f.sortCaseInsensitive();if(""==f[0]){f.splice(0,1);f.push("")}}else return true}else if(!m.bD||!m.bM&&n=="Month"){return true}i=createTiddlyElement(p,"div",null,"filtrGroup");if(c)createTiddlyElement(i,"strong",null,null,c);i=createTiddlyElement(i,"div",null,r,null,{group:h});for(o=h=="year"?m.yMax:h=="month"?1:0;h=="year"?o>=m.yMin:h=="month"?o<13:o<f.length;h=="year"?o--:o++){if(h=="year"&&(!m.yMin||!N[o])||h=="month"&&(!m.bM||!m.yMin))continue;s=f?f[o]:o;u=h=="year"?(new Date(o+"/01/01 00:00:00")).formatString(m.fy):h=="month"?(new Date("2000/"+String.zeroPad(o,2)+"/01 00:00:00")).formatString(m.fm):""==s?t.txtEmpty[n=="VAL"?"field":h]:s;e(createTiddlyButton(i,u,t.txtSet.format(l,u),t.filter,"button")).data("value",s==""?"":["year","month"].contains(h)?o:u).dblclick(function(){return false})}});v=e(createTiddlyElement(n,"div",null,"filtrList"));v.data(m);this.filter(v)},filter:function(n){var r,i,s,o,u,a=0,f="",l,c,h,p,d,v,m,g,y=config.extensions.tiddlyspace,b=e(n.html?n:this),m=b.data("value"),w=n||window.event,l=w.shiftKey,E=n.html?b:b.closest(".filtr").next(),S=E.prev(),x=E.data(),T="space|user|tag|VAL|year|month".split("|");if(x.y0==undefined){x.y1=x.yMax;x.y0=x.aY?x.yMin:x.y1;x.m0=1;x.m1=12}d=store.getTiddlers(x.sf);if(m!=undefined){o=b.closest("div").attr("group");switch(o){case"space":x.space=x.space==m?undefined:m;break;case"tag":x.tag=x.tag==m?undefined:m;break;case"user":x.user=x.user==m?undefined:m;break;case"year":if(l){u=x.yX;u=u?u:x.y0;x.y0=m<u?m:u;x.y1=m<u?u:m}else{if(b.hasClass("filtr_active")&&b.parent().find(".button").not(".filtr_active").length>0){x.yX=x.y0=x.yMin;x.y1=x.yMax}else{x.yX=x.y0=x.y1=m}}if(!w.ctrlKey){x.m0=x.mX=1;x.m1=12}break;case"month":if(l){u=x.mX;u=u?u:x.m0;x.m0=m<u?m:u;x.m1=m<u?u:m}else{if(b.hasClass("filtr_active")&&b.parent().find(".button").not(".filtr_active").length>0){x.mX=x.m0=1;x.m1=12}else{x.m0=x.m1=x.mX=m}}break;default:x.field=x.field==m?undefined:m;break}}for(h=x.desc?d.length-1:0;x.desc?h>=0:h<d.length;x.desc?h--:h++){p=d[h];g=x.fi?store.getValue(p.title,x.fi):"";space=y&&y.resolveSpaceName?y.resolveSpaceName(store.getValue(p.title,"server.bag")):"";i=p[x.sf]?p[x.sf]:store.getValue(p.title,x.sf);if(x.ex.containsAny(p.tags)||undefined!=x.space&&space!=x.space||undefined!=x.tag&&!(x.tag==""&&!p.tags.length)&&!p.tags.contains(x.tag)||undefined!=x.user&&x.user!=p.modifier||undefined!=x.field&&!(x.field==""&&g==undefined)&&x.field!=g||x.bD&&!t.inRange(i,x.m0,x.m1,x.y0,x.y1)||x.fi&&!x.bF&&!g)continue;c=!p.tags||p.tags.length<1?"":x.fts.format([p.title]);a++;f+=x.f1.replace(/%title/mg,"[["+p.title+"]]").replace(/%modifier/mg,p.modifier).replace(/%modified/mg,p.modified.formatString(x.fd)).replace(/%created/mg,p.created.formatString(x.fd)).replace(/%sortfield/mg,x.bD||t.isDate(i)?i.formatString(x.fd):i).replace(/%space/mg,space).replace(/%tags/mg,c).replace(/%hastags/mg,store.getTaggedTiddlers(p.title).length>0?"<<tag [["+p.title+"]]>>":"[["+p.title+"]]").replace(/%field/mg,x.fi?x.ff.format([t.isDate(g)?(new Date(g)).formatString(x.fd):g]):"").replace(/%count/mg,x.bC?x.fc.format([a]):"").replace(/(%nl)|\\n/mg,"\n")}T.map(function(t){s=0;if(t=="VAL"){s=1;t=x.fi.replace(/\./mg,"_")}var n=e(".filtr_"+t+" .button",S);n.each(function(){var r=e(this),i=r.data("value");if(n.length==1||t=="space"&&(undefined==x.space||x.space==i)||t=="tag"&&(undefined==x.tag||x.tag==i)||t=="user"&&(undefined==x.user||x.user==i)||t=="year"&&x.y0<=i&&i<=x.y1||t=="month"&&x.m0<=i&&i<=x.m1||s&&(undefined==x.field||x.field==i))r.addClass("filtr_active");else r.removeClass("filtr_active")})});E.empty();if(f){wikify((x.lf&&config.macros.listfiltr?"\n{{filtr_list{%0\n}}}<<listfiltr>>":"%0").format([x.f0.replace(/%field/mg,x.fi?x.ffh.format([x.filbl]):"").replace(/%count/mg,x.bC?x.fch:"").replace(/%sortfield/mg,x.sf).replace(/(%nl)|\\n/mg,"\n")+f]),E[0])}if(config.tableSorting&&config.tableSorting.refresh)config.tableSorting.refresh(E[0].parentNode);return false},inRange:function(e,t,n,r,i){var s,o=32-(new Date(i,n+1,32)).getDate();for(s=r;s<=i;s++){if(e>=this.getDate(s,t,1)&&e<=this.getDate(s,n,o,true))return true}return false},getDate:function(e,t,n,r){return new Date(e+"/"+String.zeroPad(t,2)+"/"+String.zeroPad(n,2)+(r?" 23:59:59":" 00:00:00"))},isDate:function(e){return(new Date(e)).getMonth()}});if(!Array.prototype.sortCaseInsensitive)Array.prototype.sortCaseInsensitive=function(){return this.sort(function(e,t){var n=e.toLowerCase(),r=t.toLowerCase();return n<r?-1:n>r?1:0})};config.shadowTiddlers.StyleSheetFiltr=["/*{{{*/",".filtr {display:block;}",".filtr .button{display:block;float:left;margin:3px 3px 0 0;padding:0.2em 0.4em;-moz-border-radius:7px;border-radius:7px;}",".filtr .filtr_active{background:#FE8 !important;}",".filtrGroup {display:block;padding:5px 0 0 0;clear:left;vertical-align:middle;}",".filtrGroup div {display:block; float:left; width:85%;}",".filtrGroup strong{display:block;float:left;min-width:80px;width:14%;text-align:right;padding-top:0.2em;margin:3px 1% 0 0;}",".filtrList {clear:left;padding-top:1px;}",".filtrList ul {list-style-type:none;}",".filtrList ul,.filtrList ol {margin-left:0;padding-left:0em;list-style-position:inside;}",".filtrList ul li,.filtrList ol li {padding:2px 0 2px 0.5em;border-bottom:1px solid [[ColorPalette::TertiaryPale]];}",".filtrList ul li:hover,.filtrList ol li:hover {background:[[ColorPalette::TertiaryPale]];}",".filtrList table ul li:hover,.filtrList table ol li:hover {background:transparent;}",".filtrList table ul li,.filtrList table ul li {padding:0;margin:0;}",".filtrDate {color:[[ColorPalette::TertiaryMid]];margin-right:5px;}",".filtrTags {max-width:50;float:right;text-align:right;display:inline-block;margin-right:0.5em;}",".filtrTags .button {margin:0 0 0 3px;}",".filtrTags .listTitle {display:none}",".filtrTags ul, .filtrTags li {margin:0 !important;padding:0 !important;list-style-type:none;display:inline;}","/*}}}*/"].join("\n");store.addNotification("StyleSheetFiltr",refreshStyles)})(jQuery)
//%/
See [[Finding A Tiddler]]...
You have a number of options to find a tiddler...
;MainMenu
:» for your most important tiddlers
;Search
:» type in the tiddlers title or a keyword fo find matching tiddlers  
; Sidebar / All
:» for an alphabetical list of all tiddlers
:» see shadow tiddler TabAll
; Sidebar / Tags
:» find a corresponding tag to find the tiddler in the popup
:» see shadow tiddler TabTags
; Sidebar / Timeline
:» see  most recently added / edited tiddlers
:» see shadow tiddler TabTimeline
!Plugins
Various plugins improve the task of finding tiddlers most of which can be used in combination...
;[[SimpleSearchPlugin...]]
:» opens a list of matching tiddlers instead of the tiddlers themselves
;[[GotoPlugin...]]
:» quickly find tiddlers by title or search
;[[SearchOptionsPlugin...]]
:» enhance search options and define detailed search preferences
:» [[TwHelp|http://twhelp.tiddlyspot.com/#TwHelpSearchPlugin]] provides a tweak for the generated ''~SearchResults'' tiddler
;[[YourSearchPlugin...]]
:» quickly search and navigate through search results providing an excerpt
:» also available as a [[Bookmarklet]]
;[[TagSearchPlugin...]]
:» use the overview of your most used tags to open tiddlers tagging to them
:» quickly search tags to add them to your tiddler
Following is a mechanism in TiddlySpace that allows you to monitor [[tiddlers|Tiddler]] from [[spaces|Space]] of interest without [[including|Include]] them.

To follow a space such as @tiddlywiki, create a tiddler called {{{@tiddlywiki}}} tagged ''follow'' in your [[Home Space]].
ColorPalette
StyleSheet
SiteSubtitle
GettingStarted
SiteTitle
MainMenu
SiteIcon
DefaultTiddlers
ViewTemplate
PageTemplate
SideBarOptions
EditTemplate
SiteInfo
SideBarTabs
ToolbarCommands
In TiddlySpace, the following bubble appears on every [[Tiddler]].

The number inside it represents the number of spaces that __you__ follow which have a tiddler that goes by the same name:
:[img[FollowingBubble.png]]
It is primarily used as a way to collaborate on a given subject.
iVBORw0KGgoAAAANSUhEUgAAAGUAAABACAIAAACMfy4dAAAXVGlDQ1BJQ0MgUHJvZmlsZQAAeAHVWWdYFM2y7pnNy+6Sc1pyzjlnkCRRopJzZslBBAQkKAgoIqAoqIioIEqUJAqK+CGioGIiiARRMSAoKHfQL5z7nHP+3T+3n2d636mqrq6Z6u6pqgWAc9k7KioMZgAgPCKWZm9mSHVxdaPiJgEBUJCLETB7+8ZEGdjaWoH/2r5OAGib+VBmW9d/FfvPDEY//xhfACBbhO3jF+MbjuBrAMCGvlG0WABQ6wh9NCE2CsHoOwhmoSEGIvj5Ng78jVe2sc8vjEH/knG0NwIAwwEAnuTtTQsEgCyM0KnxvoGIHrIxAFimCL/gCACYXRCs6xvk7QcAZzkiIx0eHrmNbyFY3Odf9AT+C/b29vlbp7d34N/497MgI5GJjYNjosK8k37d/F924WFxyPv61ZiQnhQRtnPbN2zIteDnbWyJ/PIg18+osF8+Q2QgLv+IXQ4IbRtLR/jstPkT6wbQTO0RjIyFbKNiDbcx8s6ggKhYW8c/6WnJQUY7EUxC6Ef8Y0z+0nMqxNti22cUhN5Mi7PfhWBhBPfFxDuYIBhZUdDr5CBH5z9lvvj5G/9Jh+GAYFPz3zIwU3Cs+fZcLIjPBUMjLbdtQOaCVYElCAP+IA7QkD4CyAArYASM/+xlQADwRjjxCC8GhII3CA5HRkQiYyIRTP1TzujfKKa/xgUi4/63RirwRWTj/p7z92xUZM6/dAYDPwT/RfdG5tjmbVsX4xmc+c+cf0ls6/tljXyD/KL85l82oUXRimgVtCFaB62L1gBUNBuaC8igldHqaAO0HloL4WkAU/Aa0Rz4l43b+sObA+LLI5M0nYIQ7vaz+/zFBU6/pIP/vv83C0DwyHLb8l8WABDrn4jsAwCMIqOSaMGBQbFUA2Tn+ktTzSN8ZaWpivIK8tvs/zdt+8z6bexn+19nEcR2/x9apAIAGttnzP5/aF7vAWgLQbYp0z800TYA6BUBGDrmG0eL/60Pvf2DAURAj6xQTsAHhIA48p4VgSrQAvrABFgAG+AIXIEHsn6CkDVIAwkgFWSAHFAADoOjoAJUg1pwHlwCzaANdIEbYBAMg1EwDp6BKTAH3oIV8BVsQBCEg8gQM8QJ8UMikBSkCKlDupAJZAXZQ66QFxQIRUBxUCq0HyqASqAK6DRUD12BOqAb0BD0AHoKTUOL0CfoO4yCSTALzAuLwnKwOmwAW8KO8B44EI6Gk+EsuBAuh2vgi3ArfAMehsfhKfgtvIoCKDoUG0oAJYNSRxmhbFBuqAAUDZWGykeVoWpQl1GdqNuoh6gp1DLqGxqLZkZT0TLIOt2B3oX2RUej09AH0RXo8+hW9C30Q/Q0egX9E0PG8GCkMJoYc4wLJhCTgMnBlGHOYVowA5hxzBzmKxaLZcOKYdWwO7Cu2BBsCvYg9gS2EduHfYCdxa7icDhOnBROB2eD88bF4nJwx3EXcb24Mdwcbh1Ph+fHK+JN8W74CHwmvgx/Ad+DH8PP4zcIDAQRgibBhuBHSCIUEc4QOgn3CXOEDSIjUYyoQ3QkhhAziOXEy8QB4nPiZzo6OkE6DTo7umC6dLpyuia6O3TTdN9ITCRJkhFpNymOVEiqI/WRnpI+k8lkUbI+2Y0cSy4k15Nvkl+S1ynMFFmKOcWPso9SSWmljFHe0xPoRegN6D3ok+nL6K/S36dfZiAwiDIYMXgzpDFUMnQwPGZYZWRmVGC0YQxnPMh4gXGIcYEJxyTKZMLkx5TFVMt0k2mWGcUsxGzE7Mu8n/kM8wDzHAuWRYzFnCWEpYDlEssIyworE6syqxNrImslazfrFBuKTZTNnC2MrYitmW2C7Ts7L7sBuz97Hvtl9jH2NQ5uDn0Of458jkaOcY7vnFROE85QzmLONs4XXGguSS47rgSuk1wDXMvcLNxa3L7c+dzN3JM8MI8kjz1PCk8tzz2eVV4+XjPeKN7jvDd5l/nY+PT5QviO8PXwLfIz8+vyB/Mf4e/lX6KyUg2oYdRy6i3qigCPwA6BOIHTAiMCG4JigrsEMwUbBV8IEYXUhQKEjgj1C60I8wtbC6cKNwhPihBE1EWCRI6J3BZZExUTdRY9INomuiDGIWYulizWIPZcnCyuJx4tXiP+SAIroS4RKnFCYlQSllSRDJKslLwvBUupSgVLnZB6II2R1pCOkK6RfixDkjGQiZdpkJmWZZO1ks2UbZN9Lycs5yZXLHdb7qe8inyY/Bn5ZwpMChYKmQqdCp8UJRV9FSsVHymRlUyV9im1K31UllL2Vz6p/ESFWcVa5YBKv8oPVTVVmupl1UU1YTUvtSq1x+os6rbqB9XvaGA0DDX2aXRpfNNU1YzVbNb8oCWjFap1QWtBW0zbX/uM9qyOoI63zmmdKV2qrpfuKd0pPQE9b70avRl9IX0//XP68wYSBiEGFw3eG8ob0gxbDNeMNI32GvUZo4zNjPONR0yYTHaZVJi8NBU0DTRtMF0xUzFLMevbgdlhuaN4x2NzXnNf83rzFQs1i70WtyxJlg6WFZYzVpJWNKtOa9jawrrU+vlOkZ0RO9tsgI25TanNC1sx22jb63ZYO1u7Srs39gr2qfa3HZgdPB0uOHx1NHQscny2S3xX3K5+J3qn3U71TmvOxs4lzlMuci57XYZduVyDXdvdcG5ObufcVt1N3I+6z+1W2Z2ze2KP2J7EPUMeXB5hHt2e9J7enle9MF7OXhe8Nr1tvGu8V33Mfap8VnyNfI/5vvXT9zvit+iv41/iPx+gE1ASsBCoE1gauBikF1QWtBxsFFwR/DFkR0h1yFqoTWhd6FaYc1hjOD7cK7wjgikiNOJWJF9kYuSDKKmonKipaM3oo9ErNEvauRgoZk9MeywLEhzeixOPy46bjteNr4xfT3BKuJrImBiReC9JMikvaT7ZNPlsCjrFN6U/VSA1I3V6r8He02lQmk9a/z6hfVn75tLN0s9nEDNCM/7IlM8syfyy33l/ZxZvVnrWbLZZdkMOJYeW8/iA1oHqXHRucO5InlLe8byf+X75dwvkC8oKNg/6Hrx7SOFQ+aGtwoDCkSLVopOHsYcjDk8U6xWfL2EsSS6ZLbUubT1CPZJ/5MtRz6NDZcpl1ceIx+KOTZVblbcfFz5++PhmRVDFeKVhZWMVT1Ve1doJvxNjJ/VPXq7mrS6o/n4q+NST02anW2tEa8pqsbXxtW/OOJ25fVb9bP05rnMF537URdRNnbc/f6terb7+As+Foga4Ia5h8eLui6OXjC+1X5a5fLqRrbGgCTTFNS1d8boy0WzZ3H9V/erlayLXqlqYW/Jbodak1pW2oLapdtf2Bx0WHf2dWp0t12Wv13UJdFV2s3YX9RB7snq2epN7V/ui+pZvBN6Y7ffsf3bT5eajW3a3RgYsB+4Mmg7evG1wu/eOzp2uIc2hjrvqd9uGVYdb76nca/lD5Y+WEdWR1vtq99tHNUY7H2g/6BnTG7vx0Pjh4CPzR8PjO8cfTOyaePJ49+OpJ35PFp6GPf04GT+58Sz9OeZ5/guGF2UveV7WvJJ41TilOtU9bTx9b8Zh5tms7+zb1zGvN+ey3pDflM3zz9cvKC50LZouji65L829jXq7sZzzjvFd1Xvx99c+6H+4t+KyMveR9nHr08HPnJ/rvih/6V+1XX35Nfzrxlr+Ouf6+W/q325/d/4+v5Gwidss/yHxo/On5c/nW+FbW1HeNO9fsQAK6eGAAAA+1SE5hCuSO4wCQOz7nVP8kkDSFQiRQTAOiRQskAhgFpJEvtt9MCccC0+izFE30WboR5hwLCO2H5eK1yXgCC+IHXRVpCJyHeU5AwOjJVMe8xArI9tu9oucaC5v7m5eKt9B/nUBP8FJ4Z0iQ2Jy4oUSb6XMpatlvsoZyR9SGFUiKxuqxKhWqfWpT2n80GLXltLR0DXRs9f3NYgxzDI6Ztxg0mv60Gxxx5YFq6W0lZG1+85gm3jbbLsS+2qHBsc2ZNcPO4+5PHV95TbrvrD73Z4Fj+eeI1693o0+J30P+SX7BwTYBWoFCQdTgr+GvAodDKsPPxQRFekQpRbNFb1JexnTF1sblx0fkGCeKJVETFpKvpfSlFq+NystYV90Oi0jOTN//+ms7uxXBwi52nlR+bUFE4eIhdpF4YdPFo+U/DgifdS9LP9Ya/lUBV2lSpXnibyTzdXPTqNrZGqdzuw7e/7cg7r1euoFq4bUi82XPjZqNhVd+XDV/dr9Vpu2Rx3anbHX67ue99D1KvU53Yjuz75ZfKtsoGyw+Hbunf1DB+4eGj50L/uP2BHn+7L3N0b7HqSMqY59ffj4Ucd4xcTex55PDJ+KTBIm3z178LzlRcXLva+8poynJWYYZr7Nvnk9MTf05sb89YWOxY6ls28Ll+Pfebw3+SC1wrCy+nHyU8/n01+yV4O+Wq7JrTOvr317/r1vo2Yz64f/T+Mtwa0txP9YwIVEh4lgAInorKDD0CtYCYm9PqM8URNI1PQCE4WlYNtw/ngu/CShihhIZ0jSITtSgujTGU4x3mBaZGFlNWZLYm/k+MAly03j6eKj43eiXhDYEjIQzhDpFd0UV5MIkTwhNSz9SZZVTkl+h4K7YqBStHKSyl7VZLUQdXcNK00dLXltQR1WXbzud713+tMG44Z3jXqMr5rUmZab5e5IMA+ycLXcYaVuLbaT1QZt88V2xu6BfZ9Dk+PJXblOMc4eLuauSm687lj398hJ3+1R65nvFent6KPsS/Kd8evwLwoICNQOYgx6E3w9pDjUP0wznD58NqItMjfKNVoKWRcjMadiaXFG8azx8wkdiQeTPJLlU+CUx6mNewvSwvftSjfO0MzU2K+TtSPbJSfiwIHcs3k386cLfh7iKdQocjocU3y45GLp0JE3ZfAxnnLV43YV4ZUFVRdPjJ78ekrwtG3N/tqOMx/PydZFn79Wv9agcTH1Uk8jaDK4sr954Bqmxaw1t+12B67T5HpmV3f3l17RPocbKf0nb16/NT6wOLh2Bz3EfFdgWO6ezh9WI273g0YTHuSMHX1Y86hxvGti6PHEk7mnX56hnrO8EHmp/spqKnC6dmbxtdic25uc+QsLtxenl9aXKe9E3ut9cF9J/zj6WelL6ernNfv1a985NrI3138m/PI/GqmcSIKdIB30IXG9JhQLtcEwbA2fgjdQHqi7aG10K0Yd04+1xc7iUvDc+NuEQ0RfOm0SN+kneYYyTN/CcJaxnKmQOZclmzWHrYC9lKOas4Grnbubp5u3h6+Xv4d6XaBFsEHohHCBSJzobjF9cUEJIPFMsk2qQNpJhiqzJNsily5vqcCmMK3YoBSnrKdCUHmoekItSF1ZfV2jRzNby1KbSXtSp0Y3RE9Rb1N/0KDYcI+RpNGa8U2TIlN3MzGzTzt6zPMtnCwFLN9atVqn77SyYbOZtm2wi7HXcoAd7jqW7HJzojrNO192iXPVcoPdhtyLdjvsYdvz1KPSc48Xr9cL7xM+e3x5fCf9yv2dApgD7gcWBJkEA2S9xIcqhC6H1YX7RPBEPI4sjdoZjY++QUuOUYpZjj0b5xHPHn8/4UCiXuJ6UlNycAo15Wnqkb2OaZxpc/va049kJGUG7N+d5ZrtnuN/IC43O68s/1xB68HBQ+OFc0VfilElzKWCR+SPapYZHbMotzvuWuFTGVm170TpyYvVw6c+1IjUJp0ZPSdWl3Z+4oJMQ9bFZ5cVGnObXjarXi249qpVqe1A+/NOpev5XTM92r3lfV/7HW+2DIgNnrkjMzQwHPqH8Mjy6O2xK4/qJ5qe3Jh88QK8kp+ue50zn7/U9p7+Y+4qx3rLpvO2/3/Xlra/CVhVAM7OAuB0GgA7dwDqpAAQqUTKJki9w5YMgKMGgA2LAPT0OIDMLv/9/SADMSTLDwAHkMxxCLyFKJACtAtKhk5AXdAzaBPJ7/RgHzgHvgDfh7+guFEGqCDUYVQHagZNh9QPvJCMrB39GsOE0cNEYE5jxrFErAE2EduMXcaJ4wJxdbhFvCw+Dt9LoCO4ES4SIaILsZmOQhdBN0ZSJ50i48k08kuKBaWDXpy+goHMkMGwxhiJ5Cu+TK+YfZjnWcJZvrJmsFHYTrDLsd/kcOdY5SzmUuB6yJ3Aw8szynuAz5Af8N+gZgtYC3IKLghdFy4WCRE1FRMRJ4mvSsxIjkndku6UuSrbJNco36zQrtinNKz8UuWjGlqdVUNIU0ZLQVteR1KXqsekD+t/MHhm2GtUY5xrEmnqYma4Q86cz4LeEmW5brVivbRzzmbGdtrutf1bh8+OP5wIzuwuYq4abtbuvrtT9hz1aEK+Y+98KL5Kfq7++wJqAweCZoN/hDKFCYRLRshGykRJRAvS2GIIMd9jF+O5EqwTs5J6k3+mmuwtTXubbp1xfb9yVkeO+YHZvAMFAgcvF+oXTRUXl7oc1TlmfjyhcuAk9ylKDVz77eynuvf1yw3Llz40rl75cQ3fyt0u12nc5doT3Bffn3YrfXDvnfi7Yfe8RgpG28eWxgUe73la/ezNS4WpjJnxOan53MX5ZbP3Fz4yfE5Zfbce8H3+R9Sv84MeyAI7pBpVAXrBa4gOqQa4Q1lIxj8MfUCye03YC86Fm+CnKBSSs7uislFXUK/QZORUCUVXov9A8m8FjB+mCvE7PdYKm4e9gyPirHEluEm8CJ6G7yewEcIIg0QhYiZxjs6CrpMkRaoms5IPUrCUTHpAn8GAYshlpDAeYxJkamTWZx5nCWfFstawGbDNsOdwyHBMcGZwyXNNcZfy7OBF8/bz7ec3pZKoEwI1gjFCpsJ8wusiE6JtYqfEj0kUSxZKFUqXyFTInpNrkb+j8FJxTZlVRVPVV61QvVvjg5aItqdOpe4zfT4DP8NGow0TE9MCs2FzjIWapY9VjvW5nTdsJm1X7NEObI6Su/SdXJ1jXIpcL7uNuH/cw+ah4xngVezd4/PeT8jfJaAocDDoR4hyaHDYyfAHkXCUYrQXrTDmeuxCPH2CWqJXUkFye8r8XvY0831705szlvYLZe3Jrsh5ksue55p/suD1IZnCxKLBYo6SyNJ7R+XLKsspx/MqSVVHT4pV3z4dXEs603zO7Ty6vqnB8xLD5ZtNic1yVxda6tqCO2Q6P3V19mT2WfWz35wdaLqdOmQxzHlvdGTX/dkHyQ/5Ho1MFDxxmBR9Dr2YeTU43TBbNEebd1jkXqpeFnt35YPuysgnz88fVtPX6NePf+fbqP7B9bPol//ZgQGIQipH98EW4vsA6Dg0AH2GBWF7pIbTBi8jtRoXZL8PoVFIDTEZ3YZexahg4jHdWAzWBluJXcJp4Q7jFvDG+DMEPCGK8JxoReyjU0M8bUi6R3YlL1HS6FnpmxhsGD4yljHpMi0yn2BxYCWz3mXLY7fiYOKY5DzLReM24GHmecs7yHeGP4caKuAoaCCkKCwmwi/KLcYlTpWQktSQspT2lkmVrZDrln+tSFHSVqapXFb9oK6ikaE5pi2uk6X7Rt/KoM1IyviMqYBZrbmERYuVsfUTmyg7kn2TozuyX7td492Vd6979Hkd8vHwUw0gBT4Nrgg1D1uMSIrcjI6lzcXaxl1NYEykJT1K0Uw9nUa3LzF9PtNl/71sw5zOXOW81gKdg0OFrkVvi9NKGY/UlMkd6ziuW9FbpX2itRpzyur00ZpXZyTPJpwbOM9aH3Ch8yLlkt/lribWK1HNw9fEkcznXbtdR9t1vq6c7ve9zn03+qVuHr21NRhy+9GQ/t2Ge2x/xIzcHeV+EDR28eHSuNCE8+PMJ+ef3p2ce7b5guEl/yupKZVpzRndWf3X+nO6bzTn1RYUFiWXBN9S3i4ud7xLeK/yfvnD2RXXj8SPXZ8CPjN8bv+yexWs1nw1/Dqztm+dZ73j265vK98Pboht9G96bK7/KP0p93Noy2/b/zEBSkgdEmkQyRApP77c2vosiiQVJQD8KN7a2qjZ2vpRiyQbyH8gfWG//6/YFsYiNfcqhP6f2/8A3sF+76IcnXEAAAAJcEhZcwAACxMAAAsTAQCanBgAABQsSURBVHgB7ZtbjCXXVYZ31a7rOadPT/f0TPe0Z9qZ8SWOjYJD7DhEeQBGjpEcyQgjCAH5BZEIiYdIIMwDQkRERIYXPyDlybJEgrCCZQmhWAETLk4cMsmI+I4dT2Y8Y7vn0tP3c6uqXXvzrV3dQx6I6B53Ox2pa06fU5ddu2r/tda//rV2TeCcU/vLlhEIt9xyv6EgEF2D4dfu/dC19b2wUn3iCypwgVLyt7EELKzyZ5VqRSqLYxcEeEjtbFXbWulABUEo/3QQ0CDRoQpCq6x1ytigtHUYhUkQ0iduRbNQemQ1UGFYW2nGuuxioWc69Jdn9bGH7ubY/+K1cUt750czeCcDkVvaxKwBTCnNPkaoQlowzpIGQSwwhEBg0xg0wyzWDLp0qqpVCWYu1JFWoa2sQAJSNNUA6hGxjsOa5yDgcdD5a0u3/vJs+2Xv4qV5ttxl4DAlFg+UQMdKoGygNH+VCiym5XTIqGSUKopUJ0mSWHZUTg2NK2uGDjQ61gHYALM0Dyyb/gJyIi3kyQg6dN6syAbGiRH6i+55vBiiv1W5axmJXzxqDMGPCticrIrPSROXxWErjthVWov34aEYDafTAQYjFrXx54CP7pt+fcDzFuXREj/0DklzzhHrEwA3bmDv2pcwEHe6+U/GtnnTnnFksxm/R1LpSIY1NOJSNWuW1ngYyEgfLJ4NZdiggEda8UqeiBiX/PjHIq7puxWvrSoV0QEPLt6wrr3MX8IuDUAyRgbEPz8YgefaERkcS7Oj5tcFLhR207EfuJwjlO97wOeavhoT8j06YTyPV9OTIFZXo+LMf/Xm30iyLJuaHU8iO/sBueyexosn7l1G6IcBbxoVN82QmsHJiP0/XNIvQMyvSyOxHIivBjzZ03x5B5QzfTOJfLLBUaF3NjCl4WDx7Mt1Mbxy+uvh2vyR2SOJXR8Yc2ByWnrZy3jJY/d4SaDyFNVIaxliYybN2obJsCFsI0PCf6IQVkIdcNBZwR0TwqcaoKXRJlRgtOFrrJlq+e0fXHj524PB4NzLL4amXF5fv2n5UmfqSLlwTs7ay3hp9ITHgrtkxDJWT8V+rHLr/ijMLescY1v+wtCFxEyMS0IbVhZGG7jKiX6RhhwTzLxjCnahqtVbr5x+7bmn33n+O8PhehxHdW3fcXa6m5mF+d63nlQPf46z9y7foww8Rn5cHgphJhmr0HODmlCcl2AeCWnpqSo0tFN1g5O4mYdOzsGaGh0KXrJIOxY2Vi6dO3v6395+6VSWqNmp2StLS/3hqF8Wz59bONRJTswekHZ7GS8CG09dHBE53twsXM6KpzWGyWEUlGgG9jeAyXeDb6AdpC9MxSEPK8iIewpmvrcGLbHhQPUXL1148T+XLvwgT9JbZqcOdtva2Uv1omi/2gLcmARfWfaufaEPkFIITzwL/wIHLAt5Lt/QkRYQSWDwWkSW1woyHgHE/4CqQCELPiviBLQaBqSJNyuxLlqZYrh68Xy1eHF98UoWK8QuWmNu6kAS2N6gmBlLlgbmympfet8mXuP3fvbhk7cfMcaMevPf/+evfO25N5peduM7jWWYcosu4OmKBYkIF8/02AljeRwEEr/PA+W3hNM24RJNLzuboz5EgjR2KzpVaLEcDdbmz59/7eVi1GvrDszX6/dDZ+g9GuuqTuuGbh0504xx6/Y1/ulHHj85l25CM3v81rs+dOKRL3z52c09O/ybRTgcwxPTQjT6ZFKGjhaVDInxi1mJ5BI4GsD8inC8N0YPEesCuseLSOkPEAeQXahWyRBs5/DBY7d9cPH86/2lq3FbDaLllZWeUmmgq8lOtFgOjnYnV69eboYneG9lmbzvYQ/W0tf/+nO/85u/+8SpC5x1/OQnZ7dy8nW1GUuDbqK6SdhJyJwVlYgEZ6EmEalWrNpx0E4lqW6RA0VBK6YaEeQ6iCMVa/kkkUZVxOLUbAaAH+kw5sPOMIgQHX4PzbIkHTs4ub5w2ZrR2uraufMXV9fLG7vTwUjbUXG8lc+Nt3MyeL9s1b7GJ8Zo/9Y//NXfex985tEv3fN3Xzx+XUBs8aSJDMaRzAbSEUYXixJjwzEhI0wMIhPb21jxcQHTE5oSaxJPk8X7sPB+Y4Kbpifs59s5LDdUeXbP/Q98428XlubPv29qOg90HNTHxieUMlPjk1OHxg8daDW3vVW8Vs9876VX1988c7U5Lb/rFzYEb7O9C98Zt0zpwQk0CE8PDOMWHmPsDFe8ciP1A5Xa4wnlSUMPToMw0Ana7G5CoXdM34KzRZzQj2nNTs/O/crls6+/8M1qYmZ27eKblxYvhSqx2o5XnZmpubnpber7pdN/8+hprjD+6c8/fvdMu9tts/HWN56c52d3FqpbkdcPhD9D9Qq+8VrAlwQFBUYLm3iAwE/sqLE+sUap+PArnI+FstDCo4zah+QFOtnJF502DyMMPnb/g6uX56/On03jpEVlyEU210sjf/FNf9wqf/mL8tXOO+02zOGX2bvuP755YDd+CYtJSDJo5RNakRC+vsIQqT5QzDGWoihJooABgpGuM+1yuIwP5oHUl0qZHBS0pA36gULYBseJwhMuowwbpKq+6f03f/bzX5yavQWITByOIturqlHlzl1ae+G/zzcD3C5e84/9wa9/5rcf+P2/+PLFQunDdz1w364xvrcAhotX+hKNAxc+VEoLq0rnCuWKIBi4oF+rNSOflUotVW65dIulXTWub1VfUV91haMAS/mQgjVpjxs51XwovZIJEDVJBeRJqDputX/jD//49l/85OWVAbR/Za03qstXfrjw0vIGf20Rr9mHHvnqY195/N5DG2Y0fOmJf3l9lY2sPbUblkWfIxcNqflZN7KsM2yyHCBzlXIV7oaKxQM9iWE7EhnkE5og4Ch1VyrUFR4ppidOSy5uQl2GyoTSwPiPbx9WLqDPgQ3WrV6zKpmZ/egDD37ioc90Jw9NtvPIBPnhm/XYhllsEa95QyagD3/45Ac30Rm/aUYoTKnh5p4d/nWurIIa0wAmfM7bgQ21+GYWOeRFqIltlAldFLMZpZqg5mJsRNWJwp9qtAW+hqRINCoklA8JQ6RSvI+QGAaZtvhv4vtMN4QIz8EePHb0ow9+au7EjWNxfuT9H+HPtbrN8LYaH//91JmTc3fc8sCf/9nRZ5+/HN/58Z8/1o1Uffbpp3ZL4qPvZfIBDseIhMmtTGwwDeRMUY6UKV1VuqJXlwN0U1BXZW+9GK5rdLlzEYmBMFOqwjhN0zDO0lYnyrtRezzsjOuso+MsjPjAiF78Chi1l7EqiAxP4V+/9o/rC6Ppn7sv7M7gsUKcftkqXvNP/dETc1/61D1zxz78S8eaU/sXnvrLP3mxWd+F77XX/gN0bFnYclgMerYq63JkTVWVrMBduJQj2Sa/9LMd4qvEUGPrOAjTOBaah+FduB7W0HqKQpV0gWmPBJKKOhNR+0AyMZ1PHc2mjuo8F4VGxAiD9eX+qWdfuHju4sydH6+CDJNG6/oMVga5Vbxo+syjv/fM3Ec+9oGjiVK9xTOnT+8eVnJnr3/rq37mh8yaaTHsimHLoJhDC1Ukkp3M0rqhqSTLEb7G+8K6cqOqHIRFmugEV1S2V1RFWUdh2kk15jocVGkStBOYUdM+z+MkH88Ozri8OzYxXSfj33txeWFhkOcTw6rm2nkaVlUt025+2QZe0v7Cd7994bvNmbv9Pahltiysa8kRWYTdfYEB1gpFkTUilHgHRviVaAUjU7PYCTtNHdd1maUJuRTnQvTgBv8TcPtGQuRqbxSlgVtzhXnbvfGKLW23FZfdu012O9Hk1HP/dOPxOw/fcMyaOnSWIkgz3m3itdsg/Uj/vdEKdkPGJ5bjSzaiuQwJjUgMsSlmaANmNWAcZiFFy8qcrPA1h+zIBHilKQuwgn/ohbprURNAfMrAY8h4EFr8N8bhrEtsGSd67GdMac6+emp1uZfd0TErV5OpG6KEEsmex8vgDqKJmOxB2StDxiPFP1GqXpgLQRlHdK4DK/UeNrWOJCQw6R9qpFZpq4TYyblVXZnaGJemRAKGTjeEVpQEaNY2HBVVRbE/zH+2FWTD3oWivzJ7ZEavnouP3Ba0xp0ZUt7Z6/aVJFKi8rOHGEwY6Qjz8e8B8JKDKHWBiDoW2gpr0z5+GimIGoqIHMSq4qQokVY2y+Mso6oTWWcIm7xowWL4ASTCBJllTBmja7Pbh+sLK8tXDrXTbHh1/XJRDMPOoOhOH0tbjXjaDt//iK+8F6tSg8AUMBdfjcBGsLMYWeWlKgaF4TCNLbELW5KMHFOxwEocrIo6TjWMBX6wPtiUpg6iUYOOTzploiRSoWHGDTbHL5ObrZ6Yf+2bQbEavX326qV5Wxlo8SpTtgcOtm68Vf3pbzHsvctfUkWGnCiuknk7MkWCvSsN4qsmkcRMuHugMRgbDSWjVsREZBlsRymwLAzkDuK1k5km+MuWjimfiIqYn7OWZmK3mCePZFyN3VOR/awujfUW+29fwPXpnH8wm1u6sra8US/cu3hRjsa2ZMCKJ02eJ2TuPUhB1rA2KOGZGBdWAyQM28/+SC5IQznKyWRUpFQAKOhIfl2TS1eFr/ojrXSNjCMOrHUD0+8j9K5cSK+8I6FY7NV7vLAlqMomy97Fq9cbScmKGSDeP5LbdeglYwBNdmN8EBf4ARxftRX5SiNG55VF6OdqARQVK5DB82EEoAyZsKBADZwwIXIoa1qLb7y2Ov/D9rETyerVssZkxeiauAIl4JXXlr2Ll9MUIwhm1jL/igRzQVEWAptkLrzi4IHBtoTfpDKGh4poIChItilGJ+5Gds0u5wivGBchUsr5hE/vwrYKypXu6tV05dKCLtf1my+6knKGjzOCrAQUPJLtdBMyrwCvoffjV7b79uGTz3z/x3e2pSMnf3UWVYWCF/MBACZyqpoXu0iYuXlEP5V4SRPxKkfmrSpQNSZFxIudYV5eNqjAlHWaQ215r4+moCQRkjDFCULYrp+phxcruiL7NMUIqhIG8BhxizyipkLZzvLshsNPv/QqO3fFvt49WNzZoA8CwrYiGKAijAU+wo9ktiiirIOf4oQwERmmqCrcJgI1GjFUxqoRYtA1h4ohghY1BsoSG0iD5BEMVO+tPnvQZsZQ++EtAjEqfBYbxVRxbLpM8yw6cTy4YY5DLDuP146AxZ0hLQ2BMSCcNTNrIsyFvCT4V8zc+ldSEfwCATSVxRFWw4pnHzADaeo8BA0cmb3y2gmmivwnw6lrN7oIzs7GztsrdIajbjqh6Dss1+Vj3fjWW/TkbCvdZj3Hg/v/f+0UWHIlTX05LtBQQlEYlrzSxVNHjjJy2ad0h9qzvL8K00Hq4rSyCdsFgampz2Bm0jZPefUmwhxxURzOBrYcVXXm0gk1WKN6KCkW3WFevm4tASMC7Syt33fiwLHblDFxd7IZ/E7a106CJcig2SnmQS84CCVjQMO4EAS8wCuUTYyvCsZCAqhhHji84o1ARww1JIJEUnk3EH8m0YGIlCVhoLgIFVYVNBcFRyJ3OHav9MsrZFqCBtSFpUoewMPqjqnZo9HEobxz2JQjNM0O47WzYHFz3LToCFJdDMkFLeoMMmrntOgDU9lCZuw1wl2sBiFW8F6FQ8z7mCBvMUl4EwKn2C+xEvRphzuLmAilB/wvmklHqwN5iZpOSN/zjrwGzBTu0eNR52Ca5mGcx+m4ra7n/YkG4v/je8fB4hrYSu2oW0npCUZGVkgyZEwYxVHE6zNAgblZytBQPp6EU8okJCtC5myInwpMAeHP8i5ETd2fWn1AkODdLtR/WBmbTkTRHW030KaaSsYPT85Ml6OC0/K0G/CyC1NJ4JekWG8z7B3wx90Ai5tLwniEDckbOKFOkhFlVYvtxH5mFkrKKbhSnq8MNXs8VeoYBY6F1zIbJFhKfCgp64jc5MPEG9EAr8RoKRWGpUhfkVpBK2hNTXUP/TK+SINoDDvGkjVvDuPyaA9uRvMWgl/eLV67BBb3VjkDeZEIISExNEgYV4STISCDLotLL+1xLigdtHAmhAIpDx4oxVjKrnIC6SGvl5cULoS+vddp3jM3Tg+G5KHYIGe73mCp44o4OaBEwgi6VLDBmXMD3quSF4R2wr52Dyx5pOhxZqK5d+yg0qMRQsyKG/FfWnDM0lKjr2RDU5khxUGYm7oaDFDwTmpBPjRijvgdFCRpprWJFJfFdMqyyjLqFggU0RHokbIaRtkU4oxqZHOuuLaIOeySe3jXfL+rYIEXRgWVI/EleWGymufN/3vxdStcDZMiTqZMIrGCFEWS1RTmk1ZeFyUzceJ0cUoCJEl7kjCJDcELJ1ICY+i8p4N+cFIE0+QFsZTxu16NiKbg4rRhjQXvZpM8wrvj9erV3QaLm4NeMBFfSOAFtqKVawrp/fV6OKwPjEcRszwZMKJFqcVL6ojL9Adl5id64H4kBTkmZkGsYKoEFYYyoyqE4PBBowicpv6DP0pgQYeACLYIx4mOASL+YZP0G0ukxeP9cj389R6Axb0tLY3yViKMDtHzAgDmgXd69zSFjSjyRApTIjsiEsj/o/Ivb5oR/iMZk+gvMoSqjoWARElQ7rcl6UCdkA+RdLLG6wCclUKBAEb/XuFyDa4CQHyTioEl6g83vT683huwuDekF+aBcmJaNmkhF3SeRFMTcZWLBkXD93soekIZM/ziLkCTJTH8NSpNq51QshoNS2siEC8gKszPiUz1NSAiLXaHo0kgoTFzmnySHOeV3OCaO4rWRfKiTvivcNeB13sGFvf2/HcWmlvcU98bNLaVe3ovwdrK/fxE2ohr/0Qu/FN60W3Y10/pCHf2tvfx2h6e+3jt47U9BLbXet++9vHaHgLba71vX/t4bQ+B7bXet699vLaHwPZa79vX9vD6H+q+L/E7WiAaAAAAAElFTkSuQmCC
<<tiddler WikiText>>
<<tiddler WikiText>>
Most wikis provide a simple syntax for editing structured wiki content as plain text based on a [[markup|TiddlyWiki Markup]] that is considerably simpler than that of HTML.

<<tiddler Wikification>>

Examples for wiki syntax are...
* [[TiddlyWiki Markup]]
* [[MediaWiki Markup|http://www.mediawiki.org/wiki/Help:Formatting]]
* [[Markdown Syntax|http://daringfireball.net/projects/markdown/syntax]]
*etc...
!"""Formatter Plugins"""
A number of formatter plugins allow you to use other markup languages and can be found here:
* [[Martin Budden's formatters|http://svn.tiddlywiki.org/Trunk/contributors/MartinBudden/formatters]] also on [[marginswiki.com|http://www.martinswiki.com/#Plugins]]
* [[FND's Formatters|http://svn.tiddlywiki.org/Trunk/contributors/FND/formatters]]
{{annotation{
''Note'': Documentation on installing and using other wiki formatters is a bit sparce. Try searching and asking in the [[google groups|https://groups.google.com/forum/?fromgroups#!searchin/tiddlywiki/formatter]].
}}}
/***
|''Name''|GetPlugin|
|''Author''|[[Tobias Beer|http://tobibeer.tiddlyspace.com]]|
|''Description''|fetch and output a (list of) tiddler, section, slice or field using a predefined or custom format|
|''Source''|https://raw.github.com/tobibeer/TiddlyWikiPlugins/master/plugins/GetPlugin.min.js|
|''Documentation''|http://get.tiddlyspace.com|
|''Version''|1.2.3 2013-11-07|
|''~CoreVersion''|2.6.2|
|''License''|Creative Commons 3.0|
/%***/
(function(e){var t=config.macros.get={config:"GetPluginConfig",dict:{errFunction:"Function undefined!",errFunctionInfo:"config.macros.get.get%0 is not a valid function!",errConfig:"Config not found!",errConfigInfo:"Config '%0' either does not exist or does not have a 'Tags' section!",defaultCategory:"Tiddler",tipSlider:"toggle '%0'",tipTab:"show '%0'"},identifiers:{filter:"$",fuzzy:"~",tiddler:"!"},template:{fuzzy:"%0",tiddler:"![[%1]]\n%0",section:"!%3 / [[%1]]\n%0",slice:";%3\n:%0",field:";%3\n:%0",tiddlerList:"!![[%1]]\n%0",sectionList:"!![[%1]]\n%0",sliceList:";[[%1]]\n:%0",fieldList:";[[%1]]\n:%0",tiddlerTable:"|[[%1]]|<<tiddler [[%4]]>>|",sectionTable:"|[[%1]]|<<tiddler [[%4]]>>|",sliceTable:"|[[%1]]|<<tiddler [[%4]]>>|",fieldTable:"|[[%1]]|%0|\n",tiddlerTableHead:"| !%0 | !Text |h\n",sectionTableHead:"| !%0 | !%1 |h\n",sliceTableHead:"| !%0 | !%1 |h\n",fieldTableHead:"| !%0 | !%1 |h\n",fmtSliders:'<<slider "%0" "%1" "%2" "%3">>',fmtTabs:'<<tabs "%0" %1>>',tableClass:"getTable",dateFormat:"0DD.0MM.YYYY"},handler:function(n,r,i,s,o,u){if(!o)return;var a,f,l,c="",h,p,d,v,m,g,y=story.findContainingTiddler(n),b=u&&u.tags?u.tags:[],w=o.parseParams("anon",null,true),E=getParam(w,"config",false),S=getParam(w,"filter"),x=i.contains("listfiltr"),T=i[0];if(t.identifiers.fuzzy==T){var N=true;i.shift()}title=u?u.title:y?y.getAttribute("tiddler"):"";if(t.identifiers.tiddler==T){var C=true;i.shift()}if(t.identifiers.filter==T){e(store.getTiddlerText(i[1]).split("\n")).each(function(){var t=this.split("|");e(store.filterTiddlers(t[0])).each(function(){if(title==this.title)c=t[1];return!c});return!c});if(!c)return}else if(E){refItem=getParam(w,"refItem",t.identifiers.tiddler);refTag=getParam(w,"refTag",t.identifiers.tiddler);E=E=="true"?t.config:E;d=store.getTiddlerText(E+"##Tags");if(!d){createTiddlyError(n,t.dict.errConfig,t.dict.errConfigInfo.format([E]))}else{d=d.split("\n");v=store.getTiddlerText(E+"##Template");for(y=0;y<d.length;y++){h=d[y];if([""," ","/","{"].contains(h.substr(0,1)))continue;h=d[y].split("|");f=e.trim(h[h.length>2?2:h.length-1]).parseParams("anon",null,true);if(u.title==h[h.length==1?0:1]&&(h.length==1||h[1]!="")&&refTag!="false")l=1;else if(b.contains(h[0])&&(h.length==1||h[0]!="")&&refItem!="false")l=2;if(l){wikify('<<tiddler "'+E+'##Template" with: "'+(l==1?getParam(f,"refTag",refTag):getParam(f,"refItem",refItem))+'" "'+u.title+'"'+">>",n);return}}}return}var k=0,L="",A=[],O,M,_="",D,P,H,B,j=e(n),F=j.attr("macroName")=="get",I=t[getParam(w,"exec","getValues")],q=getParam(w,"format",""),R=store.getTiddlerText(getParam(w,"template","")),U=i.contains("plain"),z=getParam(w,"sliders",i.contains("sliders")),W=getParam(w,"tabs",i.contains("tabs")),v=z?"Sliders":W?"Tabs":i.contains("table")?"Table":i.contains("list")||S?"List":"",X=v.toLowerCase(),V=["sliders","tabs"].contains(X),g=C?"":i[0],$=config.filters.get.delimiterRegExp.exec(c?"":g),J=$?$[2]:"",K=$?$[3]:"",Q=J=="##"?"section":J=="::"?"slice":J=="??"?"field":"tiddler",G=getParam(w,"valueprefix",""),Y=getParam(w,"prefix",""),Z=getParam(w,"suffix",""),et=getParam(w,"category",t.dict.defaultCategory),tt=getParam(w,"header",X!="table"?"":"|"+t.template.tableClass+" "+t.template.tableClass+Q.toUpperCase()+"|k\n"+t.template[Q+"TableHead"].format([et,K])),nt=getParam(w,"footer",""),rt=getParam(w,"separator","\n"),it=V?(new Date).formatString("YYYY0MM0DD0hh0mm0ss")+Math.random().toString().substr(6):"";if(!c){title=N||!g?title:$?$[1]?$[1]:title:g;if(V){O=t.template["fmt"+(X=="tabs"?"Tabs":"Sliders")]}else{O=U?"%0":q?q:R?R:t.template[N?"fuzzy":J=="##"?"section"+v:J=="::"?"slice"+v:J=="??"?"field"+v:"tiddler"+v]}if(I){H=I.call(t,o,N?g:(X?"":title)+J+K,title,Q,K,X,N)}else{createTiddlyError(n,t.dict.errFunction,t.dict.errFunctionInfo.format([get]));return false}do{k++;A.push(L);L=getParam(w,"$"+k,null)}while(L!=null);for(D=0;D<H.length;D++){M=H[D][0];P=G+H[D][1];P=P.indexOf("***/\n")!=0?P:P.substr(5);for(k=1;k<A.length;k++){P=P.replace(new RegExp("\\$"+k,"mg"),A[k])}B=(X?M:"")+g;O=O.replace(/\\n/mg,"\n");if(X=="tabs"){_+=" [[%0]] [[%1]] [[%2]]".format([M,t.dict.tipTab.format([B]),B])}else{c+=(Y+(X=="sliders"?C&&title==M?"":O.format(["chk"+("string"==typeof z?z:it)+M.replace(/(?!\w)[\x00-\xC0]/mg,"_"),B,M,t.dict.tipSlider.format([B])]):O.format([P,M,Q,K,B,et]))+Z).replace(/\$count/mg,String.zeroPad(D+1,H.length.toString().length))+(X&&D<H.length-1?rt:"")}}}if(X=="tabs"){c=(Y+O.format(["txt"+("string"==typeof W?W:it),_])+Z).replace(/\$count/mg,H.length)}c=(tt?tt:"")+c+(nt?nt:"");if(!F){j=e("<span />");j.appendTo(n);n=j[0];j.attr({refresh:"macro",macroName:"get",params:o})}wikify((x?"{{lf_get{\n%0\n}}}<<listfiltr>>":"%0").format([e.trim(c)]),n)},refresh:function(n,r){e(n).empty();t.handler(n,"get",r.readMacroParams(),null,r)},getValues:function(e,n,r,i,s,o,u){var a,f,l,c,h,p=[],d=e.parseParams("getval",null,true),v=getParam(d,"filter",null),m=u?config.macros.ns:false,c=o?v?store.filterTiddlers(v):store.getTiddlers("title"):[{title:r}];if(u)o="";if(m){m=m?m.defaults.separator:"";l=r+m+n;m=store.getTiddlerText(l);if(m){p.push([l,m]);r=store.getTiddler(l);i="tiddler";u=null}}if(!m){for(f=0;f<c.length;f++){h=undefined;l=c[f].title;if(u||i=="field"){h=store.getValue(l,u?n:s);if(u&&h)i="field"}if(!h){if(u){h=store.getTiddlerText(l+"::"+n);if(h)i="slice";if(!h){h=store.getTiddlerText(l+"##"+n);if(h)i="section"}if(!h){h=store.getTiddlerText(n);if(h){i="tiddler"}}}else{h=store.getTiddlerText((o?l:"")+n)}}a=h&&h.length==12?Date.convertFromYYYYMMDDHHMM(h):undefined;if(a&&!isNaN(a.getMonth))h=a.formatString(t.template.dateFormat);if(h){p.push([l,h])}}}return p}};config.filters.get=function(e,t){var n=t.index==0,r=config.filters.get.delimiterRegExp.exec(t[3]),i=r?r[1]:t[3],s=r?r[2]:"",o=r?r[3]:"",u=n?store.getTiddlers("title"):e.slice();e=[];u.map(function(t){if(i&&i==t.title||!i&&(s=="??"&&store.getValue(t.title,o)||store.getTiddlerText(t.title+s+o)))e.pushUnique(t)});return e};config.filters.get.delimiterRegExp=/(.*)?(\#\#|::|\?\?)(.*)/})(jQuery)
//%/
I just started using this tonight and decided to save it. Got the above and did google searches and mess with my internet sites and all that crud.

Then I took a minute and thought, it's a .html file. Let's try saving it from File > Save As in IE and renaming it. So I did that and named it "test." I then opened test.html with "Open With" in IE from where I saved it and did a couple changes, then I saved it using the "save" feature in the "backstage" shortcut in the upper right. It saved this time. I went and looked in the folder where "test.html" was saved and it saved it how tiddlywiki claimed they name saved files: test.eightnumbers.morenumbers

I closed IE and then opened test.numbers.numbers and it opened and it had kept my changes.

My guess is that the "empty" file that they sent to get started with is not working correctly or maybe you just need to do this anyways.

Hope this helps someone.
'' Getting an empty TiddlyWiki file from tiddlywiki.com ''
* Right click on http://www.tiddlywiki.com/empty.html
* Choose "Save link as..." or "Save target as..."
* Save the file to your desktop or somewhere else
* Go to the file you just saved and double click it

'' Getting a previous version of TiddlyWiki ''

* Visit http://www.tiddlywiki.com/archive/

'' Getting a hosted TiddlyWiki on Tiddlyspot ''
* Go to http://tiddlyspot.com
* Enter a site id and password
* Click create
* Your TiddlyWiki is now useable online
* To download:
** Click the download link
** Save the file on your desktop or somewhere
** Double click it to open it 

'' Downloading a TiddlyWiki hosted somewhere else ''

* As with an empty TiddlyWiki file, but with the specific url
* Or install [http://tiddlywiki.bidix.info/#download.php download.php] on your server to be able to create a download link as in a Tiddlyspot's TiddlyWiki.

[[Category:FAQ]]
[[Category:Getting Started]]
TiddlyWiki uses this [[shadow tiddler|Shadow Tiddlers]] for information aiming at getting you started. If your TiddlyWiki as well has a dedicated purpose, override its contents to provide an introduction for it.
!Summary
The shadow tiddler GettingStarted by default contains information about how to start using TiddlyWiki and is referenced from your [[MainMenu|MainMenu__shadow]] and loaded on startup via [[DefaultTiddlers|DefaultTiddlers__shadow]].
!Customization
You can overwrite it with any contents you desire or change the tiddler [[DefaultTiddlers|DefaultTiddlers__shadow]] in order to define other tiddlers for startup.
!Considerations
A good use for it is to explain what your TiddlyWiki is about, especially when you plan on redistributing it or showcase your own [[plugins|Plugin]] and [[macros|Macro]].
This section provides an overview of terminology used with TiddlyWiki...
|table100|k
|>| last updated from @glossary on 31, January 2013 |
|width:50%; !TiddlyWiki Terms | !TiddlySpace Terms |
|<<list filter [tag[Glossary]]>><<listfiltr>>|<<list filter "[tag[TiddlySpace Glossary]]">><<listfiltr>>|
/%

@GLOSSARY HAS BEEN UNINCLUDED ON 06.02.2013 FROM THIS SPACE TO HAVE MORE CONCEPTUAL FREEDOM IN @TIDDLYWIKI.

THE FOLLOWING TERMS FORM @GLOSSARY WERE EITHER CHANGED, REMOVED OR IGNORED...

;[[Discoursive]]
:context?!?

;EditTemplate Tiddler
:no references
:too specific
:dead links

;[[Following]]
:replaced by [[Follow]]

;[[glossary]]
:replaced by [[Glossary]]
:and [[TiddlySpace Glossary]]

;[[Including]]
:replaced by [[Include]]
;SiteInfo Tiddler
:replaced with SiteInfo

;[[TiddlySpace Discussion]]
:not a term
:changed to [[Discussion Groups]]

;[[ViewTemplate Tiddler]]:[
:no references
:too specific
:dead links

!END%/
|Name|GotoPlugin|
|Source|http://www.TiddlyTools.com/#GotoPlugin|
|Documentation|http://www.TiddlyTools.com/#GotoPluginInfo|
|Version|1.9.2|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|view any tiddler by entering it's title - displays list of possible matches|
''View a tiddler by typing its title and pressing //enter//.''  As you type, a list of possible matches is displayed.  You can scroll-and-click (or use arrows+enter) to select/view a tiddler, or press escape to close the listbox to resume typing.  When the listbox is not displayed, pressing //escape// clears the current input.
/***
|''Name''|GroupByPlugin|
|''Description''|Mimics allTags macro to provide ways of creating lists grouping tiddlers by any field|
|''Version''|0.6.1|
|''Author''|Jon Robson|
|''Status''|beta|
!Usage
{{{<<groupBy tags>>}}}
mimics allTags macro

{{{<<groupBy server.bag>>}}}
groups by the server.bag field (this version contains TiddlySpace specific code for turning a bag into a space name)

{{{groupBy modified dateFormat:"YYYY"}}}
group tiddlers by year.

{{{<<groupBy tags exclude:excludeLists exclude:systemConfig>>}}}
group tiddlers by tag but exclude the tags with values excludeLists and systemConfig

Within that group you can also exclude things by filter
{{{groupBy modifier filter:[tag[film]]}}}
will group tiddlers tagged with film by modifier.
***/
//{{{
(function($) {
var taglocale = config.views.wikified.tag;
var macro = config.macros.groupBy = {
	locale: {
		tooltip: "all tiddlers in group %0",
		noTiddlers: "no tiddlers",
		openAllText: taglocale.openAllText,
		openAllTooltip: taglocale.openAllTooltip,
		openTiddler: "open tiddler with title %0"
	},
	morpher: {
		// TODO: note currently the following 2 morphers are TiddlySpace specific and probably should be in separate plugin
		"server.workspace": function(value, options) {
			return macro.morpher["server.bag"](value.replace("bags/", "").replace("recipes/", ""));
		},
		"server.bag": function(value, options) {
			if(typeof(value) !== "string") {
				return false;
			} else if(value.indexOf("_public") === -1 && value.indexOf("_private") === -1) {
				value = "*%0".format(value); // add star for non-space bags.
			}
			return value.replace("_public", "").replace("_private", "");
		},
		created: function(value, options) {
			return value.formatString(options.dateFormat || "DD MMM YYYY");
		},
		modified: function(value, options) {
			return macro.morpher.created(value, options);
		}
	},

	handler: function(place, macroName, params, wikifier, paramString) {
		var field = params[0] || "server.workspace";
		var dateFormat = params[1] || "DD MMM YYYY";
		var container = $("<div />").attr("macroName", macroName).addClass("groupBy").
			attr("refresh", "macro").attr("fieldName", field).
			attr("paramString", paramString).
			attr("dateFormat", dateFormat).appendTo(place)[0];
		macro.refresh(container);
	},
	isTypeArray: function(value) {
		var valueType = typeof value;
		if(valueType === "object" && typeof value.length === "number" &&
			!(value.propertyIsEnumerable("length")) &&
			typeof value.splice === "function") { //is Array
			return true;
		} else {
			return false;
		}
	},
	_onClickGroup: function(ev, options) {
		var i, target = ev.target, locale = macro.locale;
		var tiddlers = $(target).closest(".templateContainer").data("tiddlers");
		var popup = $(Popup.create(target)).addClass("taggedTiddlerList")[0];
		var value = $(target).attr("value");
		var openAll = createTiddlyButton($("<li />").appendTo(popup)[0],
			locale.openAllText.format(value), locale.openAllTooltip);
		$(openAll).click(function(ev) {
			story.displayTiddlers(ev.target, tiddlers);
			return false;
		});
		var listBreak = $("<li />").addClass("listBreak").html("<div />").appendTo(popup);
		for(i = 0; i < tiddlers.length; i++) {
			var item = $("<li />").appendTo(popup)[0];
			var template = store.getTiddlerText(options.template) || macro.template;
			wikify(template, item, null, tiddlers[i]);
		}
		listBreak.clone().appendTo(popup);
		$(createTiddlyLink($("<li />").appendTo(popup)[0], value, false)).
			text(locale.openTiddler.format(value));
		Popup.show();
		ev.stopPropagation();
		return false;
	},
	_refresh: function(container, tiddlers, options) {
		var totalGroups = 0, locale = macro.locale, i, j;
		var excludeValues = options.exclude;
		var values = {}, value_ids = [];
		var field = options.field;
		var morpher = macro.morpher[field] || function(value) {
			return value;
		};
		for(i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			var value = tiddler[field] || tiddler.fields[field];
			value = macro.isTypeArray(value) ? value : [ value ];
			for(j = 0; j < value.length; j++) {
				var v = morpher(value[j], options);
				if(v && $.inArray(v, excludeValues) === -1) {
					totalGroups += 1;
					if(!values[v]) {
						values[v] = [];
					}
					values[v].push(tiddler);
					value_ids.pushUnique(v);
				}
			}
		}
		var ul = $("<ul />").appendTo(container)[0];
		if(totalGroups === 0) {
			$("<li />").addClass("listTitle").text(locale.noTiddlers);
		}
		value_ids = value_ids.sort();
		var groupTemplate = store.getTiddlerText(options.groupTemplate);
		var onClick = function(ev) {
			macro._onClickGroup(ev, options);
		};
		for(i = 0; i < value_ids.length; i++) {
			var title = value_ids[i];
			var info = getTiddlyLinkInfo(title);
			tiddlers = values[title];
			var btn = createTiddlyButton($("<li />").appendTo(ul)[0],
				"%0 (%1)".format(title, tiddlers.length), locale.tooltip.format(title), null, info.classes);
			if(groupTemplate) {
				$(btn).empty();
				wikify(groupTemplate, btn, null, tiddlers[0]);
			}
			$(btn).click(onClick).attr("value", title).attr("refresh", "link").attr("tiddlyLink", title);
			$(btn).addClass("templateContainer").data("tiddlers", tiddlers);
		}
	},
	refresh: function(container) {
		container = $(container).empty();
		var paramString = container.attr("paramString");
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var options = { field: container.attr("fieldName"), dateFormat: container.attr("dateFormat"), exclude: args.exclude || [],
			template: args.template ? args.template[0] : false, groupTemplate: args.groupTemplate ? args.groupTemplate[0] : "" };
		var tiddlers = args.filter ? store.filterTiddlers(args.filter[0]) : store.getTiddlers("title");
		macro._refresh(container, tiddlers, options);
	},
	template: "<<view title link>>"
};

}(jQuery));
//}}}
[[Hypertext Markup Language|http://en.wikipedia.org/wiki/HTML]] provides the structural framework for a classical TiddlyWiki. Its next generation, TiddlyWiki5, builts on HTML5 catering a growing need for dynamic components.

You can embed HTML directly in TiddlyWiki using [[HTML Formatting]].
!Summary
Use HTML entities to enter characters that can't easily be typed on an ordinary keyboard. They take the form of an ampersand ({{{&}}}), an identifying string, and a terminating semi-colon ({{{;}}}), e.g. {{{&amp;}}}.
!Markup
{{{
The value of Tiddlers&trade; cannot even be expressed in &pound;, &euro; or &dollar;.
}}}
''Displays as:''
The value of Tiddlers&trade; cannot even be expressed in &pound;, &euro; or &dollar;.

!"""Entity References"""
Comprehensive lists of html entities can be found at...
* [[w3schools.com|http://www.w3schools.com/tags/ref_entities.asp]]
* [[htmlhelp.com|http://www.htmlhelp.com/reference/html40/entities]]

!"""Examples Of Common And Eseful Entities"""
|>|>|>|>|>|>| !HTML Entities |
| &amp;nbsp; | &nbsp; | no-break space | &nbsp;&nbsp; | &amp;apos; | &apos; | single quote, apostrophe |
| &amp;ndash; | &ndash; | en dash |~| &amp;quot; | " | quotation mark |
| &amp;mdash; | &mdash; | em dash |~| &amp;prime; | &prime; | prime; minutes; feet |
| &amp;hellip; | &hellip; |	horizontal ellipsis |~| &amp;Prime; | &Prime; | double prime; seconds; inches |
| &amp;copy; | &copy; | Copyright symbol |~| &amp;lsquo; | &lsquo; | left single quote |
| &amp;reg; | &reg; | Registered symbol |~| &amp;rsquo; | &rsquo; | right  single quote |
| &amp;trade; | &trade; | Trademark symbol |~| &amp;ldquo; | &ldquo; | left double quote |
| &amp;dagger; | &dagger; | dagger |~| &amp;rdquo; | &rdquo; | right double quote |
| &amp;Dagger; | &Dagger; | double dagger |~| &amp;laquo; | &laquo; | left angle quote |
| &amp;para; | &para; | paragraph sign |~| &amp;raquo; | &raquo; | right angle quote |
| &amp;sect; | &sect; | section sign |~| &amp;times; | &times; | multiplication symbol |
| &amp;uarr; | &uarr; | up arrow |~| &amp;darr; | &darr; | down arrow |
| &amp;larr; | &larr; | left arrow |~| &amp;rarr; | &rarr; | right arrow |
| &amp;lArr; | &lArr; | double left arrow |~| &amp;rArr; | &rArr; | double right arrow |
| &amp;harr; | &harr; | left right arrow |~| &amp;hArr; | &hArr; | double left right arrow |
!"""Accented Characters"""
The table below shows how accented characters can be built up by subsituting the underscore (_) into the corresponding character:
|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|>| !Accented Characters |
| grave accent | &amp;_grave; | &Agrave; | &agrave; | &Egrave; | &egrave; | &Igrave; | &igrave; | &Ograve; | &ograve; | &Ugrave; | &ugrave; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; |
| acute accent | &amp;_acute; | &Aacute; | &aacute; | &Eacute; | &eacute; | &Iacute; | &iacute; | &Oacute; | &oacute; | &Uacute; | &uacute; | &nbsp; | &nbsp; | &Yacute; | &yacute; | &nbsp; | &nbsp; |
| circumflex accent | &amp;_circ; | &Acirc; | &acirc; | &Ecirc; | &ecirc; | &Icirc; | &icirc; | &Ocirc; | &ocirc; | &Ucirc; | &ucirc; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; |
| umlaut mark | &amp;_uml; | &Auml; | &auml; |  &Euml; | &euml; | &Iuml; | &iuml; | &Ouml; | &ouml; | &Uuml; | &uuml; | &nbsp; | &nbsp; | &Yuml; | &yuml; | &nbsp; | &nbsp; |
| tilde | &amp;_tilde; | &Atilde; | &atilde; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &Otilde; | &otilde; | &nbsp; | &nbsp; | &Ntilde; | &ntilde; | &nbsp; | &nbsp; | &nbsp; | &nbsp; |
| ring | &amp;_ring; | &Aring; | &aring; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; |
| slash | &amp;_slash; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &Oslash; | &oslash; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; |
| cedilla | &amp;_cedil; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &nbsp; | &Ccedil; | &ccedil; |
!Summary
TiddlyWiki provides support for rendering pure HTML markup. To do this, simply wrap your HTML code in {{{<html>your html markup goes here</html>}}}. This way you are able to use embed code using iFrames often suggested by popular media sites like ~YouTube.
!!"""Embedded HTML"""
{{{
<html>
<span style="padding-right:30px;font-size:2em;">any</span><br />
<b>valid</b> <em>xhtml</em>
</html>
}}}
<html><span style="padding-right:30px;font-size:2em;">any</span><br /><b>valid</b> <em>xhtml</em></html>
!!"""Embedded iFrame"""
{{{
<html>
<iframe src="http://www.youtube.com/embed/Cj6ho1-G6tw"
  width="450" height="315" frameborder="0" allowfullscreen/>
</html>
}}}
<html>
<iframe src="http://www.youtube.com/embed/Cj6ho1-G6tw?vq=hd720&iv_load_policy=3"
  width="450" height="315" frameborder="0" allowfullscreen/>
</html>
|cssClass|k
|!heading column 1|!heading column 2|h
|left aligned | right aligned|
| centered ||
|>|COLSPAN|
|ROWSPAN|color:red;red|
|~|color:green;green|
|>|footer&trade;|f
|caption|c
{{{
|cssClass|k
|!heading column 1|!heading column 2|h
|left aligned | right aligned|
| centered ||
|>|COLSPAN|
|ROWSPAN|color:red;red|
|~|color:green;green|
|>|footer&trade;|f
|caption|c
}}}
* columns are delimited by a single pipe character ({{{|}}})
* a new line creates a new row
* to merge a cell with the one to its right (colspan) use a greater than ({{{>}}})
* to merge a cell with the one above (rowspan) use a tilde ({{{~}}})
* append a {{{h}}} after the last {{{|}}} to turn the row into a header row
* prepend a row {{{|someClass|k}}} to define a css class for the entire table
* add a line {{{|caption|c}}} to define a caption for the table
* [[valid css|http://www.w3schools.com/css]] directly following the pipe character finished with a semi-colon is applied to the cell
The [[TiddlySpace API]] is built on top of the TiddlyWeb HTTP API, which is described in the [[tiddlyweb documentation|http://tiddlyweb.peermore.com/wiki/#%5B%5BHTTP%20API%5D%5D]]. For example, you can [[click here|/tiddlers?select=tag:!excludeLists]] for a list of all tiddlers in this [[TiddlyWiki.org]] in their html representation.
!Summary
Start a line using exclamation marks to create headings.
!Markup
{{{
!Heading Level 1
!!Heading Level 2
!!!Heading Level 3
!!!!Heading Level 4
!!!!!Heading Level 5
!!!!!!Heading Level 6
}}}
!Heading Level 1
!!Heading Level 2
!!!Heading Level 3
!!!!Heading Level 4
!!!!!Heading Level 5
!!!!!!Heading Level 6
Need help? Please, browse the [[FAQ]], first.

There are a number of google discussion groups revolving around TiddlyWiki related topics.
!"""Main Discussion Groups"""
;[[TiddlyWiki Discussion Group|groups.google.com/group/tiddlywiki]]
:» most frequented user discussion group
:» how to use and achieve stuff in TiddlyWiki
:» troubleshooting
:» using plugins
;[[TiddlyWikiDev Discussion Group|groups.google.com/group/tiddlywikidev]]
:» plugin development
:» TiddlyWiki development
:» release and beta discussions
;[[TiddlySpace Discussion Group|groups.google.com/group/tiddlyspace]]
:» using TiddlySpace
:» how to and troubleshooting
:» TiddlySpace plugins
;[[TiddlyWeb Discussion Group|groups.google.com/group/tiddlyweb]]
:» development focus
:» release and beta discussions for TiddlyWeb
:» change management
!"""Other Discussion Groups"""
;[[TiddlyWikiFR Discussion Group|groups.google.com/group/tiddlywikifr]]
:» pour ceux entre vous qui aiment le TiddlyWiki
;[[TiddlyWiki GTD Discussion Group|https://groups.google.com/forum/?fromgroups=#!forum/tiddlywiki-gtd]]
:» a TiddlyWiki discussion group focussing on GTD
;[[TWMobileApp Discussion Group|groups.google.com/group/twmobileapp]]
:» around [[TWMobile|https://itunes.apple.com/de/app/twmobile/id381945222?mt=8]] -- TiddlyWiki for iOS
!More Communication Tools
;[[TiddlyWiki IRC Channel]]
:direct chat with community members and developers
<<tiddler [[Comment Formatting]]>>
<<tiddler [[Comment Formatting]]>>
/***
|Name:|HideWhenPlugin|
|Description:|Allows conditional inclusion/exclusion in templates|
|Version:|4.0.0|
|Date:|2010-09-09|
|Author:|Simon Baird, Tobias Beer|
|Source:|http://mptw.tiddlyspot.com/#HideWhenPlugin|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
For use in ViewTemplate and EditTemplate. Example usage:
{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}
{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}
***/
//{{{

window.hideWhenLastTest = false;

window.removeElementWhen = function(test,place) {
	window.hideWhenLastTest = test;
	if(test){
		removeChildren(place);
		place.parentNode.removeChild(place);
	}
};

(function(){
var s,show=false,f,fs={
	When:'eval(paramString)',
	WhenTagged:'tiddler.tags.containsAll(params)',
	WhenTaggedAny:'tiddler.tags.containsAny(params)',
	WhenTaggedAll:'tiddler.tags.containsAll(params)',
	WhenExists:'store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])',
	TitleIs:'tiddler.title == params[0]',
	'"else"':'!window.hideWhenLastTest'
}
for(var f in fs){
	do{
		s=f=='"else"'?'':(show?'show':'hide');
		eval('merge(config.macros,{\n'+s+f+':{\n'+
			'handler:function(place,macroName,params,wikifier,paramString,tiddler){\n'+
				'removeElementWhen('+(show?'!':'')+fs[f]+',place);\n'+
			'}}});');
		show=!show&&s!='';
	}while(show);
}
})();
//}}}
FAQ about using the [[HideWhenPlugin from MPTW|http://mptw.tiddlyspot.com/#HideWhenPlugin]].
!!Using ~HideWhen to do conditional toolbars based on user name
Replace the normal toolbar comand in the ViewTemplate tiddler with the following:
{{{
 <div class='toolbar'
          macro="showWhen config.options.txtUserName == '~MyName' ">
     <span macro='toolbar editTiddler closeOthers closeTiddler'></span>
 </div>

 <div class='toolbar'
          macro="showWhen config.options.txtUserName !='~MyName' ">
      <span macro='toolbar closeOthers closeTiddler'>&lt/span>
 </div>
}}}
!!Using ~HideWhen to do conditional fields based on tags
Let suppose you have a some tiddlers tagged with "friend" and you'd like to use some custom field to maintain some information about them, say their favourite food.

In the ViewTemplate:
{{{
<div macro="showWhen tiddler.tags.contains('friend')">
   Favourite food: <span macro="view favouritefood"></span>
</div>
}}}
In the EditTemplate:
{{{
<div macro="showWhen tiddler.tags.contains('friend')">
   Favourite food: <span macro="edit favouritefood"></span>
</div>
}}}
Now you can view and edit your friends' favourite food.

If you wish to have the same field show for your business contacts as well as your friends then you would do it like this:

In the EditTemplate:
{{{
<div macro="showWhen tiddler.tags.containsAny(['friend','contact'])">
    Favourite food: <span macro="edit favouritefood"></span>
</div>
}}}
In the ViewTemplate:
{{{
<div macro="showWhen tiddler.tags.containsAny(['friend','contact'])">
    Favourite food: <span macro="view favouritefood"></span>
</div>
}}}
Note that custom fields must be lower case. See http://trac.tiddlywiki.org/ticket/356 for details.
!!Making editable custom fields appear on a new tiddler
Create a customized newTiddler button:
{{{
<<newTiddler
     label:'Add Training'
     tag:'Training'
     title:'New Training'
>>
}}}
Place the following in the EditTemplate:
{{{
<div macro="showWhen
          tiddler.tags.contains('Training') ||
          tiddler.title == 'New Training'">
    [[TrainingTemplateEdit]]
</div>
}}}
Create a TrainingTemplateEdit tiddler to put all of your desired custom fields in.

Placing each collection of custom fields in a separate tiddler helps cut down on the confusion of having multiple different things going on in your ViewTemplate & EditTemplate, as well as making it easier to safe guard against accidentally deleting or over writing one of them and losing everything.
The [[space|Space]] created for a [[user|User]] when [[registering|Register]] with [[TiddlySpace]] is called the users' [[Home Space]]. 

A [[Home Space]] has the same name as the [[user|User]] and is used by the system to store user information, such as their [[avatar|SiteIcon]].

''Note:'' It is possible for a [[user|User]] to [[add another user as a member|Add Member]] to their [[Home Space]] which eventually also allows for a [[user|User]] to remove themselves or be removed from their own [[Home Space]].
!Summary
Use four dashes on a line or the HTML tag {{{<hr>}}} to produce a horizontal rule.
!Markup
{{{
before
----
after
}}}
or
{{{
before<hr>after
}}}
''Displays as:''

before
----
after
See [[Tiddler Templates]]...
You can center an element horizontally by wrapping it in a class while applying the css {{{margin: 0 auto}}}.
!Example
The following illustrates two ways for  centering tables...
!!!Using a [[class wrapper|CSS Formatting]]
;Output
:{{x{
{{centered{
|table|cell|
}}} }}}
;Markup
:{{x{
<html><pre>
{{centered{
|table|cell|
}}}</pre></html>}}}
;[[StyleSheet...]]
:{{x{
<html><pre>
.viewer .centered table{
    margin:0 auto;
}
</pre></html>}}}
!!!Using a [[table class|Tables]]
;Output
:{{x{
|centered|k
|table|cell|
}}}
;Markup
:{{x{
<html><pre>
|centered|k
|table|cell|
</pre></html>}}}
;[[StyleSheet...]]
:{{x{
<html><pre>
.viewer table.centered{
    margin:0 auto;
}
</pre></html>}}}
The current UserName in TiddlyWiki is stored via Javascript at...
{{{
config.options.txtUserName
}}}
To display the UserName, e.g. in the SiteTitle or SiteSubtitle, you can use the [[core|Core Macros]] [[message]] macro via...
{{{
<<message "config.options.txtUserName">>
}}}
If you want to be able to edit the UserName, see [[How can I edit my UserName?]]...
!Alternative Methods
<<tabs
	txtDisplayUserName

	WikifyPlugin
	"Displaying the UserName using WikifyPlugin..."
	"How can I display my UserName somewhere?##WikifyPlugin"

	InlineJavascriptPlugin
	"Displaying the UserName using InlineJavascriptPlugin..."
	"How can I display my UserName somewhere?##InlineJavascriptPlugin"

	Transclusion
	"Displaying the UserName using Transclusion..."
	"How can I display my UserName somewhere?##Transclusion"
>>/%
!WikifyPlugin
Using [[WikifyPlugin|http://www.TiddlyTools.com/#WikifyPlugin]] from [[Eric Shulman / TiddlyTools|http://www.TiddlyTools.com/#WikifyPlugin]] you can write...
{{{
<<wikify "%0" {{config.options.txtUserName}}>>
}}}
!InlineJavascriptPlugin
Using [[InlineJavascriptPlugin|http://www.tiddlytools.com/#InlineJavascriptPlugin]] you can write:
{{{
<script>return config.options.txtUserName;</script>
}}}
!Transclusion
Create a tiddler named ''"""ShowValue"""'' containing nothing but...
{{{
$1
}}}
Then use [[transclusion|Transclusion]] entering the following where you want to display the UserName:
{{{
<<tiddler ShowValue with:{{config.options.txtUserName}}>>
}}}
{{annotation{
''Note:'' You can reuse the tiddler ''"""ShowValue"""'' with all kinds of expressions following the {{{with:}}} delimiter.
}}}<<tiddler EVAL>>
!END%/
In a standard TiddlyWiki, can edit the UserName in the OptionsPanel in the right sidebar.

However, if you rather want this in a custom tiddler of your own, use the [[option]] macro, e.g.:
{{{
UserName: <<option txtUserName>>
}}}
UserName: <<option txtUserName>>
<<tiddler EVAL>>
If you want to display your UserName, see [[How can I display my UserName somewhere?]]...
See [[AutoSave]]...
the following methods prevent superfluous trailing linebreaks when using custom [[CSS Formatting]]...
!Method 1
{{{
 {{foo{
 this is a test
 }}}{{bar{
 this is a test
 }}}
}}}
!Method 2
{{{
 {{foo{
 this is a test
 }}}/%
 %/{{bar{
 this is a test
 }}}
}}}
!Method 3
{{{
 {{foo{ this creates a span }}}
}}}

Source: http://multicolumn.tiddlyspot.com/#StyleSheet%20MaloStyleSheet%20%5B%5BTiddlerLayout%20test%5D%5D
Edit the ViewTemplate tiddler.
Edit the EditTemplate tiddler.
Use the StyleSheet tiddler.

Check out http://tiddlythemes.com for a list of themes.
Change the date format for the [[newJournal]] macro as follows:
{{{
<<newJournal 'YYYY-MM-DD'>>
}}}
The first parameter defines the [[date format|DateFormats]].

''Note:'' A classic TiddlyWiki displays a {{button{newJournal}}} button in the right sidebar using a shadow tiddler called SideBarOptions.
See [[Changing Default Options]] on how to permanently change default [[date formats|DateFormats]] for the following core macros, e.g.
; view macro
: {{{config.views.wikified.dateFormat = "MMM YYYY";}}}
; timeline macro
: {{{config.macros.timeline.dateFormat = "MMM YYYY";}}}
Edit your PageTemplate tiddler. Also see http://tiddlythemes.com/

(to be expanded)
#Install [[HideWhenPlugin|http://mptw.tiddlyspot.com/#HideWhenPlugin]]
#Modify the toolbar section in your ViewTemplate as below{{sub{
{{{
<div macro="showWhen readOnly">
  <!--simple toolbar for visitors -->
    <div macro='toolbar
      closeTiddler
      permalink'>
    </div>
  </div>
  <div macro="hideWhen readOnly">
    <!-- full toolbar for admin  -->
    <div macro='toolbar
      closeTiddler
      closeOthers
      +editTiddler
      deleteTiddler
      permalink
      references
      jump'>
    </div>
</div>
}}}
}}}
To set the default text alignment for all tiddlers, put something like this into your [[StyleSheet tiddler]]:

 .viewer {
    text-align: justify;
 }

that CSS rule will fully justify your tiddler text.


Use the [[version macro|version]]:
{{{<<version>>}}}
<<version>>
!Feeling Adventurous?
You can also open the source code of your TiddlyWiki. Near the top is a section that looks like this:
>{{{major: 2, minor: 2, revision: 6, date: new Date("Oct 18, 2007")}}}
In this case, the version is {{{2.2.6}}}.
To link to a tiddler named 'Meeting with Alice', you'd type <nowiki>[[Meeting with Alice]]</nowiki>

----
Does not work if you want to link from one space to another using a permalink :
{{{http://tiddlywiki.org/#[[How do I link to a tiddler without a wiki word name]]}}}
{{{[[Link Text|http://tiddlywiki.org/#«escape»[[«escape»How do I link to a tiddler without a wiki word name«escape»]]«escape»]]}}}
will not work.
----
Add the following to your StyleSheet tiddler...
{{{
.viewer tr, .viewer td,
.twtable tr, .twtable td {
    vertical-align:top;
}
}}}
See [[Finding A Tiddler]]...
Look for section ''Code Comments'' in [[Comment Formatting]] for examples on how to use wikified comments in JavaScript, CSS and HTML tiddlers...
No special coding is needed.  Using standard TiddlyWiki macros, add this to MainMenu:
{{{
<<tag Task "Tasks">>
}}}
This creates a link titled "Tasks" which displays a drop-down menu listing all tiddlers currently tagged with "Task".  Then, simply tag your tiddlers of interest with "Task", and click the "Tasks" button in the MainMenu for quick access.

Alternatively, you could write:
{{{
<<list filter [tag[Task]]>>
}}}
to display links directly in the MainMenu, rather than in a drop-down. Using this method, also edit your PageTemplate and change this...
{{{
<div id='mainMenu' role='navigation' refresh='content' tiddler='MainMenu'></div>
}}}
to....
{{{
<div id='mainMenu' role='navigation' refresh='content' force='true' tiddler='MainMenu'>
</div>
}}}
Adding the {{{force='true'}}} attribute to the mainMenu div causes the menu display to be refreshed each time *any* tiddler is edited, thus ensuring that the list of links displayed there is updated when you add/remove the "Task" tag from any given tiddler.
!Related Discussion
https://groups.google.com/d/msg/tiddlywiki/d_e6aObrifU/Ap97S8jV1okJ
Prevent a WikiWord from automatically becoming a link by putting a tilde (~) in front of it, e.g.:
{{{
~FooBar
}}}
~FooBar
!"""Using DisableWikiLinksPlugin"""
The [[DisableWikiLinksPlugin|http://www.tiddlytools.com/#DisableWikiLinksPlugin]] gives several options to customize automatic WikiWord linking, such as disabling it completely or only for tiddlers which don't already exist. After importing the plugin, these options must be enabled manually in the DisableWikiLinksPlugin tiddler; it may also be necessary to close and re-open the TiddlyWiki browser page before using the plugin for the first time.

All options are off by default, so settings applied by one user/in one browser will not be active for others. If you want to ensure that your options are in effect for, say, Web viewers, you can create a tiddler, e.g. DisableWikiLinksDefault, with a [[systemConfig]] tag and content like this:
{{{
 config.options.chkDisableWikiLinks=false;
 config.options.chkAllowLinksFromShadowTiddlers=false;
 config.options.chkDisableNonExistingWikiLinks=false;
 config.options.txtDisableWikiLinksList="DisableWikiLinksList";
 config.options.txtDisableWikiLinksTag="excludeWikiWords";
}}}

Set the values to the defaults you prefer (e.g. change "false" to "true").

'' See Also ''

* [[WikiWords]]
* [[Escaping#Wiki_Markup]]
[[Category:FAQ]]
[[Category:Using TiddlyWiki]]
See [[Alternative Tiddler Layouts]]...
Chances are, you won't find the latest version of TiddlyFox in the Mozilla addons repository.

As of Firefox beta 25 on Android 4.3, you can...
#download the latest version of TiddlyFox from Github using Chrome from
#*https://github.com/TiddlyWiki/TiddlyFox/raw/master/tiddlyfox.xpi
#go to your download folder using a file manager app, like OI file manager
#since the file manager wont open the ''.xpi'', copy or remember the path
#in Firefox, open / paste the path pointing to the local ''tiddlyfox.xpi''
#*for example: {{{file:///storage/emulated/0/Download/tiddlyfox.xpi}}}
#the install dialog should pop up followed by a restart

Now you should have a running TiddlyWiki on Firefox for Android!

!Related Discussion
https://groups.google.com/d/msg/tiddlywiki/aohMMgkoub4/JepqxntWyHoJ

!A Slightly Alternative Method
* open the TiddlyFox Github page in Firefox (used the desktop version)
*download the .xpi
*close Firefox
*use ''ES File Explore'' to open the .xpi with Firefox
*clicked ok to install
*reboot Firefox
*start using TiddlyWiki

[[These steps|https://groups.google.com/d/msg/tiddlywiki/aohMMgkoub4/l0Eac3hqNH4J]] were performed with Firefox Beta from the Google app store working as expected. Try clearing your Firefox cache, starting over with a clean slate.
To create more than one journal tiddler per day, you can alter the newJournal macro in the sidebar to include the current time rather than just the day in the tiddler title.
# in the sidebar, click the tab ''More'' and then ''Shadowed''
# open the tiddler SideBarOptions
# ''edit'' and find the definition for the newJournal macro
#* {{{<<newJournal "DD MMM YYYY" "journal">>}}}
# change the [[date format string|DateFormats]] to a datetime format, e.g.
#* {{{<<newJournal "YYYY-0MM-0DD 0hh-0mm-0ss" "journal">>}}}
#* a tiddler thus created will be called ''2013-11-04 15-17-25''
#* using this date format, listing journal tiddlers by tiddler title will also sort them by date
# save your changes and reload

If you now click 'new journal' button you create a new tiddler with the name of the current day and time in seconds, i.e. a 'unique' journal entry.
By default TiddlyWiki will make backups with each 'Save Changes' in the right hand sidebar.


You can't save from the browser's internal File -> Save as.. (crl-s) dialog. 
See: [[TiddlyWiki has been incorrectly saved]]


For limiting the number of backups there are different plugins available.
See: [[Backups]]


You can make copies of TiddlyWiki files from your file system too.
# download the latest ''empty.zip'' from http://www.TiddlyWiki.com and extract a copy of ''"""empty.html"""''
# load your existing TW document into the browser 
# invoke ''save changes'' to create a backup copy of the current document 
# replace the existing TW document's file on disk with a copy of the latest ''"""empty.html"""'' 
# invoke ''save changes'' again 
# reload your document

source and details: [[Post by Eric Shulman on the Google Groups|https://groups.google.com/d/msg/tiddlywiki/IZLKHHfewh4/T_WRXNBjHeoJ]]
First, set up a CSS rule to do the justification.  Add something like
this to your StyleSheet tiddler (find it on tab More => Shadowed):
{{{
 .justifyright {
  text-align: right;
 }
}}}
that gives you a css class of justifyright that you can use to make
stuff be right-aligned.  Make sure you get the dot at the start of
".justifyright".

Now, edit some tiddler and put the stuff you want to justify inside
triple-curly-brackets, with the CSS class after the first two.  You
will need to put the brackets on lines by themselves.

{{justifyright{
This paragraph will be right-aligned.
}}}

If you want full justification, add a CSS rule like this, and then use
"justifyfull" inside the triple curlies:

{{{
 .justifyfull {
    text-align: justify;
 }
}}}

Note that '''this won't work''' if you use the triple curlies inline:
{{{
{{justifyright{ DOESN'T WORK: This is not right justified }}}
}}}
{{justifyright{ DOESN'T WORK: This is not right justified }}}

This is because triple curlies make spans if you use them inline
<nowiki>{{{like this}}}</nowiki>, but divs if you use them on lines by themselves.


There are a lot of interesting people using ~TiddlySpace that you might like to keep track of and interact with. There are a number of ways of doing this.

If you see a number in the speech bubble in one of your tiddlers, it means that someone is writing about the same thing as you. You can find out what they're saying by clicking on it. Likewise, if you see something interesting in someone else's space, you can respond to it and write up your own thoughts on the subject by clicking "Reply to this tiddler".

Additionally, if you find anyone interesting, or you find an interesting looking space and you'd like to know when it's changed, you can "follow" that space. To do this, simply create a tiddler with the title: {{{@space-name}}} and tag it {{{follow}}}. If you want, you can store some notes about that space in the body of the tiddler.

If you then want to know what happening, simply [[include|How do I include/exclude spaces?]]@docs the @tivity space and then visit your activity stream at [[/activity|/activity]], or just visit the @tapas space directly.

!Not sure who to follow?
Here's a few suggestions:
* @fnd
* @cdent
* @pmario
* @bengillies
* @dickon
The following steps explain how you can setup your TiddlyWiki for use as a public website.
{{annotation{
''Note: ''Due to the nature of Javascript TiddlyWiki generally provides virtually no means to hide what is going on behind the scenes.
}}}
!Read Only Mode
You can add the following to a tiddler called //zzConfig// tagged [[systemConfig|Plugins]]:
{{{
if(config.options.txtUserName != "adminname") {
	showBackstage = false;
	readOnly = true;
}
}}}
{{annotation{
This plugin is automatically run in the background when TiddlyWiki loads. The prefix zz ensures that this config tiddler is loaded "last" in order to override any previous commands.
}}}
This will achieve the following effects:
;{{{if(config.options.txtUserName != "AdminUserName") }}}
:ensures that read-only mode is only enforced when the UserName set in the options panel is something other than //~AdminUserName//
;{{{showBackstage = false;}}}
:hides the [[Backstage]] area
;{{{readOnly = true;}}}
:displays a different tiddler [[Toolbar]] to the user, i.e instead of an //edit// command you will most often only find a //view// command
In order to edit a wiki in read-only mode, enter the user name in the options panel in the sidebar and reload the wiki. Now you will again be able to use the edit command in the tiddler toolbar. This user name is stored as a cookie in your browser, i.e. you will be logged in for the lifetime of this cookie. No visitor should accidentally view your wiki in edit-mode.
!Hiding The Right Sidebar
In order to hide the right hand side bar for visitors, import the following plugins from [[TiddlyTools]]:
http://www.TiddlyTools.com/#InlineJavascriptPlugin
http://www.TiddlyTools.com/#ToggleRightSidebar
To have the sidebar hidden upon TidlyWiki start, add the following to the aforementioned zzConfig tiddler:
{{{
config.options.chkShowRightSidebar=false;
}}}
{{annotation{
Note: If you put it in the same section that only applies for visitors, you will always see the sidebar whereas your visitors do not.
}}}
Before hiding the right sidebar to your visitors, you should ensure that you can access it yourself by
# simply opening the shadow tiddlers SideBarOptions or SideBarTabs tiddlers, e.g. via yourwiki.html/#SideBarOptions
# creating a hidden or hardly visible element that allows you to toggle the sidebar
#* you could append the following to the shadow tiddler SiteSubtitle {{{<<tiddler ToggleRightSidebar with: ".">>}}}
#* the dot thus added to the subtitle of your TiddlyWiki will now allow you to toggle the sidebar
!!Different Toolbar For Web Users
If you want diffenent toolbars, including the possibility to turn off double-clicking to edit, please see..
[[How do I have a different tiddler toolbar for web users?]]
!Showing One Tiddler At A Time
To enable single-page mode as in most normal web pages...
#import [[SinglePageModePlugin|http://www.TiddlyTools.com/#SinglePageModePlugin]]
#add {{{config.options.chkSinglePageMode= true;}}} to your zzConfig
!Admin Tools
For quick access to admin features, you can add {{{<<tiddler Admin>>}}} to the shadow tiddler SideBarOptions for quick acces to your most needed features and then create a tiddler called //Admin// containing things like...
;{{{<<option txtUserName>>}}}
:enter your username
;{{{<<upload http://yoursite.tiddlyspot.com/store.cgi index.html . . yoursite>>}}}
:upload your TiddlyWiki hosted on TiddlySpot using UploadPlugin
;[[zzConfig]]
:access and modify your zzConfig
This message is displayed by Firefox whenever some javascript is taking a long time to run. It can happen with a TiddlyWiki file if you have a lot of tiddlers or are using some plugins that do some extra work that takes a long time. You can get rid of the messages by making Firefox's maximum script run time a little longer. Here's how it's done:
* Type about:config in the address bar and press enter.
* Scroll down until you see dom.max_script_run_time
* Double click it and type in 20 seconds (the default is 5 seconds)
''Answer''
TiddlyWiki is a little different to other Wikis you may have encountered before. Most wikis run on a server and the code to save your changes is server code. TiddlyWiki is different. It runs entirely in your web browser. All the code to save your changes is written in Javascript and contained in the TiddlyWiki file. To save changes your browser must be able to write to local disk using javascript. This means you can only edit and save changes to a TiddlyWiki file that is on a local disk. If you put your TiddlyWiki file on your web site any changes made to it can't be saved.

(TODO, explain the "HideEditFeaturesOverHttp" or link to explanation)

(This can be a useful way to publish a web site. You can edit and save your site to your local TiddlyWiki file on your local disk. When it's finished simply upload the file for the rest of the world to see).

The above information applies to a standard, off-the-shelf TiddlyWiki. However, there ''are'' some ways you can get an editable/saveable TiddlyWiki via the web.

'' Options for making TiddlyWiki editable/saveable via the web ''

There are a [[Multi-User Collaboration|number]] of [[Server-Side_Implementations|server-sides]] that make it possible to save over HTTP.

Alternatively, a hosted service like [[Tiddlyspot]] can be used for convenience.
[[Category:FAQ]]
[[Category:Getting Started]]
<<tiddler Images>>
/***
|''Name''|ImageMacroPlugin|
|''Version''|0.9.4|
|''Description''|Allows the rendering of svg images in a TiddlyWiki|
|''Author''|Osmosoft|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''Notes''|Currently only works in modern browsers (not IE)|
|''Requires''|BinaryTiddlersPlugin|
!Usage
{{{<<image SVG>>}}} will render the text of the tiddler with title SVG as an SVG image (but not in ie where it will fail silently)
!!Parameters
width/height: specify width/height parameters
link: make the image link to a given location
tiddlyLink: link to a tiddler

!Notes
Binary tiddlers in TiddlyWeb when passed through the wikifier will be shown as images.
eg. {{{<<view text wikified>>}}} on a binary tiddler will show the image.
{{{<<view fieldname image>>}}}
will render the value of the tiddler field 'fieldname' as an image. This field can contain a tid
{{{<<image SiteIcon>>}}}
will create an image tag where the tiddler has content type beginning image and not ending +xml
will attempt to create svg object in other scenarios
{{{<<image /photos/x.jpg>>}}}
will create an image tag with src /photos/x.jpg as long as there is not a tiddler called /photos/x.jpg in 
which case it will render that tiddler as an image. Note for the case of svg files it will attempt to render as an svg if possible via the image
tag. It doesn't embed the svg in the dom for security reasons as svg code can contain javascript.
!Code
***/
//{{{
(function($) {

var macro = config.macros.image = {
	shim: "/bags/common/tiddlers/shim",
	ieVersion: config.browser.isIE ? parseInt(config.browser.ieVersion[1], 10) : false,
	svgns: "http://www.w3.org/2000/svg",
	xlinkns: "http://www.w3.org/1999/xlink", 
	svgAvailable: document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"),
	_fixPrefix: 1,
	_external_cache: {},
	_image_tag_cache: {},
	_image_dimensions: {},
	locale: {
		badImage: "This image cannot be displayed."
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler){
		var imageSource = params[0];
		// collect named arguments
		var args = macro.getArguments(paramString, params);
		this.renderImage(place, imageSource, args);
	},
	init: function() {
		var startupImages = store.getTaggedTiddlers("systemImage");
		var place = $("<div />").attr("id", "systemImageArea").appendTo("body").hide()[0];
		for(var i = 0; i < startupImages.length; i++) {
			var image = startupImages[i];
			macro.renderImage(place, image.title, { idPrefix: "" });
		}
		var data = new Image();
		data.onload = function() {
			// note ie 8 only supports data uris up to 32k so cannot be relied on
			macro.supportsDataUris = this.width != 1 || this.height != 1 ? false : true;
			macro.supportsDataUris = macro.ieVersion && macro.ieVersion < 9 ? false : macro.supportsDataUris;
		};
		data.onerror = data.onload;
		data.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
	},
	refreshImage: function(src) {
		var elements = macro._image_tag_cache[src] ? macro._image_tag_cache[src] : [];
		if(macro._image_dimensions[src]) {
			macro._image_dimensions[src] = false;
		}
		for(var i = 0; i < elements.length; i++) {
			var el = $(elements[i]);
			var newSrc = "%0?nocache=%1".format(src, Math.random());
			el.attr("src", newSrc); // force reload
		}
	},
	isBinaryImageType: function(contentType) {
		return (contentType && contentType.indexOf("image") === 0 &&
			contentType.indexOf("+xml") != contentType.length - 4) ? true : false;
	},
	isImageTiddler: function(tiddler) {
		return macro.isSVGTiddler(tiddler) || macro.isBinaryImageTiddler(tiddler);
	},
	isSVGTiddler: function(tiddler) {
		var type = tiddler ? tiddler.fields['server.content-type'] : false;
		return type == "image/svg+xml";
	},
	isBinaryImageTiddler: function(tiddler) {
		return macro.isBinaryImageType(tiddler.fields['server.content-type']);
	},
	renderImage: function(place, imageSource, options) {
		var imageTiddler = store.getTiddler(imageSource);
		var container;
		var classes = ["image"];
		if(options.link) {
			classes = classes.concat(["imageLink", "externalLink"]);
			container = $("<a />").attr("href", options.link).appendTo(place)[0];
		} else if(options.tiddlyLink) {
			classes.push("imageLink");
			container = createTiddlyLink(place, options.tiddlyLink, false);
		} else {
			container = $("<span />").appendTo(place)[0];
		}
		$(container).addClass(classes.join(" "));

		options = options ? options : {};
		if(imageTiddler && macro.isBinaryImageTiddler(imageTiddler)) { // handle the case where we have an image url
			return macro._renderBinaryImageTiddler(container, imageTiddler, options);
		} else if(imageTiddler){ // handle the case where we have a tiddler
			return macro._renderSVGTiddler(container, imageTiddler, options);
		} else { // we have a string representing a url
			return macro._renderBinaryImageUrl(container, imageSource, options);
		}
	},
	_renderAlternateText: function(container, options) {
		var img;
		var src = options.src || "";
		if(options.width && options.height) {
			img = $("<img />").attr("src", src).addClass("svgImageText").attr("width", options.width).
				attr("height", options.height).appendTo(container);
		}
		var alt = options.alt;
		if(img && alt) {
			img.attr("alt", alt).attr("title", alt);
		} else if(alt) {
			$(container).addClass("svgImageText").text(alt);
		}
		macro._image_tag_cache[src] = img;
	},
	_renderSVGTiddler: function(place, tiddler, options) {
		if(!options) {
			options = {};
		}
		merge(options, { tiddler: tiddler, fix: true});

		if(macro.svgAvailable) {
			this._importSVG(place, options); // display the svg
		} else if(options.altImage) {
			var image = options.altImage;
			delete options.altImage;
			this._renderBinaryImageUrl(place, image, options);
		} else {
			this._renderAlternateText(place, options); // instead of showing the image show the alternate text.
		}
	},
	_renderBinaryImageTiddler: function(place, tiddler, options) {
		var resourceURI;
		var fields = tiddler.fields;
		if(fields["server.type"] == "tiddlyweb") { // construct an accurate url for the resource
			resourceURI = "%0/%1/tiddlers/%2".format(config.defaultCustomFields["server.host"],
				fields["server.workspace"], encodeURI(fields["server.title"]));
		} else { // guess the url for the resource
			resourceURI = tiddler.title;
		}
		var ctype = fields["server.content-type"] || tiddler.type;
		var text = tiddler.text;
		if(macro.supportsDataUris && ctype && text.indexOf("<html") == -1) {
			var uri = "data:%0;base64,%1".format(ctype, text);
			options.src = resourceURI;
			return macro._renderBinaryImageUrl(place, uri, options);
		} else if(options.src) {
			return macro._renderBinaryImageUrl(place, options.src, options);
		} else {
			return macro._renderBinaryImageUrl(place, resourceURI, options);
		}
	},
	_renderImageTag: function(container, src, width, height, options) {
		var img;
		img = $("<img />").appendTo(container);
		if(height) {
			img.attr("height", height);
		}
		if(width) {
			img.attr("width", width);
		}
		if(macro.ieVersion && macro.ieVersion < 7 && macro.shim && options.ie6png) {
			$(img).css({width: userW, height: userH,
					filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%0', sizingMethod='scale')".format(src)
				}).attr("src", macro.shim);
		} else {
			img.attr("src", src);
		}
		if(!macro._image_tag_cache[options.srcUrl]) {
			macro._image_tag_cache[options.srcUrl] = [];
		}
		img = $(img).addClass(options.imageClass)[0];
		macro._image_tag_cache[options.srcUrl].push(img);
		return img;
	},
	_getDimensions: function(realDimensions, reqDimensions, preserve) {
		var w = realDimensions.width;
		var h = realDimensions.height;
		var reqh = reqDimensions.height;
		var reqw = reqDimensions.width;
		var finalw = w, finalh = h;
		var ratiow = reqw / w, ratioh = reqh / h;
		var scaledw = ratioh * w;
		var scaledh = ratiow * h;
		if(!reqw && reqh) {
			finalw = scaledw;
			finalh = reqh;
		} else if(reqw && !reqh) {
			finalw = reqw;
			finalh = scaledh;
		} else if(reqh && reqw) {
			var preserveWidth = w > h ? true : false;
			if(preserve) {
				if(preserveWidth && scaledh < reqh) {
					finalh = scaledh;
					finalw = reqw;
				} else {
					finalh = reqh;
					finalw = scaledw;
				}
			} else {
				finalw = reqw;
				finalh = reqh;
			}
		}
		return { width: parseInt(finalw, 10), height: parseInt(finalh, 10) };
	},
	_renderBinaryImageUrl: function(container, src, options) {
		var srcUrl = options.src ? options.src : src;
		srcUrl = srcUrl.indexOf("/") === -1 ? "/%0".format(srcUrl) : srcUrl; // for IE. 
		var image_dimensions = macro._image_dimensions[srcUrl];
		var image = new Image(); // due to weird scaling issues where you use just a width or just a height
		var createImageTag = function(dimensions, error) {
			if(error) {
				var altImage = options.altImage;
				if(altImage) {
					delete options.altImage;
					macro._renderBinaryImageUrl(container, altImage, options);
				} else {
					options.src = src;
					macro._renderAlternateText(container, options);
				}
			} else {
				var dim = macro._getDimensions(dimensions, { 
					width: options.width, height: options.height }, options.preserveAspectRatio);
				options.srcUrl = srcUrl;
				macro._renderImageTag(container, src, dim.width, dim.height, options);
			}
		};

		if(!image_dimensions) {
			image.onload = function() {
				var dimensions = { width: image.width, height: image.height};
				macro._image_dimensions[srcUrl] = dimensions;
				createImageTag(dimensions);
			};
			image.onerror = function() {
				createImageTag(null, true);
			};
			image.src = src;
		} else {
			createImageTag(image_dimensions);
		}
	},
	_generateIdPrefix: function(){
		return "twsvgfix_" + (this._fixPrefix++).toString() + "_";
	},
	_fixSVG: function(childNodes, idPrefix) {
		var urlPattern = /url\(\#([^\)]*)\)*/ig;
		var fixes = [
		{ attr: "id", pattern: /^(.*)$/ig },
		{ attr: "href", namespace: macro.xlinkns, pattern: /^#(.*)$/ig }
		];
		var url_fixes = ["filter", "fill", "mask", "stroke", "style"];
		for(var i = 0; i < url_fixes.length; i++) {
			fixes.push({ attr: url_fixes[i], pattern: urlPattern });
		}
		for(var t = 0; t < childNodes.length; t++) {
			var node = childNodes[t];
			for(var a = 0; a < fixes.length; a++) {
				var fix = fixes[a];
				var attr = fix.attr;
				var ns = fix.namespace || "";
				if(node.hasAttributeNS && node.hasAttributeNS(ns, attr)) {
					var v = node.getAttributeNS(ns, attr);
					fix.pattern.lastIndex = 0;
					var match = fix.pattern.exec(v);
					if(match) {
						// Make sure replacement string doesn't contain any single dollar signs
						var toReplace = match[1];
						if(toReplace.indexOf(idPrefix) !== 0 && toReplace.indexOf("twglobal_") !== 0) {
							var replacement = (idPrefix + toReplace).replace("$", "$$$$"); 
							v = v.replace(match[1], replacement);
						}
						node.setAttributeNS(ns, attr,v);
					}
				}
			}
			var children = node.childNodes;
			if(children.length > 0) {
				this._fixSVG(children, idPrefix);
			}
		}
	},
	_importSVG: function(place, options){
		options = options ? options : {};
		var svgDoc, tiddlerText = options.tiddler.text;
		if (window.DOMParser) {
			svgDoc = new DOMParser().parseFromString(tiddlerText, "application/xml").documentElement;
			var idPrefix = options.idPrefix || this._generateIdPrefix();
			this._fixSVG([svgDoc], idPrefix);
			var el = document.importNode(svgDoc, true);
			var svgHolder = document.createElementNS(macro.svgns,"svg");
			var width = options.width;
			var height = options.height;
			if(width || height) {
				if(width && height) { // set view box of containing svg element based on the svg viewbox and width and height.
					var viewBox = el.getAttribute("viewBox");
					var topLeft = "0 0";
					if(viewBox) {
						topLeft = viewBox.replace(/([0-9]*) +([0-9]*) +([0-9]*) +([0-9]*) */gi,"$1 $2");
					}
					svgHolder.setAttributeNS(macro.svgns, "viewBox", "0 0 %0 %1".format(width, height));
				} else {
					if(!width) {
						width = el.getAttribute("width");
					}
					if(!height) {
						height = el.getAttribute("height");
					}
				}
				svgHolder.setAttribute("width", width);
				svgHolder.setAttribute("height", height);

				el.setAttribute("width", "100%");
				el.setAttribute("height", "100%");
				svgHolder.setAttribute("class", "svgImage svgIcon %0".format(options.imageClass || ""));
				svgHolder.appendChild(el);
				place.appendChild(svgHolder);
			}
			else {
				var existing = el.className ? el.className.baseVal : "";
				el.setAttribute("class","svgImage %0".format(existing));
				place.appendChild(el);
			}
			// if a tiddler attribute is set this is read as a link
			$("[tiddler], [tiddlyLink]", place).attr("refresh", "link").click(function(ev) {
				var tiddler = $(ev.target).attr("tiddlyLink");
				if(tiddler) {
					story.displayTiddler(ev.target, tiddler);
				}
			});
		}
	},
	getArguments: function(paramString, params) {
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var options = {};
		for(var id in args) {
			if(true) {
				var p = args[id];
				if(id == "def") {
					options[id] = p;
				} else {
					options[id] = p[0];
				}
			}
		}
		var width = isNaN(params[1]) ? false : parseInt(params[1], 10);
		var height = isNaN(params[2]) ? false : parseInt(params[2], 10);

		options.width = macro.lookupArgument(options, "width", width);
		options.height = macro.lookupArgument(options, "height", height);
		options.preserveAspectRatio = args.preserveAspectRatio && 
			args.preserveAspectRatio[0] == "yes" ? true : false;
		options.tiddlyLink = macro.lookupArgument(options, "tiddlyLink", false);
		options.link = macro.lookupArgument(options, "link", false);
		return options;
	},
	lookupArgument: function(args, id, ifEmpty) {
		return args[id] ? args[id] : ifEmpty;
	}
};

// update views
var _oldwikifiedview = config.macros.view.views.wikified;
// update wikifier to check tiddler type before rendering
merge(config.macros.view.views, {
	wikified: function(value, place, params, wikifier, paramString, tiddler) {
		if(macro.isImageTiddler(tiddler) && params[0] == "text") {
			var newplace = $("<div />").addClass("wikifiedImage").appendTo(place)[0];
			macro.renderImage(newplace, tiddler.title, { alt: macro.locale.badImage });
		} else {
			_oldwikifiedview.apply(this, arguments);
		}
	},
	image: function(value, place, params, wikifier, paramString, tiddler) {
		// a field can point to another tiddler whereas text is the current tiddler.
		var title = params[0] == "text" ? tiddler.title : value;
		var args = macro.getArguments(paramString, params);
		macro.renderImage(place, title, args);
	}
});
config.shadowTiddlers.StyleSheetImageMacro = [".wikifiedImage svg, .wikifiedImage .image { width: 80%; }",
	".svgImageText { background-color:[[ColorPalette::Error]]; color:#ddd; display: inline-block; }",
	"span.svgImageText { display: inline-block; overflow: hidden; }"
].join("");
store.addNotification("StyleSheetImageMacro", refreshStyles);

})(jQuery);
//}}}
!Summary
Generally, images are external to TiddlyWiki. You have different means to layout the image flow.
!Markup
!!Simple Images
{{{
[img[http://tiddlywiki.org/fractal.jpg]]
}}}
[img[http://tiddlywiki.org/fractal.jpg]]
!!Images Titles
{{{
[img[tooltip|http://tiddlywiki.org/fractal.jpg]]
}}}
[img[tooltip|http://tiddlywiki.org/fractal.jpg]]
!!Image Links
{{{
[img[http://tiddlywiki.org/fractal.jpg][http://www.flickr.com/photos/jermy/10134618/]]
}}}
[img[http://tiddlywiki.org/fractal.jpg][http://www.flickr.com/photos/jermy/10134618/]]

!!Floating Images
To clear a float, append...
{{{
@@clear:both;display:block; @@
}}}

!!Floating Left...
{{{
[<img[http://tiddlywiki.org/fractal.jpg]]
@@clear:both;display:block; all clear@@
}}}
[<img[http://tiddlywiki.org/fractal.jpg]]
@@clear:both;display:block; all clear@@
!!Floating Right
{{{
[>img[http://tiddlywiki.org/fractal.jpg]]
@@float:right;clear:both;display:block; all clear@@
@@clear:both;display:block; @@
}}}
[>img[http://tiddlywiki.org/fractal.jpg]]
@@float:right;clear:both;display:block; all clear@@
@@clear:both;display:block; @@

!!See Also
*[[Image Macro|http://docs.tiddlyspace.com/#%5B%5Bimage%20macro%5D%5D]]@docs
From the [[Bakstage Area]] you can import tiddlers either from a TiddlyWiki stored on a local path or from a TiddlyWiki on the web. In general, you can import tiddlers from any TiddlyWiki, other than restrictions imposed by modern browsers which may prevent this, there are no restrictions authors can impose on what content you can import from a TiddlyWiki.
!The Import Wizard
<<importTiddlers>>
* It is not possible to import from TiddlyWiki's on servers which are not [[CORS|http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing]] enabled. Popular sites such as [[TiddlyTools|http://tiddlytools.com]] are currently not CORS enabled. Fortunately this is fixable - webmasters can enable their sites to be CORS enabled by following the instructions [[here|http://enable-cors.org]] and if a website is not CORS enabled you can e-mail the owner to tell them the problem
* Some browsers will only allow you to import from TiddlyWikis in the same directory as your TiddlyWiki. If you use Chrome you can enable this by modifying the Chrome shortcut to include the following parameter
{{{
--allow-file-access-from-files
}}}
* Note some browsers, notably Opera do not support import / upgrade in any form.
Rather than being a bug, this is one in a number of problems steming from latest browsers enforcing higher restrictions for local file access via JavaScript.
!How to import anyways?
;Step 1 — preparation
:put your original TiddlyWiki in the same folder or a subfolder of the blank, target TiddlyWiki of the newer version

;Method 1 — using ~ImportTiddlersPlugin by Eric Shulman
:» either run the [[the bookmarklet|Bookmarklets]] in your new TiddlyWiki or install it from [[TiddlyTools|http://tiddlytools.com#ImportTiddlersPlugin]]
:» rather than using the file picker which fails, enter (or copy & paste) the path to your source TiddlyWiki, e.g. {{{source.html}}}, directly directly into the file path input and then hit {{button{open}}}

;Method 2 — using ~TiddlyFileImportr by @Jon Robson
:» install it as a [[plugin|Plugins]] from [[here|http://repository.tiddlyspace.com/TiddlyFileImportr]], open the import tab in the backstage panel, and follow through the wizard
:» ''downside:'' it's a bit slow as it currently saves the TiddlyWiki creating backups with every imported tiddler
!Summary
The shadow tiddler ImportTiddlers provides access to importing tiddlers.
!Default Contents
{{{
<<importTiddlers>>
}}}
<<importTiddlers>>
Including is the act of adding the public contents of one [[space|Space]] into another space as a [[member|Member]] of the latter.
See...
* [[How can I display my UserName somewhere?]]
* [[How can I edit my UserName?]]
/***
|''Name''|IndexMacro|
|''Author''|Tobias Beer|
|''Version''|0.6 BETA|
|''Description''|will create an {{{<<index>>}}} (toc) and {{{<<scroll>>}}} to elements|
@@color:red; Experimental! Will change at will!@@
!Usage
Heading: <<scroll "##Code">>
{{{
<<scroll "##Code">>
}}}
Definition Term: <<scroll ";;term">>
{{{
<<scroll ";;term">>
}}}
;term
:definition
!Code
***/
//{{{
(function($){

config.macros.scroll = {
  handler: function(place, macroName, params, wikifier, paramString, tiddler) {
    var what = params[0],
      tid = story.findContainingTiddler( place );
      type =
        what.indexOf('##') == 0 ? ':header' : (
        what.indexOf(';;') == 0 ? 'dt' : 'tiddler' );

    what = type == 'tiddler' ? what : what.substr(2);
    tid = type == 'tiddler' ? what : (
      tid ? tid.getAttribute( 'tiddler' ) : ''
    );

    if( tid ) $(createTiddlyElement(
      place,
      'a',
      null,
      'scrollTo tiddlyLink tiddlyLinkExisting',
      what,
      {
        tiddler:tid,
        type:type,
        contains:what
      }
    )).click(this.scroll).attr('href','#');
  },

  top : 20,
  scroll: function(){
    var $el = $(this),
      tid = story.tiddlerId($el.attr('tiddler')),
      type = $el.attr('type'),
      contains = $el.attr('contains'),
      $tid = $('#' + tid);
    (
      type == 'tiddler' ?
      $tid :
      $(type, $tid)
    ).each(function(){
      var $el = $(this),
      txt = $el.text();
      if(txt.indexOf(contains) >= 0){
        $('html,body').animate({scrollTop: $el.offset().top - config.macros.scroll.top});
        return false;
      }
    });
  }
};

})(jQuery);
//}}}
/***
|Name|InlineJavascriptPlugin|
|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|
|Documentation|http://www.TiddlyTools.com/#InlineJavascriptPluginInfo|
|Version|1.9.6|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|Insert Javascript executable code directly into your tiddler content.|
''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.
!!!!!Documentation
>see [[InlineJavascriptPluginInfo]]
!!!!!Revisions
<<<
2010.12.15 1.9.6 allow (but ignore) type="..." syntax
|please see [[InlineJavascriptPluginInfo]] for additional revision details|
2005.11.08 1.0.0 initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.InlineJavascriptPlugin= {major: 1, minor: 9, revision: 6, date: new Date(2010,12,15)};

config.formatters.push( {
	name: "inlineJavascript",
	match: "\\<script",
	lookahead: "\\<script(?: type=\\\"[^\\\"]*\\\")?(?: src=\\\"([^\\\"]*)\\\")?(?: label=\\\"([^\\\"]*)\\\")?(?: title=\\\"([^\\\"]*)\\\")?(?: key=\\\"([^\\\"]*)\\\")?( show)?\\>((?:.|\\n)*?)\\</script\\>",
	handler: function(w) {
		var lookaheadRegExp = new RegExp(this.lookahead,"mg");
		lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			var src=lookaheadMatch[1];
			var label=lookaheadMatch[2];
			var tip=lookaheadMatch[3];
			var key=lookaheadMatch[4];
			var show=lookaheadMatch[5];
			var code=lookaheadMatch[6];
			if (src) { // external script library
				var script = document.createElement("script"); script.src = src;
				document.body.appendChild(script); document.body.removeChild(script);
			}
			if (code) { // inline code
				if (show) // display source in tiddler
					wikify("{{{\n"+lookaheadMatch[0]+"\n}}}\n",w.output);
				if (label) { // create 'onclick' command link
					var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",wikifyPlainText(label));
					var fixup=code.replace(/document.write\s*\(/gi,'place.bufferedHTML+=(');
					link.code="function _out(place,tiddler){"+fixup+"\n};_out(this,this.tiddler);"
					link.tiddler=w.tiddler;
					link.onclick=function(){
						this.bufferedHTML="";
						try{ var r=eval(this.code);
							if(this.bufferedHTML.length || (typeof(r)==="string")&&r.length)
								var s=this.parentNode.insertBefore(document.createElement("span"),this.nextSibling);
							if(this.bufferedHTML.length)
								s.innerHTML=this.bufferedHTML;
							if((typeof(r)==="string")&&r.length) {
								wikify(r,s,null,this.tiddler);
								return false;
							} else return r!==undefined?r:false;
						} catch(e){alert(e.description||e.toString());return false;}
					};
					link.setAttribute("title",tip||"");
					var URIcode='javascript:void(eval(decodeURIComponent(%22(function(){try{';
					URIcode+=encodeURIComponent(encodeURIComponent(code.replace(/\n/g,' ')));
					URIcode+='}catch(e){alert(e.description||e.toString())}})()%22)))';
					link.setAttribute("href",URIcode);
					link.style.cursor="pointer";
					if (key) link.accessKey=key.substr(0,1); // single character only
				}
				else { // run script immediately
					var fixup=code.replace(/document.write\s*\(/gi,'place.innerHTML+=(');
					var c="function _out(place,tiddler){"+fixup+"\n};_out(w.output,w.tiddler);";
					try	 { var out=eval(c); }
					catch(e) { out=e.description?e.description:e.toString(); }
					if (out && out.length) wikify(out,w.output,w.highlightRegExp,w.tiddler);
				}
			}
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
		}
	}
} )
//}}}

// // Backward-compatibility for TW2.1.x and earlier
//{{{
if (typeof(wikifyPlainText)=="undefined") window.wikifyPlainText=function(text,limit,tiddler) {
	if(limit > 0) text = text.substr(0,limit);
	var wikifier = new Wikifier(text,formatter,null,tiddler);
	return wikifier.wikifyPlain();
}
//}}}

// // GLOBAL FUNCTION: $(...) -- 'shorthand' convenience syntax for document.getElementById()
//{{{
if (typeof($)=='undefined') { function $(id) { return document.getElementById(id.replace(/^#/,'')); } }
//}}}
To save on space, TiddlyWiki users often host images externally on sites like Flickr and ImageShack. A URL or HTML code for the image is then pasted into a tiddler (including MainMenu and SiteTitle to display images in the menu and header respectively). 

Open the tiddler, position the cursor where the image is to go and paste in the link using the following formatting:

'''URL'''
<nowiki>
[img[URL of image]]
</nowiki>

'''URL with alternate text and link'''
<nowiki>
[img[alternate text|URL of image][tiddler or URL]]
</nowiki>

'''HTML'''
<nowiki>
<html>HTML code from hosting site</html>
</nowiki>

''Image Hosting''

There are various free image hosting services which can be used to store pictures:
* [[TinyPic|http://tinypic.com/index.php]]
* [[ImageShack|http://www.imageshack.us]]
* [[Flickr|http://www.flickr.com]]
See [[TiddlyLink]]...
TiddlyWiki works on InternetExplorer 6.x and above under Windows. It also allows you to <<saveChanges>>, albeit there are some problems in XP Service Pack2 and Vista to work around. If you're having problems, make sure you've followed the appropriate [[downloading guidelines|http://tiddlywiki.com/#Downloading]].
!Display Issues
Known problems with ~TiddlyWiki under InternetExplorer:
* gradient fills sometimes appear in the wrong place until you move the mouse over the tiddler
* horizontal gradients don't work correctly
* links to tiddlers with multiple consecutive spaces in their titles is broken
* euns of spaces within tiddlers get conflated into a single space when you edit a tiddler. This is particularly annoying when using monospaced blocks
!Windows XP Service Pack2 and Vista 
Internet Explorer Windows XP ~SP2 seems to have a magical ability to keep track of html files that have been downloaded from the internet and saved on an NTFS drive. By storing additional data in an [[alternate data stream|http://www.microsoft.com/technet/sysinternals/FileAndDisk/Streams.mspx]], it manages to keep them in the 'Internet' zone regardless of attempts to rename or modify the file. But, in order to be able to <<saveChanges>>, TiddlyWiki needs to run in the 'My Computer' zone.

The solution is to right-click on the TiddlyWiki html file and choose //Properties//. If the file is blocked, you'll see an 'Unblock' button on the resulting property sheet that removes the protection and allows the file to open in the 'My Computer' zone. Then open the file in Internet Explorer - it might put up its information bar asking you whether you want to run it. You need to 'Allow blocked content' to let TiddlyWiki do its stuff.
<<<
If you find yourself running into the information bar frequently, you can disable it by visiting the "Options" dialog and, on the "Advanced" tab make sure that "Allow active content to run in files on My Computer" is checked.

Alternatively, you can rename the file to {{{*.hta}}} which has the added bonus of automatically granting all necessary save permissions.
<<<
This is all a bit frustrating. An easy alternative is to use Firefox, which seems to do the trick on all platforms.
<<tiddler TiddlyWiki>>
! What is TiddlyWiki?
{{annotation{TiddlyWiki is a single-file, self-contained wiki for managing micro-content, written in ~JavaScript.}}}
If you completely understand all of that sentence, you should go straight on to the next section. For the rest of us, read on for the longer explanation.
;it's a single file
:A complete TiddlyWiki is stored in a single file on your computer, and thus belongs to the class of [[Single Page Applications|http://en.wikipedia.org/wiki/Single_page_application]]. That makes it super-easy to move your TiddlyWiki around on a USB stick or by emailing it to yourself.
;it's self-contained
:The single file that is a TiddlyWiki contains not only all of your data, but all the machinery to edit and manipulate it. All you need is a modern web browser, like Mozilla Firefox, Google Chrome or Safari. You don't need to have any other special programs installed on your computer, and you don't need to be connected to the Internet.
:The same TiddlyWiki file will work on just about any computer: Windows PCs, Apple Macs, Linux and BSD boxes...
;it's a wiki
:A wiki is a collection of web pages, like a normal web site, except that every page can be edited, easily and immediately. Wiki systems are often used to collaboratively manage documentation for large projects, and also sometimes used by a single user as a kind of personal notebook.
;it manages micro-content
:Most web sites and wikis manage information as pages. TiddlyWiki is different -- it saves your stuff in smaller chunks (each chunk is called a 'tiddler'). Information in small chunks like this is called 'micro-content', and once you start usingTiddlyWiki, you realize that micro-content is a natural fit to a lot of the stuff you deal with every day.
To really get an idea of what TiddlyWiki can do for you, you're going to have to try it out. Don't worry -- it's a single file, remember. So go on to the next section and we will get started.
!Getting Started
;1. download TiddlyWiki
:from http://tiddlywiki.com
;2. configure your browser, if needed
:see [[Browser Compatibility]]...

''Step 2: ?''
With apologies to [[Instiki|http://instiki.org/]], there //''is no step 2''// -- your TiddlyWiki is ready! Wanna see it? Go to the HTML file you saved in Step 1 and open it in your web browser. See? Ready to go. Leave it on screen, and you can jump right into the next section.

{{annotation{this thing about "no step 2" needs to be replaced with a walkthrough on getting TW past various security checks, like the unlock thing that you need to do with WinXP SP2, with a particular focus on win/IE. If anyone can post me the steps required for particular os/browser combinations, I'd be much obliged :)}}}

''Step 3: Profit!''
cf. [[Wikipedia|http://en.wikipedia.org/wiki/Gnomes_%28South_Park_episode%29#The_Gnomes]]
!Using TiddlyWiki
* [[TiddlyWiki User's Guide|http://danielbaird.com/tiddlywikiguides/userguide-sample.html#"TiddlyWiki User's Guide"]]
* [[Introduction to TiddlyWiki|http://www.slideshare.net/guest102a23/an-introduction-to-tiddlywiki-revised/]] (slides)
See these:
* [[EasyEditPlugin|http://visualtw.ouvaton.org/VisualTW.html#EasyEditPlugin]] (doesn't require any external files)
* [[WYSIWYG plugin|http://visualtw.ouvaton.org/VisualTW.html#%5B%5BWysiwyg%20plugin%5D%5D]] (requires [http://www.fckeditor.net FCKeditor])
* [[RichTextPlugin|http://tiddlywiki.ouvaton.org/Demo.html]] (requires [http://tinymce.moxiecode.com/index.php TinyMCE])
* [[ASciencePad|http://math.chapman.edu/~jipsen/asciencepad/asciencepad.html]] (an adaptation I believe, i.e. it's not a standard TW core}

This is not WYSIWYG but may be of interest:
* [[PreviewPlugin|http://www.tiddlytools.com/#PreviewPlugin]] in combination with [[QuickEditPackage|http://www.tiddlytools.com/#QuickEditPackage]]
* [[WikiBar|http://aiddlywiki.sourceforge.net/wikibar_demo_2.html]] (Doesn't work in IE)


Non-TiddlyWiki WYSIWYG, of related interest
* [[KNote|http://knote.smartgoldfish.com]] (A standalone note taking program based on TiddlyWiki)
* [[LumiNotes|http://www.luminotes.com]]
* [[TiddlyBackpack|http://www.tiddlybackpack.com]]


[[<< Back to FAQ list|TiddlyWiki FAQ]]
[[JavaScript|http://en.wikipedia.org/wiki/JavaScript]] is the programming language on which TiddlyWiki is built. It is a dynamic language, interpreted and executed directly during runtine, mostly by [[web browsers|http://en.wikipedia.org/wiki/Web_browser]] in the context of a website or web application.
Jeremy is the [[creator of TiddlyWiki|https://plus.google.com/u/1/109308865556494599029]].

http://tiddlywiki.com/#JeremyRuston
[[Jeremy|http://jermolene.tiddlyspace.com]] is the original creator of TiddlyWiki who worked as Head of Open Source Innovation for [[BT]], leading [[Osmosoft]].
To improve accessibility and ergonomics, TiddlyWiki provides the following keyboard shortcuts which should be identical on all platforms...
!!Editing
| !Scope | !Action | !Shortcut | !Details |h
|EditMode|save tiddler|~Ctrl-Enter|for Macs: Ctrl => Cmd|
|EditMode|minor change|~Shift-Ctrl-Enter|does not update modified timestamp|
|EditMode|cancel|Esc|leave EditMode|
|[[Search]]|clear|Esc|Clear the search term|
Some [[TiddlyWiki macros|Core Macros]] define [[access keys|http://en.wikipedia.org/wiki/Access_key]], whose invocation is browser-specific:
| !Action | !PC | !Mac |h
|[[search|Search]]|SHIFT+ALT+F| CTRL+F|
|[[save changes|saveChanges]]|SHIFT+ALT+S| CTRL+S|
|[[new tiddler|newTiddler]]|SHIFT+ALT+N| CTRL+N|
|[[new journal|newJournal]]|SHIFT+ALT+J| CTRL+J|
For Firefox versions prior to 2.0 the default modifier is ALT only rather than SHIFT+ALT.
As of Opera 7.0 on the PC and Mac, press and release SHIFT+ESC and then press the shortcut letter without any modifier.
The following roughly illustrates a default [[TiddlyWiki layout|Layout]] and components...

PageTemplate -- (DefaultTiddlers / WindowTitle / SiteUrl)
|>|>|SiteTitle - SiteSubtitle|
|background:#f9f9f9;MainMenu|width:250px;{{right{ToolbarCommands}}}<br><br>&nbsp;&nbsp;&nbsp;ViewTemplate<br><br>&nbsp;&nbsp;&nbsp;EditTemplate |background:#f9f9f9;<<tiddler "Layout##SIDEBAR">>|
''StyleSheet:'' StyleSheetColors - StyleSheetLayout - StyleSheetPrint/%
!SIDEBAR
« SideBarOptions »
OptionsPanel
AdvancedOptions
----
« SideBarTabs »
{{button{[[Recent|TabTimeline]]}}}{{button{[[All|TabAll]]}}}{{button{[[Tags|TabTags]]}}}{{button{[[More|TabMore]]}}}
{{button{[[Missing|TabMoreMissing]]}}}{{button{[[Orphans|TabMoreOrphans]]}}}{{button{[[Shadowed|TabMoreShadowed]]}}}
!END%/
!Summary
Line breaks can be forced explicitly using a {{{<br>}}} -- useful in lists or tables.
!Markup
{{{
|A cell<br> with a line break|
}}}
|A cell<br> with a line break|
!!Avoiding Linebreaks
Sometimes you want to avoid superflous linebreaks and increase readability of your wiki text, e.g. when using @@highlights@@ or the tiddler macro. To achieve that, end the current line by starting a hidden comment and ending it on the next line, e.g.:
{{{
@@highlight@@/%
%/<<tiddler foo>>
}}}
This will prevent from adding a superflous linebreak between the highlight and the transcluded content that follows.
!!Also see
* [[Table Formatting
<<tiddler Links>>
!Configuration for LinkifyPlugin from @linkify...
 As much as possible, try to enter definitions alphabetically! However, definitions are parsed sequentially, so it may however be necessary to change the order occasionally.

Comment Formatting|code comment*|html comment*|css comment*|javascript comment*
TiddlyWiki Layout|html template*|layout of a tiddler|layout of tiddlywiki
Startup Parameters|paramif*

Backstage Area|Backstage
Bag|bags
Basic Formatting|bold|italic|underline|superscript|subscript
Bookmarklets|bookmarklet*
Blockquotes|blockquote*|quot*
CSS Formatting|CSS rule*|CSS
Changing Default Options|zz*
Code|code-block*|code block*|code format*|inline code|white-space*|monospace*
Core Macros|core macro*|standard macro*
Custom Fields|custom field
EditMode|edit mode|edit a tiddler|editing a tiddler|edit
edit|edit macro
Escaping
Evaluated Parameters|evaluated parameter*
External Link|external link*
FAQ
Fields|field|changecount|core field*|created field|created|modifier fields|modifier|modified field|modified|title fields|title|standard fields|tiddler text
Formatting Text|formatter*|markup language*|markup syntax*
Headings|heading*
HTML Entities|html entit*|entit*
HTML Formatting|html form*|hmtl mark*|iframe*|embed*
HTML
Line Breaks|newline*|new line*|new-line*|line-break*
Links|link*
Lists|list format*|ordered list*|unordered list*|mixed list*|definition list*|list*
Macros|macro*
Macro Parameters|parameter definition*|parameter value*|named parameter*|simple parameter*|param*
Markup|markup|formatting|inline|block|nest*|text formatting|formatting|render*
Multi-Line Content|multi-line*
newTiddler|new tiddler|newTiddler
About the old and the new wikis|OldWiki|old wiki
Plugins|plugin*
Private
Public
readOnly|readonly mode|read only
ShadowTiddler|Shadow Tiddlers|shadow tiddler*|shadow*
Sidebar
Slices|slice*
Space
StyleSheets|cascading style sheet*|custom style*|style sheet*|style*
Tables|table format*|table*|cell*|column*|row*
Tags|tag*
~tiddler|tiddler macro
Tiddler|tiddlers
TiddlyLink|tiddlylinks|internal link*
tiddler|tiddler macr*
Toolbar|toolbar button*|Toolbar*|
Transclusion|partial transcl*|transclu*
ViewMode|view mode|view a tiddler|viewing a tiddler|view
view|view macro
WikiWord|wikilink*|wiki-link*|auto-link*|wiki link*
Wikification
/***
|''Macro''|LinkifyPlugin|
|''Description''|Automatically turns text into links, optionally using aliases<br>The plugin idea is based on Clint Checketts and Paul Petterson's [[RedirectMacro|http://checkettsweb.com/styles/themes.htm#RedirectMacro]]|
|''Documentation''|http://linkify.tiddlyspot.com|
|''Author''|Tobias Beer|
|''Version''|1.1.2 (2013-10-04)|
|''CoreVersion''|2.5.2|
|''Source''|https://raw.github.com/tobibeer/TiddlyWikiPlugins/master/plugins/LinkifyPlugin.min.js|
|''Usage''|define redirects in LinkifyConfig|
/%***/
(function(e){config.shadowTiddlers.LinkifyConfig="!Exclude\n-excludeLists systemConfig noLinkify\n!Linkify\nLinkifyPlugin|^linkif\n^Tiddler";var t=config.extensions.linkify={defaults:{linkifyAllTiddlers:true,doNotLinkifyInside:"h1,h2,h3,h4,h5,h6,.header,.noLinkify,th",doNotLinkifySameTiddler:true},linkified:[],excluded:[],handler:function(n){var r,i,s=e(n.output).closest(t.defaults.doNotLinkifyInside).length>0,o=story.findContainingTiddler(n.output);o=o?o.getAttribute("tiddler"):"";s=s||t.defaults.doNotLinkifySameTiddler&&o==this.target;r=o.indexOf("##");if(r<0)r=o.indexOf("::");if(r>0)o=o.substr(0,r);i=n.source.substr(n.matchStart,1)==config.textPrimitives.unWikiLink;if(s||i||o&&t.excluded.contains(o)){n.outputText(n.output,n.matchStart+(i?1:0),n.nextMatch)}else{n.outputText(createTiddlyLink(createTiddlyElement(n.output,"span",null,"linkified"),this.target,false),n.matchStart,n.nextMatch)}},addFormatter:function(e,n,r,i,s){var o,u,a=0,f,l,c,h,p,d,v,m,g=config.formatters,y=e.substr(0,1);if(e.substr(e.length-1,1)=="*"){m=true;e=e.substr(0,e.length-1)}e:while(!o&&['"',"~","^","*","("].contains(y)){switch(y){case"~":if(i)return false;case"^":d=true;break;case'"':o=e.substr(e.length-1,1)=='"';if(o)e=e.substr(0,e.length-1);else break e;break;case"(":v=e.substr(e.length-1,1)==")";if(v)e=e.substr(0,e.length-1);else break e;break;case"*":p=true}e=e.substr(1);y=e.substr(0,1)}if(!v)e=e.replace(/\\/mg,"");l="linkify_"+e.replace(/([\W])/mg,function(e){return e.charCodeAt(0)});if(s){c="linkify_"+s.replace(/([\W])/mg,function(e){return e.charCodeAt(0)})}while(a<g.length){u=u||g[a].name==l;if(s&&g[a].name==c){g.splice(a,1)}else a++}if(u||r||!e)return false;h=config.textPrimitives.unWikiLink+"?"+(v?"(?:%2)":"(?:\\b%0%2%1\\b)").format([p?"[\\w]*":"",m?"[\\w]*":"",v?e:e.escapeRegExp().replace(/([a-z]|[A-Z])/img,function(e){return"["+(o?e:/[\W]/mg.exec(e)?"'"+e:e.toUpperCase()+e.toLowerCase())+"]"}).replace(/[\s]/mg,"[\\s]")]);f={name:l,match:h,target:n,handler:t.handler};if(d)g.unshift(f);else g.push(f);return true},indexConfig:function(){var e,n,r,i,s,o,u,a,f,l,c,h,p=config.formatters,d=function(e){e=e.replace(/^(\'|\*|\^|\~|\()+/mg,"");return e.replace(/(\*|\))+?/mg,"")};t.linkified=[];u=store.getTiddlerText("LinkifyConfig")||store.getShadowTiddlerText("LinkifyConfig");u=u?u.split("\n"):[];for(var v=0;v<p.length;v++){if(p[v].name.indexOf("linkify_")==0){p.splice(v,1);v--}}for(s=0;s<u.length;s++){if(!u[s]||[" ","!"].contains(u[s][0]))continue;o=u[s].split("|");l=d(o[0]);n=0;t.linkified.pushUnique(l);for(e=1;e<o.length;e++){a=d(o[e]);if(a.toLowerCase().indexOf(l.toLowerCase())==0){h=o[e];o[e]=o[n];o[n]=h;n=e}}for(e=0;e<o.length;e++)t.addFormatter(o[e],l,false,e==n)}if(t.defaults.linkifyAllTiddlers){c=store.getTiddlers();for(f=0;f<c.length;f++){l=c[f].title;t.addFormatter(l,l,t.excluded.contains(l)||t.linkified.contains(l))}}},indexExcludes:function(){var e,n="",r,i,i=store.getTiddlerText("LinkifyConfig")||store.getShadowTiddlerText("LinkifyConfig");t.excluded=[];i=i?i.split("\n"):[];for(r=0;r<i.length;r++)if(i[r].indexOf("-")==0)n+=i[r].substr(1,i[r].length-1)+" ";n=n.readBracketedList();n.map(function(e){t.excluded.pushUnique(e)});for(e=0;e<n.length;e++)store.getTaggedTiddlers(n[e]).map(function(e){t.excluded.pushUnique(e.title)})},init:function(){this.indexConfig();this.indexExcludes();formatter=new Formatter(config.formatters)}};config.extensions.linkify.init();window.linkifyTiddlers=function(){};TiddlyWiki.prototype.saveTiddlerLINKIFY=TiddlyWiki.prototype.saveTiddler;TiddlyWiki.prototype.saveTiddler=function(n,r,i,s,o,u,a,f,l,c){var h=[],p=store.saveTiddlerLINKIFY.apply(this,arguments),d=r;t.addFormatter(d,d,t.excluded.contains(d)||t.linkified.contains(d),true,d!=n?n:null);if(n=="LinkifyConfig"||r=="LinkifyConfig"){t.indexConfig()}t.indexExcludes();formatter=new Formatter(config.formatters);if(d!=n){e("[tiddler]",e("[content]")).each(function(){var t=e(this),i=t.text()||"",s=t.attr(tiddler)|"";if(i.indexOf(r)>-1||i.indexOf(n)>-1){if(s)h.pushUnique(s)}});e("a[tag], a[tiddlyLink]").each(function(){var t,i=e(this),s=i.attr("tiddlyLink");s=s?s:i.attr("tag");if(s==n||s==r){t=e(this).closest(".tiddler").attr("tiddler");if(t)h.pushUnique(t)}});h.map(function(e){story.refreshTiddler(e,null,true)})}return p};store.removeTiddler_Linkify=store.removeTiddler;store.removeTiddler=function(e){var t=store.removeTiddler_Linkify.apply(this,arguments);config.extensions.linkify.addFormatter("*",null,null,null,e);formatter=new Formatter(config.formatters);story.refreshAllTiddlers(true);return t};config.shadowTiddlers.StyleSheetLinkify="/*{{{*/\n"+".linkified .tiddlyLink{color:[[ColorPalette::PrimaryMid]];font-weight:normal;}\n"+".linkified .tiddlyLink:hover{color:[[ColorPalette::PrimaryLight]];background:transparent;}\n"+".headerShadow .linkified .tiddlyLink {color:transparent !important;}\n"+".siteSubtitle .linkified .tiddlyLink{color:[[ColorPalette::PrimaryPale]];background:transparent;}\n"+".siteSubtitle .linkified .tiddlyLink:hover{color:[[ColorPalette::Background]];background:transparent;}\n"+"dt .linkified .tiddlyLink{font-weight:bold;}\n"+"/*}}}*/";store.addNotification("StyleSheetLinkify",refreshStyles)})(jQuery)
//%/
!Summary
TiddlyWiki allows different kinds of links, e.g. WikiWords, [[TiddlyLinks|TiddlyLink]], external Links or TiddlySpace links.
!!WikiWords
Any words or phrases that are CamelCase or [[Compound-Words|CamelCase]] - in which the elements are joined without spaces - will result in them becoming wiki links to tiddlers with that name. 
{{{
WikiWord
}}}
WikiWord

To prevent this, append a tilde {{{~}}}...
{{{
~WikiWord
}}}
~WikiWord

!![[TiddlyLinks|TiddlyLink]]
A tiddler can also be linked using square brackets encompassing the tiddler title:
{{{
[[Core Macros]]
}}}
[[Core Macros]]

!![[Pretty TiddlyLinks|TiddlyLink]]
Optionally, a custom title can be used, separated by a pipe character (|)
{{{
[[standard macros|Core Macros]]
}}}
[[standard macros|Core Macros]]

!![[External Links|External Link]]
A valid URL directly results in a link to that external site:
{{{
http://tiddlywiki.org
}}}
http://tiddlywiki.org

!![[Pretty External Links|External Link]]
Similar to TiddlyLinks, external links can have a different title as well:
{{{
[[visit TiddlyWiki.org|http://tiddlywiki.org]]
}}}
[[visit TiddlyWiki.org|http://tiddlywiki.org]]

!![[TiddlySpace Links|TiddlySpace]]
In TiddlySpace, you can link to another space using the prefix {{{@}}}:
{{{
@TiddlyWiki
}}}
@TiddlyWiki

Suppress space link using the tilde {{{~}}} prefix:
{{{
~@TiddlyWiki
}}}
~@TiddlyWiki

To link to a tiddler in another space use..
{{{
GettingStarted@TiddlyWiki
[[Core Macros]]@TiddlyWiki
[[Standard Macros|Core Macros]]@TiddlyWiki
}}}
GettingStarted@TiddlyWiki
[[Core Macros]]@TiddlyWiki
[[Standard Macros|Core Macros]]@TiddlyWiki
<<tiddler Lists>>
/***
|Name|ListFiltrPlugin|
|Description|Allows to easily filter simple and complex lists|
|Documentation|http://listfiltr.tiddlyspace.com|
|Author|[[Tobias Beer|http://tobibeer.tiddlyspace.com]]|
|Version|1.7.4 (2013-11-07)|
|~CoreVersion|2.6.5|
|License|Creative Commons 3.0|
|Source|https://raw.github.com/tobibeer/TiddlyWikiPlugins/master/plugins/ListFiltrPlugin.min.js|
***/
// /%
function placeholderIsSupported(){var e=document.createElement("input");return"placeholder"in e}(function(e){var t=config.macros.listfiltr={InputPlaceholder:"filter list",InputLabel:"Filter list:",InputTooltip:"enter a search term to filter the list",defaultPreserve:".st-bullet, .annotation",wait:500,minInput:2,or:" ",h:"h1,h2,h3,h4,h5,h6",index:"li,dd,dt,td,th,div",remove:"lf-h lf-hide lf-found lf-keep lf-section",ignore:".lf-found,br,.pseudo-ol-li,.linkified",keepOuter:"b,em,strong,blockquote",keep:[".lf-keep.lf-h",".lf-found.lf-h",".lf-found .lf-h:not(%0)",".lf-section.lf-h",".lf-section .lf-h","thead:not(.lf-h) .lf-h","tr.lf-keep td.lf-h","tr.lf-keep th.lf-h","tr.lf-keep td > .lf-h","tr.lf-keep th > .lf-h","dt.lf-keep .lf-h","dd.lf-keep .lf-h"].join(","),dontKeepInsideFound:["tr.lf-h","div.lf-found li.lf-h:not(div.lf-found li.lf-found li.lf-h)","td.lf-found tr.lf-h","td.lf-found li.lf-h","td.lf-found dt.lf-h","td.lf-found dd.lf-h",".sliderPanel.lf-found li.lf-h",".sliderPanel.lf-found ul.lf-h"].join(","),showOnFilter:[".sliderPanel"].join(","),hideOnEmpty:[".sliderPanel"].join(","),timer:0,handler:function(n,r,i,s,o,u){var a,f,l,c,h=[],p,d=o.parseParams("anon",null,true),v=getParam(d,"appendTo",this.appendTo),m=getParam(d,"preserve",this.defaultPreserve);if(v){c=e(n).closest(".tiddler");n=e(v,c).first()[0]||n}c=e(n).children().last();while(c.is("br"))c=c.prev();if(c.is("span, div"))c=c.contents();c.wrapAll('<div class="lf-list"/>');c=c.closest(".lf-list");if(e.fn.outline)e("ol:not(ol li > ol)",c).outline();t.finalKeep=t.keep;t.keepOuter.split(",").map(function(e){h.push("> "+e);t.finalKeep+=", > "+e+".lf-preserve.lf-h"});e(m+(h.length?","+h.join(","):""),c).addClass("lf-preserve");t.textToParagraph(c);f=e("<div class=lf-search/>").insertBefore(c);p=placeholderIsSupported()?t.InputPlaceholder:"";if(!p){e("<span class=lf-label/>").html(t.InputLabel).appendTo(f)}a=e('<input type="search"/>').attr({title:t.InputTooltip,placeholder:p}).appendTo(f);a.bind("keyup search",function(){var n=e(this);clearTimeout(t.timer);t.timer=setTimeout(function(){t.filter(n);return true},t.wait)})},filter:function(n){var r,i,s,o,u,a=t.index+",span,"+t.h,f=n.val(),l=n.closest(".lf-search").next(),c=n.closest(".st-tree"),h=config.macros.simpletree;if(f.length>t.minInput){l.addClass("lf-filtered");if(h&&c.length&&!c.is(".st-all")){h.toggleAll(c);c.addClass("lf-tree")}}else{l.removeClass("lf-filtered");if(h&&c.length&&c.is(".st-all.lf-tree")){h.toggleAll(c)}c.removeClass("lf-tree")}e("*",l).removeClass(t.remove);e(".highlight",l).each(function(){var t=e(this),n=t.parent();if(t.is("pre, code")){t.removeClass("highlight")}else{t.contents().unwrap();n[0].normalize()}});if(f.length<t.minInput){e(t.hideOnEmpty,l).hide()}else{e(t.showOnFilter,l).show();t.highlight(e.trim(f.toLowerCase()),l);e(a,l).not(t.ignore).each(function(){var n=1,r,o,u,a,f,l,c,h,p,d,v=e(this);i=v.is(".highlight");if(!i)i=v.is("li, dt, dd")?t.checkLi(v):e(".highlight",v).length;if(i){t.mark(v,true);d=v.parentsUntil(".lf-list").last();if(d.is(t.keepOuter)){t.mark(d,true);s=t.keepHeading(d,true)}d=v.closest(t.h);if(d.length)d.nextUntil(t.h).addClass("lf-keep lf-section");else t.keepHeading(v);d=v.closest("dt");if(d.length){t.mark(d);t.mark(d.nextUntil("dt","dd"))}d=v.closest("dd");if(d.length){t.mark(d.prevAll("dt:first"))}d=v.closest("td, th");if(d.length){h=t.mark(v.closest("table"));u=d.is("th")&&!d.prev().length;p=d.closest("tr");t.mark(p,u);a=t.maxCols(h);r=t.numCols(p);if(r<a){l=p.prev("tr");do{t.mark(l,u);l=t.numCols(l)<=r?l.prev("tr"):0}while(l.length)}f=p.next("tr");while(f.length){if(r==a&&t.numCols(f)<r||r<a&&t.numCols(f)<=r){t.mark(f,u);f=f.next("tr")}else{f=0}}if(d.closest("thead").length){v.prevAll().each(function(){o=e(this).attr("colspan");n+=o?parseInt(o):1});h.find("tbody tr").each(function(){var r=0;e("td, th",this).each(function(){var i=e(this);o=i.attr("colspan");r+=o?parseInt(o):1;if(r>=n){t.mark(i,true);t.mark(i.closest("tr"));return false}})})}}if(v.is(".listTitle")&&v.parent().hasClass("timeline"))t.mark(e("> li",v.parent()));t.mark(v.closest("li").parent().find("> .listTitle"))}else{v.addClass("lf-h");if(v.is("td, th")&&v.closest("tbody").length){v.closest("tr").not(".lf-found, .lf-keep").addClass("lf-h")}}});e(".highlight",l).parentsUntil(l).removeClass("lf-h");e("ol, ul, dl, table, .lf-preserve",l).each(function(){var n=e(this);if(e(".highlight",n).length)t.mark(n);else n.addClass("lf-h")});e(t.h,l).not(".lf-found").each(function(){var n=e(this),r=true,i=n.nextUntil(t.h);i.each(function(){el=e(this);if(el.is(".lf-keep, .lf-found, .lf-section")){r=false;return r}});if(r)i.removeClass("lf-keep lf-preserve").addClass("lf-h")});e(t.finalKeep.format(t.dontKeepInsideFound),l).removeClass("lf-h");e(".lf-h:not(.lf-preserve .lf-h)",l).addClass("lf-hide")}return true},highlight:function(n,r){e("*",r).highlight(n);e(".externalLink, .tiddlyLink",r).each(function(){var r=e(this),i=(r.attr("tiddlyLink")||r.attr("href")).replace(/\/\/\:/mg,"_").toLowerCase();n.split(t.or).map(function(t){if(t&&i.indexOf(t)>-1&&!e(".highlight",r).length){r.contents().wrap('<span class="highlight"/>')}})})},keepHeading:function(e,n){n=n?e:e.parentsUntil(".lf-list").last();h=n.prev();if(!h.is(t.h))h=n.prevUntil(t.h).last().prev();if(h.is(t.h)){t.mark(h)}},mark:function(e,n){e.not(t.ignore).removeClass("lf-keep lf-h").not(".highlight").addClass(n?"lf-found":"lf-keep");return e},textToParagraph:function(n){n.find(":not(iframe)").addBack().contents().filter(function(){var t=e(this);return this.nodeType==3&&(t.next().length||t.prev().length)&&!t.closest(".lf-preserve").length&&!t.prevAll(".pseudo-ol-li").length}).wrap('<span class="lf-text"/>');e(".lf-text",n).each(function(){var n,r=e(this),i=false;if(r.closest(".lf-p").length)return true;n=r.prevUntil(t.block).add(r).add(r.nextUntil(t.block));n.each(function(){var n=e(this);i=n.next().is(t.block)||n.prev().is(t.block);return!i});if(i)n.wrapAll('<span class="lf-p lf-preserve"/>')})},maxCols:function(t){var n=0;e("> thead > tr, > tbody > tr",t).each(function(){n=Math.max(n,e("> td, > th",this).length)});return n},numCols:function(t){var n=0;e("> td, > th",t).each(function(){var t=e(this).attr("colspan");n+=t?parseInt(t):1});return n},checkLi:function(n,r){var i=false;n.children(":not(ol, ul, dl)").each(function(){var n=e(this),s=n.is(".highlight")||e(".highlight",n).length;if(r)t.mark(n);i=i||s});if(i||r){x=n.parent("ol, ul, dl").parent("li, dd, dt");if(x.length)t.checkLi(x,true)}return i}};t.block=t.h+","+t.index+",br,blockquote,ol,ul,dt,p,pre,form";e.fn.highlight=function(n){var r=[],i='<span class="highlight">%0</span>',s=n.split(t.or);s.map(function(e){if(e)r.push("(\\b\\w*"+e+"\\w*\\b)")});r=new RegExp(r.join("|"),"gi");this.each(function(){var t=e(this);e(this).contents().each(function(){if(this.nodeType===3&&r.test(this.nodeValue)){var o=t.closest("pre, code");if(o.length){o.addClass("highlight")}else{e(this).replaceWith(this.nodeValue.replace(r,function(e,t){var n;s.map(function(t){if(e.toLowerCase().indexOf(t)>=0){n=i.format(e)}return!n});return n}))}}else if(!e(this).hasClass("highlight")){e(this).highlight(n)}})});return this};config.shadowTiddlers["StyleSheetListFiltr"]="/*{{{*/\n"+".lf-search {padding:5px;background:#eef;}\n"+".lf-hide {display: none !important;}\n"+".lf-found {background:#F5F5DC;}\n"+".lf-list + br {display:none;}\n"+".lf-label {margin-right:5px;font-weight:bold;}\n"+".lf-filtered .lf-p {display:block;}\n"+".lf-filtered dd .lf-p {display:inline-block;}\n"+".lf-filtered br {display: none;}\n"+".lf-filtered .lf-preserve br {display: block;}\n"+".lf-preserve.lf-found br {display: block;}\n"+"/*}}}*/";store.addNotification("StyleSheetListFiltr",refreshStyles)})(jQuery)
//%/
!Summary
In TiddlyWiki you can make user of different list types, such as unordered lists, ordered or numbered lists, as well as definition lists.
!!Ordered Lists
Lists can be ordered using numbers and letters by starting a line with a hash {{{#}}}...
{{{
#List item one
##List item two
###List item three
}}}
#List item one
##List item two
###List item three
!!Unordered Lists
Create unordered lists by starting a line using an asterisk {{{*}}}...
{{{
*Unordered List Level 1
**Unordered List Level 2
***Unordered List Level 3
}}}
*Unordered List Level 1
**Unordered List Level 2
***Unordered List Level 3
!!Definition Lists
Create definition lists by starting a line using a semi-colon {{{;}}} for the term followed by a line starting with a colon {{{:}}} for the definition...
{{{
;Term 1
:Definition for Term 1
;Term 2
:Definition for Term 2
}}}
;Term 1
:Definition for Term 1
;Term 2
:Definition for Term 2
[[Macros]] provide dynamic functions in TiddlyWiki.

<<slider chkCoreMacrosOverview Macro##CORE "Core Macros" "Click to see a list of all core macros..." >> are disitributed with a standard TiddlyWiki -- many more macros are provided by third-party plugins.

Macros are executed when the tiddler containing the macro call is rendered. To use a macro, simply add it in your wikitext using the following markup:
{{{<<macroName [parameters]>>}}}/%
!CORE

Her's a list of all [[Core Macros]] and their description...
<<get ##Description filter:"[tag[Core Macros]][sort[title]]" table category:Macro>>
!END%/
While {{{<<someMacros>>}}} work just like that, a TiddlyWiki macro may allow you to specify either simple parameters or named parameters.
!!!"""Simple Parameter Definition"""
Some macros only require a single parameter, e.g.:
{{{<<someMacro parameterValue>>}}}

For others, the macro author may have defined a fixed parameter sequence, e.g.:
{{{<<someMacro param1Value param2Value param2Value>>}}}
!!!"""Named Parameter Definition"""
Named parameters allow you to specify the values for predefined variables that are recognized by the macro by their name so that their sequence is of no importance, e.g.:
{{{<<someMacro namedParameter:yourValue>>}}}

In rare occasions, as with the [[newTiddler]] macro, a named parameter may be overloaded, e.g.:
{{{<<newTiddler tag:tag1 tag:"tag 2">>}}}
This will actually allow you to create a <<newTiddler label:"new tiddler" prompt:"Create a new tiddler with tags 'tag1' and '[[tag 2]]'..." tag:tag1 tag:"tag 2">> with both {{{tag1}}} and {{{tag 2}}} as its tags; i.e. the macro can handle multiple values passed down to it for the same named parameter {{{tag}}}.
!!!"""How TiddlyWiki Parses Parameters"""
 For a visual reference as to how TiddlyWiki parses macro parameters, see [[ParamParser|http://paramparser.tiddlyspace.com/#ParamParserMacro]].
!!!"""Value Delimiters"""
For both, simple parameters or named parameters, you can use any of the following options to delimit parameter values:
;no quotes
:{{{<<someMacro param1 param2>>}}}
;single quotes
:{{{<<someMacro 'param1' 'param 2'>>}}}
:usually used for values containing spaces
;double quotes
:{{{<<someMacro "param1" "param 2">>}}}
:may be handy when you need to nest quotes
;double square brackets
:{{{<<someMacro [[Tiddler A]] [[Tiddler B]]>>}}}
:the most safe and visual way to reference tiddlers, but not necessarily
;double curly brackets
:{{{<<someMacro param:{{<code>}}>>}}}
:{{alert{Caution!}}} The {{{<code>}}} is actually [[evaluated as javascript|Evaluated Parameters]] and the result used as the parameter value.
!!!"""Empty Values"""
To pass down an empty value, i.e. to override an otherwise non-empty default value, you can pass down either of the following as the parameter value:
;empty single quotes
:{{{''}}}
;empty double quotes
:{{{""}}}
;empty double square brackets
:{{{[[]]}}}
{{right title{[[Core Macros]]}}}From the [[Glossary|Macro]]...
<<<
<<tiddler [[Macro]]>>
<<<
!"""Macro Parameters"""
<<tiddler "Macro Parameters">>
TiddlyWiki is a free browser-based, reusable, non-linear personal notebook.

This is the community wiki, providing documentation and a variety of resources for TiddlyWiki users and developers. Please visit the official TiddlyWiki site for project information, downloads etc.

TiddlyWiki.org is a community effort, so active participation and contributions are very welcome!

[[TiddlyWiki]]   [[TiddlyWiki.org]]   [[Policy]]   [[Help]]

[[Information for Users]] 
|![[Basics]] |![[Advanced Features]] |
|[[Introduction]] |[[Customization]] |
|[[TiddlyWiki Markup]] |[[Macros]] |
|[[Components]] |[[Plugins]] |
|[[Configuration]] |[[Scripts]] |
|[[Content Management]] |[[Server-Side Solutions]] |
|[[Troubleshooting]] |[[Client-side Tools]] |
|[[TiddlyWiki FAQ]] | |

[[Additional Resources]]

[[Beginner's Guides]]
    [[Getting Started on TiddlyWiki.com]]
    [[TiddlyWiki for the Rest of Us by Dave Gifford]]
    [[TW Help by Morris Gray]]
    [[more... ]]

[[Services]]

    [[Community Support mailing list at Google Groups]]
    [[Tiddlyspot (free TiddlyWiki hosting)]]

[[Adaptations]]

    [[MPTW]]
    [[TeamTasks]]
    [[RippleRap]]
    [[more... ]]


[[Information for Developers]]
[[Guides]]
    [[Translation]]
    [[Core Code]]
    [[Writing Plugins]]
    [[Writing Macros]]

[[Resources]]
    [[Code Repository]]
    [[Tickets (Bug Tracking)]]
    [[Developers' mailing list]]
    [[Nightly Builds]]
    [[Developer Tools]]
    [[Hot Issues]]


    [[Translation]]
    [[Core Code]]
    [[Writing Plugins]]
    [[Writing Macros]]

[[Resources]]

    [[Code Repository]]
    [[Tickets (Bug Tracking)]]
    [[Developers' mailing list]]
    [[Nightly Builds]]
    [[Developer Tools]]
    [[Hot Issues]]
[[Welcome]][[FAQ]][[Glossary]][[Download]][[Contribute]]
!Summary
The shadow tiddler MainMenu is intended to provide easy access to your most important topics. In a standard TiddlyWiki, the MainMenu is the column on the left hand side.
!Default Contents
{{{
[[GettingStarted]]
}}}
!TiddlySpace
In a default TiddlySpace, the MainMenu is displayed as a horizontal menu at the top of the page.
TiddlyWiki markup is a dedicated markup syntax to <<tag Formatting "format your content">> using WikiText...
|noLinkify|k
|width:250px; !Example | !Example Markup |h
| how the example markup renders | what to enter as tiddler text |
|>| ![[Basic Text Formatting|Basic Formatting]] |
|''bold''|{{{''bold''}}} (two __single__-quotes) |
|//italics//|{{{//italics//}}} |
|''//bold italics//''|{{{''//bold italics//''}}} |
|__underline__|{{{__underline__}}} |
|--strikethrough--|{{{--strikethrough--}}} |
|super^^script^^|{{{super^^script^^}}} |
|sub~~script~~|{{{sub~~script~~}}} |
|@@highlight@@|{{{@@highlight@@}}} |
|foo -- bar|{{{foo -- bar}}} -- two dashes create an Em dash|
|>| ![[Avoiding Wikification|Suppressing Formatting]] |
|to output text as-is (escaping), enclose it in three double quotes or use the {{{<nowiki>}}} markup|>|
|"""plain//text""" |{{{"""plain//text"""}}}|
|<nowiki>not__wikified</nowiki>|{{{<nowiki>not__wikified</nowiki>}}}|
|>| ![[Headings]] |
|start a new line with one or more exclamation points to create headings |>|
|<html><h1>Heading 1</h1><h2>Heading 2</h2><h3>Heading 3</h3><h4>Heading 4</h4><h5>Heading 5</h5></html>|{{{!Heading 1}}}<br />{{{!!Heading 2}}}<br />{{{!!!Heading 3}}}<br />{{{!!!!Heading 4}}}<br />{{{!!!!!Heading 5}}}|
|>|![[Lists]]|
|>| [[Ordered Lists|Lists]] |
|<html><ol><li>item one</li><li>item two<ol><li>level two<ol><li>level three</li></ol></li></ol></li></ol></li></ol></html>|{{{#item one}}}<br/>{{{#item  two}}}<br/>{{{##level two}}}<br/>{{{###level three}}}|
|>| [[Unordered Lists|Lists]] |
|<html><ul><li>item one</li><li>item two<ul><li>level two<ul><li>level three</li></ul></li></ul></li></ul></html>|{{{*item one}}}<br/>{{{*item two}}}<br/>{{{**level two}}}<br/>{{{***level three}}}|
|>| [[Definition List|Lists]] |
|<html><dl><dt>term</dt><dd>definition</dd></dl></html>|{{{;term}}}<br />{{{:definition}}}|
|>| [[Mixed Lists|Lists]] |
|<html><ol><li>ordered<ul><li>unordered<dl><dt>term</dt><dd>definition</dd></dl></li></ul></li></ol></html>|{{{# ordered}}}<br />{{{#* unordered}}}<br />{{{#*;term}}}<br />{{{#*:definition}}}|
| ![[Blockquotes]] |>|
| [[Nested Blockquotes|Blockquotes]] |>|
|<html><blockquote>blockquote<blockquote>level two<blockquote>level three</blockquote></blockquote></blockquote></html>|{{{>blockquote}}}<br />{{{>>level two}}}<br />{{{>>>level three}}}|
|>| [[Multi-line Blockquotes|Blockquotes]] |
|<html><blockquote>multi-line<br/>blockquote</blockquote></html>|{{{<<<}}}<br />{{{multi-line}}}<br />{{{blockquote}}}<br />{{{<<<}}}|
|>| [[Mixed Blockquotes|Blockquotes]] |
|<html><blockquote>foo<br><blockquote>inner foo, level 1<br><blockquote>inner foo, level 2<br></blockquote></blockquote>more foo<br></blockquote></html>|{{{<<<}}}<br />{{{foo}}}<br />{{{> inner foo, level 1}}}<br />{{{>> inner foo, level 2}}}<br />{{{more foo}}}<br />{{{<<<}}}|
|>| ![[Code  / Monospaced Text|Code]] |
|>| [[Inline Code|Code]] |
|{{{monospaced text}}}|<html><code>{{{mono space text}}}</code></html>|
|>| [[Code Block|Code]] |
|<html><pre>{{{<br/>multi-line<br/>code block<br/>}}}</pre></html>|<html><code>{{{</code></html><br/>{{{multi-line}}}<br/>{{{code block}}}<br/><html><code>}}}</code></html>|
| ![[Links]] |>|
|>| [[Internal Links|TiddlyLink]] |
|[[WikiWord]]|{{{WikiWord}}}|
|~NoLink|{{{~NoLink}}} -- a tilde {{{~}}} prevents automatic ~WikiWord links|
|[[Plain Link]]|{{{[[Plain Link]]}}}|
|[[Pretty Link|Tiddler Name]]|{{{[[Pretty Link|Tiddler Name]]}}}|
|>| [[External Links|External Link]] |
|A valid URL is automatically rendered as an external link.|>|
|http://www.tiddlywiki.com|{{{http://www.tiddlywiki.com}}}|
|[[Pretty External Link|http://www.tiddlywiki.com]]|{{{[[Pretty External Link|http://www.tiddlywiki.com]]}}}|
|>| ![[Filesystem Links|Links]] |
|You can, of course, use file system links both as plain or pretty links.|>|
|''Windows Network Path''|{{{[[file://///server/share]]}}}|
|''Windows Local''|{{{[[file:///c:/folder/file]]}}}|
|''Linux/Unix Local''|{{{[[file:///folder/file]]}}}|
|''Relative Path (Subfolder)''|{{{[[folder/file]]}}}|
|>| ![[Images]] |
|In general, image files are external to a TiddlyWiki.|>|
|[img[http://www.tiddlywiki.com/favicon.ico]]|{{{[img[path/image.jpg]]}}}|
| aligned right&nbsp;&nbsp;[>img[http://www.tiddlywiki.com/favicon.ico]]|{{{[>img[path/image.jpg]]}}}|
|[<img[http://www.tiddlywiki.com/favicon.ico]]&nbsp;&nbsp;aligned left|{{{[<img[path/image.jpg]]}}}|
|w/ internal link [>img[http://www.tiddlywiki.com/favicon.ico][TiddlyWiki]]|{{{[img[path/image.jpg][TiddlerName]]}}}|
|w/ external link [>img[http://www.tiddlywiki.com/favicon.ico][http://www.tiddlywiki.com]]|{{{[img[path/image.jpg][TiddlyWiki|http://www.tiddlywiki.com]]}}}|
|>| ![[Gradients|gradient]] |
|<<gradient horiz #faa #afa #aaf>>&nbsp;&nbsp;__vert__ical or __horiz__ontal<br>&nbsp;&nbsp;see [[gradient macro|http://tiddlywiki.org/#%5B%5Bgradient%20(macro)%5D%5D]]>>|{{{<<gradient horiz #faa #afa #aaf>>wiki text>>}}}|
|>| ![[Tables]] |
|<<tiddler HTML_TABLE>>|<<tiddler HTML_TABLE_MARKUP>>|
|>|<<tiddler HTML_TABLE_RULES>>|
|>| ![[Custom Styles|CSS Formatting]] |
|>|a {{{@@highlight@@}}} element can accept CSS syntax to directly style text.|>|
|@@color:green;green coloured@@|{{{@@color:green;green coloured@@}}}|
|>| ![[Custom CSS Class Wrapper|CSS Formatting]] |
|>|You can define a custom css class wrapper, like {{{.button}}} below. By default, the inner text is placed inline into a {{{<span>}}} of said class(s). If you start and end the inner text with a newline, the content is placed in a {{{<div>}}}. Use the StyleSheet to define the css styles applied to the class.|
|<br>{{button title{Click!}}}|<html><pre>{{button title{Click!}}}</pre></html>|
|>| ![[Embedded HTML|HTML Formatting]] |
|<html><span style="padding-right:30px;font-size:2em;">any</span><br /><b>valid</b> <em>xhtml</em></html>|<html><code style="font-weight:bold">&lt;html&gt;</code></html>{{{<span style="padding-right:30px;font-size:2em;">any</span><br /><b>valid</b> <em>xhtml</em>}}}<html><code style="font-weight:bold">&lt;/html&gt;</code></html>|
|>| [[Embedded <iframe>|HTML Formatting]] |
|<html><iframe height="200px" width="300px" src="http://www.youtube.com/embed/Cj6ho1-G6tw?vq=hd720" frameborder="0" allowfullscreen/></html>|<html><code style="font-weight:bold">&lt;html&gt;</code></html>{{{<iframe src="http://the.url"/>}}}<html><code style="font-weight:bold">&lt;/html&gt;</code></html>|
|>| ![[Line Break|Line Breaks]] |
|handy for entering multi-line content into table cells or lists|>|
|a<br>b|{{{a<br>b}}} or {{{a<br/>a}}} or {{{a<br />a}}}|
|>| ![[Horizontal Rules]] |
|before<hr>after|{{{<hr>}}} or <br>{{{----}}} on its own line|
|>| ![[HTML Entities]] |
|>|You can use HTML entities...|
|&#632;&trade; |{{{&#632;&trade;}}}|
| ![[Macros]] |>|
|>|macros are called by enclosing the macro name in {{{<<}}} and {{{>>}}}|
|<<version>> |{{{<<version>>}}}|
|>| ![[Hidden Text|Basic Formatting]] |
|This is hidden: |{{{This is hidden: /% secret comment %/}}}|
!See also...
* [[WikiText]]
* [[Formatting Text]]
* [[Customization]]
* [[Macros]]
!Summary
In a standard TiddlyWiki, the MarkupPostBody shadow tiddler contains HTML and is inserted at the end of the {{{<body>}}} section of the TiddlyWiki HTML file immediately after the script block.
!Default Contents
''none''
!Use Cases
tbd
!Summary
In a standard TiddlyWiki, the MarkupPostHead shadow tiddler contains HTML that is inserted at the end of the {{{<head>}}} section of the TiddlyWiki HTML.
!Default Contents
''none''
!Use Cases
tbd
!Summary
In a standard TiddlyWiki, the MarkupPreBody shadow tiddler contains HTML and is inserted at the beginning of the {{{<body>}}} section of the TiddlyWiki HTML file.
!Default Contents
''none''
!Use Cases
tbd
<!--{{{-->
<link rel="shortcut icon" href="/recipes/tiddlywiki_public/tiddlers/favicon.ico" />
<link href="/bags/tiddlywiki_public/tiddlers.atom" rel="alternate"
	type="application/atom+xml" title="tiddlywiki's public feed" />
<!--}}}-->
!Summary
In a standard TiddlyWiki, the MarkupPreHead shadow tiddler contains HTML and is inserted at the beginning of the {{{<head>}}} section of the TiddlyWiki HTML.
!Default Contents
<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
!Use Cases
tbd
See http://www.mediawiki.org...
!References
<<references>>
A [[space|Space]] may have one or more members who together form a [[Small Trusted Group]] collectively owning the space.
//{{{
config.options.txtFadeTimer = 5000; // 5 seconds 

var displayMessageFADEOUT=displayMessage;
displayMessage=function(text,linkText)
{
	displayMessageFADEOUT.apply(this, arguments);
	ti=config.options.txtFadeTimer;
	if(ti>0)setTimeout(clearMessage,ti); 
}
//}}}
While browsers for iOS, Android & Co. display TiddlyWiki sites on the Internet quite well, all those devices do not allow to save edits in TiddlyWiki on your phone.

However, the following dedicated apps provide editing support for TiddlyWiki on mobilde devices...
|table100|k
|vertical-align:middle; !Operating<br>System | !App |>|>|>|h
|~| !Name | !Devices | !Dropbox |h
|vertical-align:middle;!Android|[[AndTidWiki|https://market.android.com/details?id=de.mgsimon.android.andtidwiki]]|all | yes |
|~|[[Firefox + TiddlyFox|How to get TiddlyFox running on Android?]]|all | yes |
|vertical-align:middle;!iOS|[[TWMobile|http://itunes.apple.com/gb/app/twmobile/id381945222?mt=8]]|iPad | yes |
|~|[[TWEdit|http://itunes.apple.com/gb/app/twedit/id409607956?mt=8]]|iPhone, iPad, iPod Touch | yes |
|~|[[tiddlyNotes|http://itunes.apple.com/us/app/tiddlynotes-lite/id465933435?mt=8]]|iPhone, iPad, iPod Touch | yes |
{{annotation{
''Note:'' These apps are produced by independent third parties not associated with [[TiddlyWiki.com]] or UnaMesa.
}}}
<<tiddler Code>>
/***
|''Name''|MorePlugin|
|''Author''|Tobias Beer|
|''Version''|0.9 beta|
|''Description''|adds a ''Read more about [[XYZ]]...'' reference to a tiddler|
!Usage
Add to ViewTemplate...
{{{
<div macro='more'></div>
}}}
Use your prefered fields editor to add and edit a field called ''more''. A value will be interpreted as follows...
;when the value is the name of an existing tiddler or contained in double square brackets
:» e.g. when {{{more='Valid Tiddler Name'}}} or {{{more='[[Pretty|Link]]'}}}
:» then {{{%0}}} in {{{config.macros.more.template}}} is replaced with the {{{[[Link]]}}}
:» the result gets wikified
;any other value
:» is wikified as-is, without using {{{config.macros.more.template}}}
;no value or field "more" not present
:» nothing is wikified
!Code
***/
//{{{
config.macros.more = {
	template: "For more information, see %0...<br><br>",
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var tid = story.findContainingTiddler( place );
		tid = tid ? store.getValue( tid.getAttribute( 'tiddler' ) , 'more' ) : '';
		tid = store.getTiddler( tid ) ? "[[" + tid + "]]" : tid;
		var isLink = tid && tid.substr( 0, 2 ) == '[[' && tid.substr( tid.length - 2 , 2 ) == ']]';
		tid = isLink ? this.template.format([tid]) : tid;
		if( tid ) wikify( tid , place );
	}
};
//}}}
By default, some [[TiddlyWiki Markup]] such as lists or tables do not allow multi-line content. However, workarounds exist to achieve this nontheless.
!Custom CSS Class Wrapper
See section ''Custom CSS Class Wrapper'' in [[TiddlyWiki Markup]]...

The most simple and versatile method to use multi-line content in a list element is by using a (dummy) custom CSS class wrapper, e.g.:
<html><pre>
#item 1
#{{multiLine{
!!!Heading
Some content.
}}}
# item 3
</pre>
<ol>
<li>item 1</li>
<li>
<h3>Heading</h3>
<p>Some content.</p>
</li>
<li>item 3</li>
</ol></html>{{annotation{
''Note'': You are not required to actually define the respective css class in your StyleSheet.
}}}
!"""Manual Line Breaks"""
Especially in tables, a manual line break can be used, e.g.:
{{{
|!foo|bar<br>baz|
}}}
|!foo|bar<br>baz|
The same can be achieved using [[CoreTweak #831 from TiddlyTools|http://tiddlytools.com/#CoreTweaks]] and the following syntax:
{{{
|!foo|bar\\
baz|
}}}
Create a line break simply by appendind two backslashes at the end of a line without breaking the list or table format.
{{annotation{
''Note'': A [[TiddlyTools CoreTweak|http://tiddlytools.com/#CoreTweaks]] can be installed either by importing the whole [[CoreTweaks|http://tiddlytools.com/#CoreTweaks]] plugin or by appending the desired [[CoreTweak|http://tiddlytools.com/#CoreTweaks]] to your [[zzConfig]].
}}}
!"""Using Transclusion"""
You can use the [[tiddler macro|tiddler]] to transclude (embed) multi-line into a tiddler by fetching it from another tiddler, e.g.:
{{{
# item 1
# <<tiddler [[item 2]]>>
# item 3
}}}
!!!Partial Transclusion
You can as well transclude a hidden section of the same tiddler, e.g ''~SomeTiddler'' might contain:
{{{
|Foo|<<tiddler [[SomeTiddler##LOREM]]>>|
|Bar|<<tiddler [[SomeTiddler##IPSUM]]>>|
/%
!LOREM
Lorem ipsum dolor sit amet.
!IPSUM
Consectetur adipisicing elit.
!END%/
}}}
|Foo|Lorem ipsum dolor sit amet.|
|Bar|Consectetur adipisicing elit.|
{{annotation{
''Note:'' Fore hidden sections, use uppercase """SECTION TITLES""" to easily identify that it's a hidden section.
}}}
!"""MediaWiki Formatter"""
The [[MediaWikiTableFormatterPlugin|Formatting Text]] provides an alternative table syntax supporting multi-line content in table cells.
If it seems like wiki options ("options >>" on the right sidebar) aren't being saved between browser sessions. 

Make sure you have cookies enabled because the TW options are saved in cookies.
You can also  change the default settings in a tiddler variously called systemconfig, systemsettings, zzconfigoptions. These are tiddlers, not tags.

See also [[How do I change my default options?|Persistent Options]]
Open the [[SiteTitle]] tiddler. (The tiddler is in GettingStarted but can also be found using the search box or listed under the All or Timeline tabs on the right-hand menu.)

Type the TiddlyWiki name in the main text box (below the yellow box which says 'this shadow tiddler...') 

Click on Done (grey menu at top right of tiddler). The name should now be displayed in the header at the top of the TiddlyWiki.

The TiddlyWiki's sub-title can be changed by opening and editing the [[SiteSubtitle]] tiddler.
/*!
|''Name:''|NiceTaggingPlugin|
|''Description:''|Creates a nicer interface for adding and removing TiddlyWiki. Ideal for tiddly novices. |
|''Version:''|0.6.6|
|''Date:''|October 2010|
|''Source:''|http://svn.tiddlywiki.org/Trunk/contributors/JonRobson/plugins/niceTagging/plugins/NiceTaggingPlugin.js|
|''Author:''|Jon Robson|
|''License:''|[[BSD open source license]]|
|''CoreVersion:''|2.3|
|''Dependencies:''||
!Usage
{{{<<niceTagger tags>>}}} or {{{<<niceTagger field>>}}}
!!Additional Parameters
splitOn: <character>
valuesSource: <tiddler title>
textcase: <lower>
!StyleSheet
.tip {font-style:italic;font-weight:bold;}
input.dp-applied {width: 140px; float: left;}
.niceTagger input {width:200px; float:left;}
.deleter {color:red; font-weight:bold; padding:2px; cursor:pointer;}
.ac_results {padding: 0px;border: 1px solid black;background-color: white;overflow: hidden;z-index: 99999;}
.ac_results ul {width: 100%;list-style-position: outside;list-style: none;padding: 0;margin: 0;}
.ac_results li {margin: 0px;padding: 2px 5px;cursor: default;display: block;font: menu;font-size: 12px;line-height: 16px;overflow: hidden;}
.ac_loading {background: white url('indicator.gif') right center no-repeat;}
.niceTaggerAdder input {width:auto; display: inline;}
.ac_odd {background-color: #eee;}
.ac_over {background-color: #0A246A;color: white;}
*/
//{{{
(function($) {

config.shadowTiddlers.NiceTaggingStyle = store.getTiddlerText(tiddler.title + "##StyleSheet");
store.addNotification("NiceTaggingStyle", refreshStyles);

String.prototype.toJSON = function(){
	var namedprms = this.parseParams(null, null, true);
	var options ={};
	for(var i=0; i < namedprms.length;i++){ 
		var nameval = namedprms[i];
		if(nameval.name) {
			options[nameval.name] = nameval.value;
		}
	}
	return options;
};

var macro = config.macros.niceTagger = {
	lingo:{
		add: "add"
	},
	twtags: {},
	initialised:{},
	init: function(field){
		field = !field ? 'tags' : field;
		if(this.initialised[field]){
			if(field == 'tags') {
				var numTags = store.getTags();
				if(numTags.length == this.twtags[field].length) {
					return;
				}
			} else {
				return;
			}
		}
		var tiddlers= store.getTiddlers();
		macro.twtags[field] = [];
		var uniqueSuggestions = [];
		for(var i=0; i < tiddlers.length; i++){
			var tid = tiddlers[i];
			var values;
			if(field=='tags') {
				values = tid.tags;
			} else {
				values= tid.fields[field];
				values = values ? values : "";
				values = values.readBracketedList();
			}
			for(var j=0; j < values.length; j++){
				uniqueSuggestions.pushUnique(values[j]);
			}
			
		}
		macro.twtags[field] = uniqueSuggestions;
		this.initialised[field] =true;
	},
	save: function(title, field, listvalues, place, autosavechanges) {
		var tiddler = store.getTiddler(title);
		var tiddlerEl = story.getTiddler(title);
		var valueToSave;
		valueToSave = String.encodeTiddlyLinkList(listvalues);
		var el = $("[edit=%0]".format([field]), tiddlerEl);
		if(el.length === 0) {
			el = $("<input />").attr("type", "hidden").attr("edit", field).appendTo(place);
		}
		el.val(valueToSave);

		var dummy = new Tiddler(title);
		if(field == "tags") {
			dummy.tags = listvalues;
		} else {
			dummy.fields[field] = valueToSave;
		}
		return dummy;
	},
	refreshFieldDisplay: function(place, tiddler, field) {
		var container = $(".niceTagger", place);
		container.empty();
		var values;
		if(!field || field == 'tags') {
			values = tiddler.tags;
		} else {
			values = tiddler.fields[field] ? tiddler.fields[field].readBracketedList() : [];
		}
		for(var t = 0; t < values.length; t++){
			var tag = values[t];
			$("<span />").addClass("tag").text(tag).appendTo(container);
			$("<span />").addClass("deleter").text("x").attr("deletes", escape(tag)).appendTo(container);
		}

		$(".deleter", place).click(function(ev){
			var todelete = $(ev.target).attr("deletes");
			var newValues = [];
			for(var i = 0; i < values.length; i++){
				var value = values[i];
				if(escape(value) != todelete) {
					newValues.push(value);
				}
			}
			tiddler = macro.save(tiddler.title, field, newValues, place, tiddler.autosavechanges);
			macro.refreshFieldDisplay(place, tiddler, field);
		});
	},
	saveNewValue: function(tiddler, field, value, container, splitChar) {
		var tiddlerEl = story.getTiddler(tiddler.title);
		var editEl = $("[edit=%0]".format([field]), tiddlerEl);
		var adder = $(".niceTaggerAdder input[type=text]", container);
		var saveThis;
		if(editEl.length > 0) {
			saveThis = editEl.val() || "";
			saveThis = saveThis.readBracketedList();
		} else {
			if(field == 'tags') {
				saveThis = tiddler.tags;
			} else {
				var val = tiddler.fields[field];
				val = val ? val : "";
				saveThis = val.readBracketedList();
			}
		}
		value = typeof(value) == 'string' ? value.trim() : value;
		if(value.length === 0) {
			return;
		}
		var newValues;
		if(splitChar && value && value.indexOf(splitChar) != -1){
			newValues = value.split(splitChar);
		} else {
			newValues = [value];
		}
		for(var i = 0; i < newValues.length;i++){
			var svalue = newValues[i];
			saveThis.pushUnique(svalue);
		}
		tiddler = macro.save(tiddler.title, field, saveThis, container, tiddler.autosavechanges);

		macro.refreshFieldDisplay(container, tiddler, field);
		$(adder).val("");
	},
	getSuggestionsFromTiddler: function(srcTiddler, textcase){
		var suggestions = [];
		if(srcTiddler){
			var src = store.getTiddler(srcTiddler);
			var text = src.text;
			var tempdiv = document.createElement("div");
			wikify(text, tempdiv, null, src);
			var html = $(tempdiv).html();
			suggestions = html.split(/<br\/?>/gi);
		}
		var finalSuggestions = [];
		for(var i=0; i < suggestions.length; i++){
			var val = suggestions[i].trim();
			if(textcase && textcase == "lower") {
				val = val.toLowerCase();
			}
			finalSuggestions.pushUnique(val);
		}
		return finalSuggestions;
	},
	removeFromList: function(list,removeList){
		var uniqueSuggestions = [];
		for(var i=0; i < list.length; i++){
			var s =list[i];
			if(s && typeof(s) == 'string'){
				if(uniqueSuggestions.indexOf(s) ==-1 && removeList.indexOf(s) ==-1){
					uniqueSuggestions.push(s);
				}
			}
		}
		return uniqueSuggestions;
	},
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var options = paramString.toJSON();
		var args = paramString.parseParams("anon")[0];
		if(options.autoSaveChanges) {
			tiddler.autosavechanges = true;
		}
		if(!options.field) {
			options.field = args.anon ? args.anon[0] : "tags";
		}
		this.init(options.field);
		var container = $("<div />").addClass("niceTaggerContainer").attr("field", options.field).
			appendTo(place)[0];
		var displayer = $("<div />").addClass("niceTagger").appendTo(container)[0];
		macro.refreshFieldDisplay(container, tiddler, options.field);
		var tagplace = $("<div />").addClass("niceTaggerAdder").appendTo(container)[0];
		var splitChar = options.splitOn;
		var adder;

		if($().autocomplete){
			params = paramString.parseParams("anon", null, true, false, false);
			var textcase = getParam(params, "case");
			var srcTiddler = getParam(params, "valuesSource");
			var suggestions;
			if(srcTiddler) {
				suggestions = macro.getSuggestionsFromTiddler(srcTiddler, textcase);
			} else {
				suggestions = [];
			}
			var tagsoff = getParam(params,"nostoretags");
			if(!tagsoff) {
				suggestions = suggestions.concat(macro.twtags[options.field]);
			}

			var ignoreList = paramString.parseParams("exclude", null, true, false, true);
			if(ignoreList && ignoreList[0] && ignoreList[0].exclude) {
				ignoreList = ignoreList[0].exclude;
			} else {
				ignoreList = ["excludeList"];
			}
			suggestions = macro.removeFromList(suggestions, ignoreList);

			var addtaghandler = function(v) {
				macro.saveNewValue(tiddler, options.field, $(v).val(), container, splitChar);
			};
			$("<input type='text' name=\""+options.field+"\" value=\"\"/>").autocomplete(suggestions,{ matchContains: true, selectFirst:false }).result(addtaghandler).appendTo(tagplace);
			adder = $("input", tagplace)[0];
		} else {
			adder = document.createElement("input");
			tagplace.appendChild(adder);
		}
		$(adder).keypress(function (ev) {
			ev.stopPropagation();
			if(ev.which == 13){
				var results = $(".ac_over",".ac_results"); //is anything highlighted in autocomplete plugin ?
				var value;
				if(results.length === 0) {
					value = $(ev.target).val();
				} else {
					value = $(results[0]).val();
				}
				macro.saveNewValue(tiddler, options.field, value, container, splitChar);
			}
		});
		var addbutton = document.createElement("input");
		addbutton.type = "button";
		addbutton.value = macro.lingo.add;
		addbutton.className = "adder";
		tagplace.appendChild(addbutton);
		$(addbutton).click(function(e){
			var val = $(adder).val() || "";
			macro.saveNewValue(tiddler, options.field, val, container, splitChar);
		});
	}	
};

_setTiddlerField = Story.prototype.setTiddlerField;
Story.prototype.setTiddlerField = function(title, value, mode, field) {
	var tiddler = store.getTiddler(title) || new Tiddler(title);
	var container = $(".niceTaggerContainer[field=%0]".format([field]), 
		story.getTiddler(title));
	if(container.length > 0) {
		macro.saveNewValue(tiddler, field, value, container[0]);
	} else {
		_setTiddlerField.apply(this, arguments);
	}
	
};
})(jQuery); //end alias
//}}}
See [[About the old and the new wikis]]...
TiddlyWiki provides a number of settings that allow you to configure your user experience.

In a classic TiddlyWiki these can be found in the right sidebar in the [[OptionsPanel]] from which also points to the [[AdvancedOptions]] that are as well accessible in the [[Backstage Area]] under ''Tweaks''.
From the [[Glossary]]...
<<<
<<tiddler Option>>
<<<

Does your browser tend to forget your settings or do you use TiddlyWiki in different places? Then read [[Changing Default Options]] or [[Persistent Options]] on how to make your settings permanent.
!Summary
The shadow tiddler OptionsPanel is used as the contents of the options panel slider in the right-hand sidebar.
!Default Contents
{{{
These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser

Your username for signing your edits. Write it as a [[WikiWord]] (eg [[JoeBloggs]])

<<option txtUserName>>
<<option chkSaveBackups>> [[SaveBackups]]
<<option chkAutoSave>> [[AutoSave]]
<<option chkRegExpSearch>> [[RegExpSearch]]
<<option chkCaseSensitiveSearch>> [[CaseSensitiveSearch]]
<<option chkAnimate>> [[EnableAnimations]]

----
Also see [[AdvancedOptions]]

}}}
/***
|''Name''|OrgDocPlugin|
|''Author''|Tobias Beer|
|''Version''|1.0|
|''Description''|Shows annotations for plugins and shadows which point to the corresponding documentation tiddler.|
!Usage
Add to ViewTemplate...
{{{
<div macro='orgDoc'></div>
}}}
!Code
***/
//{{{
config.macros.orgDoc = {
    local: {
        msgIntro: "This is a [[%0|%1]].",
        msgGoTo: " You may find documentation for it at [[%0|%1]]",
        msgMissing: " Unfortunately, there is no documentation yet at [[%0]]",
        txtPLUGIN: 'plugin',
        txtSHADOW: 'shadow tiddler'
    },
    handler: function (place, macroName, params, wikifier, paramString, tiddler) {
        var
            tid = tiddler.title,
            url = window.location.href,
            source = /^(http\:\/\/tiddlywiki.org|http\:\/\/tiddlywiki.tiddlyspace.com)/,
            match = null != source.exec(url),
            isShadow = config.shadowTiddlers[tid] != null,
            type = isShadow ? 'SHADOW' : (
                tiddler.tags && tiddler.tags.contains('systemConfig') ?
                'PLUGIN' :
                null
            ),
            doc = tid + '...',
            docTid = store.getTiddler(doc);

        if (!type) return;

        wikify(
            "\n{{annotation{\n''Note:'' " +
            this.local.msgIntro.format([
                this.local['txt' + type],
                (
                    (match ? '' : 'http://tiddlyWiki.org/#') +
                    (type == 'PLUGIN' ? 'Plugins' : 'ShadowTiddler')
                )
            ]) +
            this.local['msg' + (docTid ? 'GoTo' : 'Missing')].format([
                match ?
                doc :
                ('TiddlyWiki.Org|http://tiddlywiki.org#' + encodeURIComponent(String.encodeTiddlyLink('[[' + doc + ']]')))
            ]) +
            "\n}}}\n",
            place
        );
    }
}
//}}}
|''Name''|OrgDocPlugin|
|''Author''|Tobias Beer|
|''Version''|1.0|
|''Description''|Shows annotations for plugins and shadows which point to the corresponding documentation tiddler.|
!Details
Primarily developed for [[tiddlywiki.org|http://tiddlywiki.org]], this plugin shows annotations for plugins and shadows which point to the corresponding documentation tiddler.
[[Osmosoft|http://osmosoft.com]] is the open source innovation arm of [[BT|http://www.bt.com]]. 

Osmosoft helps promote [[Open Source|http://en.wikipedia.org/wiki/Open_source]] within [[BT]], ensuring that benefits from as well as obligations to consuming and contributing to [[Open Source|http://en.wikipedia.org/wiki/Open_source]] projects are well understood.

Osmosift helps drive innovation, leading several popular projects including [[TiddlyWiki]], [[TiddlyWeb]] and of course [[TiddlySpace]].
Initially, the person creating a space is the Owner of that space, esp of their [[Home Space]].

When other [[users|User]] are [[added as members|Add Member]], all [[mambers|Member]] are considered as [[peers|Small Trusted Group]] sharing the same privileges as the initial [[owner|Owner]].
<!--{{{-->
<div class='header'>
	<div id='sidebarSearch'>
		<span macro='search'></span>
	</div>
	<div class='headerForeground'>
		<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
		<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
	</div>
	<div class='clearFloat'></div>
</div>

<div id='menuBar'>
	<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
	<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
</div>
<div id='displayArea'>
	<div id='messageArea'></div>
	<div id='tiddlerDisplay'></div>
	<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<!--}}}-->
!Summary
The shadow tiddler PageTemplate contains the HTML markup that defines the overall layout and structure of TiddlyWiki. Here you can change the main content areas in your TiddlyWiki.
!Default Contents
<!--{{{-->
<div class='header'
  macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
  <div class='headerShadow'>
    <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
    <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
  </div>
  <div class='headerForeground'>
    <span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
    <span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
  </div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
  <div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
  <div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
  <div id='messageArea'></div>
  <div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
/***
|''Name''|ParamParserMacro|
|''Author''|[[Tobias Beer|http://tobibeer.tiddlyspace.com]]|
|''Version''|1.0|
|''Description''|Displays how TiddlyWiki parses macro parameters.|
|''Source''|http://paramparser.tiddlyspace.com#ParamParserMacro|
|''~CoreVersion''|2.6.1|
|''Documentation''|See below...|
''Note:'' Parameter evaluation may be turned off in a TiddlySpace!
!Usage
Use the {{{<<params>>}}} macro with parameters of your choice to see how TiddlyWiki would parse them.
{{{
<<params
  foo
  [[bar]]
  {{'baz'}}
  foo:bar
  baz:[[mumble]]
  bar:'keeper'
  bar:"tender"
  isTrue:{{!false}}
>>
}}}
<<params
  foo
  [[bar]]
  {{'baz'}}
  foo:bar
  baz:[[mumble]]
  bar:'keeper'
  bar:"tender"
  isTrue:{{!false}}
>>
!Code
***/
//{{{
(function($){

config.macros.params = {
  handler: function(place, macroName, params, wikifier, paramString, tiddler) {
    var e, i, iColon, key, px = {},
    p = paramString.parseParams('anon',null,true),
    e = paramString.checkEval('foo',null,true),
    checkEval = /^(\{\{)(.*)(\}\})$/,

    out =
      "|>|>|>|>|>| !Params Array |\n" +
      "| !# | !params[#-1] " +
      "|min-width:60px; !type " +
      "|min-width:60px; !evaluated? " +
      "|min-width:60px; !key "+
      "|min-width:60px; !value |\n";
console.log(params);
    for(i=0; i< params.length; i++) {
      v = params[i];
      iColon = v.indexOf(':');
      key = p[0]['anon'] && p[0]['anon'].contains(v) ? null : v.substr(0, iColon);
      if(key){
        if(px[key] == undefined )
          px[key] = 0;
        else
          px[key] = px[key] + 1;
      }

      out +=
        "| " + (i+1) + " |" +
        "{{{ " + v + " }}}| " +
        (key ? "named" : "simple") + " | " +
        (e[i] == 0 ? "no" : ( e[i] == 1 ? "yes" :
          "<html>" +
            "<a title='Evaluation may have failed because parameter evaluation is disabled, e.g. in TiddlySpace.' " +
               "href='http://tiddlywiki.org/#%5B%5BEvaluated%20Parameters%5D%5D' " +
               "target='_blank' class='externalLink'>" +
                "failed" +
            "</a>" +
          "</html>"
        )) + " |" +
        (key ? key : "") + " |" +
        (key ? p[0][key][px[key]] : v ) + "|\n";
    }
    if(!i)out += "|>|>|>|>|>|//empty// |\n";

    out +=
      "|>|>|>|>|>|! Params parsed using...|\n" +
      "|>|>|>|>|>|padding:5px 20px; [[" +
        "p = paramString.parseParams('anon', null, true); |" +
        "http://tiddlywikidev.tiddlyspace.com/#String.prototype.parseParams()" +
      "]] |\n";

    i=0;
    out +=
      "|>|>|>|>|>|!Simple Parameters|\n" +
      "|>|>|>|>|>|padding:5px 20px; as stored in array {{{p[0]['anon']}}} |\n";
    $.each(p[0], function(key, val){
      if(key == 'anon'){
        i++;
        for (var v=0; v < val.length; v++){
          out += "| ''[" + v + "] = ''|>|>|>|>|{{{" + val[v] + "}}}|\n";
        }
      }
    });
    if(!i)out += "|>|>|>|>|>|//none// |\n";

    i=0;
    out +=
      "|>|>|>|>|>|!Named Parameters|\n" +
      "|>|>|>|>|>|padding:5px 20px; fetched using [[" +
        "var fooVal = getParam(p,'foo',''); |" +
        "http://tiddlywikidev.tiddlyspace.com/#getParam()" +
      "]] |\n";

    $.each(p[0], function(key, val){
      if(key != 'anon'){
        i++;
        out += "| ''" + key + " = ''|>|>|>|>|{{{" + getParam(p,key,'') + "}}}";
        if( val.length > 1 ) {
          out +=
          "<br><br>There actually are multiple values for parameter ''" + key + "''!<br>"+
          "If you -- as a developer -- want to support this,<br>" +
          "do not use {{{" + key + "Val = getParam(p, '" + key + "', '');}}}.<br><br>" +
          "Rather retrieve all values using<br>" +
          "{{{" + key + "Arr = p[0]['" + key + "'];}}}.<br><br>" +
          "Then, access your values like this:"
          for (var v=0; v < val.length; v++){
            out += "<br>''" + key + "Arr[" + v + "] = ''{{{" + val[v] + "}}}";
          }
        }
        out += "|\n";
      }
    });
    if(!i)out += "|>|>|>|>|>|//none// |\n";

    out +="|>|>|>|>|>|!parsed paramString|\n"+
      "| ''p = ''|>|>|>|>|" +
      "<html><code style='white-space:pre'>" +
      JSON.stringify(p, undefined, 2).replace(/\n/mg,"</code><br /><code style='white-space:pre'>") +
      "</code></html>|\n";

    wikify(out,place);
    $('table',place).last().find('td').css('vertical-align','top');
  }
};


// Based on parseParams... only purpose is to check if params are evaluated

// Parse a space-separated string of name:value parameters
// The result is an array of objects:
//   result[0] = object with a member for each parameter name, value of that member being an array of values
//   result[1..n] = one object for each parameter, with 'name' and 'value' members
String.prototype.checkEval = function(defaultName,defaultValue,allowEval,noNames,cascadeDefaults) {
  var count=0;
  var evaluated=[];
	var parseToken = function(match,p) {
		var n;
		if(match[p]) // Double quoted
			n = match[p];
		else if(match[p+1]) // Single quoted
			n = match[p+1];
		else if(match[p+2]) // Double-square-bracket quoted
			n = match[p+2];
		else if(match[p+3]) // Double-brace quoted
		{
    	try {
				n = match[p+3];
				if(allowEval && config.evaluateMacroParameters != "none") {
					if(config.evaluateMacroParameters == "restricted") {
						if(window.restrictedEval) {
							n = window.restrictedEval(n);
              evaluated.push(1);
						}else{
              evaluated.push(2);
            }
					} else {
						n = window.eval(n);
            evaluated.push(1);
					}
				}else{
          evaluated.push(2);
        }
			} catch(ex) {
        evaluated.push(2);
			}
    }
		else if(match[p+4]) // Unquoted
			n = match[p+4];
		else if(match[p+5]) // empty quote
			n = "";
		return n;
	};
	var r = [{}];
	var dblQuote = "(?:\"((?:(?:\\\\\")|[^\"])+)\")";
	var sngQuote = "(?:'((?:(?:\\\\\')|[^'])+)')";
	var dblSquare = "(?:\\[\\[((?:\\s|\\S)*?)\\]\\])";
	var dblBrace = "(?:\\{\\{((?:\\s|\\S)*?)\\}\\})";
	var unQuoted = noNames ? "([^\"'\\s]\\S*)" : "([^\"':\\s][^\\s:]*)";
	var emptyQuote = "((?:\"\")|(?:''))";
	var skipSpace = "(?:\\s*)";
	var token = "(?:" + dblQuote + "|" + sngQuote + "|" + dblSquare + "|" + dblBrace + "|" + unQuoted + "|" + emptyQuote + ")";
	var re = noNames ? new RegExp(token,"mg") : new RegExp(skipSpace + token + skipSpace + "(?:(\\:)" + skipSpace + token + ")?","mg");
	var match;
	do {
		match = re.exec(this);
		if(match) {
			var n = parseToken(match,1);
			var v = parseToken(match,8);
			if(v == null && defaultName) {
				v = n;
				n = defaultName;
			} else if(v == null && defaultValue) {
				v = defaultValue;
			}
			r.push({name:n,value:v});
			if(cascadeDefaults) {
				defaultName = n;
				defaultValue = v;
			}
		}
    if(evaluated.length == count) evaluated.push(0);
    count++;
	} while(match);

	return evaluated;
};

if(window.location.href.indexOf('http://paramparser.tiddlyspace.com') >= 0)
  config.evaluateMacroParameters = "full";

})(jQuery);
//}}}
See [[Startup Parameters]]...
'' Slow Rendering ''

In TiddlyWikis with a large amount of tiddlers, the listings in [[SideBarTabs]] (e.g. [[Timeline]]) might require a long time to be generated, thus inhibiting the overall performance.

cf. [[Tips for speeding up performance on large TiddlyWikis|http://www.giffmex.org/twfortherestofus.html#%5B%5BTips%20for%20speeding%20up%20performance%20on%20large%20TiddlyWikis%5D%5D]]

Quote:[[Dave|http://groups.google.com/group/TiddlyWiki/browse_thread/thread/2558268245a93d7a/cec021c6f5b42271?#cec021c6f5b42271]]
I recommend disabling animations even on medium-sized tiddlywikis. Animations slow it down. Also, if your file gets big you will want to open the shadowed tiddler tab rather than the tab listing all tidders A-Z or by date. Or hide the tabbed menus altogether if you don't need them showing. With each new tiddler, the image of the two tabbed lists I mentioned (all and by date) has to be refreshed and can take a while. You can remove the tabbed lists from the page layout by removing their code from PageTemplate. Nevertheless, I have a couple TiddlyWikis with 1,000s of tiddlers that each have form fields, and I am not noting any other performance
issues yet.

'' Plugin Load Times ''

[[Eric|http://groups.google.com/group/TiddlyWiki/browse_thread/thread/38c0b23e4e007c2b/263409bf4f852efd?#263409bf4f852efd]]
The plugin 'load timer' information is available in the shadow tiddler, [[PluginManager]], which is also accessible from the
backstage>plugins menu, or by embedding the <nowiki><<plugins>></nowiki> macro into any tiddler content.

[[Martin|http://groups.google.com/group/TiddlyWiki/browse_thread/thread/38c0b23e4e007c2b/53af6dface09556f?#53af6dface09556f]]
You can also see the total time taken to load the plugins:
1) go to the tweak dropdown in backstage
2) click the "Show unknown options" checkbox
3) click the "chkDisplayInstrumentation" checkbox, it's about the 8th one down
this will let you see what proportion of the total load time is spent loading the plugins


'' Maximum File Size ''
Ken: This seems to be the constant question: How big can it get?
As far as I am aware there is no limit to how big of a file you can download and open. I pumped up a TW to around 3 megs just to see what it could do and didn't have any problems. It took a while to get the file, but I got it.

If you are running lots of plugins then Firefox will give you the "A script is making this page run slow. Do you want to continue?" message, but it will load. 


[[Daniel|http://groups.google.com/group/TiddlyWiki/browse_thread/thread/2558268245a93d7a/7dcfe21a4e0d5bd3?#7dcfe21a4e0d5bd3]]
The problems reported by people with large TiddlyWikis are usually performance based, and it seems that the solution (once you've disabled animations..) is to remove macros that loop through every tiddler, like the tabs in the sidebar.  So it's not so much the size
that's the problem in a direct sense, but the fact that many TW macros assume that looping through every tiddler isn't very slow. 


Markus: Mine is online and loading of about 1.7 MB might be quite annoying for people with low bandwidth. I'm desperately seeking for a solution !


''Book Comparison ''

[[Alice in Wonderland|http://www.gutenberg.org/etext/11]], a book of approximately 200 pages, translates to a mere 160 kB in plain-text format.

'' See Also ''

* [[Tips for speeding up performance on large TiddlyWikis|http://www.giffmex.org/twfortherestofus.html#%5B%5BTips%20for%20speeding%20up%20performance%20on%20large%20TiddlyWikis%5D%5D]]
* [[I keep getting "A script is making this page run slow" in Firefox]]
A PermaLink allows you to open TiddlyWiki with a dedicated tiddler or a set of tiddlers.

TiddlyWiki provides two ways to contruct a PermaLink...
;PermaLink Toolbar Button
:&raquo; outputs a link in the browsers address bar to open TiddlyWiki with this tiddler
;PermaView Sidebar Button
:&raquo; outputs a link in the browsers address bar to open TiddlyWiki with all currently displayed tiddler preserving the order
See...
* [[PermaLink]]
* [[permaview (macro)]]
As of version 2.6.5, TiddlyWiki can save options permanently -- in addition to the ability to save options in cookies. Persistent options are stored in the shadow tiddler called [[SystemSettings]] which need to create manually.
For example, the option {{{chkAnimate}}} is currently stored as a cookie. To make it option persistent add it to your SystemSettings tiddler:
<<<
chkAnimate: true
<<<
''Note:'' It can still be changed using the OptionsPanel in the sidebar.

The names of all available options can be found in the shadow tiddler called AdvancedOptions.
{{annotation{
!Important
An even more flexible and powerful option is to use a [[zzConfig]] type of tiddler. For details, see [[Changing Default Options]].
}}}
!!Under The Hood
TiddlyWiki uses a JavaScript object to store options from SystemSettings, e.g.
{{{
config.optionsSource {
	chkAnimate: "setting",
	chkAutoSave: "setting"
	// etc...
}
}}}
Each option can take two values...
;null
:» the option is stored in a cookie (default)
;setting
:» the option is stored in SystemSettings
See [[Plugins]]...
!ImportTiddlers Method

see [[Importing Tiddlers]]

!Copy & Paste Method

;Locate the plugin you want to install
* It's a good idea to get it from the plugin author's site so you know you have the latest version

;Copy the source of the plugin tiddler
* To do this you need to click the tiddler's 'edit' button. Sometimes instead of an 'edit' button there is a 'view' or 'source' button instead, but either way it should show you the source of the plugin tiddler.
* Click in the text box and do an "Edit", "Select All" from your browser menu, or press Ctrl-A (Cmd-A for Mac users) to select the entire contents. Often the tiddlers contents is already selected for you so you may be able to skip this step.
* Do an "Edit", "Copy", or press Ctrl-C (Cmd-C for Mac users) to copy the entire contents of the tiddler.

;Create the plugin tiddler in your TiddlyWiki
* Back in your own TiddlyWiki, click 'new tiddler' to create a tiddler.
* You can name the tiddler anything you like but to save confusion give it the same as the plugin you are installing.
* Do an "Edit", "Paste", or Ctrl-V/Cmd-V to paste the plugin source code into your new plugin tiddler.
* (Note if you updating a plugin you already have you can just edit it, do a select all, delete to clear the contents before you paste in the new contents).

;Add the "systemConfig" tag
* Before you save the new plugin tiddler, add the tag "systemConfig" to the tags box. It must start with a lowercase 's'. This is what tells TiddlyWiki to execute the code in the plugin tiddler when starting.

;Save and reload
* The plugin is not active until you save and reload your TiddlyWiki so click 'save changes', then click reload in your browser.

;Testing
* Now your plugin should be active and working. Check that it is doing what it should be doing.

!Troubleshooting

cf. [[Troubleshooting]]

;If it's not working but you don't get an error

Check the following
* Did you remember the systemConfig tag? It must be spelt correctly and it is case sensitive.
* Did you save and reload?

;You get javascript error messages (check your Javascript Console in Firefox)

* It means that there are errors in the plugin code.
* Check that you copied the entire plugin source code and that you clicked edit (or view or source) before copying.
* It's possible that the plugin is buggy. If you email the plugin author or post to the TiddlyWiki Google Group you may get some help. Mention your browser your OS and the details of the problem you're having.
<<tiddler "Best Practices">>
!Summary
By default, the shadow tiddler PluginManager contains nothing but the command to display the plugin manager.
!Default Contents
{{{
<<plugins>>
}}}
Plugins are a core feature of TiddlyWiki and...
* are optional modules extending the functionality of TiddlyWiki containing JavaScript 
* are tagged <<tag systemConfig>> which TiddlyWiki interprets as "Please, run my code when the wiki loads!"
* typically provide macros or functions later triggered, e.g. by being calling from the tiddler text when a tidder is opened
* are mostly written by third-party developers and released under an open-source license

!"""Installing Plugins"""
[[Ideally|Plugin Installation]], to install a plugin, [[import|Importing]] it from its original location into your TiddlyWiki. You can, however, also copy and paste a plugin into a new tiddler.
{{annotation{
Note: In order to be processed on startup, plugins need  to be tagged <<tag systemConfig>>.
}}}
!"""Executing Plugins"""
Plugins are loaded and run by TiddlyWiki upon startup in alpha-numeric, case-sensitive order by tiddler title, i.e. A-Z precedes a-z.
!!!Plugin Dependencies
Plugins support the use of a ''Requires'' [[slice]]. For a plugin which contains such a slice, the plugins listed as required are loaded first, regardless of the sort order of the titles.

Object detection can be used for [[strict dependency handling|Best Practices]]. 

!Example

If PluginA requires PluginB to be loaded first, it should contain the following directive:
{{{
|Requires|PluginB|
}}}
This will force an override of the normal load sequence and ensure that PluginB is loaded before PluginA is processed.

! See Also

* <<tag plugins>>
* [[Plugin Installation]]
* [[Plugin Repositories]]
* [[Plugin Questions]]
* [[Macros]]
* [[Best Practices]]
! Be Bold!

Contributions to the wiki are always welcome. If you ever come across information that you think is useful to a larger audience, feel free to add it to the wiki.

Don't worry if you're not sure about details like page title or categorization - this is a wiki, so chances are others will take care of those issues as they find them.

! Editing Guidelines

Anyone who is a member of TiddlySpace has the power to edit in this space.

! Page Names

Page names should generally be concise (e.g. "Customization" or "Customizing" instead of "How to customize TiddlyWiki.").

!! Capitalization in Titles

# Always capitalize the first and the last word.
# Capitalize all nouns, pronouns, adjectives, verbs, adverbs, and subordinate conjunctions ("as", "because", "although").
# Lowercase all articles, coordinate conjunctions ("and", "or", "nor"), and prepositions regardless of length, when they are other than the first or last word.<br>Capitalize prepositions of five characters or more ("after", "among", "between").
# Lowercase the "to" in an infinitive.

source: [http://www.writersblock.ca/tips/monthtip/tipmar98.htm Writer's Block]

! See Also

* [[Quality]]
* <<tag help>>
See [[Tiddler Templates]]...
'' Problem ''

When you type a bunch of spaces into your TiddlyWiki, they look ok until you save and reload.  Then any run of multiple spaces have been replaced with an single space. This also affects tab characters so it's especially nasty for plugins and code snippets. All your indenting gets trashed.

'' Solution ''

This only happens in Microsoft Internet Explorer. When IE stores tiddlers it replaces a set of spaces with a single space.  There is no simple solution apart from switching to a different browser, such as Mozilla Firefox.

Also I believe the problem is fixed in 2.2 (currently in beta).

'' Guess Again ''

It happens in Firefox 2, TiddlyWiki 2.4.0.

And In Firefox 3. Hopefully there's a better solution than using &amp;nbsp;

'''temporary note'''

Using [[preformatted blocks|TiddlyWiki Markup#Preformatted]] should solve this issue.

However, even without those, it seems to work fine with TiddlyWiki v2.4.1 and both Firefox 3 and IE7 on Windows Vista.

-- [[User:FND|FND]] 07:00, 28 August 2008 (UTC)

----

I just upgraded to 2.4.1 and spaces are not preserved for me.  I run TiddlyWiki in Firefox 3 on Vista

-- 16:33, 18 December 2008 (UTC)
A [[TiddlySpace|Space]] comprises of two collections of [[tiddlers|Tiddler]], a [[public|Public]] [[bag|Bag]] and a [[private|Private]] [[bag|Bag]].

Only a [[member|Member]] of a [[space|Space]] may read, change or delete a private tiddler.
{{annotation{
''Note:'' This default may be changed to more fine grained access control settings by a [[member|Member]] of a space using the TiddlyWeb [[HTTP API]].
}}}
Versions of TiddlyWiki before and including 2.6.3 are known to have an issue with the upgrade function. To upgrade these versions you will need to download an empty latest version of TiddlyWiki and import your content into it using the "import" function in the backstage. See [[Upgrading from TiddlyWiki version 2.6.3 or before]].
A [[TiddlySpace|Space]] comprises of two collections of [[tiddlers|Tiddler]]: a [[public|Public]] [[bag|Bag]] and a [[private|Private]] [[bag|Bag]].

Tiddlers in the public bag are visible to anyone who has access to the TiddlySpace server, in the case of [[tiddlyspace.com|http://tiddlyspace.com]] this is anyone on the Web.

Only a [[member|Member]] of the [[space|Space]] may alter a public tiddler.
{{annotation{
''Note:'' This default may be changed to more fine grained access control settings by a [[member|Member]] of a space using the TiddlyWeb [[HTTP API]].
}}}
There are numerous ways to stage your TiddlyWiki. You can, in fact, use it to create your own website.
!Hosting Services
Good places to work with TiddlyWiki online are...
;TiddlySpace
:» your number one place for TiddlyWiki based collaboration
;TiddlySpot
:» hosting TiddlyWiki made as simple as it gets
;TiddlyHoster
:» use the power of TiddlyWeb to manage tiddlers with bags, profiles and policies
;Web Hosting
:» Do you have a webserver or access to shared webhosting? Well, its actually quite simple using an [[FTP|http://en.wikipedia.org/wiki/File_Transfer_Protocol]] programm like [[FileZilla|http://filezilla-project.org]] to upload your TiddlyWiki and external files like images in some subfolder to your webspace.
!Cloud Storage
It is quite simple to stage your TiddlyWiki using [[Dropbox|SimpleDropboxPublishing]] or similar services, like Box.net, ~SkyDrive, etc...
!Email
That's right. If you're a singe-file purist in the TiddlyVerse you might as well just email a TiddlyWiki to someone and share all the information and dynamic features instantly. If you also use images in folders along with it, zip it up, and spread the word.
Lately I found the version number changed from 2.6.2 to 2.6.3
But trying to upgrade the 2.6.2 version by backstage/upgrade does not work, it ends in displaying "Error with the new core code". And this error ist displayed not only when I try to upgrade from 2.6.2 to 2.6.3 but even when I try to "upgrade" a fresh and empty version 2.6.3 tiddlywiki. Might it be that there are (wrong?) Firefox configuration settings which prevent it from upgrading tiddlywiki? What am I doing wrong?
See also: [[Error with the new core code]]
See [[Blockquotes]]...
<<tiddler Blockquotes>>
Tiddlers that have been redirected tag to <<tag REDIRECTED>>.
/***
|''Name''|RandomColorPalettePlugin|
|''Description''|Adds a random color palette to TiddlyWiki|
|''Author''|Jon Robson|
|''Version''|1.4.0|
|''Status''|stable|
|''Source''|https://github.com/jdlrobson/TiddlyWikiPlugins/raw/master/plugins/RandomColorPalettePlugin/RandomColorPalettePlugin.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage
{{{
<<RandomColorPalette>>
}}}
Sets and saves a random color palette on execution

{{{
<<RandomColorPaletteButton>>
}}}
Creates a button, which when clicked will change the color palette
More information at http://macros.tiddlyspace.com/#%5B%5BRandomColorPaletteButton%20macro%5D%5D
!Code
***/
//{{{
RGB.prototype.toRGBString = function() {
	return "rgb(%0,%1,%2)".format(parseInt(this.r * 255, 10),
		parseInt(this.g * 255, 10), parseInt(this.b * 255, 10))
}
function HSL_TO_RGB(h, s, l) { // h (hue) between 0 and 360, s (saturation) & l (lightness) between 0 and 1
	var c = l <= 0.5 ? 2 * l * s : ( 2 - (2 * l)) * s;
	var h1 = h / 60;
	var x = c * (1 - Math.abs((h1 % 2) - 1)); 
	var r, g, b;
	if(typeof(h) == 'undefined') {
		r = 0;
		g = 0;
		b = 0;
	} else if(0 <= h1 && h1 < 1) {
		r = c;
		g = x;
		b = 0;
	} else if(1 <= h1 && h1 < 2) {
		r = x;
		g = c;
		b = 0;
	} else if(2 <= h1 && h1 < 3) {
		r = 0;
		g = c;
		b = x;
	} else if(3 <= h1 && h1 < 4) {
		r = 0;
		g = x;
		b = c;
	} else if(4 <= h1 && h1 < 5) {
		r = x;
		g = 0;
		b = c;
	} else if(5 <= h1 && h1 < 6) {
		r = c;
		g = 0;
		b = x;
	}
	m = l - (0.5 * c);
	return new RGB(r + m, g + m, b + m);
}

(function($){
	var macro = config.macros.RandomColorPalette = {
		messagesOn: false, 
		changedPaletteText: "We have assigned you a random theme by adjusting the [[ColorPalette]] tiddler.\nDon't like it? Click <<RandomColorPalette>> for another one.", 
		handler: function(place, macroName, params, wikifier, paramString, tiddler) {
			paramString = paramString || "";
			var options = macro.getOptions(paramString);
			macro.generatePalette(options, true);
		},
		optionTypes: {
			floats: ["hue", "saturation", "darkest", "lightness", "huevariance", "dark", "pale", "light", "mid",
				"saturation_light", "saturation_pale", "saturation_mid", "saturation_dark"
			]
		},
		getOptions: function(paramString) {
			var args = paramString.parseParams("name", null, true, false, true)[0];
			var options = {};
			var numbers = macro.optionTypes.floats;
			for(var i in args) {
				options[i] = numbers.indexOf(i) > -1 ? parseFloat(args[i][0], 10) : args[i][0];
			}
			return options;
		},
		generateRandomNumber: function(min, max, info) {
			var num = (Math.random() * 1);
			info = !info ? { attempts:0 } : info;
			info.attempts += 1;
			var good = true;
			if(min == max) {
				return max;
			}
			if(min && num < min) {
				good = false;
			} else if(max && num > max) {
				good = false;
			}
			if(!good) {
				if(info.attempts < 5) {
					return macro.generateRandomNumber(min, max, info);
				} else {
					if(max) {
						return max;
					} else if(min) {
						return min;
					} else {
						return 1;
					}
				}
			}
			return num;
		},
		getExistingPalette: function(asJSON) {
			var title = "ColorPalette";
			var tiddlerText;
			if(store.tiddlerExists(title)) {
				tiddlerText = store.getTiddlerText(title);
			} else if(store.isShadowTiddler(title)){
				tiddlerText = config.shadowTiddlers[title];
			}
			if(asJSON) {
				var json = {};
				if(tiddlerText) {
					var lines = tiddlerText.split("\n");
					for(var i = 0; i < lines.length; i++) {
						var definition = lines[i].split(":");
						if(definition.length == 2) {
							var name = definition[0].trim();
							var value = definition[1].trim();
							json[name] = value;
						}
					}
				}
				return json;
			} else {
				return tiddlerText;
			}
		},
		generatePalette: function(options, save) {
			var outputRGB = options.rgb;
			var palette = macro.getExistingPalette(true);
			var hue = options.hue || Math.floor(Math.random() * 359);
			var saturation = options.saturation || macro.generateRandomNumber(0.3, 0.7);
			var dark = options.dark || options.darkest || macro.generateRandomNumber(0, 0.10);
			var pale = options.pale || options.lightness || macro.generateRandomNumber(0.90, 1);
			var delta = ( ( pale - dark ) / 3 );
			var mid = options.mid || dark + delta;
			var light = options.light || dark + (delta * 2);
			var lightness_values = {Dark: dark, Mid: mid, Light: light, Pale: pale};
			var saturation_values = {};
			for(i in lightness_values) {
				if(true) {
					saturation_values[i] = options["saturation_" + i.toLowerCase()] || saturation;
				}
			}

			var opposite_hue = (hue + 180) % 360;
			var seed = options.huevariance || Math.floor((85 * Math.random()) + 5); // we want it to be at least 5 degrees
			var huetwo = (opposite_hue + seed) % 360;
			var huethree = (opposite_hue - seed) % 360;
			if(huetwo < 0) {
				huetwo = 360 + huetwo;
			}
			if(huethree < 0) {
				huethree = 360 + huethree;
			}
			for(var j in lightness_values) {
				if(true) {
					var saturation = saturation_values[j];
					palette["Primary" + j] = HSL_TO_RGB(hue, saturation, lightness_values[j]);
					palette["Secondary" + j] = HSL_TO_RGB(huetwo, saturation, lightness_values[j]);
					palette["Tertiary" + j] = HSL_TO_RGB(huethree, saturation, lightness_values[j]);
				}
			}
			palette.Background = HSL_TO_RGB(hue, saturation, 0.92);
			palette.Foreground = HSL_TO_RGB(hue, saturation, 0.08);
			palette.ColorPaletteParameters = ["HSL([", hue, "|", seed, "], [", saturation_values.Pale, "|",
				saturation_values.Light, "|", saturation_values.Mid, "|", saturation_values.Dark, "],",
				"[", dark, "|", mid, "|", light, "|", pale, "])"].join("");
			// construct new ColorPalette
			var text = ["/*{{{*/\n"];
			var colorcode;
			for(var id in palette) {
				if(true) {
					var color = palette[id];
					colorcode = outputRGB ? color.toRGBString() : color.toString();
					text.push("%0: %1\n".format(id, colorcode));
				}
			}
			text.push("/*}}}*/");
			text = text.join("");
			if(save) {
				macro.saveColorPalette(text);
			}
			return text;
		},
		saveColorPalette: function(text) {
			var tid = store.getTiddler("ColorPalette");
			if(!tid) {
				tid = new Tiddler("ColorPalette");
				tid.fields = merge({}, config.defaultCustomFields);
			} // TODO: detect that the ColorPalette in the space comes from outside recipe
			tid.fields["server.page.revision"] = "false"; // edit conflicts dont matter

			// save the color palette in tid
			tid = store.saveTiddler(tid.title, tid.title, text, tid.modifier, tid.modified,
				tid.tags, tid.fields, false, tid.created, tid.creator);
			// an interval is used to cope with users clicking on the palette button quickly.
			if(macro._nextSave) {
				window.clearTimeout(macro._nextSave);
			}
			macro._nextSave = window.setTimeout(function() {
					autoSaveChanges(null, [tid]);
				}, 2000);
			// temporary workaround for IE.
			$.twStylesheet.remove({ id: "StyleSheetColors" });
			$.twStylesheet.remove({ id: "StyleSheet" });
			refreshAll();
			macro.reportChange();
			return tid;
		},
		reportChange: function() {
			if(macro.messagesOn) { // only display message once..
				var msgPlace = getMessageDiv();
				if(!$(".changedPalette", msgPlace)[0]) {
					var tempPlace = document.createElement("div");
					wikify("{{changedPalette{" + macro.changedPaletteText + "}}}", tempPlace);
					msgPlace.appendChild(tempPlace);
				}
			}
		}
	};
	var btnMacro = config.macros.RandomColorPaletteButton = {
			text: "New ColorPalette",
			tooltip: "Generate a random colour scheme for your TiddlyWiki",
			makeButton: function(place, options) {
				var btnHandler = function(ev) {
					var t = $(ev.target);
					var options = t.data("options");
					macro.generatePalette(options, true);
					ev.preventDefault();
					return false;
				};
				var btn = createTiddlyButton(place, this.text, this.tooltip, btnHandler);
				$(btn).data("options", options);
				return btn;
			},
			handler: function(place, macroName, params, wikifier, paramString, tiddler) {
				var options = macro.getOptions(paramString);
				btnMacro.makeButton(place, options);
			}
	};
})(jQuery);
//}}}
/***
|''Name''|<...>|
|''Description''|<...>|
|''Author''|FND|
|''Version''|<#.#.#>|
|''Status''|<//unknown//; @@experimental@@; @@beta@@; //obsolete//; stable>|
|''Source''|http://devpad.tiddlyspot.com/#<...>|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/contributors/FND/|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5.0|
|''Requires''|<...>|
|''Keywords''|<...>|
***/
//{{{
(function($) {

var macro = config.macros.randomTiddler = {
	locale: {
		label: "random",
		tooltip: "display a random tiddler"
	},

	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var excludeTag = params[0] || "excludeLists";
		var btn = createTiddlyButton(place, this.locale.label,
			this.locale.tooltip, function() {});
		btn.onclick = null; // XXX: hacky, but createTiddlyButton wouldn't add href otherwise
		$(btn).data("excludeTag", excludeTag).click(this.onClick);;
	},
	onClick: function() {
		var btn = $(this);
		var excludeTag = btn.data("excludeTag");
		var tiddlers = store.getTiddlers();
		macro.displayRandomTiddler(tiddlers, excludeTag);
	},
	displayRandomTiddler: function(tiddlers, excludeTag) {
		var i = Math.floor(Math.random() * tiddlers.length);
		var tid = tiddlers[i];
		if(!tid.tags.contains(excludeTag)) {
			story.displayTiddler(place, tid);
		} else {
			this.displayRandomTiddler(tiddlers); // XXX: risks infinite recursion
		}
	}
};

})(jQuery);
//}}}
Type the text for 'Read-Only_Mode'
The TiddlyWiki core code is stored and developed as a collection of individual files, which makes it more manageable.

A recipe file determines which code files, tiddlers and HTML components to put together - somewhat like a jigsaw puzzle.
[[Cook]] then reads the recipe file and generates a new TiddlyWiki document from it.

Recipes can reference one another, making it straightforward to create a multiple variants of TiddlyWiki at one time.

!!Example

TiddlyWiki's [[default recipe file|http://svn.tiddlywiki.org/Trunk/core/tiddlywiki.html.recipe]]:
{{{
template: html/tiddlywiki.template.html
recipe: tiddlers/split.recipe
recipe: js/split.recipe
copy: java/TiddlySaver.jar
}}}

!!External Resources

* [[Recipe Files|http://trac.tiddlywiki.org/wiki/RecipeFiles]]

!!See Also

* [[Cook]]
* [[Ginsu]]
* [[Chef]]
/***
|''Name''|RefreshTiddlerCommand|
|''Version''|0.3.0|
***/
//{{{
(function($) {

var cmd = config.commands.refreshTiddler = {
	text: "refresh",
	locale: {
		refreshing: "Refreshing tiddler..."
	},
	tooltip: "refresh this tiddler to be the one on the server",
	handler: function(ev, src, title) {
		var tiddler = store.getTiddler(title);
		if(!tiddler) {
			tiddler = new Tiddler(title);
			merge(tiddler.fields, config.defaultCustomFields);
		}
		$(story.getTiddler(title)).find(".viewer").
			empty().text(cmd.locale.refreshing);
		var dirtyStatus = store.isDirty();
		story.loadMissingTiddler(title, {
			"server.workspace": tiddler.fields["server.recipe"]  ? "recipes/" + tiddler.fields["server.recipe"] :
				tiddler.fields["server.workspace"] || "bags/"+tiddler.fields["server.bag"],
			"server.host": tiddler.fields["server.host"],
			"server.type": tiddler.fields["server.type"]
		}, function() {
			store.setDirty(dirtyStatus);
		});
	}
};

})(jQuery);
//}}}
To register as a new user in TiddlySpace visit [[TiddlySpace.com|http://tiddlyspace.com/register]].
/***
|Name|RenderPlain|
|Source|http://tiddlywiki.tiddlyspace.com/#RenderPlain|
|Version|1.0|
|Author|Tobias Beer|
|License|Creative Commons|
|~CoreVersion|2.1|
|Description|renders a tiddler or tiddler slice or section as a monospaceblock|
!!!Usage
{{{
<<renderPlain SomeTiddler##HiddenSection [inline]>>
}}}
Using the optional parameter {{{inline}}}, the text will be rendered as inline monospaced text.
!!!Code
***/
//{{{
config.macros.renderPlain = { 
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		if(paramString) {
			var out =
				paramString.indexOf('inline')<0?
				'{{{\n%0\n}}}':
				'{{{%0}}}';
			wikify(
				out.format([store.getTiddlerText(params[0])]),
				place
			);
		}
	}
}
//}}}
Image hosting sites offer a handful of pre-set sizes (eg thumbnail, small, large). If none suit, here's one method for resizing images within TiddlyWiki. 


If using a URL, wrap it in HTML tags and insert '''style="width: 70px; "'''  or  '''style="height: 146px; "''' (altering the px to desired size) before '''/></html>''' like this:

<nowiki>
<html><img src="url of image" style="width: 70px; "/></html>
</nowiki>

If using HTML code from a hosting site, insert '''style="width: 70px; "''' before /></a></html> like this:

<nowiki>
<html><a href="link" style="width: 70px;" /></a></html> 
</nowiki>

You can also use [[ImageSizePlugin|http://www.tiddlytools.com#ImageSizePlugin]] from [[TiddlyTools]] to resize images without using HTML.
<!--{{{-->
<div macro='slideRevision'></div>
<div class='heading'>
	<span class="titleBar">
		<div class='title' macro='view title text'></div>
	</span>
	<span class='modifierIcon'
		macro='view modifier SiteIcon label:no height:48 width:48 preserveAspectRatio:yes'>
	</span>
	<div class='toolbar'
		macro='toolbar [[ToolbarCommands::RevisionToolbar]] icons:yes height:48 width:48 more:popup'>
	</div>
	<div class='tagClear'></div>
</div>
<div class='content'>
	<div class='viewer' macro='view text wikified'></div>
</div>
<div class='tagInfo'>
	<div class='tidTags' macro='tags'></div>
	<div class='tagging' macro='tagging'></div>
</div>
<!--}}}-->
TiddlySpace keeps a revision history on all edits.

It is accessible by...
*clicking on the tiddler subtitle which contains the modified date
*using the ''revisions'' command under ''Show Additional Commands'' in the tiddler toolbar
/***
|''Name''|RevisionsCommandPlugin|
|''Description''|provides access to tiddler revisions|
|''Author''|FND|
|''Contributors''|Martin Budden|
|''Version''|0.3.3|
|''Status''|@@beta@@|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/RevisionsCommandPlugin.js|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/association/plugins/|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.6.0|
|''Keywords''|serverSide|
!Usage
Extend [[ToolbarCommands]] with {{{revisions}}}.
!Revision History
!!v0.1 (2009-07-23)
* initial release (renamed from experimental ServerCommandsPlugin)
!!v0.2 (2010-03-04)
* suppressed wikification in diff view
!!v0.3 (2010-04-07)
* restored wikification in diff view
* added link to side-by-side diff view
!To Do
* strip server.* fields from revision tiddlers
* resolve naming conflicts
* i18n, l10n
* code sanitizing
* documentation
!Code
***/
//{{{
(function($) {

jQuery.twStylesheet(".diff { white-space: pre, font-family: monospace }",
	{ id: "diff" });

var cmd = config.commands.revisions = {
	type: "popup",
	hideShadow: true,
	text: "revisions",
	tooltip: "display tiddler revisions",
	revTooltip: "", // TODO: populate dynamically?
	loadLabel: "loading...",
	loadTooltip: "loading revision list",
	selectLabel: "select",
	selectTooltip: "select revision for comparison",
	selectedLabel: "selected",
	compareLabel: "compare",
	linkLabel: "side-by-side view",
	revSuffix: " [rev. #%0]",
	diffSuffix: " [diff: #%0 #%1]",
	dateFormat: "YYYY-0MM-0DD 0hh:0mm",
	listError: "revisions could not be retrieved",

	handlePopup: function(popup, title) {
		title = this.stripSuffix("rev", title);
		title = this.stripSuffix("diff", title);
		var tiddler = store.getTiddler(title);
		var type = _getField("server.type", tiddler);
		var adaptor = new config.adaptors[type]();
		var limit = null; // TODO: customizable
		var context = {
			host: _getField("server.host", tiddler),
			workspace: _getField("server.workspace", tiddler)
		};
		var loading = createTiddlyButton(popup, cmd.loadLabel, cmd.loadTooltip);
		var params = { popup: popup, loading: loading, origin: title };
		adaptor.getTiddlerRevisionList(title, limit, context, params, this.displayRevisions);
	},

	displayRevisions: function(context, userParams) {
		removeNode(userParams.loading);
		if(context.status) {
			var callback = function(ev) {
				var e = ev || window.event;
				var revision = resolveTarget(e).getAttribute("revision");
				context.adaptor.getTiddlerRevision(tiddler.title, revision, context,
					userParams, cmd.displayTiddlerRevision);
			};
			var table = createTiddlyElement(userParams.popup, "table");
			for(var i = 0; i < context.revisions.length; i++) {
				var tiddler = context.revisions[i];
				var row = createTiddlyElement(table, "tr");
				var timestamp = tiddler.modified.formatString(cmd.dateFormat);
				var revision = tiddler.fields["server.page.revision"];
				var cell = createTiddlyElement(row, "td");
				createTiddlyButton(cell, timestamp, cmd.revTooltip, callback, null,
					null, null, { revision: revision });
				cell = createTiddlyElement(row, "td", null, null, tiddler.modifier);
				cell = createTiddlyElement(row, "td");
				createTiddlyButton(cell, cmd.selectLabel, cmd.selectTooltip,
					cmd.revisionSelected, null, null, null,
					{ index:i, revision: revision, col: 2 });
				cmd.context = context; // XXX: unsafe (singleton)!?
			}
		} else {
			$("<li />").text(cmd.listError).appendTo(userParams.popup);
		}
	},

	revisionSelected: function(ev) {
		var e = ev || window.event;
		e.cancelBubble = true;
		if(e.stopPropagation) {
			e.stopPropagation();
		}
		var n = resolveTarget(e);
		var index = n.getAttribute("index");
		var col = n.getAttribute("col");
		while(!index || !col) {
			n = n.parentNode;
			index = n.getAttribute("index");
			col = n.getAttribute("col");
		}
		cmd.revision = n.getAttribute("revision");
		var table = n.parentNode.parentNode.parentNode;
		var rows = table.childNodes;
		for(var i = 0; i < rows.length; i++) {
			var c = rows[i].childNodes[col].firstChild;
			if(i == index) {
				if(c.textContent) {
					c.textContent = cmd.selectedLabel;
				} else {
					c.text = cmd.selectedLabel;
				}
			} else {
				if(c.textContent) {
					c.textContent = cmd.compareLabel;
				} else {
					c.text = cmd.compareLabel;
				}
				c.onclick = cmd.compareSelected;
			}
		}
	},

	compareSelected: function(ev) {
		var e = ev || window.event;
		var n = resolveTarget(e);
		var context = cmd.context;
		context.rev1 = n.getAttribute("revision");
		context.rev2 = cmd.revision;
		context.tiddler = context.revisions[n.getAttribute("index")];
		context.format = "unified";
		context.adaptor.getTiddlerDiff(context.tiddler.title, context,
			context.userParams, cmd.displayTiddlerDiffs);
	},

	displayTiddlerDiffs: function(context, userParams) {
		var tiddler = context.tiddler;
		tiddler.title += cmd.diffSuffix.format([context.rev1, context.rev2]);
		tiddler.text = "{{diff{\n" + context.diff + "\n}}}";
		tiddler.tags = ["diff"];
		tiddler.fields.doNotSave = "true"; // XXX: correct?
		if(!store.getTiddler(tiddler.title)) {
			store.addTiddler(tiddler);
		}
		var src = story.getTiddler(userParams.origin);
		var tiddlerEl = story.displayTiddler(src, tiddler);
		var uri = context.uri.replace("format=unified", "format=horizontal");
		var link = $('<a target="_blank" />').attr("href", uri).text(cmd.linkLabel);
		$(".viewer", tiddlerEl).prepend(link);
	},

	displayTiddlerRevision: function(context, userParams) {
		var tiddler = context.tiddler;
		tiddler.title += cmd.revSuffix.format([tiddler.fields["server.page.revision"]]);
		tiddler.fields.doNotSave = "true"; // XXX: correct?
		if(!store.getTiddler(tiddler.title)) {
			store.addTiddler(tiddler);
		}
		var src = story.getTiddler(userParams.origin);
		story.displayTiddler(src, tiddler);
	},

	stripSuffix: function(type, title) {
		var str = cmd[type + "Suffix"];
		var i = str.indexOf("%0");
		i = title.indexOf(str.substr(0, i));
		if(i != -1) {
			title = title.substr(0, i);
		}
		return title;
	}
};

var _getField = function(name, tiddler) {
	return tiddler.fields[name] || config.defaultCustomFields[name];
};

})(jQuery);
//}}}
Something broke in your TiddlyWiki or TiddlySpace?

Use the {{{#start:safe}}} paramifier to start TiddlyWiki with all plugins disabled. 
A TiddlyWiki is a single html file which can be saved to a hard drive, USB stick or server.

'''Save to hard drive'''
Click on Save Changes (right-hand top menu). 
Name the file, select the location and click on Save.
The document will be saved with the specified name, location and an .html extension. When next opened it will display in the user's default browser.

'''Save to USB stick'''
Click on Save Changes (right-hand top menu). 
Name the file, select USB stick drive as the location and click on Save.
The document will be saved with the specified name, location and an .html extension. 

'''Save to Tiddlyspot'''
Click on Save to Web (top right-hand menu). A yellow dialog box appears which says "About to upload on <nowiki>http://tiddlywikiname.tiddlyspot.com/index.html..."</nowiki>  It will say "Main TiddlyWiki file uploaded" when it's done.  
In TiddlyWiki you can implement scripts in JavaScript -- most of these are based on...
:» [[InlineJavascriptPlugin|Scripts]]
:» transclusion with evaluated parameters
In TiddlyWiki you can use Javascript scripts in various ways. The most prominent are described below...
:» """Using InlineJavascriptPlugin"""
:» """Transclusion With Evaluated Parameters"""
!"""Using InlineJavascriptPlugin"""
TiddlyWiki Scripts require [[InlineJavascriptPlugin|http://www.TiddlyTools.com/#InlineJavascriptPlugin]] by [[TiddlyTools|http://www.TiddlyTools.com]] and...
* are tiddlers that can contain a wiki text mixed with javascript code, embedded "inline", in between {{{<script>...</script>}}} markup 
* are executed each time the tiddler in which they are embedded is rendered
* are typically used to generate and return wiki syntax that is automatically rendered to insert ''dynamic content'' into a tiddler, such as a dynamically generated list
* can make small 'on-the-fly' adjustments to attributes of rendered elements in the same tiddler using relative DOM references, e.g. {{{place.lastChild}}}, {{{place.parentNode}}} wheras {{{place}}} refers to the dom-node in which script is executed 
*  can be used to create custom link handlers invoked "onclick" to trigger javascript functions in response to user actions
!"""Transclusion With Evaluated Parameters"""
Enclosing parameter values in double curly-brackets for macro parameters will interpret and execute the value as Javascript and use the return value as a computed parameter value.

[[Eric Shulman|http://tiddlytools.com]] from [[TiddlyTools|http://tiddlytools.com]] has built a large collection of tools based on this kind of [[transclusion with evaluated parameters|http://tiddlytools.com/#CatalogTabs]].
{{annotation{
''Note'': In TiddlySpace, evaluated parameters by default are disabled for security reason. To enable them nontheless, see section ''"""Evaluated Parameters and TiddlySpace"""'' in [[Evaluated Parameters]].
}}}
!"""Script Sources"""
* [[TiddlyTools|http://tiddlytools.com]] has numerous [[transclusion scripts|http://tiddlytools.com/#transclusion]] and [[scripts|http://tiddlytools.com/#script]]
* [[try searching for InlineJavascriptPlugin|https://groups.google.com/forum/?fromgroups#!topicsearchin/tiddlywiki/InlineJavascriptPlugin]] in the [[google discussion groups|https://groups.google.com/forum/?fromgroups#!topicsearchin/tiddlywiki/InlineJavascriptPlugin]]
!"""Example Scripts"""
* [[Tagging Linked Tiddlers]]
* [[Convert List To WikiLinks]]
* [[Hour Based Greetings]]
* [[What Time is It?]]
* [[numbered list to table]]
/%TODO: CHECK MISSING REFERENCES %/
See [[Finding A Tiddler]]...
Plugins enhancing search...
|Name|SearchOptionsPlugin|
|Source|http://www.TiddlyTools.com/#SearchOptionsPlugin|
|Documentation|http://www.TiddlyTools.com/#SearchOptionsPluginInfo|
|Version|3.0.10|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|extend core search function with additional user-configurable options|
Adds extra options to core search function including selecting which data items to search, enabling/disabling incremental key-by-key searches, and generating a ''list of matching tiddlers'' instead of immediately displaying all matches.  This plugin also adds syntax for rendering 'search links' within tiddler content to embed one-click searches using pre-defined 'hard-coded' search terms.
See [[Section]]...
A sections in a tiddler refers to all the content starting from a [[heading|TiddlyWiki Markup]] up until the next heading or the end of the tiddler text.
{{annotation{
''Important'': Sections do __not__ entail subsections when accessed programatically.
}}}
!Example
Assume, there is a tiddler called ''"""Some Tiddler"""'' containing the following text...
{{{
!Section 1
Some introductory text.
!!Section 1.1
Some more details.
}}}
Here, the section ''Section 1'' entails all the content up until heading ''Section 1.1''.

You can [[reuse|Transclusion]] the content of ''Section 1'' using the [[tiddler macro|tiddler]]:
{{{
<<tiddler "Some Tiddler##Section 1">>
}}}
Displayed as:
<<<
Some introductory text.
<<<

Transcluding ''Section 1.1'' works the same way...
{{{
<<tiddler "Some Tiddler##Section 1.1>>
}}}
Displayed as:
<<<
Some more details.
<<<
Serializations are explained at [[tiddlyweb.peermore.com|http://tiddlyweb.peermore.com/wiki/bags/docs/tiddlers/serialization]]

Read more about the [[TiddlySpace API]]...
/***
|''Name''|SerializerLinks|
|''Description''|TiddlySpace plugin creating links to the different serialization forms.|
|''Version''|0.8.1|
***/
//{{{
(function($) {
var tiddlyspace = config.extensions.tiddlyspace;
var tweb = config.extensions.tiddlyweb;

var macro = config.macros.serializerLinks = {
	available: ["atom", "html", "json", "txt", "wiki"],
	separator: " / ",
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		if(!tiddler) {
			return;
		}
		var container = $("<span />").appendTo(place);
		var bag = tiddler.fields["server.bag"]
		var space = tiddlyspace.resolveSpaceName(bag);
		tweb.getStatus(function(status) {
			var host = status.server_host;
			var base = tiddlyspace.getHost(host, space);
			for(var i = 0; i < macro.available.length; i++) {
				var serializer = macro.available[i];
				$("<a />").addClass("sLink").text(serializer).attr("href", "%0/bags/%1/tiddlers/%2.%3".format([
					base, bag, encodeURIComponent(tiddler.title), serializer
				])).appendTo(container);
				if(i < macro.available.length - 1) {
					$("<span />").text(macro.separator).appendTo(container);
				}
			}
		});
	}
};

})(jQuery);
//}}}
The single-file paradigm was at the heart of the original design of [[TiddlyWiki]]. It therefore was not designed for multi-user collaboration which makes concurrent editing a challenging issue.

However, there are various solutions enabling TiddlyWiki to be used as a collaborative platform.
! Overview
Server-side solutions for [[TiddlyWiki]] provide ubiquitous access to hosted TiddlyWiki documents, and potentially enable multi-user collaboration on a single TiddlyWiki document.

There are a number of solutions, each suited to specific needs:

| !Name | !Description | !Requirements | !Multi-User Support | !Revision History | !Status |h
|[[TiddlyWeb]] |the most advanced server-side for TiddlyWiki with a robust [[HTTP API]] with [[Bags]], [[Recipes]], [[Profiles]] and more and the technological basis for TiddlySpace|Python |yes |yes |actively developed and maintained |
|[[TiddlySpace]] |TiddlySpace is both, a website providing a collaborative environment for TiddlyWiki as well as a package for TiddlyWeb that allows you to run your own TiddlySpace instance|Python |yes |yes |actively developed and maintained |
|[[GieWiki|https://code.google.com/p/giewiki]] |Hopes to include all the features you would expect in a community wiki engine, runs on Google App Engine |Python, [[Google App Engine SDK|http://code.google.com/intl/da/appengine/downloads.html]] |yes |yes |actively developed |
|[[TiddlyHome|http://tiddlyhome.bidix.info]]|TiddlyHome provides an infrastructure for a multi-user and multi-site TiddlyWiki hosting service based on UploadPlugin. |PHP |yes |yes |actively maintained |
|[[version control systems|http://en.wikipedia.org/wiki/Revision_control]] (e.g. Subversion, Git, Mercurial) |since version 2.2, TiddlyWiki is very much suitable to be used in conjunction with regular version control systems | |yes (to a limited extent) |yes | |
|[[ccTiddly]] | |PHP and MySQL |yes |yes |? |
|[[Coral]] | |Java | | |? |
|[[MiniTiddlyServer]] | |PHP |no |no (regular TiddlyWiki backups only) |abandoned |
|[[MyWiki|http://aasted.org/wiki/]] |Needs no database. Works out of box. |PHP |No |No |Abandoned. Last version in 2004|
|[[PrinceTiddlyWiki]] | | | | |abandoned |
|[[PhpTiddlyWiki]] ([[fixed version|http://www.borism.net/2009/03/18/server-side-tiddlywiki-with-php-easy/]]) | |PHP | | |abandoned |
|[[ServerLockPlugin]] |prevent overwriting changes (simultaneous editing) when using a TiddlyWiki document stored on a remote server |PHP |yes (prevents simultaneous editing) |no (regular TiddlyWiki backups only) |? |
|[[TiddlyLock]] |prevent overwriting changes (simultaneous editing) when using a TiddlyWiki document over a shared network drive |network share |yes (prevents simultaneous editing)|no (regular TiddlyWiki backups only) |? |
|[[UploadPlugin]] |upload TiddlyWiki document |PHP |no |no (regular TiddlyWiki backups only) |actively maintained |
|[[WebDavPlugin]] |save TiddlyWiki to [[WebDav|http://en.wikipedia.org/wiki/WebDAV]] directory |[[WebDAV-enabled server||http://en.wikipedia.org/wiki/WebDAV]] |no |no (regular TiddlyWiki backups only) |? |
|[[ZiddlyWiki]] | |Python, Zope |yes |yes |irregularly maintained |
|[[Tiddly on Tahoe|http://allmydata.org/trac/tiddly_on_tahoe]]|[[Tahoe-LAFS|https://tahoe-lafs.org]] is a decentralized, secure storage grid; the result is a Server-Independent Wiki |[[tahoe-lafs|http://allmydata.org/trac/tiddly_on_tahoe]] | no | ? | ? |
|[[ProjectWiki|http://github.com/diclophis/projectwiki/tree/master]]|a prototype server-side savable TiddlyWiki| PHP | ? | ? | ? |
! Hosting Services
;[[TiddlySpace]]
:» based on TiddlyWeb
;[[TiddlySpot]]
:» based on UploadPlugin
;[[TiddlyHome 2.0|http://tiddlyhome2.bidix.info]]
:» a php based store for TiddlyWiki 
! See Also
* [[I put my TiddlyWiki file on my web server and I can't save]]
* [[Can I use TiddlyWiki as a multi-user/collaborative/server based wiki?]]
/%
REMOVED FOR NOW

;[[TiddlyHost|http://tiddlyhost.appspot.com]]
: What is this ?!?

;[[LimeBits|http://www.limebits.com]]
:» host for """WebDAV-based""" open source applications -- [[using WebDAVSavingPlugin|http://www.limebits.com/apps/bitfinder/#url=/&tag=TiddlyWiki]]
: no instructions
: unavailable
%/
With the [[ServerAdaptorMechanism]], TiddlyWiki adopts a simple model for interacting with servers:
* ''Server adaptors'' are plugins that provide a standardised interface to a particular server architecture. As standard, TiddlyWiki provides the FileAdaptor for talking to static TiddlyWiki files but others are available for talking to popular wiki servers
* A ''host'' string identifies a particular server, usually by it's URL
* A ''workspace'' string identifies a particular compartment or storage area within a server, for instance the name of a wiki on a shared MediaWiki server
* A ''title'' identifies a tiddler within a particular workspace
Via the [[ServerAdaptorExtendedFields]], particular tiddlers can have a connection to a particular server.
TiddlyWiki's architecture for interacting with servers allows it to be plugged into a wide variety of servers. This is done through the addition of plugins containing custom server adaptors. Server adaptors are designed to allow things like importing tiddlers, loading missing tiddlers on the fly and synchronising changes with a server. Separate macros and core extensions implement such features by accessing the facilities provided by server adaptors.

Server adaptors are designed to use a familiar model akin to a device driver, adapting a standardised interface to whatever is required by the underlying server: [[WebDAV|http://en.wikipedia.org/wiki/Webdav]], ZiddlyWiki, [[MediaWiki|http://en.wikipedia.org/wiki/MediaWiki]], [[Socialtext|http://www.socialtext.com/]] or HTML scraping.

Many server architectures are [[REST|http://en.wikipedia.org/wiki/REST]] based, and TiddlyWiki server adaptors are particularly easy to create for common REST patterns. It is also possible to create TiddlyWiki server adaptors for severs with an [[XML-RPC|http://en.wikipedia.org/wiki/XML-RPC]] interface.

Server adaptors are registered by name in the global object {{{config.adaptors}}}. Each entry is a reference to an object constructor for that type of server adaptor. The adaptor object must implement the following methods:
* [[Adaptor.openHost]]
* [[Adaptor.openWorkspace]]
* [[Adaptor.getTiddler]]
* [[Adaptor.close]]

Additionally the adaptor may implement the following methods:
* [[Adaptor.getWorkspaceList]] (required to support the Import Tiddlers UseCase)
* [[Adaptor.getTiddlerList]] (required to support the Import Tiddlers UseCase)
* [[Adaptor.putTiddler]] (required to support the Sync UseCase)
* [[Adaptor.getTiddlerRevision]]
* [[Adaptor.getTiddlerRevisionList]]

The adaptor object is used through the life of a connection to a server; see [[ServerAdaptorConcepts]] for details. Many of the methods use an AsynchronousPattern of callbacks to deliver their results.

Custom formatters for the WikifierFormatterMechanism are often used alongside server adaptors to allow TiddlyWiki to display content in the native format of a server.
/***
|''Name''|ServerSideSavingPlugin|
|''Description''|server-side saving|
|''Author''|FND|
|''Version''|0.6.5|
|''Status''|stable|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/ServerSideSavingPlugin.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5.3|
|''Keywords''|serverSide|
!Notes
This plugin relies on a dedicated adaptor to be present.
The specific nature of this plugin depends on the respective server.
!Revision History
!!v0.1 (2008-11-24)
* initial release
!!v0.2 (2008-12-01)
* added support for local saving
!!v0.3 (2008-12-03)
* added Save to Web macro for manual synchronization
!!v0.4 (2009-01-15)
* removed ServerConfig dependency by detecting server type from the respective tiddlers
!!v0.5 (2009-08-25)
* raised CoreVersion to 2.5.3 to take advantage of core fixes
!!v0.6 (2010-04-21)
* added notification about cross-domain restrictions to ImportTiddlers
!To Do
* conflict detection/resolution
* rename to ServerLinkPlugin?
* document deletion/renaming convention
!Code
***/
//{{{
(function($) {

readOnly = false; //# enable editing over HTTP

var plugin = config.extensions.ServerSideSavingPlugin = {};

plugin.locale = {
	saved: "%0 saved successfully",
	saveError: "Error saving %0: %1",
	saveConflict: "Error saving %0: edit conflict",
	deleted: "Removed %0",
	deleteError: "Error removing %0: %1",
	deleteLocalError: "Error removing %0 locally",
	removedNotice: "This tiddler has been deleted.",
	connectionError: "connection could not be established",
	hostError: "Unable to import from this location due to cross-domain restrictions."
};

plugin.sync = function(tiddlers) {
	tiddlers = tiddlers && tiddlers[0] ? tiddlers : store.getTiddlers();
	$.each(tiddlers, function(i, tiddler) {
		var changecount = parseInt(tiddler.fields.changecount, 10);
		if(tiddler.fields.deleted === "true" && changecount === 1) {
			plugin.removeTiddler(tiddler);
		} else if(tiddler.isTouched() && !tiddler.doNotSave() &&
				tiddler.getServerType() && tiddler.fields["server.host"]) { // XXX: server.host could be empty string
			delete tiddler.fields.deleted;
			plugin.saveTiddler(tiddler);
		}
	});
};

plugin.saveTiddler = function(tiddler) {
	try {
		var adaptor = this.getTiddlerServerAdaptor(tiddler);
	} catch(ex) {
		return false;
	}
	var context = {
		tiddler: tiddler,
		changecount: tiddler.fields.changecount,
		workspace: tiddler.fields["server.workspace"]
	};
	var serverTitle = tiddler.fields["server.title"]; // indicates renames
	if(!serverTitle) {
		tiddler.fields["server.title"] = tiddler.title;
	} else if(tiddler.title != serverTitle) {
		return adaptor.moveTiddler({ title: serverTitle },
			{ title: tiddler.title }, context, null, this.saveTiddlerCallback);
	}
	var req = adaptor.putTiddler(tiddler, context, {}, this.saveTiddlerCallback);
	return req ? tiddler : false;
};

plugin.saveTiddlerCallback = function(context, userParams) {
	var tiddler = context.tiddler;
	if(context.status) {
		if(tiddler.fields.changecount == context.changecount) { //# check for changes since save was triggered
			tiddler.clearChangeCount();
		} else if(tiddler.fields.changecount > 0) {
			tiddler.fields.changecount -= context.changecount;
		}
		plugin.reportSuccess("saved", tiddler);
		store.setDirty(false);
	} else {
		if(context.httpStatus == 412) {
			plugin.reportFailure("saveConflict", tiddler);
		} else {
			plugin.reportFailure("saveError", tiddler, context);
		}
	}
};

plugin.removeTiddler = function(tiddler) {
	try {
		var adaptor = this.getTiddlerServerAdaptor(tiddler);
	} catch(ex) {
		return false;
	}
	var context = {
		host: tiddler.fields["server.host"],
		workspace: tiddler.fields["server.workspace"],
		tiddler: tiddler
	};
	var req = adaptor.deleteTiddler(tiddler, context, {}, this.removeTiddlerCallback);
	return req ? tiddler : false;
};

plugin.removeTiddlerCallback = function(context, userParams) {
	var tiddler = context.tiddler;
	if(context.status) {
		if(tiddler.fields.deleted === "true") {
			store.deleteTiddler(tiddler.title);
		} else {
			plugin.reportFailure("deleteLocalError", tiddler);
		}
		plugin.reportSuccess("deleted", tiddler);
		store.setDirty(false);
	} else {
		plugin.reportFailure("deleteError", tiddler, context);
	}
};

plugin.getTiddlerServerAdaptor = function(tiddler) { // XXX: rename?
	var type = tiddler.fields["server.type"] || config.defaultCustomFields["server.type"];
	return new config.adaptors[type]();
};

plugin.reportSuccess = function(msg, tiddler) {
	displayMessage(plugin.locale[msg].format([tiddler.title]));
};

plugin.reportFailure = function(msg, tiddler, context) {
	var desc = (context && context.httpStatus) ? context.statusText :
		plugin.locale.connectionError;
	displayMessage(plugin.locale[msg].format([tiddler.title, desc]));
};

config.macros.saveToWeb = { // XXX: hijack existing sync macro?
	locale: { // TODO: merge with plugin.locale?
		btnLabel: "save to web",
		btnTooltip: "synchronize changes",
		btnAccessKey: null
	},

	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		createTiddlyButton(place, this.locale.btnLabel, this.locale.btnTooltip,
			plugin.sync, null, null, this.locale.btnAccessKey);
	}
};

// hijack saveChanges to trigger remote saving
var _saveChanges = saveChanges;
saveChanges = function(onlyIfDirty, tiddlers) {
	if(window.location.protocol == "file:") {
		_saveChanges.apply(this, arguments);
	} else {
		plugin.sync(tiddlers);
	}
};

// override removeTiddler to flag tiddler as deleted -- XXX: use hijack to preserve compatibility?
TiddlyWiki.prototype.removeTiddler = function(title) { // XXX: should override deleteTiddler instance method?
	var tiddler = this.fetchTiddler(title);
	if(tiddler) {
		tiddler.tags = ["excludeLists", "excludeSearch", "excludeMissing"];
		tiddler.text = plugin.locale.removedNotice;
		tiddler.fields.deleted = "true"; // XXX: rename to removed/tiddlerRemoved?
		tiddler.fields.changecount = "1";
		this.notify(title, true);
		this.setDirty(true);
	}
};

// hijack ImportTiddlers wizard to handle cross-domain restrictions
var _onOpen = config.macros.importTiddlers.onOpen;
config.macros.importTiddlers.onOpen = function(ev) {
	var btn = $(resolveTarget(ev));
	var url = btn.closest(".wizard").find("input[name=txtPath]").val();
	if(window.location.protocol != "file:" && url.indexOf("://") != -1) {
		var host = url.split("/")[2];
		var macro = config.macros.importTiddlers;
		if(host != window.location.host) {
			btn.text(macro.cancelLabel).attr("title", macro.cancelPrompt);
			btn[0].onclick = macro.onCancel;
			$('<span class="status" />').text(plugin.locale.hostError).insertAfter(btn);
			return false;
		}
	}
	return _onOpen.apply(this, arguments);
};

})(jQuery);
//}}}
See ShadowTiddler...
<<tiddler ShadowTiddler>>
Many [[TiddlyWiki]]'s defaults are stored as a built-in, so called <<tag ShadowTiddler>> which provides default or fallback contents and settings for a TiddlyWiki.
{{annotation{
''Note:'' //"shadow"// refers to the nature of these tiddlers as not being visible in many lists, however still being present. Also, deleting a shadow tiddler makes it magically reappear.
}}}
A list of all shadow tiddlers generated by [[list macro|list]] can be found in the [[Sidebar]] under...
{{button{[[More|TabMore]]}}} / {{button{[[Shadowed|TabMoreShadowed...]]}}} -- in TiddlySpace simply under {{button{[[Shadows|TabMoreShadowed...]]}}}
!Modifying Default Contents
To override the default content of a shadow tiddler, just edit it -- this automatically creates a regular tiddler by the same name now taking precedence over the shadow tiddler.

To restore the default shadow tiddler, simply delete or rename the tiddler that overrides it.
!"""ShadowTiddler Reference"""
!![[User Contents|TiddlyWiki Layout]]
;[[DefaultTiddlers|DefaultTiddlers...]]
:» <<message config.annotations.DefaultTiddlers>>
;[[GettingStarted|GettingStarted...]]
:» <<message config.annotations.SiteUrl>>
;[[MainMenu|MainMenu...]]
:» <<message config.annotations.MainMenu>>
;[[SiteTitle|SiteTitle...]]
:» <<message config.annotations.SiteTitle>>
;[[SiteSubtitle|SiteSubtitle...]]
:» <<message config.annotations.SiteSubtitle>>
;[[WindowTitle|WindowTitle...]]
:» """Use to define the text you wish displayed as the window title of your TiddlyWiki in the the browser."""
;[[SiteUrl|SiteUrl...]]
:» <<message config.annotations.SiteUrl>>
!![[HTML Templates|TiddlyWiki Layout]]
;[[PageTemplate|PageTemplate...]]
:» <<message config.annotations.PageTemplate>>
;[[ViewTemplate|ViewTemplate...]]
:» <<message config.annotations.ViewTemplate>>
;[[EditTemplate|EditTemplate...]]
:» <<message config.annotations.EditTemplate>>
;[[ColorPalette|ColorPalette...]]
:» <<message config.annotations.ColorPalette>>
!!StyleSheets
;[[StyleSheet|StyleSheet...]]
:» <<message config.annotations.StyleSheet>>
;[[StyleSheetLayout|StyleSheetLayout...]]
:» <<message config.annotations.StyleSheetLayout>>
;[[StyleSheetColors|StyleSheetColors...]]
:» <<message config.annotations.StyleSheetColors>>
;[[StyleSheetPrint|StyleSheetPrint...]]
:» <<message config.annotations.StyleSheetPrint>>
;[[StyleSheetLocale|StyleSheetLocale...]]
:» <<message config.annotations.StyleSheetLocale>>
!![[HTML Framework|HTML]]
;[[MarkupPreHead|MarkupPreHead...]]
:» <<message config.annotations.MarkupPreHead>>
;[[MarkupPostHead|MarkupPostHead...]]
:» <<message config.annotations.MarkupPostHead>>
;[[MarkupPreBody|MarkupPreBody...]]
:» <<message config.annotations.MarkupPreBody>>
;[[MarkupPostBody|MarkupPostBody...]]
:» <<message config.annotations.MarkupPostBody>>
!![[Import & Plugins|Core Macros]]
;[[ImportTiddlers|ImportTiddlers...]]
:» <<message config.annotations.ImportTiddlers>>
;[[PluginManager|PluginManager...]]
:» <<message config.annotations.PluginManager>>
!![[Sidebar]]
;[[SideBarOptions|SideBarOptions...]]
:» <<message config.annotations.SideBarOptions>>
;[[OptionsPanel|OptionsPanel...]]
:» <<message config.annotations.OptionsPanel>>
;[[AdvancedOptions|AdvancedOptions...]]
:» <<message config.annotations.AdvancedOptions>>
;[[SideBarTabs|SideBarTabs...]]
:» <<message config.annotations.SideBarTabs>>
;[[TabTimeline|TabTimeline...]]
:» <<message config.annotations.TabTimeline>>
;[[TabAll|TabAll...]]
:» <<message config.annotations.TabAll>>
;[[TabTags|TabTags...]]
:» <<message config.annotations.TabTags>>
;[[TabMore|TabMore...]]
:» <<message config.annotations.TabMore>>
;[[TabMoreMissing|TabMoreMissing...]]
:» <<message config.annotations.TabMoreMissing>>
;[[TabMoreOrphans|TabMoreOrphans...]]
:» <<message config.annotations.TabMoreOrphans>>
;[[TabMoreMissing|TabMoreMissing...]]
:» <<message config.annotations.TabMoreMissing>>
;[[TabMoreShadowed|TabMoreShadowed...]]
:» <<message config.annotations.TabMoreShadowed>>
!See Also
* [[TiddlyWiki Layout]]
* [[StyleSheets]]
* [[Changing Default Options]] and [[Persistent Options]]
<<closeAll>><<permaview>><<newTiddler>>
!Summary
The tiddler SideBarOptions by default provides buttons in the right sidebar that provide general functions to manage your TiddlyWiki, like saving it or adding new tiddlers or journals or generating a [[PermaLink]].
!Default Contents
<<<
{{{<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>}}}
<<<
!TiddlySpace
In ~TiddlySpace these options are displayed on the right hand side to the [[MainMenu|MainMenu (shadow)]].
{{{
<<closeAll>><<permaview>><<newTiddler>>
}}}
<<tabs txtMainTab "Activity" "Activity"   TabAll "following" "followers" followers "followers>>

In a [[classic TiddlyWiki|TiddlyWiki Layout]] the sidebar is the right column containing...
;SideBarOptions
:commands to manage TiddlyWiki, e.g. to save it or create new tiddlers and journals
;OptionsPanel
:most used options
;SideBarTabs
:tabs with tiddler lists
;Situation:
You have a TiddlyWiki file on your pc and want to share this as a website online. (by sending or linking the web-address (the "url"))
Meanwhile you also want to edit the same TiddlyWiki local and add content.
;One of the options is Dropbox
Dropbox is a cloudservice that can be used for synchronizations of folders between pc's.
The Dropbox functionality can both be used via a website and installed on you local computer (both Mac, Windows and Linux)
In the following guide you need to have Dropbox installed on your pc! (see ''Dropbox installation'' below)
Dropbox has many great features like sharing folders between users and other pc's...this guide will __only__ cover the usage of the ''public'' folder and TiddlyWiki to publish your local TiddlyWiki.
!!!Step 1
*Go to Dropbox and sign-up for an account.
*Download Dropbox and  install it on your computer.
*Finish the installation settings so Dropbox is attached to the account you created.
!!!Step 2
*You will now have a Dropbox folder on your pc (depending where you installed it.. homefolder or desktop (all is ok))
*Inside the Dropbox are a number of pre-created folders.
!!!Step 3
*Open the "Public" folder inside the Dropbox-folder and create a folder ("tw" for example).
*Put (copy-paste or drag) a TiddlyWiki inside the "tw" folder you just created.
!!!Step 4
*Visit the Dropbox service online and login.
(now you can see the same document structure similar to your local Drobox folder)
*Go to the "Public" folder and open the "tw" folder you just created locally.
(since Dropbox synchronizes with your local folder the new "tw" folder should be there)
*Open the "tw" folder and locate the TiddlyWiki.
*The dialog (arrow on the right side) will give you the option for delete, move etc.
''The "public-url" is the link to your TiddlyWiki file over the internet.''
//(example image "copy public url")//
[img[dropbox.png]]
!!!Step 5 (the test)
Edit your local TiddlyWiki and check (reload page) the public url to see the changes.
!!!Dropbox installation
Visit this url: https://www.dropbox.com to sign-up for the service and to download Dropbox for local installation.
Watch the video to see more features about Dropbox.
!!!Downside of Dropbox urls
It is not possible to have nice domain-names instead of the Dropbox url's.
Your TiddlyWiki's will allway's have url's similar to:
{{{
http://dl.dropbox.com/u/YOUR_NUMBER/tw/empty.html
}}}
!!!Tip
Many TiddlyWiki users have a Dropbox to publish and share so called "minimal testcases" (MTC's) in the googlegroups (TiddlyWiki's where the "private" content is stripped of...only showing an issue)...so they can easily share ideas or issues.
/***
|''Name''|SimpleSearchPlugin|
|''Description''|displays search results as a simple list of matching tiddlers|
|''Authors''|FND|
|''Version''|0.4.1|
|''Status''|stable|
|''Source''|http://devpad.tiddlyspot.com/#SimpleSearchPlugin|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/contributors/FND/plugins/SimpleSearchPlugin.js|
|''License''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''Keywords''|search|
!Code
***/
//{{{
if(!version.extensions.SimpleSearchPlugin) { //# ensure that the plugin is only installed once
version.extensions.SimpleSearchPlugin = { installed: true };

if(!config.extensions) { config.extensions = {}; }

config.extensions.SimpleSearchPlugin = {
	heading: "Search Results",
	containerId: "searchResults",
	btnCloseLabel: "close",
	btnCloseTooltip: "dismiss search results",
	btnCloseId: "search_close",
	btnOpenLabel: "open all",
	btnOpenTooltip: "open all search results",
	btnOpenId: "search_open",

	displayResults: function(matches, query) {
		story.refreshAllTiddlers(true); // update highlighting within story tiddlers
		var el = document.getElementById(this.containerId);
		query = '"""' + query + '"""'; // prevent WikiLinks
		if(el) {
			removeChildren(el);
		} else { //# fallback: use displayArea as parent
			var container = document.getElementById("displayArea");
			el = document.createElement("div");
			el.id = this.containerId;
			el = container.insertBefore(el, container.firstChild);
		}
		var msg = "!" + this.heading + "\n";
		if(matches.length > 0) {
			msg += "''" + config.macros.search.successMsg.format([matches.length.toString(), query]) + ":''\n";
			this.results = [];
			for(var i = 0 ; i < matches.length; i++) {
				this.results.push(matches[i].title);
				msg += "* [[" + matches[i].title + "]]\n";
			}
		} else {
			msg += "''" + config.macros.search.failureMsg.format([query]) + "''"; // XXX: do not use bold here!?
		}
		createTiddlyButton(el, this.btnCloseLabel, this.btnCloseTooltip, config.extensions.SimpleSearchPlugin.closeResults, "button", this.btnCloseId);
		if(matches.length > 0) { // XXX: redundant!?
			createTiddlyButton(el, this.btnOpenLabel, this.btnOpenTooltip, config.extensions.SimpleSearchPlugin.openAll, "button", this.btnOpenId);
		}
		wikify(msg, el);
	},

	closeResults: function() {
		var el = document.getElementById(config.extensions.SimpleSearchPlugin.containerId);
		removeNode(el);
		config.extensions.SimpleSearchPlugin.results = null;
		highlightHack = null;
	},

	openAll: function(ev) {
		story.displayTiddlers(null, config.extensions.SimpleSearchPlugin.results);
		return false;
	}
};

// override Story.search()
Story.prototype.search = function(text, useCaseSensitive, useRegExp) {
	highlightHack = new RegExp(useRegExp ? text : text.escapeRegExp(), useCaseSensitive ? "mg" : "img");
	var matches = store.search(highlightHack, null, "excludeSearch");
	var q = useRegExp ? "/" : "'";
	config.extensions.SimpleSearchPlugin.displayResults(matches, q + text + q);
};

// override TiddlyWiki.search() to sort by relevance
TiddlyWiki.prototype.search = function(searchRegExp, sortField, excludeTag, match) {
	var candidates = this.reverseLookup("tags", excludeTag, !!match);
	var primary = [];
	var secondary = [];
	var tertiary = [];
	for(var t = 0; t < candidates.length; t++) {
		if(candidates[t].title.search(searchRegExp) != -1) {
			primary.push(candidates[t]);
		} else if(candidates[t].tags.join(" ").search(searchRegExp) != -1) {
			secondary.push(candidates[t]);
		} else if(candidates[t].text.search(searchRegExp) != -1) {
			tertiary.push(candidates[t]);
		}
	}
	var results = primary.concat(secondary).concat(tertiary);
	if(sortField) {
		results.sort(function(a, b) {
			return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);
		});
	}
	return results;
};

} //# end of "install only once"
//}}}
/***
|''Name''|SimpleSearchPlugin|
|''Description''|displays search results as a simple list of matching tiddlers|
|''Authors''|FND|
|''Version''|0.4.1|
|''Status''|stable|
|''Source''|http://devpad.tiddlyspot.com/#SimpleSearchPlugin|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/contributors/FND/plugins/SimpleSearchPlugin.js|
|''License''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''Keywords''|search|
iVBORw0KGgoAAAANSUhEUgAAAEkAAAAwCAYAAABdXlfVAAAKd2lDQ1BJQ0MgUHJvZmlsZQAAeAHVlmdUFMkahqt7ciLNMGQY4pAlR8lxyBnBxDBDGMI4DEHBhMriCq4BERFQFmSJCq6BtAZEFAOLgCIGdEEWAeW6GDCBcnvg4HrOvfvv/rnVp6qffuurr6urus55ASB3sAWCJFgCgGR+mjDIw5mxKiKSgXsE8ICAXCpAnc1JFTgFBPiAfyzv7wNI1HnXQJTrH8P+e4ckNyaVAwAUgHRHc1M5yQifQ3ieIxCmAQCfRrhvY5oAYVQ2wjQhMkGEC0Uct8S1Io5e4guLMSFBLkhMHwB4MpstjAOANIzojAxOHJKHNI+wEZ/L4wNA1kfYnhPP5iIsmrt+cvIGERcjrB39XZ6475jNjv6Wk82O+8ZL34KMRF7syksVJLEzFx/+l01yUjqyXotFCmnJ/CQ/0d7QkDrJZbt6L7MgaXHPFvUYfmjwss6P9vNf5lihe9AyC9Kcv+OAkGU9K97Fb5ljUt2+5Ulge4n2bDG/MD0odJlTM4LdljkrPiR8mbkxrt/0WJ47a1nnpbG+vStxg/e3OYBgkAn4gAN8ARukgjQQA4RpMZvSkHHAZYMgU8iLi09jOCF/XIw+g8XnGOozTIyMjUTd/zdFdNaWJvuWvniGIPqtv7WtTAAcGpAzIPu3FjIBQF0ZALL4vzWNbgDobQC0UTjpwoylfGjRDQOIQBzZITmgDNSBNjAAJsAC2AJH4Aa8gD8IARFgHbLC8SAZCMFGsAXsALkgHxwAh0EJKAcnQC04Bc6AFnABXAHXwW3QBwbBYzACxsFLMAPegzkIgnAQBaJCcpAKpAnpQSaQFWQPuUE+UBAUAUVBcRAfSoe2QLugfKgAKoEqoDroV6gNugLdhPqhh9AoNAW9gT7DKJgM02AlWAteAVvBTrA3HAKvhePgFDgLzoH3wcVwJXwSboavwLfhQXgEfgnPogCKhKKjVFEGKCuUC8ofFYmKRQlR21B5qCJUJaoR1Y7qRt1FjaCmUZ/QWDQVzUAboG3RnuhQNAedgt6G3osuQdeim9Fd6LvoUfQM+iuGglHE6GFsMCzMKkwcZiMmF1OEqcacx1zDDGLGMe+xWCwdy8RaYj2xEdgE7GbsXuwxbBO2A9uPHcPO4nA4OZwezg7nj2Pj0nC5uKO4k7jLuAHcOO4jnoRXwZvg3fGReD5+J74IX4+/hB/AT+DnCBIETYINwZ/AJWQS9hOqCO2EO4RxwhxRksgk2hFDiAnEHcRiYiPxGnGY+JZEIqmRrEmBJB4pm1RMOk26QRolfSJLkXXJLuQ15HTyPnINuYP8kPyWQqFoURwpkZQ0yj5KHeUq5SnloxhVzFCMJcYV2y5WKtYsNiD2SpwgrinuJL5OPEu8SPys+B3xaQmChJaEiwRbYptEqUSbxJDErCRV0ljSXzJZcq9kveRNyUkpnJSWlJsUVypH6oTUVakxKoqqTnWhcqi7qFXUa9RxGpbGpLFoCbR82ilaL21GWkraTDpMepN0qfRF6RE6iq5FZ9GT6PvpZ+j36Z9llGScZGJk9sg0ygzIfJBVkHWUjZHNk22SHZT9LMeQc5NLlDso1yL3RB4trysfKL9R/rj8NflpBZqCrQJHIU/hjMIjRVhRVzFIcbPiCcUexVklZSUPJYHSUaWrStPKdGVH5QTlQuVLylMqVBV7FZ5KocpllRcMaYYTI4lRzOhizKgqqnqqpqtWqPaqzqkx1ULVdqo1qT1RJ6pbqceqF6p3qs9oqGj4amzRaNB4pEnQtNKM1zyi2a35QYupFa61W6tFa5Ipy2Qxs5gNzGFtiraDdop2pfY9HayOlU6izjGdPl1Y11w3XrdU944erGehx9M7ptevj9G31ufrV+oPGZANnAwyDBoMRg3phj6GOw1bDF+t0FgRueLgiu4VX43MjZKMqoweG0sZexnvNG43fmOia8IxKTW5Z0oxdTfdbtpq+tpMzyzG7LjZA3Oqua/5bvNO8y8WlhZCi0aLKUsNyyjLMsshK5pVgNVeqxvWGGtn6+3WF6w/2VjYpNmcsfnL1sA20bbednIlc2XMyqqVY3Zqdmy7CrsRe4Z9lP3P9iMOqg5sh0qHZ47qjlzHascJJx2nBKeTTq+cjZyFzuedP7jYuGx16XBFuXq45rn2ukm5hbqVuD11V3OPc29wn/Ew99js0eGJ8fT2POg5xFJicVh1rBkvS6+tXl3eZO9g7xLvZz66PkKfdl/Y18v3kO+wn6Yf36/FH/iz/A/5PwlgBqQE/BaIDQwILA18HmQctCWoO5gavD64Pvh9iHPI/pDHodqh6aGdYeJha8Lqwj6Eu4YXhI+sWrFq66rbEfIRvIjWSFxkWGR15Oxqt9WHV4+vMV+Tu+b+WubaTWtvrpNfl7Tu4nrx9ez1Z6MwUeFR9VHzbH92JXs2mhVdFj3DceEc4bzkOnILuVMxdjEFMROxdrEFsZNxdnGH4qbiHeKL4qd5LrwS3usEz4TyhA+J/ok1iQtJ4UlNyfjkqOQ2vhQ/kd+1QXnDpg39Aj1BrmAkxSblcMqM0FtYnQqlrk1tTaMhpqYnXTv9h/TRDPuM0oyPG8M2nt0kuYm/qSdTN3NP5kSWe9Yvm9GbOZs7t6hu2bFldKvT1opt0LbobZ3b1bfnbB/P9siu3UHckbjj951GOwt2vtsVvqs9RyknO2fsB48fGnLFcoW5Q7ttd5f/iP6R92PvHtM9R/d8zePm3co3yi/Kn9/L2XvrJ+Ofin9a2Be7r3e/xf7jB7AH+AfuH3Q4WFsgWZBVMHbI91BzIaMwr/Dd4fWHbxaZFZUfIR5JPzJS7FPcelTj6IGj8yXxJYOlzqVNZYple8o+HOMeGzjueLyxXKk8v/zzz7yfH1R4VDRXalUWncCeyDjxvCqsqvsXq1/qquWr86u/1PBrRmqDarvqLOvq6hXr9zfADekNUyfXnOw75XqqtdGgsaKJ3pR/GpxOP/3i16hf75/xPtN51ups4znNc2XnqefzmqHmzOaZlviWkdaI1v42r7bOdtv2878Z/lZzQfVC6UXpi/svES/lXFq4nHV5tkPQMX0l7spY5/rOx1dXXb3XFdjVe8372o3r7tevdjt1X75hd+PCTZubbbesbrXctrjd3GPec/5389/P91r0Nt+xvNPaZ93X3r+y/9KAw8CVu653r99j3bs96DfYfz/0/oOhNUMjD7gPJh8mPXz9KOPR3OPsYcxw3hOJJ0VPFZ9W/qHzR9OIxcjFUdfRnmfBzx6PccZe/pn65/x4znPK86IJlYm6SZPJC1PuU30vVr8Yfyl4OTed+y/Jf5W90n517i/Hv3pmVs2Mvxa+Xniz963c25p3Zu86ZwNmn75Pfj/3Ie+j3MfaT1afuj+Hf56Y2ziPmy/+ovOl/av31+GF5IUFAVvIXvQCKKSFY2MBeFMDACUCACrii4kdS154MQJa8u8Ii3z8opf/T17yy4vxFgBUOwIQmg2AJ1LLENZEKq0DAJElDHEEsKnpt4ooopIaa2qyCBBZiFiTjwsLb5UAwLUD8EW4sDB3bGHhSxXi2R8C0JGy5MFF0T4GAKC3uvgaW18tN10c/n3zb/Gq6ETcjLViAAAACXBIWXMAAAsTAAALEwEAmpwYAAAPcElEQVRoBe2a2W4byRWGD9nNfdEu27ItK47HGNvI7eQmj5GXyYvkQXKRi7xAECBIkGAukmAQeyxLsqiNi7h2k8z/VbMkSiI1trVMJsgBWl1d+/nrP+dUFZWq/KY+tv/LtQiE4yiyaZRSk+rkkfZls/KvK7921J9YoQMpJ21TeoZCJNIDMKGeWE+aZ1JGfqDHvZU3UiLQGyFNPvWHZPwPSTgYRNaOpJHT3KwgdDJSvDUyq0jjvvL7SheVBqCOvgECMLOqNxiD0tgAGsBOVTevCnT3qZL0cF778vd5yVV2XzcO/dyGhJVh355WRxZIsU6Usu87gTWFykp+bEfdwNLp2DayZrt9QSRAFoOhCQdbVv12nLK1cCQWpuwwSltPM17PjK2ldEYwMUmvMG/ARSnPUF+mrAt1YSILQjljIaR5aEsZfVGP/kj7cvJII8yHcv/tMr/gT9jtDez5i8DK1Zxtf+hav9uzpxspW1jM2z/fte3rrYxlwpT9eze2v+727ZevMtYfjG19PWO1g9gK2diGo7R1eik7agysVMzYn/elRmoyQybFLJktGpP2aCnpvn0+34jXijbTwjdtkZEqMYbve8Lo6bZZWQXFHmjX7gv+hN1GZPv7IykuJnSH9s2rtA0GoVWqZm+20pYvhmLK2LYejW1jMWUZMWWxktJcx/ZoTebVCmxB38+eZW37e1gmLT70bS0Yy+zG1tYMhakz3YdiZ0/K1QYpK6nM+TSpsZAdWWeYsrpokpdWmHCkwqqwhhn4SthT1J9IZTuy9ec5tddYdbmKSjCyUMNm5DyPZQ05zReAvhvIEtSO+d9EQpNPijVo1E9rYWJLpUsWDwb6HgsGFff6UiYQGJE92sjb3/7ettevCra319d31prNyApyZN1Oygr5jB23h/brB6e2uS6TS49UJmAESkFKleXYIgHxdjdtC8XYikUB00pbTmV5gZ8LhwIntPd7gdoPLMik7bQj8kj5jMw8kwlsWyx9sNTXQqVt9zBr3V5sD5aHDpRASDVOU+prpH6y9ts/juxAuuUFGKb3pRL+rDy0nrZKcTu2OB7bP06atr4W2tHewK1AqRyKaV17uDa2Tj1tx7W+vdUatk6H1j6OrN8fWlf5ne6pLS6E1uyMNKnAPhwCSNoWS6K7JpjWkuKlhmLWcWtsB42MFfNmJ22xRCDkBFJV2vTl59qKDkGQtVOZ8FCNYQkLhdnXmppHP2eZQwF8Olb9wOryowSNlOoNRb10KrAe/jKIraRRCUQ3wAiT/cOkPS99uu58l/5b2b/QcjT1lknNF98H7X5s8XO5+TzC3/3+5wk2k76celPY+CFGzvuJC1p1X3zd27dj/3V5uuMZa0Cnvr8LDa40Vj0qSqb7cW1VF8aGk80brB2JiTyXu0l6uPTXd3w5eyy5lPeT/mQxD467ExNPyaQVhEqyghvIzVrfYOC7aooPS4tOkQIS9MHPxmyufkBowzNLwtk8klmJelE0sppWhTowERp3e0PLZdlkyuyUt7qUd+mL/UzIyYtKKsRMoX2ksyLfgZw7Y8TSgDcThNQjZ9cpOe60nsDVH8puQtUPw9DVpx5t+OatT0mSF2hr0e/sa45ZRc+iHHlsrVZvlu6TPGeobm6VStmyapcYF/mJhBrjiozdxizJ7hG9FGazCr8ZhZlsljA70OCKGvpeXsidAXbe0aRT3/dkkCgaJL5BgAQoqAZDgRJpywEoeKUh4clJ6EACRIAdjzMOFMp5ABWQELpPgCK6DW17e0dbj6K9efNGdQKnNGDOE8p6vZ5bAEC6XDcl1CbLPq8LBh4JaW3WtG/5IRlKqZ3v/mkZDVbQjvRkf8+qK6tuokc77620uGyVZe1CBddQymdyeassLf9Qt59VPhDozKNQLKgd4GgsvPg1AgzzTO5akICPBThp9G3voKOBRGWZYFmbx/5g5Fj11VZVZpiYCisQ9fv2r7/8yTrNxoRhiZlVV9csK0A6zbq16yeWK5UFnPrIF+zVN786p8M1K36NjmdFMKnZbIuhQ8fEkb4BYGVl6azOvMRlBvl614OkWqyD8yXxyJkdwHl/RCdlndX4PheIqW9VHMaRpYPQxppwSuaRSov6Sg8EJBNKy+fggwDvtiTSlv74uC7z6Wsnr5O5poJZrn4CSPPmMBckzyJ80kmj5w6u5OFU2HUQRTKyd8Lr9AqgdKt16piRyWTcuI7KAsUBIjPMZOYHVfxPV4dsfBTtksd15/piLPJw6oVC4cLYVGCM03bH1cF83CKr/kjmVqmUXDvX0Wf8mT/bSSdMqKOIVtfZLRabAkU4wupI+flcYC82ZW46LlAPBZjk0eG+dTodyxcU+XRWGIk9OERVsFKpIuonPoohHAeV74X2u7sf7aTessXFij18sOoAw9QpQxgLdgCSFz8+92P7+0dikRw90THG3BQcoqGiXf52QfLzJqo9fVhyh0vy3A6WSWqlSSdaon+iaFomVV16YgtLsG3kImAsBSMBnJXjz+cS5+/reyX9G9MtyuEeHjdkMgOd47ouYqEw+ZQz7uX2/hv2buh6gkV0jljzIg9m+jp+rE99z2WSG0QDNBXutz+2nYKJqXGA1JWF2ITguNk3aU4QhSpqE9tRvW+AkxHzMM0R6XBszx7nxaZzBrhOLvzRKT6fs4Vq2YFTrzcdgxLm5DUGY13dHfrxcdi7ezXXI+GfRSuXi1Ypl8TmxPwvDPcJH3N9km+Lgm3d7/JGYANpmMHpvVrOXnLciV/ANJFYvsBtDFUXRdICjXakp8WvMj6pVjuwDzv7buUxG0yFPmAQ0asgM362uSEfU7nCDkwSn0b3GZkk7eaF9unxr0vPZFKjNdDVR+wGgh2VUibZRMovOeWUh1I8TPxidCP6JZtOBpYnmin0O09oD5OKME7aYnIFsSsZj933xWBBP4BCl7F80MHhidUbTVusVuTXqo659On9FvU/R2YyqXbUtd1ax5lUQc4ZsykXFK41k+ZpJPNKu/1SMS/H/azqduOe7qzk6ami20SYHGEZIPENfPNQz++cSeOEfT6OluiVsC3xP555gMvCoDB1Lgv59Is/TKuyH88z9XL9T/meCRKTwJzwNQhnOMI+ThxhIsm6JX7IZU7+UFar1ezo6Mht8/P5vJs0+ZgHkybNQwTkgRmvX7+eqfR03z9W+gJImrcorXvrjsLoYVeT1p2xLvcLAsuFfjEK6WrvBMN4nj4qSUkUT9rCina7rdXmDMaZqC+6sz/h7nzg2ntTBShWnW+/p+JNH7TH6SJ8e6ENQLOlmMUk6lHHy00YdNaHOjzv0efqjV/C6VIKcD7kwzBMx5mPwCnphwJo7evheLe3t3V1Huk6t2rt05a7AcjlCtaQn8jlcmemdXJyYkuLi/J/XQcS4FIO++qNhvMxAOKBhHFd1WUn/eTJU3fKZ/q3AcSU6leSF5jUUhTDYXOXXNBlFUAkpoZDTDaSmCA+CiHqcCxxTNI3jpNJ45PGWn0OrwP9VMIGr6h67hqjP3BMQPke4EwYAVvIS078ib8BFOdfJmwDDPJgJIzjKuSuAULPC9Gt14/PDrKVMkqlDOAKudA569MOv7El/sTdKQmV/ONQE3foOMpxtXF8fCJT0AW/fqI6qAf6sSCy55u638mP7PDwkHGd+LskzBHfhPMGZIABrGq16vIB0AOzsrKi/o/d1caLFy8c8+6aTReYdDb5iZkBkhdWDIfeH+i3NSnCXRLlsGhaUByzYSOHaY71O5u7YNMvLEQtmAAAKA4buMchXS6XXTe+DFZhegBGOW+fhy/ie9bdz/Rcbit9gUm+U/zPLMF5t7uR7ewrIqkOZ7avni04p+5XkzcrjeB8uRlEmY72OoC8trbmQPJOHGVp02w2HWitVssBSd7CwoLLOzg4cCBixuQ9fvzY1Zk1x7vIu8IkzW22iFTwiltK/BZmB5OWJjeTvhGrjjIwD0UT1hGxhm5LQH6yB0rMlvreF8Ec2lAHEGEV2wbYSR1vcuQh1LsPuQJSMihIfdkEUOzdu3cOKBiEeRGtAAa/g4KASD0cLwIIfC8q0vV118S391OAQz9EQszz5cuX9waOm5z+zAHJFxOtztPnKZ+Z/Bhwnp9Et4bCtzcblMVH4ZQBCqW9icEa8gCS+qQBwgtg0Q7gaAPTaE8d2twXk674pPc7Xdv52LfXL8v6Rwgm4qc8/Z6Z6SqgDD6JN+zwO+63b986FlGJsrwUDqUsaZgCYADld+Awjn7wP4BEOf0RHXHym5ubDiRvntOzu+30GZP8YO/e1+zd9x/t1dfP9d8c+k1d2wJO/jCKaLVU1X8eDTtu4pgLE4YBXvAxKAoLSPsVhwEI+aRhgWcC9RDmQNuczLOkvl3kUx6neYT61KE+bOKZHttVuoM/Z0zyE36ysWgP1vgtLWsN/m9G/10COABF2GeCmipTvqCoBxlmcHajPwBBUUB5/vy5A5aypaUlV1av113ag0ofnNrTKe2nDmpaoJ7zW231yek+DJMDMu3wa1tbWy5a+rHvAB/X5RmTbmsAQCKcwyAmjwAS30QngPN+h3KY4JVMNqpy8N2BFiX5gTKdZh1ZJM6P54dj2nBXHuiHhruWmSOw+j6aoDDHk3J1TWFfG0GtKMxixw27lvQfcuyfvKJM2DMJNgGI90sAhBMHNBwy+ZzFuErh/nlsRds/1j6r3rPNxxWNFyc/Cmj8F1sV1T936ncNzHT/M0FCOZ7EVyR3MgPttJv6H6aBzmsQRMVudbmZBCTMDwGAJ0+euDff9EMeApAwzfcPixiDPA7JpqvZ5WUAl8kJGOon7ZIbUfcx6Yc0/dyHfJ65eXTuY2b/RWPMZNLc+X3CysEMTIqwjhC2ScMmGIMkDEicP/m0ifVDpkpURuRLGMm3LycP5vHtGXZfTPoskCbsZ+6yHdRF4eTtfRKgfPvtt87fLC8vO8D8JhA/x64aP4TfI43PYn9EtGJvROTjvMdZD1BXVpZ1y3nswGFvhC+7L3ASzaSjlJuo67Nu9qY7lEZBGMSbPKIbjhvxZzAfASn3LAM0n0890pTBNvoDcPqBUZTdB2CfxaRPgQ8F/P02O2WU5kFBWEYeCq+vr7utgj+O0Df5lHPSX11ddTtuQMHMqAcwRERuBWDU1taW6xeQ7xKsW2cSIGE6AMPkpyMYigAUMr0toA7i63o/RHvq0Sds8gyjD+pwLuR913LrTIIN73QLABsAZX9/3ynDyiPkASL1uFuCFbCMIw57MsDY2NhwgO3t7Tk/RR5tAAlgOEA/fPjQld01i5jzfwDo6NNp52evygAAAABJRU5ErkJggg==
Currently this just redirects to TiddlyWiki.com

To access the underlying space and give it another purpose request access from @jon and visit:
http://tiddlywiki.tiddlyspace.com/?select=title:!MarkupPreHead
The SiteInfo tiddler is a special [[tiddler|Tiddler]] that can be used to provide a public description on [[space|Space]].

It can just contain text but also tags and [[extended fields|Custom Fields]]. It is designed to describe a space to a newcomer and to be used by plugins.

For example, a space tagged ''"""plugin"""'' will be listed as a plugin space, one called ''"""theme"""'' will be listed as a theme space.

The idea behind its conception was first discussed [[here|http://groups.google.com/group/tiddlyweb/browse_thread/thread/34e6ac1ef870c7e6]].
Community Documentation @@color:#fcc;margin-left:20px; (for ~TiddlyWiki Classic prior to version 5)@@
!Summary
Use the SiteSubtitle shadow tiddler to define a subtitle for your TiddlyWiki, by default displayed under the main [[SiteTitle...]]
!Default Contents
{{{
a reusable non-linear personal web notebook
}}}
!TiddlySpace
In ~TiddlySpace by default it is set as
{{{
a TiddlySpace
}}}
~TiddlyWiki Classic
!Summary
In the shadow tiddlerSiteTitle you can define the title of your TiddlyWiki. 
!Default Contents
{{{
TiddlyWiki
}}}
!TiddlySpace
In TiddlySpace the SiteTitle is by default set to the name of your newly created space.
!Description
Set the SiteUrl shadow tiddler to the full target URL when using TiddlyWiki for publication on the web.
!Default Contents
''none''
[[Slices]] are little chunks of information that can be referenced in another tiddler. A slice is a {{{name:value}}} pair that can be specified anywhere in a tiddler using one of the following notations:
{{{
name: value
|name:|value|
|name|value|
}}}
Leading and trailing blanks are stripped.
From the [[Glossary]]...
<<<
<<tiddler Slice>>
<<<

A slice name may contain any of the characters {{{a-ZA-Z_0-9}}}. You may use ''bold'' or //italic// formatting as well as a trailing colon and/or leading tilde, e.g.:
{{{
|''name:''|value|
|//~WikiName//|value|
}}}
{{annotation{
@@color:red;Important!@@ Be sure to add the colon and the tilde @@color:red;__inside__@@ the formatting, otherwise the slice will not be recognized!
}}}
!Using Slices
Slice values can be retrieved and embedded using the [[tiddler macro|tiddler]], e.g.:
{{{
<<tiddler "TiddlerName::SliceName">>
}}}
{{annotation{
@@color:red;Important!@@ To successfully retrieve a slice, you need to enclose the whole parameter using {{{'single'}}} or {{{"double quotes"}}} or {{{[[double square brackets]]}}}, otherwise TiddlyWiki will think it is a named parameter, with {{{TiddlerName}}} being the parameter name and {{{:SliceName}}} its value.
}}}

!Simple Plain
version: 1.2.3.4
<<<
;markup
:{{{version: 1.2.3.4}}}
;slice-name
:{{{version}}}
;slice-value
:<<tiddler 'Slices::version'>>
<<<

!Simple Bold
''Author:'' Joe Brown
<<<
;markup
:{{{''Author:'' Joe Brown}}}
;slice-name
:{{{Author}}}
;slice-value
:<<tiddler 'Slices::Author'>>
<<<

!Simple Italic -- no ~WikiWord
''~SeeAlso:'' [[Wikipedia|http://wikipedia.com]]
<<<
;markup
:{{{//~SeeAlso:// [[Wikipedia|http://wikipedia.com]]}}}
;slice-name
:{{{SeeAlso}}}
;slice-value
:<<tiddler 'Slices::SeeAlso'>>
<<<

!Table Plain
|URL:|http://example.com|
<<<
;markup
:{{{|URL:|http://example.com|}}}
;slice-name
:{{{URL}}}
;slice-value
:<<tiddler 'Slices::URL'>>
<<<

!Table Bold
|''Type:''|Plugin|
<<<
;markup
:{{{|''Type:''|Plugin|}}}
;slice-name
:{{{Type}}}
;slice-value
:<<tiddler 'Slices::Type'>>
<<<

!Table Italic
|//Source://|http:\\example.com\source.js|
<<<
;markup
:{{{|//Source://|http:\\example.com\source.js|}}}
;slice-name
:{{{Source}}}
;slice-value
:<<tiddler 'Slices::Source'>>
<<<
Adding another [[user|User]] as a [[member|Member]] to a [[space|Space]] makes them a factual owner of the space -- having the same privileges to [[create|New Tiddler]], [[edit|Edit Tiddler]], [[delete|Delete Tiddler]] and [[publish|Publish]] tiddlers as well as to [[add|Add Member]] and [[remove|Remove Member]] [[members|Member]] from the [[space|Space]] as the initial [[owner|Owner]].
<<<
This is analogous to cutting a key and giving it to someone you invited into your house guest while giving them rights to change the locks and lock you out. But that's unlikely to happen with people you invite into your home, is it not?
<<<
A [[space|Space]], also called a TiddlySpace, is a TiddlyWiki hosted on TiddlyWeb [[...and more|http://tiddlyweb.com]]. Each space has a [[Space Name]] and comprises of tiddlers stored in one of two [[bags|Bag]]:
# A [[Private]] [[Bag]] named {{{spacename_private}}}
# A [[Public]] [[Bag]] named {{{spacename_public}}}
Initially, a [[Space]] belongs to the [[user|User]] who created it, e.g. a users [[Home Space]] automatically generated when registering with TiddlySpace. Later, other users can be added to the [[members|Member]] of the space forming a [[Small Trusted Group]].

Both, [[users|User]] and [[plugins|Plugins]], are at liberty to access and manipulate [[tiddlers|Tiddler]], [[recipes|Recipe]], and [[bags|Bag]] using the [[TiddlyWeb]] [[HTTP API]].
Each [[space|Space]] is identified by a [[Space Name]] which may only contain lowercase letters, digits or hyphens.

The [[Space Name]] is unique to a TiddlySpace server, and is accessible on a subdomain of the server, e.g. on  [[tiddlyspace.com|http://tiddlyspace.com]] the @glossary space can be reached at:
<<<
http://glossary.tiddlyspace.com
<<<
!Upload an icon
<<tiddler spaceIcon>>
!Describe your space
If you haven't already done so, you should provide a brief decscription of yourself and what you're using this space for. To do this, just edit the [[SiteInfo]] tiddler (keeping the title the same of course).

!Change the title
<<tiddler spaceTitle>>
!Change the theme
<<tiddler colorScheme>>
!Change the menu
If you'd like to change the menu items along the top, you can edit the [[MainMenu]] tiddler.

!Change the default tiddlers
<<tiddler setDefaultTiddlers>>
!More Advanced customisations
If you know HTML and CSS, you can edit some or all of the following tiddlers to customise your space further:
* PageTemplate
* EditTemplate
* ViewTemplate
* StyleSheet
See [[UTF-8]]...
People and organisations with a business interest in TiddlyWiki, TiddlyWeb and TiddlySpace.
The basic entity in a TiddlyWiki is a tiddler pocessing a handful of basic characteristics called ''standard fields'', which are...
;title
:» the tiddler title; unique in a document
;text
:» the tiddlers' text
;tags
:» keywords for categorization
;created
:» the date/time when the tiddler was created
;modified
:» the date/time when the tiddler was last saved
;modifier
:» the UserName of the one who last modified the tiddler
Click the "new tiddler" button towards the top right of the screen to write something in your space. You'll need to give it a title, some content and, optionally, some tags that will help you identify it later.

!Stuck for ideas?
Not sure what to write about? Not sure what to keep in your space? Other people use ~TiddlySpace for almost anything. How about some of the following:

* [[Save interesting sites|http://bookmarks.tiddlyspace.com]], images or articles from around the web so that you can refer back to them.
* [[Record your family tree|http://familytree.tiddlyspace.com]], store notes on long lost relatives or ancestors and map their relationship to you.
* [[Make up a pocketbook|http://pocketbook.tiddlyspace.com]] to store some useful information in, then print it out, [[fold it up|http://www.pocketmod.com/]], and take it with you.
* [[Plan your holiday|http://the-web-is-your-oyster.tiddlyspace.com/]], record where you're planning to go, note down places of interest and refer back to it later.
* [[Create a mindmap|http://mindmaps.tiddlyspace.com/]] to visualise your inner thoughts and see how they relate to each other.
* [[Set up a questionnaire|http://questionnaire.tiddlyspace.com/]] and get all your friends to answer it.

If you don't like any of those ideas, you can still use this space directly to keep notes and link them together, make a todo list and keep track of everything you're doing, or any one of a hundred million other things.

Still stuck? Check out the @featured space for more suggestions.

You can also [[socialise with others|How to socialise]].
When TiddlyWiki loads, it reads startup parameters (also called paramifiers) from the local part of the URL which follows the hash character {{{#}}}.

{{foo{
;"""open:<title>"""
:» opens the tiddler with the specified title
:» http://www.tiddlywiki.org/#open:Paramifiers
;"""<tiddler name(s)>"""
:» opens tiddlers, see PermaLink / PermaView
:» http://tiddlywiki.org/#TiddlyLink%20WikiLink
;"""start:safe"""
:» opens the document in [[Safe Mode]]
:» http://www.tiddlywiki.org/#start:safe
;"""search:<text>"""
:» performs a search for the specified text
:» http://tiddlywiki.org/#search:sidebar
;"""theme:<themeTiddler>"""
:» displays TiddlyWiki with the specified theme
;"""tag:<name>"""
:» displays tiddlers tagged with the specified tag
:» http://tiddlywiki.org/#tag:Formatting
;"""filter:<expression>"""
:» displays tiddlers matching the specified [[filter|Filters]] expression
:» http://tiddlywiki.org/#filter:%5Btag%5BButton%5D%5D
;"""readOnly:<yes/no>"""
:» enables or disables [[readOnly]] mode
:»  http://www.tiddlywiki.org/#readOnly:yes
;"""newTiddler:<title>"""
:» creates a new tiddler with the specified title, opening it in EditMode
:» http://www.tiddlywiki.org/#newTiddler:NEW
;"""newJournal:<dateFormat>"""
:» creates a new journal entry with the specified [[date format|DateFormats]]
:» http://www.tiddlywiki.org/#newJournal:YYYY-0MM-0DD
}}}<<listfiltr>>
To construct a valid URL, non-ASCII characters in the paramifier value need to be URL encoded...
| !Character | !Encoding |h
| <blank>|%20|
| [|%5B|
| ]|%5D|
[[StyleSheetTiddlySpace]]
[[StyleSheetDemo]]
/*{{{*/
h1, h2, h3 {
	margin-top: 0.7em;
}
.info_source {
	margin-left: 56px;
}

.tiddler .viewer {
	margin:0;
}
.viewer .tagcloudTag {
	border:none;
	background:#ddf;
        line-height:1.2em;
}

.viewer .tagcloudTag:hover{
        background:#ccf;
}

.viewer pre {
        font-size:1em;
}

.viewer .annotation pre {
	background-color:[[ColorPalette::TertiaryPale]];
}

.viewer .table100 {
	width: 100%;
}

.viewer table,
table.twtable {
	margin: 0.8em 0;
}

.viewer .error td,
.twtable .error td {
	background-color: #fcc;
}

.viewer td, .viewer tr,
.twtable td, .twtable tr {
	vertical-align:top;
	background: white;
}

.inlineList li {
	margin-right: 10px;
	display: inline-block;
}

.right {
	float:right;
	margin:0 1em 10px 10px;
}

.justifyright {
	text-align: right;
}

.justifyfull {
	text-align: justify;
}

.serialized{
	margin:1em 1em 1em 0;
}

#searchResults .button {
	background:white;
	float:right;
	margin:0.5em 0 0 1em;
	padding:0.5em 1em;
}

#menuBar {
	padding: 0.3em 0;
}

#mainMenu a {
	padding: 5px 10px;
	font-size: 0.9em;
	margin: 0;
	line-height: 1em;
	display: inline-block;
}

#sidebarOptions .tiddlyLink,
#sidebarOptions .button {
	font-size: 0.7em;
	font-weight:normal;
	float: right;
	padding: 5px 15px;
	color: #fff;
	display:inline;
	cursor: pointer;
	line-height: 1em;
	text-align: center;
	margin: 0 !important;
	display: block;
	width:auto;
}

#sidebarOptions .tiddlyLink:hover {
	color: #fff;
}

.annotation {
	display:block;
	margin:0.5em 0 0 0;
	background-color:[[ColorPalette::PrimaryPale]];
	border:none;
}

.tiddler {
	border-top-color: [[ColorPalette::PrimaryLight]];
}

.tiddler:hover {
	border-top-color: [[ColorPalette::PrimaryMid]];
}

#messageArea .button{
	
color:[[ColorPalette::Background]];
	background:transparent;
	text-decoration:none;
}

#messageArea .button:hover{
	text-decoration:underline;
}

.viewer blockquote {
	border-left: 1px solid[[ColorPalette::PrimaryMid]];
	background-color:[[ColorPalette::TertiaryPale]];
	line-height: 1.5em;
	padding-left: 0.5em;
	margin: 0.5em;
}

#messageArea {
	top: 0 !important;
	left: 30%;
	width: 30%;
}

.viewer table, table.twtable {
	border:1px solid [[ColorPalette::TertiaryLight]] !important;
}
.viewer th, .viewer thead td, .twtable th, .twtable thead td, .twtable thead tr.evenrow td{
	background:[[ColorPalette::SecondaryPale]];
	border:1px solid [[ColorPalette::TertiaryLight]] !important;
	font-weight:bold;color:[[ColorPalette::Foreground]];
}
.viewer td, .viewer tr, .twtable td, .twtable tr {
	border:1px solid [[ColorPalette::TertiaryLight]] !important;
}
.viewer tr.evenRow td, .twtable tr.oddrow td {
	background:[[ColorPalette::TertiaryPale]];
}
.viewer th .linkified .tiddlyLink {
	font-weight: bold;
	color:[[ColorPalette::PrimaryMid]];
}
.viewer th .linkified .tiddlyLink:hover {
	color:[[ColorPalette::PrimaryLight]];
}

.highlight,
.marked {
	background:[[ColorPalette::SecondaryPale]];
}

.tiddlyLink:hover .highlight,
.tiddlyLink:hover .marked {
	background:[[ColorPalette::PrimaryLight]];
}

.alert{
	color:red;
}

.viewer .listWrapper li {
	margin-top:1px;
	background:[[ColorPalette::TertiaryPale]];
	list-style-type:none;
	padding:0;
}
.viewer .listWrapper li .tiddlyLink {
	display:block;
	padding:0 4px;
}
.viewer .listWrapper li.listTitle {
	background:transparent;
}

.viewer a.bookmarklet,
.viewer span.bookmarklet {
	color:#6A6;
	font-weight:bold;
}

.viewer a.bookmarklet:hover,
.viewer span.bookmarklet:hover {
	color:#393;
	font-weight:bold;
	background:none;
}

.viewer ul.timeline li.listTitle {
	margin-left: 0;
}

.viewer ul.timeline li.listLink {
	margin-left: 1em;
	list-style-type:none;
	color:[[ColorPalette::TertiaryMid]];
}

.viewer .noTitle li.listTitle{
	display:none;
}

.fancyTimeline .listTitle{
	margin-top:5px;
	font-size:1.2em;
	color:[[ColorPalette::PrimaryLight]];
}

.source {
	float:right;
	margin-right:1em;
}

dd{
	margin-left: 1em;
}

.tiddlerCustomFields input {
	width:300px;
}

.tiddlerCustomFields .fieldName {
	width:100px;
}

.editSpaceSiteIcon .originButton img, .editSpaceSiteIcon .originButton svg {
	margin: 0;
}

.editorHeading {
	top: 16px;
}

.heading .editor input {
	padding-left:3px;
}

.tiddler .editor {
	padding: 0px;
}

.tiddler .titleBar{
	margin-left:0px;
}

.tiddler .heading .title {
	font-size:24px;
	line-height:24px;
}

.tagInfo {
	margin:0;
}

.tiddler .originButton div {
	display:inline;
}

.originButton img,
.originButton svg {
	vertical-align: -5%;
	margin-right: 3px;
}

.originButton .roundelLabel {
	margin-right:5px;
}

.siteIcon .label {
	padding: 0;
	color:[[ColorPalette::TertiaryMid]];
}

.tiddler .subtitle{
	font-style:normal;
}

.tiddler .subtitle:hover {
	font-weight:normal;
	color:[[ColorPalette::TertiaryMid]];
}

.titleBar .siteIcon,
.titleBar .label {
	display:inline !important;
}

.titleBar a {
	color:[[ColorPalette::TertiaryLight]];
}

.titleBar a:hover {
	background:transparent;
	color:[[ColorPalette::PrimaryLight]];
}

.titleBar .siteIcon img {
	display:none;
}

.tiddler .titleBar span .button,
.tiddler .titleBar span .button:hover {
	border:0;
	padding:0;
	margin:0;
}

.tiddler .titleBar span a,
.tiddler .titleBar span .button, {
	font-style:normal;
	color: [[ColorPalette::PrimaryMid]] !important;
}

.tiddler .titleBar span a:hover,
.tiddler .titleBar span .button:hover {
	font-style:normal;
	color: [[ColorPalette::PrimaryLight]] !important;
}

.customizeLink{
    padding:3px;
    display:block;
}

.customizeLink img{
    width:16px;
    vertical-align:-3px;
}

.tab,
.tabContents {
    border:0;
}

.tab{
    color:[[ColorPalette::Background]];
    background:[[ColorPalette::TertiaryLight]];
    padding:2px 4px;
}

.tabSelected{
    color:[[ColorPalette::TertiaryDark]];
    background:[[ColorPalette::TertiaryPale]];
}

#sidebarTabs {
position: absolute;
right: 72px;
width: 332px;
top: 0;
margin: 0;
}

#sidebarTabs .tabsetWrapper .tabset {
width: 100%;
border: 0;
height: auto;
width: 100%;
padding: 0;
right: 0;
}

#sidebarTabs .tabsetWrapper .tabset .tab {
font-size: 0.9em;
padding: 0.7em 8px 0.5em;
color: [[ColorPalette::SecondaryMid]];
background: transparent;
border: 1px solid transparent;
line-height: 16px;
position: relative;
display: inline-block;
margin: 0;
border: 0;
font-weight: bold;
}

#sidebarTabs .tabsetWrapper .tabset .tabSelected {
color: [[ColorPalette::SecondaryMid]];
background: [[ColorPalette::TertiaryPale]] !important;
border:1px solid [[ColorPalette::SecondaryMid]];
border-bottom-color: [[ColorPalette::TertiaryPale]];
z-index: 10;
margin: 0;
font-weight: bold;
}

#sidebarTabs .tabsetWrapper .tabset .tab.tabSelected:hover{
    color: [[ColorPalette::Background]];
    background: [[ColorPalette::SecondaryMid]] !important;
}

#sidebarTabs .tabsetWrapper .tabset a:hover,
#sidebarTabs .tabContents li a:hover {
    color: [[ColorPalette::Background]];
}

#sidebarTabs .tabsetWrapper .tabContents {
background-color: [[ColorPalette::TertiaryPale]];
border-width:1px;
width: 332px;
left: 0;
position: relative;
min-height: 34em;
padding: 8px;
clear: both;
font-size: 0.8em;
}

#sidebarTabs .tabContents li a {
display: block;
text-align: left;
margin: 0 0 1px 0;
padding: 0.5em 10px 2px 10px;
background: transparent;
}

#sidebarTabs .tabContents li {
border: none;
margin-left: 0;
word-wrap: break-word;
}

#sidebarTabs .timeline li.listTitle {
color: [[ColorPalette::TertiaryMid]];
margin-left: 0;
padding: 0.3em 0.11em;
font-size: 1em;
border-bottom: none;
background: transparent;
}

.tabContents .timeline {
background: transparent;
}

#sidebarTabs .lf-search {
padding: 0 0 10px 0;
background:transparent;
}

#sidebarSearch {
right: 85px;
top: 40px;
width: 220px;
}
/*}}}*/
!Summary
The shadow tiddler StyleSheet is intended for you to customise the look and feel of your TiddlyWiki using CSS such as...
{{{
.mainMenu {
  color: red;
}
}}}
!Default Contents
''none''
!TiddlySpace
The default StyleSheet tiddler in TiddlySpace demonstrates how you can reference other StyleSheets tiddler the contents of which are then included in full ~, like that seen in TiddlySpace in the StyleSheetTiddlySpace
{{{
/*{{{*/
[[StyleSheetTiddlySpace]]
/*}}}*/
}}}
!Summary
The shadow tiddler StyleSheetColors contains CSS definitions related to the color of page elements. ''DO NOT EDIT THIS TIDDLER'', instead make your changes in the StyleSheet shadow tiddler.
/*{{{*/
.viewer .centered table,
.viewer table.centered{
    margin:0 auto;
}
/*}}}*/
!Summary
The shadow tiddler StyleSheetLayout contains CSS definitions related to the layout of page elements. ''DO NOT EDIT THIS TIDDLER'', instead make your changes in the StyleSheet shadow tiddler.
/***
The shadow tiddler StyleSheetLocale is intended for use when a translation requires any css style changes. It can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
!Summary
The shadow tiddler StyleSheetPrint contains CSS definitions for printing.
!Default Contents
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
#displayArea {margin: 1em 1em 0em;}
noscript {display:none;} /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
}
/*}}}*/
/*{{{*/
.tiddler .originButton div {
	display: inline-block;
}

.tiddler .spaceSiteIcon .siteIcon {
	_display: inline; /* IE doesn't like inline-block */
}

.tiddler .originButton {
	display: block;
}

.selected .tagging,
.selected .tagging:hover {
	border: none;
	background: none;
}

.tagging {
	float: none;
	background: none;
	border: none;
}

.tagging li.listTitle {
	margin-left: 0px;
}
.tagging li {
	margin: 0 8px;
}

.tagging .tiddlyLink {
	-webkit-border-radius: 3px;
	-moz-border-radius: 3px;
	-o-border-radius: 3px;
	border-radius: 3px;
	padding: 1px 2px;
	line-height: 1.2em;
}

/* for following */
#popup .siteIcon {
	float: left;
	height: 25px;
}

.content {
	width: 100%; /* IE */
	font-size: 0.9em;
}

.editorHeading {
	height: 48px;
}

.heading {
	left: 0;
	margin-bottom: 40px;
	position: relative;
	top: 32px;
}

.followButton a {
	display: block;
	margin-top: -20px;
}

.tiddler .followPlaceHolder {
	display: block;
	position: absolute;
	top: 16px;
	right: 64px;
	_right: 138px; // add width of modifierIcon
}

.tiddler .followButton {
	position: relative;
	height: 24px;
	text-align: left;
	color: #fff;
	background: [[ColorPalette::PrimaryMid]];
	padding: 10px 0px 0px 10px;
	width: 38px;
	margin: -16px -8px 24px 0;
}

/* creates the larger triangle */
.followButton:before {
	content: "\00a0";
	display: block; /* reduce the damage in FF3.0 */
	position: relative;
	bottom: -20px;
	right: 0;
	width: 0;
	height: 0;
	border-width: 0 0 20px 20px;
	border-style: solid;
	border-color: transparent [[ColorPalette::PrimaryMid]];
}

.toolbar svg {
	height: 16px;
	width: 16px;
}

.toolbar svg .glyph {
	fill: #ccc;
}

.toolbar a:hover .glyph {
	fill: black;
}

.toolbar a:active .glyph {
	fill: [[ColorPalette::Background]];
}

.originButton,
.followPlaceHolder,
.tiddler .subtitle {
	cursor: pointer;
}

.editSpaceSiteIcon .originButton {
	cursor: auto;
}

.tiddler .subtitle:hover {
	font-weight: bold;
	background: none;
}

.originButton img,
.originButton svg {
	margin-left: 0px;
}

.modifierIcon {
	position: absolute;
	width: 74px;
	top: 0px;
	right: 0px;
	_right: 74px; /* in IE6 positioning works incorrectly so use -width instead */
	text-align: right;
}

.modifierIcon img,
.modifierIcon svg {
	margin-right: 8px;
}

.tiddler .viewer {
	padding-bottom: 16px;
	margin: 0 0 0 56px;
	line-height: 1.4em;
}

.viewer pre {
	margin-left: 0;
}

.siteIcon .label {
	color: [[ColorPalette::TertiaryDark]];
}

.tiddler .spaceSiteIcon {
	float: left;
	margin-right: 0;
	margin-top: 0;
	position: relative;
	display: block;
}

.tiddler .titleBar {
	display: block;
	margin-right: 136px;
	margin-left: 56px;
}

.followButton a {
	color: [[ColorPalette::Background]];
}

.tiddler {
	position: relative;
	padding: 0;
	margin-bottom: 3em;
	border-top: 3px solid [[ColorPalette::PrimaryMid]];
	background: #fff;
}

.tiddler .editor {
	padding: 0px 8px;
}

.tiddler .heading .title {
	position: relative;
	display: block;
	word-wrap: break-word;
	font-size: 32px;
	line-height: 32px;
}
.tiddler .heading .editor.title {
	font-size: 1.7em;
	line-height: normal;
}

.tiddler .headingClear {
	clear: both;
}

.tiddler .subtitle {
	font-style: italic;
	font-size: 0.9em;
	color: #a6a59e;
	margin-top: 0;
}

.toolbar {
	position: absolute;
	padding: 0;
	top: 8px;
	right: -8px;
}

.toolbar .moreCommand.highlight {
	background: none;
}

.tiddler .toolbar .button {
	border: none;
	display: inline;
	padding: 0px;
	margin-right: 16px;
}

.tiddler .toolbar a:hover {
	background: none;
}

.tiddler .tagged .listTitle {
	display: none;
}

.revButton {
	float: right;
}

/*! EditTemplate specific*/
.tiddler .privacySettings {
	text-align: center;
}
.tiddler .privacySettings .originButton {
	display: inline;
}

.editSpaceSiteIcon, .privacyEdit {
	float: left;
}

.editSpaceSiteIcon svg,
.editSpaceSiteIcon img,
.editSpaceSiteIcon .roundelLabel {
	float: left;
}

.tagTitle {
	position: absolute;
	text-align: center;
	width: 48px;
	top: 0px;
	left: -56px;
}

.editSpaceSiteIcon .originButton img,
.editSpaceSiteIcon .originButton svg {
	height: 16px;
	margin-left: 24px;
	margin-right: 32px;
	width: 16px;
}

.tagAnnotation {
	margin-top: 8px;
	padding-bottom: 8px;
}
.annotationsBox {
	margin-top: 8px;
}

.editorFooter {
	position: relative;
	padding: 0;
	margin-top: 16px;
	margin-left: 64px;
}

.tiddler .editorFooter .editor {
	padding-left: 0px;
}

.heading .editor input {
	width: 100%;
	font-size: 1.5em;
}

.spaceSiteIcon .externalImage .image a:hover,
.modifierIcon .externalImage .image a:hover {
	background: none;
}

div.toolbar {
	visibility:hidden;
	right:-16px;
}

.selected div.toolbar {
	visibility: visible;
}

.followButton a:hover {
	background: [[ColorPalette::PrimaryMid]];
	text-decoration: underline;
}

a.image:hover {
	background: transparent;
}

@media all and (max-device-width: 480px) {
	div.toolbar {
		visibility:visible;
	}
}
@media only screen and (device-width: 768px) {
	div.toolbar {
		visibility:visible;
	}
}
@media all and (max-width: 960px) {
	.tiddler .titleBar {
		margin-left: 36px;
		margin-right: 80px;
	}

	.tiddler .heading {
		margin-bottom: 48px;
	}

	.tiddler .heading .title {
		font-size: 32px;
		line-height: 32px;
	}

	.tiddler .modifierIcon img,
	.tiddler .modifierIcon svg,
	.tiddler .spaceSiteIcon .originButton img,
	.originButton svg {
		width: 32px;
		height: 32px;
		margin-left: 0px;
		margin-right: 0px;
	}

	.tiddler .followPlaceHolder {
		right: 48px;
	}

	.tiddler .followButton {
		width: 24px;
	}

	.tiddler .viewer {
		margin: 0px 0px 0px 36px;
		padding-top: 0;
	}

	br {
		line-height: 0.5em;
	}
}
/*}}}*/
/*{{{*/
body {
	font-size: 1em;
	font-family: helvetica, arial, sans-serif;
	background-color: #fff;
	color: [[ColorPalette::Foreground]];
}

body ul { margin: 0; }

#popup {
	background-color: [[ColorPalette::TertiaryPale]];
}

#popup.confirmationPopup, .followList {
	font-size: 0.8em;
	padding: 1em;
	border: solid 1px [[ColorPalette::SecondaryMid]];
	background-color: [[ColorPalette::SecondaryPale]];
}

.followList .listTitle {
	text-decoration: underline;
}

#popup .followTiddlersList a {
	display: inline;
	padding: 0;
}

#popup li a {
	color: [[ColorPalette::PrimaryMid]];
	font-weight: bold;
}

#popup li a:hover {
	color: [[ColorPalette::PrimaryPale]];
	background: [[ColorPalette::PrimaryMid]];
}

#popup li.listTitle {
	border-bottom: 1px solid #000;
	font-weight: bold;
	margin-bottom: 10px;
}

#popup.followList {
	margin-left: 50px;
	margin-top: -30px;
}

.followTiddlersList .label {
	display: block;
	left: 10px;
	top: 0px;
	line-height: 16px;
	position: relative;
}

#popup .followTiddlersList .siteIcon{
	height: auto;
}

#popup .followTiddlersList li{
	clear: both;
	display: block;
	height: 48px;
	margin-bottom: 8px;
	position: relative;
}

#popup .followTiddlersList a{
	display: inline;
}

#displayArea {
	margin: 0;
	top: 0px;
	left: 0px;
	width: 100%;
	position: relative;
}

.revisionCloak {
	position: absolute;
	position: fixed !important;
	height: 100%;
	width: 100%;
	top: 0;
	left: 0;
	border: 0;
	margin: 0;
	padding: 0;
	opacity: 0.5;
	filter: alpha(opacity=50);
	background-color: #000;
}

/* *** Header *** */
.header {
	position: relative;
	background-color: [[ColorPalette::PrimaryMid]];
	_width: 100%; /* ie 6 demands */
}

.headerForeground {
	background-color: [[ColorPalette::PrimaryMid]];
	float: left;
	margin: 24px 16px 0px 72px;
	padding: 0;
	position: relative;
	top: 0;
	_width: 70%; /*ie6: needed for the background to actually be transparent*/
	_background-color: transparent; /*ie6: needed to show the search box*/
}

.clearFloat {
	clear: both;
}

#contentWrapper {
	position: relative;
	padding-top: 1px;
	top: -1px;
}

#tiddlerDisplay {
	_position: relative; /* ie 6*/
}

.siteTitle {
	clear: both;
	display: block;
	font-size: 32px;
	font-weight: bold;
	line-height: 32px;
}

.siteSubtitle {
	display: block;
	font-size: 14px;
	height: 16px;
	margin-bottom: 8px;
}

#sidebarSearch {
	padding: 0;
	position: absolute;
	right: 80px;
	top: 8px;
	width: 176px;
}

#sidebarSearch .txtOptionInput {
	width: 100%;
	margin-top: 5px;
	_color: #bbb; /* ie6 danger */
}

#sidebarSearch .txtOptionInput:focus {
	color: #000;
}

#sidebarSearch .searchButton {
	display: none;
}

/* *** Menu Bar *** */

#mainMenu {
	position: static;
	text-align: left;
	margin-left: 72px;
	float: left;
	width: auto;
	padding: 0;
	font-size: 1em;
	line-height: normal;
}

#mainMenu a {
	color: #fff;
	padding: 8px;
	font-size: 0.9em;
	margin-right: 16px;
}

#mainMenu a:hover {
	background-color: [[ColorPalette::PrimaryMid]];
	color: [[ColorPalette::Background]]
}

#sidebarOptions {
	margin-right: 72px;
	float: right;
	font-size: 1.1em;
	line-height: 1.6em;
	min-height: 1em;
	padding-top: 0;
}

#sidebarOptions a {
	margin-right: 8px;
}

.confirmationPopup .button,
#sidebarOptions .button {
	cursor: pointer;
	line-height: 1.4em;
	text-align: center;
	margin-right: 8px;
	margin-left:-2px;
}

.confirmationPopup .button {
	font-size: 0.9em;
	padding: 2px;
}

#sidebarOptions .button {
	font-size: 0.7em;
	float: left;
	width: 80px;
	padding: 0px;
        color: #fff;
}

.confirmationPopup a.button,
#sidebarOptions a {
	border: none;
	margin: 0 0.2em;
	padding: 0.6em 0.25em;
	display: inline;
	color: #666;
}

.confirmationPopup a.button:hover,
#sidebarOptions a:hover {
	color: #000;
}

.confirmationPopup a.button:active,
#sidebarOptions a:active {
	border: solid 1px [[ColorPalette::PrimaryMid]];
	background-color: #fff;
	background: -webkit-gradient( linear, left bottom, left top, color-stop(0.1,rgb(200,200,200)), color-stop(1, rgb(100,100,100)));
	background: -moz-linear-gradient(center bottom , rgb(200,200,200) 10%,rgb(100,100,100) 100%) repeat scroll 0 0 transparent;
}
/* *** Sidebar *** */

#sidebar .wizard table {
	margin: 0px;
}

.tabContents .listTitle:first-child {
	margin-top: 0px;
}

#menuBar {
	background: [[ColorPalette::PrimaryLight]];
	left: 0;
	right: 0;
	position: relative;
	margin: 0;
	padding: 0.5em 0 0.5em 0;
	min-height: 1em;
	overflow: hidden;
	_width: 100%; /* for ie 6 */
}

#sidebarOptions a.button:hover {
	color: [[ColorPalette::PrimaryPale]];
    background: [[ColorPalette::PrimaryMid]];
}

#tiddlerDisplay, #searchResults {
	margin: 16px 448px 0 72px;
}

#sidebarTabs {
	position: absolute;
	right: 72px;
	width: 352px;
	top: 0;
}

#sidebarTabs .tabsetWrapper .tabset {
	width: 87px;
	border-top: 1px solid [[ColorPalette::PrimaryPale]];
	border-left: 1px solid [[ColorPalette::PrimaryPale]];
	border-bottom: 1px solid [[ColorPalette::PrimaryPale]];
	height: auto;
	float: left;
	word-wrap: break-word;
	top: 0;
	padding: 0;
}

#sidebarTabs .tabsetWrapper .tabContents {
	background-color: [[ColorPalette::PrimaryPale]];
	border: 3px solid [[ColorPalette::PrimaryMid]];
	width: 242px;
	_width: 238px;
	left: -3px;
	_left: -5px;
	position: relative;
	min-height: 34em;
	padding: 8px;
	font-size: 0.8em;
}

/* ---- Side style --- */

#sidebarTabs .tabsetWrapper .tabset .tab {
	font-size: 0.9em;
	padding: 0.7em 8px 0.5em;
	color: #fff;
	background: [[ColorPalette::PrimaryLight]];
	border: none;
	line-height: 16px;
	position: relative;
	display: block;
	margin: 0;
}

#sidebarTabs .tabsetWrapper .tabset .tabSelected {
	color: [[ColorPalette::PrimaryMid]];
	background: [[ColorPalette::PrimaryPale]];
	border-top: 3px solid [[ColorPalette::PrimaryMid]];
	border-bottom: 3px solid [[ColorPalette::PrimaryMid]];
	border-left: 3px solid [[ColorPalette::PrimaryMid]];
	z-index: 10;
	margin-top: -1px;
	font-weight: bold;
}

#sidebarTabs .tabContents li {
	border: none;
	margin-left: 0;
	word-wrap: break-word;
}

.tabContents .timeline {
	background: [[ColorPalette::PrimaryPale]];
	margin-bottom: 8px;
}

#sidebarTabs .timeline li.listTitle {
	color: #132E43;
	margin-left: 8px 0;
	padding: 0.3em 0.11em;
	font-size: 1em;
	border-bottom: none;
}

#sidebarTabs .tabContents li a {
	display: block;
	text-align: left;
	margin: 0 0 1px 0;
	padding: 0.3em 1em;
	background: [[ColorPalette::PrimaryPale]];
}

#sidebarTabs .tabsetWrapper .tabset a:hover,
#sidebarTabs .tabContents li a:hover {
	color: [[ColorPalette::PrimaryPale]];
	background: [[ColorPalette::PrimaryMid]];
}

/* Activity Stream */
#sidebarTabs .tabContents .activityStream .feedItem a {
	display: inline-block;
	padding: 0;
	background: none;
}

/* ---- Tagging box --- */
.tagInfo {
	border: 1px solid #cccccc;
	padding: 10px 15px;
	-moz-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2);
	box-shadow: 0 2px 2px rgba(0,0,0,0.2);
	color: [[ColorPalette::TertiaryMid]];
	background: -moz-linear-gradient(100% 100% 90deg, #f4f4f4, #e5e5e5);
	background: -webkit-gradient(linear, left top, right top, from(#e5e5e5), to(#f4f4f4));
	margin-top: 1em;
	font-size: 13px;
	margin: 0 0 0 56px;
}

.tagInfo ul {
	list-style: none;
	padding-left: 2.2em;
}

.tagInfo ul li {
	display: inline;
}

.tagInfo ul li.listTitle,
.tagInfo .tagging ul li.listTitle {
	color: [[ColorPalette::PrimaryMid]];
	font-size: 13px;
}

.tagInfo ul li a {
	border: none;
}

.tagInfo .tagging ul li {
	float: none;
	display: inline-block;
}

.tagInfo .tagging {
	padding: 0;
}

.viewRevision .toolbar {
	right: 48px;
	top: 8px;
}

.viewRevision .modifierIcon img,
.viewRevision .modifierIcon svg {
	margin-right: 8px;
}

.viewRevision .toolbar svg {
	width: 32px;
	height: 32px;
}

/* --- IE hacks from lattice --- */

/* ie hacks */
* html #menuBar {
	margin-bottom: 8px;
}
.toolbar .svgIconText {
	*display: inline;
}

div.tiddler .toolbar a {
	cursor: pointer;
	float: left\9;
	display: inline\9;
}

* html .toolbar {
	right: 8px;
}
* html .followButton a {
	margin-top: 0px;
	margin-right: 8px;
}
* html #tiddlerDisplay {
	margin-top: 0px;
}

/* for printing purposes */
@media print {
	#mainMenu,
	#sidebar,
	#messageArea,
	.toolbar,
	.followPlaceHolder,
	#backstageButton,
	#backstageArea,
	#sidebarTabs,
	#sidebarSearch .txtOptionInput,
	#sidebarOptions {
		display: none !important;
	}
	#displayArea {
		margin: 1em 1em 0em;
	}
	noscript {
		display:none; /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
	}
	#tiddlerDisplay {
		margin: 16px 16px;
	}
}

@media all and (max-width: 960px){
	#tiddlerDisplay,
	#searchResults {
		margin: 16px 366px 0 16px;
	}

	#mainMenu {
		margin-left: 16px;
	}

	.headerForeground {
		margin-left: 16px;
	}

	#sidebarSearch {
		right: 16px;
	}

	#sidebarOptions {
		margin-right: 16px;
	}

	#sidebarTabs {
		right: 16px;
		width: 326px;
	}

	#sidebarTabs .tabsetWrapper .tabset {
		font-size: 0.9em;
		width: 77px;
	}

	#sidebarTabs .tabsetWrapper .tabContents {
		width: 226px;
		_width: 222px;
	}

	#sidebarTabs .tabContents li a {
		font-size: 0.9em;
	}
}
/*}}}*/
[[StyleSheetTiddler]]
A standard TiddlyWiki comes with a number of predefined [[shadow tiddlers|ShadowTiddler]] interpreted by TiddlyWiki as cascading style sheets, aka [[css|http://www.w3schools.com/css]]. These include...
| !Shadow Tiddler | !Description |h
|[[StyleSheetColors]] |default color styles |
|[[StyleSheetLayout]] |default layout styles |
|[[StyleSheetLocale]] |locale-specific styles |
|[[StyleSheetPrint]] |default print styles |
|[[StyleSheet]] |the tiddler for your custom styles; run after all others|

''Note'': The color scheme of a TiddlyWiki is defined using [[Slices]] in the shadow tiddler called [[ColorPalette]].

Like all shadow tiddlers you can simply overwrite the default styles provided by these StyleSheets or add them if your customizations went awry.

Some plugins also provide default styles in the form of a shadow tiddlers whose names usually begin with [[StyleSheet]] followed by he name of the plugin.
!Summary
TiddlyWiki markup rules can be suppressed for any given section of text by enclosing it in three ''double'' quotes or wrapping it using the {{{<nowiki>}}} markup...
* when you just don't want that text to be TiddlyWiki markup
* when you want to prevent WikiWords
* when you copy & paste from other sources
!Markup
{{{
» neither is this italicised or a """//WikiWord//"""
» nor is this <nowiki>__underlined__</nowiki>
}}}
» neither is this italicised or a """//WikiWord//"""
» nor is this <nowiki>__underlined__</nowiki>

In addition, you can suppress auto-linking for WikiWords, use the tilde prefix {{{~}}}:
{{{
~WikiWord
}}}
~WikiWord
!!Also see
*[[Comment Formatting]]
*[[Code Formatting]]
deprecated as of 2.7.0
<<sync>>
Certain tags in TiddlyWiki are predefined and have a special meaning...
| !System Tag | !Usage |h
|<<tag systemConfig>>|usually usually [[Plugins]] or [[Macros]], these tiddlers contain executable JavaScript code executed on startup and on demand|
|<<tag systemConfigDisable>>|a deaktivated [[plugin|Plugins]] that is not executed on startup -- takes precedence over ''systemConfig'' and ''systemConfigForce''|
|<<tag systemConfigForce>>|force [[plugins|Plugins]] to be executed on startup irrespective of dependencies to a given ''CoreVersion'' or other plugins|
|<<tag systemServer>>|a tiddler which contains server details for [[Import]]|
|<<tag systemTheme>>|a tiddler that is a [[Theme|Themes]]|
|<<tag excludeSearch>>|a tiddler excluded from search results|
|<<tag excludeLists>>|a tiddler excludes from lists in the sidebar tabs (e.g. [[Timeline]]) as well as from the generated RSS feed|
|<<tag excludeMissing>>|a tiddler that wont appear in the sidebar under ''More'' / [[Missing|TabMoreMissing...]]|
chkPrivateMode: false
<<tiddler "Persistent Options">>
Below is a list of templates for use via transclusion:
!FAQ
[[« back to FAQ|FAQ]]
!RAQUO
» <<view title link>>
!MODIFIER
» <<view title link>> -- by ''@<<view modifier>>'' | """created""" ''<<view created date "DD. MMM YYYY">>'' 
!EXCLUDE+LIST
» <<view title link>> -- """modified""" ''<<view modified date "DD. MMM YYYY">>'' by ''@<<view modifier>>''
!EXCLUDE+LIST+GROUP
bag: <<view server.bag text>>
!PAGE+INCOMPLETE
{{annotation{
This page is still incomplete. Please help improve the article and discuss it in the [[google groups|groups.google.com/group/tiddlywiki/]].
}}}
|''ViewTemplate''|##TWDocViewTemplate|
|''EditTemplate''|##EditTemplate|
|''StyleSheet''|##StyleSheet|

!ViewTemplate
[[TWDocViewTemplate]]

!EditTemplate
[[EditTemplate]]

!StyleSheet
[[StyleSheet]]
<<list all>><<listfiltr>>
!Summary
In a standard TiddlyWiki, the TabAll shadow tiddler outputs all tiddlers of a TiddlyWiki using the [[list macro|list]] and is displayed as the {{button{All}}} tab in the right sidebar.
!Default Contents
{{{
<<list all>>
}}}
In a standard TiddlyWiki, the TabMoreMissing shadow tiddler shows all tiddlers that have links to them but are undefined using the [[list macro|list]] and is displayed as the {{button{More}}} tab in the [[Sidebar]].
!Summary
By default, the TabMoreMissing shadow tiddler defines the contents of the {{button{Missing}}} tab in the [[Sidebar]] and contains a call to the [[list macro|list]] which outputs all tiddlers that have links to them but are undefined.
!Default Contents
{{{
<<list missing>>
}}}
!Summary
In a standard TiddlyWiki, the TabMoreOrphans shadow tiddler shows all tiddlers that are not linked to from any other tidder using the [[list macro|list]] and is dislayed as the {{button{Orphans}}} tab in the [[Sidebar]].
!Default Contents
{{{
<<list orphans>>
}}}
!Summary
By default, the TabMoreShadowed shadow tiddler defines the default contents of the {{{Shadows}}} tab in the [[Sidebar]] and calls the [[list macro|list]] which outputs a list of all shadow tiddlers, e.g. tiddlers with predefined fallback contents.
!Default Contents
{{{
<<list shadowed>>
}}}
<<allTags excludeLists>><<listfiltr>>
!Summary
In a standard TiddlyWiki, the TabTags shadow tiddler outputs all tags of a TiddlyWiki using the [[allTags]] macro and is displayed as the {{button{Tags}}} tab in the right sidebar.
!Default Contents
{{{
<<allTags excludeLists>>
}}}
<<timeline "modified" "17" "YYYY-0MM-0DD">><<listfiltr>>
*[[Complete Timeline...|Timeline]]
!Summary
By default, the TabTimeline shadow tiddler defines the contents of the {{{Recent}}} tab in the [[Sidebar]] and calls the [[list macro|list]] which outputs all tiddlers in your TiddlyWiki in reverse chronological order.
!Default Contents
{{{
<<timeline>>
}}}
!Optimization
Listing all tiddlers may not prove practical or desireable. [[TiddlyWiki.org demonstrates|TabTimeline]] how you can shorten the list only to display a full [[timeline]] elsewhere,
<<tiddler Tables>>
!Summary
TiddlyWiki provides flexible means to output tables.
!!"""Simple Tables"""
{{{
|North West|North|North East|
|West|Here|East|
|South West|South|South East|
}}}
|North West|North|North East|
|West|Here|East|
|South West|South|South East|
!!"""Cell Formatting"""
*Insert a space before cell content to right justify cell
*Insert a space after cell content to left justify cell
*Insert spaces before and after cell content to centre justify cell
*Insert an exclamation mark ({{{!}}}) as the first non-space character of a cell to turn it into a header cell
{{{
|!First column|!Second column|!Third column|
|left | centre | right|
}}}
|!First column|!Second column|!Third column|
|left | centre | right|
!!"""Table Headers and Footers"""
* Mark a table row as a header by adding an 'h' to the end
* Mark a table row as a footer by adding an 'f' to the end
{{{
|NW|N|NE|h
|W|X|E|
|SW|S|SE|f
}}}
|NW|N|NE|h
|W|X|E|
|SW|S|SE|f
Use  an exclamation mark to turn an individual cell into a header cell of type {{{<th}}}...
{{{
| NW| !N |NE |h
| !W| X |!E |
| SW| !S |SE |f
}}}
| NW| !N |NE |h
| !W| X |!E |
| SW| !S |SE |f
!!"""Table Caption"""
A caption can be added to a table by adding a {{{c}}} after the last column either before the main table...
{{{
|A caption above the table|c
|North West|North|North East|
|West|Here|East|
|South West|South|South East|
}}}
|A caption above the table|c
|North West|North|North East|h
|West|Here|East|
|South West|South|South East|
or after the main table...
{{{
|North West|North|North East|
|West|Here|East|
|South West|South|South East|
|A caption below the table|c
}}}
|North West|North|North East|h
|West|Here|East|
|South West|South|South East|
|A caption below the table|c
!!"""Merging Table Cells"""
Merge a cell horizontally with the one to its right using greater-than {{{>}}}...
{{{
|North West|North|North East|
|>|>|West and Here and East|
|South West|South|South East|
}}}
|North West|North|North East|
|>|>|West and Here and East|
|South West|South|South East|
Merge a cell vertically with the one above using a tilde {{{~}}}...
{{{
|Westerly|North|North East|
|~|Here|East|
|~|South|South East|
}}}
|Westerly|North|North East|
|~|Here|East|
|~|South|South East|
!!"""CSS Formatting for Tables"""
A CSS class can be added to an entire table using a special first row that ends with a {{{k}}}...
{{{
|myClass|k
|North West|North|North East|
|West|Here|East|
|South West|South|South East|
}}}
Use your StyleSheet tiddler to define the desired styles.

CSS properties can also be added to individual table cells by appending the CSS syntax directly after the delimiting pipe {{{|}}}.
{{{
|color:red; North West|opacity:0.5;North|North East|
|color(green):West|Here|East|
|South West|South|South East|
}}}
|color:red; North West|opacity:0.5;North|North East|
|color(green):West|Here|East|
|South West|South|South East|
!!"""Alternating Row Colors"""
TiddlyWiki automatically assigns the classes {{{oddRow}}} and {{{evenRow}}} to table row elements {{{<TR>}}}. These can then be styled using the StyleSheet tiddler:
{{{
.viewer tr.oddRow { background-color: #fff; }
.viewer tr.evenRow { background-color: #ffe; }
}}}
<<tiddler tabs>>
One of the standard fields of a tiddler is called tags which allow you to categorize tiddlers. Tagging makes most sense if a tiddler has a tag of a more abstract category to which it belongs, i.e. ''Apple'' would have a tag of ''Fruit''.

Tags therefore are not just individual words, e.g. <<tag "Core Macros">>.

In TiddlyWiki, tags are first class members and as such themselves tiddlers. In this way, an elaborate tagging hierarchy can be defined.
<<tagcloud
exclude:DELETED
exclude:DEPRECATED?
exclude:excludeLists
exclude:excludeSearch
exclude:excludePublisher
exclude:excludeMissing
exclude:no-tag-info
exclude:systemConfig
exclude:REVIEW
exclude:REDIRECTED
exclude:"TiddlyWiki FAQ"
>>
/***
|''Name''|TiddlyTagCloudPlugin|
|''Author''|Jon Robson|
|''Version''|0.3.11|
!Usage
{{{ <<tagcloud>> }}} creates a tag cloud of all content.

<<tagcloud filter:"[is[local]]" exclude:excludeLists exclude:excludeSearch exclude:excludePublisher>>
!Parameters
exclude: name a tag you want to exclude from the tag cloud.
filter: provide a filter to run the tag cloud on a subset of tiddlers see SiteInfo@filters and [[filters syntax]]@docs
threshold:2 - will ignore any tags that occur less than 2 times.
sortOrder: <-,+,""> - sort the resulting tags in descending, ascending or no order
***/
//{{{
(function($) {
var stylesheet = "StyleSheetTagCloud";
config.shadowTiddlers[stylesheet] = ['.tagcloudTag { display: inline-block; border : none; margin-right: 8px; '].join("\n");
store.addNotification(stylesheet, refreshStyles);

var macro = config.macros.tagcloud = {
	locale: {
		tooltip: "see the %0 occurrences of %1"
	},
	cache: {},
	options: {
		fontSize: {
			small: 10,
			large: 48,
		},
		threshold: 1,
		sortOrder: "+"
	},
	_cleanup: function() {
		for(var i in macro.cache) {
			if($(i).length === 0) {
				delete macro.cache[i];
			}
		}
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var id = "tagcloud"+Math.random();
		var container = $("<div />").attr("params", paramString).addClass("tagcloud").
				attr("id", id).appendTo(place)[0];
		macro.refresh(container);
	},
	refresh: function(container) {
		macro._cleanup();
		var tags, tag;
		var locale = macro.locale;
		var paramString = $(container).attr("params");
		var args = paramString.parseParams("anon")[0];
		var exclude = args.exclude || [];
		var tiddlers = args.filter ? store.filterTiddlers(args.filter[0]) : store.getTiddlers();
		var count = {};
		var lookup = {};
		var options = macro.options;
		var threshold = args.threshold ? parseInt(args.threshold[0], 10) : options.threshold;
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			tags = tiddler.tags;
			for(var j = 0; j < tags.length; j++) {
				tag = tags[j];
				if(!exclude.contains(tag)) {
					lookup[tag] = lookup[tag] || [];
					lookup[tag].push(tiddler);
					if(!count[tag]) {
						count[tag] = 1;
					} else {
						count[tag] += 1;
					}
				}
			}
		}
		tags = [];
		var largest, smallest, c;
		for(var k in count) {
			tags.push(k);
			if(count[k] < threshold) {
				delete count[k];
			}
		}
		var sort = options.sortOrder;
		tags = tags.sort(function(i, j) {
			if(sort == "+") {
				return i < j ? -1 : 1;
			} else if(sort == "-") {
				return i < j ? 1 : -1;
			} else {
				return 0;
			}
		});
		for(var l in count) {
			if(true) {
				c = count[l];
				if(!largest) {
					largest = c;
				} else if(c > largest) {
					largest = c;
				}
				if(!smallest) {
					smallest = c;
				} else if(c < smallest) {
					smallest = c;
				}
			}
		}
		var id = $(container).attr("id");
		macro.cache[id] = lookup;
		for(var l = 0; l < tags.length; l++) {
			var tag = tags[l];
			if(true) {
				c = count[tag];
				if(c) {
					var size = macro.determineFontSize({ largest: largest, smallest:smallest, occurrences: c });
					var btn = createTagButton(container,"[_tagcloud[%0-:-%1]]".format(id, tag),
						null,tag,locale.tooltip.format(c, tag));
					$(btn).addClass("tagcloudTag").attr("tag", tag).css({ "font-size": size + "px" }).
						addClass("button size%0".format(size)).click(function(ev) {
							var tag = $(ev.target).attr("tag");
							window.setTimeout(function() {
								var items = $(".popup li a");
								var lastLink = items[items.length - 1];
								$(lastLink).text("Open tag " + tag).attr("tiddlylink", tag);
							}, 10);
						});
						// the last line is rather hacky but gets the required result of making it possible to open the tag
				}
			}
		}
	},
	determineFontSize: function(args) {
		var options = macro.options;
		var deltaFontSize = options.fontSize.large - options.fontSize.small;
		var delta = args.occurrences / (args.largest - args.smallest + 1);
		return options.fontSize.small + parseInt(delta * deltaFontSize, 10);
	}
};

config.filters._tagcloud = function(results, match) {
 var args = match[3] ? match[3].split("-:-") : false;
	if(args) {
		var id = args[0];
		var lookup = macro.cache[id] || {};
		var tag = args[1];
		var tiddlers = lookup[tag] || [];
		return tiddlers;
	} else {
		return [];
	}
};

})(jQuery);
//}}}
See...
*[[tabs (macro)]], section ''Example''
*[[tag (macro)]]
*[[tags (macro)]]
*[[tagging (macro)]]
|''Name:''|TagSearchPlugin|
|''Description:''|Provides a drop down listing current tags and others to be set. Based on [[x-tagger|http://tbgtd.tiddlyspot.com/#x-tagger]] which in turn was once based on [[TaggerPlugin|http://tw.lewcid.org/#TaggerPlugin]].|
|''Author:''|[[Tobias Beer]]|
|''Version:''|1.2.0 (2010-10-10)|
|''Documentation:''|http://tagsearch.tiddlyspot.com|
|''Source:''|http://tagsearch.tiddlyspot.com/#TagSearchPlugin|
|''~TiddlyWiki:''|Version 2.5 or better|
Plugins enhancing tagging...
From the [[Glossary|Tag]]...
<<<
<<tiddler Tag>>
<<<
![[System Tags]]
<<tiddler "System Tags">>
!Also see...
* [[tags macro|tags]]
* [[Enhanced Tagging]]
/***
|''Name''|TemplateTransclusionPlugin|
|''Author''|Tobias Beer|
|''Version''|0.5 beta|
|''Description''|transcludes content from a tiddler by the same name having a certain prefix|
!Usage
Add to ViewTemplate...
{{{
<div macro='transclude <prefix>'></div>
}}}
Assuming the currently viewed tiddler is called ''Bar'' and //<prefix>// is ''Foo'' the macro will include FooBar.
!Code
***/
//{{{
config.macros.transclude = {
    handler: function (place, macroName, params, wikifier, paramString, tiddler) {
        wikify('<<tiddler [[' + params[0] + tiddler.title + ']]>>', place);
    }
};
//}}}
!Faces
<<view modifier SiteIcon>> <<view modifier link>>
|Name|HideWhenPlugin|
|Author|[[SimonBaird]]|
|URL|http://mptw.tiddlyspot.com/|
|Description|Allows conditional inclusion/exclusion in templates.|
The current places of discussions are google groups:
* [[TiddlyWiki|http://groups.google.com/group/tiddlywiki]] -- for TiddlyWiki users (general issues and progress)
* [[TiddlyWikiDev|http://groups.google.com/group/tiddlywikidev/]] -- for extensions and core developers and contributors (and other coding)
* [[TiddlySpace|http://groups.google.com/group/tiddlyspace]] -- for TiddlySpace users
* [[TiddlyWeb|http://groups.google.com/group/tiddlyweb]] -- for TiddlySpace, TiddlyWeb and TiddlyWeb extensions' developers and contributors
/***
|''Name''|??Theme|
|''Source''|http://??|
|''Version:''|0.1|
|''Author:''|Name|
|''Date:''|date|
|''License:''|link to license|
|''Comments:''|Please make comments at http://groups.google.nl/group/TiddlyWiki|
|''~CoreVersion:''|2.6.x|
|''Type''|CSS|
|''Description''|a ''~TiddlyWiki'' theme: http://??|
|''PageTemplate:''|##PageTemplate|
|''ViewTemplate:''|##ViewTemplate|
|''EditTemplate:''|##EditTemplate|
|''StyleSheet:''|##StyleSheet|
***/

!PageTemplate
<!--{{{-->

<!--}}}-->
!ViewTemplate
<!--{{{-->

<!--}}}-->
!EditTemplate
<!--{{{-->

<!--}}}-->
!StyleSheet
/*{{{*/

/*}}}*/
There are numerous ways to get TiddlyWiki to display the way you want it to.
!"""Themes Repository"""
A few themes have been listed over time in the themes repository which provide empty [[TiddlyWikis|TiddlyWiki]] for you to start with...
http://themes.tiddlywiki.com
!"""How Themes Work"""
A TiddlyWiki theme basically is a set of [[shadow tiddlers|ShadowTiddler]] and [[style sheets|StyleSheets]], predefined tiddlers which may be bundled to a theme tiddler.
The tiddler is the basic, self-contained element in TiddlyWiki and is defined by a set of standard fields.

It is a piece of micro-content which can contain human readable content based on [[TiddlyWiki Markup]] or other text based formats, [[binary data|Binary Tiddler]], CSS for StyleSheets or JavaScript in the form of [[plugins|Plugins]].

In TiddlySpace, each tiddler is saved in a [[bag|Bag]] and may be accessed through the TiddlyWeb [[HTTP API]], e.g. a text version of this tiddler can be retrieved using: http://tiddlywiki.tiddlyspace.com/Tiddler.txt
In a standard TiddlyWiki, how a tiddler is displayed is determined by the shadow tiddler called ViewTemplate.

See [[Alternative Tiddler Layouts]] if you wonder [[How to display different layouts for diferent tiddlers?]]
Using the [[newTiddler]] macro you are able to create new tiddlers with predefined contents.
!1. Entering Text Directly
Use the {{{text}}} parameter to provide the desired text for the new tiddler...
{{{
<<newTiddler
	label:"New tiddler with text content.."
	text:"Some content..."
	tag:"NEW!"
>>
}}}
<<newTiddler
	label:"New tiddler with text content.."
	text:"Some content..."
	tag:"NEW!"
>>
!2. """Using A Template Tiddler"""
Use the {{{text}}} parameter and the getTiddlerText function to fetch the template text from a tiddler via evaluated parameters...
{{{
<<newTiddler
	label:"New tiddler with template content..."
	text:{{store.getTiddlerText("Welcome")}}
	tag:"NEW!"
>>
}}}
<<newTiddler
	label:"New tiddler with template content..."
	text:{{store.getTiddlerText("Welcome")}}
	tag:"NEW!"
>>
{{annotation{
''Important:'' For this to work in TiddlySpace, you will need to enable [[Evaluated Parameters]].
}}}
!store.getTiddlerText()
<<tiddler [[getTiddlerText (function)]]>>
The function {{{getTiddlerText()}}} is a [[core function|http://tiddlywikidev.tiddlyspace.com/#Dev.Core]] of the [[store object|http://tiddlywikidev.tiddlyspace.com/#TiddlyWiki.class]] and allows to fetch the text of...
; [[an entire tiddler|Tiddler]]
:{{{store.getTiddlerText("Some Tiddler")}}}
; [[a tiddler section|Sections]]
:{{{store.getTiddlerText("Some Tiddler##Some Section")}}}
:» notice the double hashes ##
;[[a tiddler slice|Slices]]
:{{{store.getTiddlerText("Some Tiddler::SomeSlice")}}}
:» notice the double colons ::
It is an integral part to [[tiddler]] macro macro and what is referred to as transclusion.

For more info, see [[TiddlyWiki.prototype.getTiddlerText()]]...
From the [[Glossary|Tiddler]]...
<<<
<<tiddler Tiddler>>
<<<

In a classic TiddlyWiki, tiddlers are primarily displayed and edited in the main story column at the center of the page. Tiddlers are pervasive in TiddlyWiki, most content is stored as a tiddler, like the MainMenu, even Plugins and StyleSheets.

Other systems may use more formal terms, e.g.""" "items" """,""" "entries" """,""" "entities" """ -- according to [[Jeremy Ruston|JeremyRuston]],""" "tiddler" """may undoubtedly be a silly name, but it has the virtue of being confusingly distinctive rather than confusingly generic.
!!Structure
<<tiddler 'Standard Field'>>
!![[Shadow Tiddlers|ShadowTiddler]]
Shadow tiddlers are tiddlers that provide default contents which also server as failproof fallbacks -- see ShadowTiddler.

!!"""Tiddler IDs"""
Every tiddler element as displayed by the browser and stored in the [[DOM]] has a unique identifier. This ID is composed of the string {{{tiddler}}} and the tiddler's name, e.g. {{{tiddlerGettingStarted}}}.
;[[ticket #472|http://trac.tiddlywiki.org/ticket/472]]
:&raquo; discusses blanks in tiddler titles -- resolved with TiddlyWiki version 2.6.3

!!Also see
* [[ShadowTiddler]]
* [[Toolbar]]
* [[Alternative Tiddler Layouts]]
/***
|''Name''|TiddlyFileImporter|
|''Version''|0.3.8|
|''Author''|Ben Gillies|
|''Type''|plugin|
|''Description''|Upload a TiddlyWiki file to TiddlyWeb, and import the tiddlers.|
!Usage
Upload a TiddlyWiki file to TiddlyWeb, and import the tiddlers.
!Requires
tiddlyweb
tiddlywebplugins.reflector
!Code
***/
//{{{
(function($){
if(!version.extensions.TiddlyFileImporter)
{ //# ensure that the plugin is only installed once
	version.extensions.TiddlyFileImporter = { installed: true };
}

config.macros.fileImport = {
	reflectorURI: '/reflector?csrf_token=%0',
	incorrectTypeError: 'Incorrect File Type. You must upload a TiddlyWiki',
	uploadLabel: 'Upload',
	uploadLabelPrompt: 'Import tiddlers from this TiddlyWiki',
	step1FileText: 'File:',
	step1PostText: 'In the next screen you will select the tiddlers to import.',
	step1Title: 'Step 1: Pick a TiddlyWiki to import',
	step1TypeChooser: 'Import From:',
	step3Html: ['<input type="hidden" name="markList" />',
		'<input type="hidden" checked="true" name="chkSync" />',
		'<input type="hidden" name="chkSave" />',
		'<input type="hidden" name="txtSaveTiddler" />'].join(),

	handler: function(place, macroName, params, wikifier, paramString) {
		var wizard = new Wizard();
		wizard.createWizard(place, 'Import a TiddlyWiki');
		this.restart(wizard);
	},

	restart: function(wizard) {
		var me = config.macros.fileImport;
		wizard.addStep(me.step1Title, ['<input type="hidden" ',
			'name="markList" />'].join(""));
		var markList = wizard.getElement('markList');
		var uploadWrapper = document.createElement('div');
		markList.parentNode.insertBefore(uploadWrapper, markList);
		uploadWrapper.setAttribute('refresh', 'macro');
		uploadWrapper.getAttribute('macroName', 'fileImport');
		var iframeName = 'reflectorImporter' + Math.random().toString();
		me.createForm(uploadWrapper, wizard, iframeName);
		$(uploadWrapper).append('<p>' + me.step1PostText + '</p>');
		wizard.setValue('serverType', 'tiddlyweb');
		wizard.setValue('adaptor', new config.adaptors.file());
		wizard.setValue('host', config.defaultCustomFields['server.host']);
		wizard.setValue('context', {});
		var iframe = $(['<iframe name="' + iframeName + '" ',
			'style="display: none" />'].join("")).appendTo(uploadWrapper);
		var onSubmit = function(ev) {
			var uploadType = $('select[name=uploadtype]', wizard.formElem).val();
			if (uploadType == "file") {
				// set an onload ready to hijack the form
				me.setOnLoad(uploadWrapper, wizard, iframe[0]);
				wizard.importType = 'file';
				wizard.formElem.submit();
			} else {
				var csrf_token = config.extensions.tiddlyspace.getCSRFToken();
				$.ajax({
					url: "%0/reflector?csrf_token=%1".format(
						config.defaultCustomFields["server.host"], csrf_token),
					type: "POST",
					dataType: "text",
					data: {
						uri: $("input", ".importFrom", wizard.formElem).val()
					},
					success: function(data, txtStatus, xhr) {
						wizard.POSTResponse = data;
						me.importTiddlers(uploadWrapper, wizard);
					},
					error: function(xhr, txtStatus, error) {
						displayMessage(["There was an error fetching the ",
							'url: ', txtStatus].join(""));
						me.restart(wizard);
					}
				});
				return false;
			}
		};
		wizard.setButtons([{
			caption: me.uploadLabel,
			tooltip: me.uploadLabelPrompt,
			onClick: onSubmit
		}]);
		$(wizard.formElem).submit(function(ev) {
			onSubmit(ev);
			ev.preventDefault();
		});
	},

	createForm: function(place, wizard, iframeName) {
		var form = wizard.formElem;
		var me = config.macros.fileImport;
		form.action = me.reflectorURI.format(
			config.extensions.tiddlyspace.getCSRFToken());
		form.enctype = 'multipart/form-data';
		form.encoding = 'multipart/form-data';
		form.method = 'POST';
		form.target = iframeName;
		onSelectChange = function(e) {
			var changeTo = $(this).val();
			if (changeTo == "file") {
				$(".importFrom").html('%0 <input type="file" name="file" />'.
					format(me.step1FileText));
			} else {
				$(".importFrom").html('URL: <input type="text" name="uri" />'
					+ ' Do you want <a target="_blank" href="http://faq.tiddlyspace.com/How%20do%20I%20include%2Fexclude%20spaces%3F">inclusion</a> instead?');
			}
		};
		$(place).append('<span>%0</span>'.format(me.step1TypeChooser)).
			append($(['<select name="uploadtype"><option value="file" selected="selected">file',
				'<option value="uri">url</select>'].join("")).change(onSelectChange)).
			append('<div class="importFrom">%0<input type="file" name="file" /></div>'.
					format(me.step1FileText));
	},

	setOnLoad: function(place, wizard, iframe) {
		var me = config.macros.fileImport;
		var loadHandler = function() {
			me.importTiddlers.apply(this, [place, wizard, iframe]);
		};
		iframe.onload = loadHandler;
		completeReadyStateChanges = 0;
		iframe.onreadystatechange = function() {
			if (++(completeReadyStateChanges) == 5) {
				loadHandler();
			}
		};
	},

	importTiddlers: function(place, wizard, iframe) {
		var tmpStore = new TiddlyWiki();
		var POSTedWiki = "";
		if (wizard.importType == "file") {
			try {
				POSTedWiki= iframe.contentWindow
					.document.documentElement.innerHTML;
			} catch(e) {
				displayMessage(config.macros.fileImport.incorrectTypeError);
				config.macros.fileImport.restart(wizard);
				return;
			}
			// now we are done, so remove the iframe
			$(iframe).remove();
		} else {
			POSTedWiki = wizard.POSTResponse;
		}

		tmpStore.importTiddlyWiki(POSTedWiki);
		var newTiddlers = tmpStore.getTiddlers();
		var workspace = config.defaultCustomFields['server.workspace'];
		var context = {
			status: true,
			statusText: 'OK',
			httpStatus: 200,
			adaptor: wizard.getValue('adaptor'),
			tiddlers: newTiddlers
		};
		context.adaptor.store = tmpStore;
		wizard.setValue('context', context);
		wizard.setValue('workspace', workspace);
		wizard.setValue('inFileImport', true);
		config.macros.importTiddlers.onGetTiddlerList(context, wizard);
	}
};

var _onGetTiddler = config.macros.importTiddlers.onGetTiddler;
config.macros.importTiddlers.onGetTiddler = function(context, wizard) {
	if (wizard.getValue('inFileImport')) {
		var me = config.macros.importTiddlers;
		if(!context.status)
			displayMessage("Error in importTiddlers.onGetTiddler: " + context.statusText);
		var tiddler = context.tiddler;
		var fields = tiddler.fields;
		merge(fields, config.defaultCustomFields);
		fields["server.workspace"] = wizard.getValue('workspace');
		delete fields['server.permissions'];
		delete fields['server.bag'];
		fields['server.page.revision'] = 'false';
		delete fields['server.recipe'];
		fields.changecount = 1;
		store.suspendNotifications();
		store.saveTiddler(tiddler.title, tiddler.title, tiddler.text,
			tiddler.modifier, tiddler.modified, tiddler.tags, tiddler.fields,
			false, tiddler.created);
		store.resumeNotifications();
		var remainingImports = wizard.getValue("remainingImports")-1;
		wizard.setValue("remainingImports",remainingImports);
		if(remainingImports === 0) {
			if(context.isSynchronous) {
				store.notifyAll();
				refreshDisplay();
			}
			wizard.setButtons([
					{caption: me.doneLabel, tooltip: me.donePrompt, onClick: me.onClose}
				],me.statusDoneImport);
			autoSaveChanges();
		}
	} else {
		_onGetTiddler.apply(this, arguments);
	}
};

var _onCancel = config.macros.importTiddlers.onCancel;
config.macros.importTiddlers.onCancel = function(e)
{
	var wizard = new Wizard(this);
	if (!wizard.getValue('inFileImport')) {
		return _onCancel.apply(this, arguments);
	}
	var place = wizard.clear();
	config.macros.fileImport.restart(wizard);
	return false;
};

var _step3Html = config.macros.importTiddlers.step3Html;
var _onGetTiddlerList = config.macros.importTiddlers.onGetTiddlerList;
config.macros.importTiddlers.onGetTiddlerList = function(context, wizard) {
	var fileImport = config.macros.fileImport;
	var importTiddlers = config.macros.importTiddlers;
	if (wizard.getValue('inFileImport')) {
		importTiddlers.step3Html = fileImport.step3Html;
	} else {
		importTiddlers.step3Html = _step3Html;
	}
	_onGetTiddlerList.apply(this, arguments);
};
})(jQuery);
//}}}
TiddlyFox is an extension for Mozilla Firefox created by [[Jeremy Ruston]] which enables TiddlyWiki documents loaded from a file:/// URI to save changes in a TiddlyWiki back to the local filesystem.
!Installation
Download and install the latest revision of TiddlyFox by clicking on the following link while in Firefox:
https://github.com/TiddlyWiki/TiddlyFox/blob/master/tiddlyfox.xpi

You can also install TiddlyFox form Mozilla's official addon library. However, this version typically lags behind the latest release:
https://addons.mozilla.org/en-US/firefox/addon/tiddlyfox

Surprisingly, you can also install TiddlyFox on the mobile version of Firefox for Android. Mozilla has done a good job to let a Firefox add-on to support both desktop and mobile platforms with just one .xpi.
!Background
Due to security issues, Firefox15 and above no longer support the use of the *privileged* file I/O functions needed by TiddlyWiki to save a local file. As a result, attempting to save from Firefox 15+ will produce the error you saw. Tiddlyfox restores the file I/O support for TiddlyWiki.
!Working with TiddlyFox
Whenever you open a TiddlyWiki document with TiddlyFox installed, you will be asked to confirm whether or not file saving should be permitted (OK/Cancel). Pressing OK allows TiddlyFox to provide file I/ O for the current document. TiddlyFox remembers that choice and applies it each time that document is opened, so that you only see the confirmation message the first time. Pressing Cancel bypasses the TiddlyFox addon and loads the document without support for file I/O (and thus, no saving of changes). If you press Cancel, TiddlyFox will ask for confirmation again the next time you open the document.
TiddlyHome is a package design as an infrastructure for multi-user and multi-site TiddlyWiki hosting service based on UploadPlugin. 

TiddlyHome 0.1.4 is in beta stage and use TiddlyWiki 2.4.1

[[TiddlyHome|http://tiddlyhome.bidix.info/]]
[[TiddlyHoster|http://hoster.peermore.com]] provides TiddlyWeb based hosting for your [[tiddlers|Tiddler]]. It provides more flexibility than TiddlySpace in terms of access control which, however, it does not live up to in terms of presentation and user engagement.
A TiddlyLink is the term used for an internal link from one tiddler to another.
| !Mode | !Description |width:220px;  !Markup |width:100px; !Example |h
| ''WikiWord''|words in CamelCase are automatically rendered as a TiddlyLink|{{{TiddlyWiki}}}|[[TiddlyWiki]]|
| ''Title''|especially needed when tiddler titles contain blanks.|{{{[[A Tiddler]]}}}|[[A Tiddler]]|
| ''Pretty Link''|when the flow of your text requires to change the wording|{{{[[great wiki|TiddlyWiki]]}}}|[[great wiki|TiddlyWiki]]|
Also see [[External Link]]...
The ~TiddlySaver Java applet allows ~TiddlyWiki to save changes in a local version (from a file:// URL) of Safari, Opera and other browsers. It is a small file named [["TiddlySaver.jar"|TiddlySaver.jar]] that must be placed in the same directory as your ~TiddlyWiki file. As of August 2008, when an empty ~TiddlyWiki file is downloaded using either Safari or Opera, it is bundled with a copy of the ~TiddlySaver.jar file in a zip file - both files must be in the same directory ''whenever the ~TiddlyWiki file is opened'' in order to work.

[["TiddlySaver.jar"|TiddlySaver.jar]]  is signed by [[UnaMesa Association|UnaMesa]]. The [[UnaMesa Association|UnaMesa]] certificate is signed by the ''Thawte Code Signing CA'' intermediate certificate which is chained to the ''Thawte Premium Server CA'' root certificate. You need to trust this certificate Chain to be able to use the applet.

Note that there is currently [[a bug|http://trac.tiddlywiki.org/ticket/172]] that prevents ~TiddlySaver from working if you have specified a backup directory in AdvancedOptions and the directory doesn't exist.

Thanks to Andrew Gregory for the original TiddlySaver code, and ~BidiX for arranging all the certificate magic.
[[TiddlySpace|http://tiddlyspace.com]] is a service for creating and curating small [[packets of content|Tiddler]] on the web. You may [[collaborate with others|Small Trusted Group]], assemble content by [[including spaces|What is space inclusion?]], add [[cool features|Extensions]] using [[plugins|Plugins]] and mix your content with other services using the [[API|TiddlySpace API]]. 

TiddlySpace is [[Open Source|http://en.wikipedia.org/wiki/Open_source]] software from [[Osmosoft]] so you're free to host your own instance on your own domain and are encouraged to contribute to the [[project|http://github.com/TiddlySpace/tiddlyspace]]. TiddlySpace is based on TiddlyWeb, the most advanced server-side implementation for TiddlyWiki.

For the latest and greatest on TiddlySpace, visit the @blog.
TiddlySpace is built on TiddlyWeb, web-friendly hosting for TiddlyWiki documents. Individual [[tiddlers|Tiddler]] are accessed using ~RESTful HTTP interactions.

For more details one the TiddlySpace API read the [[API Documentation|http://tiddlyweb.peermore.com/wiki/#%5B%5BHTTP%20API%5D%5D]].
!Examples
http://glossary.tiddlyspace.com#TiddlySpace -- a TiddlyWiki [[permalink|Permalink]]
http://glossary.tiddlyspace.com/TiddlySpace -- a TiddlySpace short link
http://glossary.tiddlyspace.com/bags/glossary_public/tiddlers -- the TiddlyWeb [[bag|Bag]] of tiddlers

Different representations for resource may be requested using [[content negotiation|http://en.wikipedia.org/wiki/Content_negotiation]] or by appending a suffix to the URI, e.g.:
*http://glossary.tiddlyspace.com/TiddlySpace
*http://glossary.tiddlyspace.com/TiddlySpace.html
*http://glossary.tiddlyspace.com/TiddlySpace.txt
*http://glossary.tiddlyspace.com/TiddlySpace.json
*http://glossary.tiddlyspace.com/TiddlySpace.atom
*http://glossary.tiddlyspace.com/TiddlySpace.wiki
This glossary defines terms used in the context of TiddlySpace / TiddlyWeb.
<<list filter "[tag[TiddlySpace Glossary]]">>
The following roughly illustrates the default [[TiddlySpace layout|TiddlySpace Layout]] and components...

PageTemplate -- (DefaultTiddlers / WindowTitle / SiteUrl)
|>|{{title{SiteTitle}}}<br>SiteSubtitle|
|background:#f9f9f9;MainMenu|background:#f9f9f9; « SideBarOptions »|
|background:white;width:400px;{{right{ToolbarCommands}}}<br><br>&nbsp;&nbsp;&nbsp;ViewTemplate<br><br>&nbsp;&nbsp;&nbsp;EditTemplate|background:#f9f9f9;« SideBarTabs »<br>{{button{[[Recent|TabTimeline]]}}}<br>{{button{[[All|TabAll]]}}}<br>{{button{[[Public|TiddlySpaceTabs]]}}}<br>{{button{[[Private|TiddlySpaceTabs]]}}}<br>{{button{[[Tags|TabTags]]}}}<br>{{button{[[Spaces|TiddlySpaceTabs]]}}}<br>{{button{[[Missing|TabMoreMissing]]}}}<br>{{button{[[Orphans|TabMoreOrphans]]}}}<br>{{button{[[Shadowed|TabMoreShadowed]]}}}|
''StyleSheet:'' StyleSheetColors - StyleSheetLayout - StyleSheetPrint
/***
|''Name''|TiddlySpaceBackstage|
|''Version''|0.8.0|
|''Description''|Provides a TiddlySpace version of the backstage and a homeLink macro|
|''Status''|@@beta@@|
|''Contributors''|Jon Lister, Jon Robson, Colm Britton|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceBackstage.js|
|''Requires''|TiddlySpaceConfig ImageMacroPlugin TiddlySpaceViewTypes|
!StyleSheet
.tiddler .error.annotation .button{
	display: inline-block;
}

#backstageArea {
	z-index: 49;
	color: white;
	background-color: black;
	background: -webkit-gradient(linear,left bottom,left top,color-stop(0, #222),color-stop(0.5, #333),color-stop(1, #555));
	background: -moz-linear-gradient(center bottom,#222 0%, #333 50%, #555 100%);
	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ff555555, endColorstr=#ff222222);
	-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#ff555555, endColorstr=#ff222222)";
	height: 25px;
	padding: 0;
}

#backstageButton {
	overflow: hidden;
}

#backstageButton #backstageShow,
#backstageButton #backstageHide {
	margin: 0px;
	padding: 0px;
}

#backstageButton #backstageShow:hover,
#backstageButton #backstageHide:hover {
	background: none;
	color: none;
}

#backstageButton img,
#backstageButton svg {
	width: 24px;
	height: 24px;
}

#messageArea {
	top: 50px;
}

#backstageToolbar {
	position: relative;
}

#backstageArea a {
	padding: 0px;
	margin-left: 0px;
	color: white;
	background: none;
}

#backstageArea a:hover {
	background-color: white;
}

#backstage ol,
#backstage ul {
	padding: auto;
}

#backstageButton a {
	margin: 0;
}

.backstagePanelBody ul {
	padding: 5px;
	margin: 5px;
}

#backstage #backstagePanel {
	margin-left: 5%;
	padding: 0em;
	margin-right: 5%;
}

#backstageToolbar a {
	position: relative;
}

#backstageArea a.backstageSelTab,
#backstageToolbar .backstageTask {
	line-height: 25px;
	color: #767676;
}

.backstageTask .externalImage,
.backstageTask .image {
	display: inline;
}

#backstageToolbar a span {
	z-index: 2;
}

a.backstageTask {
	display: inline;
        margin-left: 1em !important;
}

.backstagePanelBody .button {
	display: inline-block;
	margin-right: 10px;
}

.backstagePanelBody {
	margin: 0 0 0 0.6em;
	padding: 0.4em 0.5em 1px 0.5em;
}

#backstage table {
	margin: auto;
}

#backstage .wizard table {
	border: 0px;
	margin: 0;
}

#backstage div  li.listLink {
	border: 0px;
	width: 78%;
	font-size: 0.7em;
}

#backstage div li.listTitle {
	font-weight: bold;
	text-decoration: underline;
	font-size: 1em;
	background: #ccc;
	width: 100%;
}

#backstage fieldset {
	border: solid 1px [[ColorPalette::Background]];
}

#backstage .viewer table,#backstage table.twtable {
	border: 0px;
}

#backstageToolbar img {
	padding: 0;
}

#backstage .wizard,
#backstage .wizardFooter {
	background: none;
}

.viewer td, .viewer tr, .twtable td, .twtable tr {
	border: 1px solid #eee;
}

#backstage .inlineList ul li {
	background-color: [[ColorPalette::Background]];
	border: solid 1px [[ColorPalette::TertiaryMid]];
	display: block;
	float: left;
	list-style: none;
	margin-right: 1em;
	padding: 0.5em;
}

.backstageClear, .inlineList form {
	clear: both;
	display: block;
	margin-top: 3em;
}

.tiddlyspaceMenu {
	text-align: center;
}

span.chunkyButton {
	display: inline-block;
	padding: 0;
	margin: 0;
	border: solid 2px #000;
	background-color: #04b;
}

span.chunkyButton a.button, span.chunkyButton a:active.button {
	white-space: nowrap;
	font-weight: bold;
	font-size: 1.8em;
	color: #fff;
	text-align: center;
	padding: 0.5em 0.5em;
	margin: 0;
	border-style: none;
	display: block;
}

span.chunkyButton:hover {
	background-color: #014;
}

span.chunkyButton a.button:hover {
	border-style: none;
	background: none;
	color: #fff;
}

#backstage .unpluggedSpaceTab .wizard,
.unpluggedSpaceTab .wizard {
	background: white;
	border: 2px solid #CCC;
	padding: 5px;
}

.syncKey .keyItem {
	border: 1px solid black;
	display: inline-block;
	margin: 0.2em;
	padding: 0.1em 0.1em 0.1em 0.1em;
}

.keyHeading {
	font-size: 2em;
	font-weight: bold;
	margin: 0.4em 0em -0.2em;
}

.unpluggedSpaceTab .putToServer,
.unpluggedSpaceTab .notChanged {
	display: none;
}

.tiddlyspaceMenu ul {
	margin: 0;
	padding: 0;
}

.tiddlyspaceMenu ul li {
	list-style: none;
}

.unsyncedChanges .unsyncedList {
	display: block;
}

.unsyncedList {
	display: none;
}
!Code
***/
//{{{
(function ($) {
    var name = "StyleSheet" + tiddler.title;
    config.shadowTiddlers[name] = "/*{{{*/\n%0\n/*}}}*/".
        format(store.getTiddlerText(tiddler.title + "##StyleSheet")); // this accesses the StyleSheet section of the current tiddler (the plugin that contains it)
    store.addNotification(name, refreshStyles);

    if (!config.extensions.tiddlyweb.status.tiddlyspace_version) { // unplugged
        config.extensions.tiddlyweb.status.tiddlyspace_version = "<unknown>";
        config.extensions.tiddlyweb.status.server_host = {
            url:config.extensions.tiddlyweb.host }; // TiddlySpaceLinkPlugin expects this
    }
    var disabled_tasks_for_nonmembers = ["tiddlers", "plugins", "batch", "sync"];

    var tweb = config.extensions.tiddlyweb;
    var tiddlyspace = config.extensions.tiddlyspace;
    var currentSpace = tiddlyspace.currentSpace.name;
    var imageMacro = config.macros.image;

    if (config.options.chkBackstage === undefined) {
        config.options.chkBackstage = false;
    }

// Set up Backstage
    config.tasks = {};
    config.tasks.status = {
        text:"status",
        tooltip:"TiddlySpace Info",
        content:"<<tiddler Backstage##Menu>>"
    };
    config.tasks.tiddlers = {
        text:"tiddlers",
        tooltip:"tiddlers control panel",
        content:"<<tiddler Backstage##BackstageTiddlers>>"
    };
    config.tasks.plugins = {
        text:"plugins",
        tooltip:"Manage installed plugins",
        content:"<<tiddler Backstage##Plugins>>"
    };
    config.tasks.batch = {
        text:"batch",
        tooltip:"Batch manage public/private tiddlers",
        content:"<<tiddler Backstage##BatchOps>>"
    };
    config.tasks.tweaks = {
        text:"tweaks",
        tooltip:"Tweak TiddlyWiki behaviors",
        content:"<<tiddler Backstage##Tweaks>>"
    };
    config.tasks.exportTiddlers = {
        text:"import/export",
        tooltip:"Import/export tiddlers from/to a TiddlyWiki",
        content:"<<tiddler Backstage##ImportExport>>"
    };
    config.tasks.sync = {
        text:"sync",
        tooltip:"Check Sync status",
        content:"<<tiddler Backstage##SpaceUnplugged>>"
    };

    if (window.location.protocol === "file:") {
        config.unplugged = true;
    }

    config.backstageTasks = ["status", "tiddlers", "plugins",
        "batch", "tweaks", "exportTiddlers", "sync"];

    config.messages.backstage.prompt = "";
// initialize state
    var _show = backstage.show;
    backstage.show = function () {
        // selectively hide backstage tasks and tabs based on user status
        var tasks = $("#backstageToolbar .backstageTask").show();
        var bs = backstage.tiddlyspace;
        if (!config.unplugged) {
            tweb.getUserInfo(function (user) {
                if (user.anon) {
                    jQuery.each(disabled_tasks_for_nonmembers, function (i, task) {
                        var taskIndex = config.backstageTasks.indexOf(task);
                        if (taskIndex !== -1) {
                            config.backstageTasks.splice(taskIndex, 1);
                        }
                    });
                    config.messages.memberStatus = bs.locale.loggedout;
                } else {
                    config.messages.memberStatus = readOnly ?
                        bs.locale.nonmember : bs.locale.member;
                }
            });
        } else {
            config.messages.memberStatus = bs.locale.unplugged;
        }

        // display backstage
        return _show.apply(this, arguments);
    };
    if (readOnly) {
        jQuery.each(disabled_tasks_for_nonmembers, function (i, task) {
            var taskIndex = config.backstageTasks.indexOf(task);
            if (taskIndex !== -1) {
                config.backstageTasks.splice(taskIndex, 1);
            }
        });
    }

    var tasks = config.tasks;
    var commonUrl = "/bags/common/tiddlers/%0";

    backstage.tiddlyspace = {
        locale:{
            member:"You are a member of this space.",
            nonmember:"You are not a member of this space.",
            loggedout:"You are currently logged out of TiddlySpace.",
            unplugged:"You are unplugged."
        },
        showButton:function () {
            var showBtn = $("#backstageShow")[0];
            var altText = $(showBtn).text();
            $(showBtn).empty();
            imageMacro.renderImage(showBtn, "backstage.svg",
                { altImage:commonUrl.format("backstage.png"), alt:altText});
        },
        hideButton:function () {
            var hideBtn = $("#backstageHide")[0];
            var altText = $(hideBtn).text();
            $(hideBtn).empty();
            imageMacro.renderImage(hideBtn, "close.svg",
                { altImage:commonUrl.format("close.png"), alt:altText, width:24, height:24 });
        }
    };

    var _init = backstage.init;
    backstage.init = function () {
        _init.apply(this, arguments);
        var init = function (user) {
            var bs = backstage.tiddlyspace;
            bs.showButton();
            bs.hideButton();
        };
        tweb.getUserInfo(init);
    };

    var home = config.macros.homeLink = {
        locale:{
            linkText:"your home space"
        },
        handler:function (place) {
            var container = $("<span />").appendTo(place)[0];
            tweb.getUserInfo(function (user) {
                if (!user.anon && user.name !== currentSpace) {
                    createSpaceLink(container, user.name, null, home.locale.linkText);
                }
            });
        }
    };

    config.macros.exportSpace = {
        handler:function (place, macroName, params) {
            var filename = params[0] ||
                "/tiddlers.wiki?download=%0.html".format(currentSpace);
            $('<a class="button">download</a>').// XXX: i18n
                attr("href", filename).appendTo(place);
        }
    };

}(jQuery));
//}}}
(function() {
var getCSRFToken = function(window) {
	// XXX: should not use RegEx - cf.
	// http://www.quirksmode.org/js/cookies.html
	// https://github.com/TiddlySpace/tiddlyspace/commit/5f4adbe009ed4bda3ce39058a3fb07de1420358d
	var regex = /^(?:.*; )?csrf_token=([^(;|$)]*)(?:;|$)/;
	var match = regex.exec(document.cookie);
	var csrf_token = null;
	if (match && (match.length === 2)) {
		csrf_token = match[1];
	}

	return csrf_token;
};

if (typeof config !== 'undefined' && config.extensions &&
		config.extensions.tiddlyspace &&
		config.extensions.tiddlyspace.getCSRFToken === null) {
	config.extensions.tiddlyspace.getCSRFToken = getCSRFToken;
} else {
	window.getCSRFToken = getCSRFToken;
}
})(window);
/***
|''Name''|TiddlySpaceCloneCommand|
|''Version''|0.5.8|
|''Description''|provides a toolbar command for cloning external tiddlers|
|''Status''|stable|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceCloneCommand.js|
|''Requires''|TiddlySpaceConfig TiddlySpaceFilters|
!Code
***/
//{{{
(function($) {

var cmd = config.commands;
var tiddlyspace = config.extensions.tiddlyspace;

var fieldsCache = {};

cmd.cloneTiddler = {
	text: cmd.editTiddler.text,
	tooltip: "Create a copy of this tiddler in the current space",
	errorMsg: "Error publishing %0: %1",

	isEnabled: function(tiddler) {
		return !config.filterHelpers.is.local(tiddler) && !readOnly;
	},
	handler: function(ev, src, title) {
		var tiddler = store.getTiddler(title);
		if(tiddler) {
			fieldsCache[title] = $.extend({}, tiddler.fields);
			tiddler.fields["server.workspace"] = tiddlyspace.getCurrentWorkspace(config.options.chkPrivateMode ?
		"private" : "public");
			tiddler.fields["server.permissions"] = "read, write, create"; // no delete
			delete tiddler.fields["server.page.revision"];
			delete tiddler.fields["server.title"];
			delete tiddler.fields["server.etag"];
			// special handling for pseudo-shadow tiddlers
			if(tiddlyspace.coreBags.contains(tiddler.fields["server.bag"])) {
				tiddler.tags.remove("excludeLists");
			}
		} else { // ensure workspace is the current space
			var el = story.findContainingTiddler(src);
			el = $(el);
			var fields = el.attr("tiddlyfields");
			if(fields) { // inherited via TiddlyLink
				fields = fields.decodeHashMap();
				fields["server.workspace"] = config.
					defaultCustomFields["server.workspace"];
			} else {
				fields = config.defaultCustomFields;
			}
			fields = String.encodeHashMap(fields);
			el.attr("tiddlyfields", fields);
		}
		cmd.editTiddler.handler.apply(this, arguments);
		if(tiddler) {
			tiddler.fields["server.permissions"] += ", delete";
		}
		return false;
	}
};

cmd.editTiddler.isEnabled = function(tiddler) {
	return !cmd.cloneTiddler.isEnabled.apply(this, arguments);
};

// hijack cancelTiddler to restore original fields
var _cancelHandler = cmd.cancelTiddler.handler;
cmd.cancelTiddler.handler = function(ev, src, title) {
	var tiddler = store.getTiddler(title);
	if(tiddler) {
		tiddler.fields = fieldsCache[title] || tiddler.fields;
		delete fieldsCache[title];
	}
	return _cancelHandler.apply(this, arguments);
};

// hijack saveTiddler to clear unused fields stash
var _saveHandler = cmd.saveTiddler.handler;
cmd.saveTiddler.handler =  function(ev, src, title) {
	delete fieldsCache[title];
	return _saveHandler.apply(this, arguments);
};

})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceConfig|
|''Version''|0.7.7|
|''Description''|TiddlySpace configuration|
|''Status''|stable|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceConfig.js|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlyWebConfig ServerSideSavingPlugin TiddlyFileImporter|
!Code
***/
//{{{
(function($) {

var tweb = config.extensions.tiddlyweb;

var recipe = config.defaultCustomFields["server.workspace"].split("recipes/")[1];
var currentSpace; // assigned later

var disabledTabs = [];

var coreBags = ["system", "tiddlyspace"];
var systemSpaces = ["plugins", "info", "images", "theme"];
systemSpaces = $.map(systemSpaces, function(item, i) {
	return "system-%0_public".format(item);
});

// hijack search macro to add custom attributes for mobile devices
var _search = config.macros.search.handler;
config.macros.search.handler = function(place, macroName, params) {
	_search.apply(this, arguments);
	$(".searchField:input", place).
		attr({ autocapitalize: "off", autocorrect: "off" });
};

// arg is either a container name or a tiddler object
// if fuzzy is truthy, space may be inferred from workspace (for new tiddlers)
// returns space object or false
var determineSpace = function(arg, fuzzy) {
	if(typeof arg == "string") { // container name
		var space = split(arg, "_", "r");
		return ["public", "private"].contains(space.type) ? space : false;
	} else if(arg) { // tiddler
		var container = determineContainer(arg, fuzzy);
		return container ? determineSpace(container.name, fuzzy) : false;
	} else {
		return false;
	}
};

// if fuzzy is truthy, container may be inferred from workspace for new tiddlers
// returns container object or false
var determineContainer = function(tiddler, fuzzy) { // TODO: expose?
	var bag = tiddler.fields["server.bag"];
	var recipe = tiddler.fields["server.recipe"]; // XXX: unused/irrelevant/redundant!?
	if(bag) {
		return { type: "bag", name: bag };
	} else if(recipe) {
		return { type: "recipe", name: recipe };
	} else if(fuzzy) { // new tiddler
		var workspace = tiddler.fields["server.workspace"];
		if(workspace) {
			var container = split(workspace, "/", "l");
			return ["bags", "recipes"].contains(container.type) ? container : false;
		} else {
			return false;
		}
	} else {
		return false;
	}
};

// hijack removeTiddlerCallback to restore tiddler from recipe cascade -- TODO: move into TiddlyWebWiki?
var sssp = config.extensions.ServerSideSavingPlugin;
var _removeTiddlerCallback = sssp.removeTiddlerCallback;
sssp.removeTiddlerCallback = function(context, userParams) {
	var title = context.tiddler.title;
	var recipe = context.tiddler.fields["server.recipe"];
	_removeTiddlerCallback.apply(this, arguments);
	if(recipe) {
		context.workspace = "recipes/" + recipe;
		var callback = function(context, userParams) {
			if(context.status) {
				var dirty = store.isDirty();
				store.saveTiddler(context.tiddler).clearChangeCount();
				store.setDirty(dirty);
			} else {
				store.notify(title, true);
			}
		};
		context.adaptor.getTiddler(title, context, null, callback);
	}
};

// splits a string once using delimiter
// mode "l" splits at the first, "r" at the last occurrence
// returns an object with members type and name
var split = function(str, sep, mode) {
	mode = mode == "r" ? "pop" : "shift"; // TODO: use +/-1 instead of "l"/"r"?
	var arr = str.split(sep);
	var type = arr.length > 1 ? arr[mode]() : null;
	return { type: type, name: arr.join(sep) };
};

var plugin = config.extensions.tiddlyspace = {
	currentSpace: determineSpace(recipe),
	coreBags: coreBags.concat(systemSpaces),

	determineSpace: determineSpace,
	isValidSpaceName: function(name) {
		return name.match(/^[a-z][0-9a-z\-]*[0-9a-z]$/) ? true : false;
	},
	getCurrentBag: function(type) {
		return "%0_%1".format(currentSpace, type);
	},
	getCurrentWorkspace: function(type) {
		return "bags/" + this.getCurrentBag(type);
	},
	// returns the URL for a space's avatar (SiteIcon) based on a server_host
	// object and an optional space name
	// optional nocors argument prevents cross-domain URLs from being generated
	getAvatar: function(host, space, nocors) {
		if(space && typeof space != "string") { // backwards compatibility -- XXX: deprecated
			space = space.name;
		}
		var subdomain = nocors ? currentSpace : space;
		host = host ? this.getHost(host, subdomain) : "";
		var bag = space ? "%0_public".format(space) : "tiddlyspace";
		return "%0/bags/%1/tiddlers/SiteIcon".format(host, bag);
	},
	// returns the URL based on a server_host object (scheme, host, port) and an
	// optional subdomain
	getHost: function(host, subdomain) {
		if(host === undefined) { // offline
			tweb.status.server_host = {}; // prevents exceptions further down the stack -- XXX: hacky workaround, breaks encapsulation
			return null;
		}
		subdomain = subdomain ? subdomain + "." : "";
		var url = "%0://%1%2".format(host.scheme, subdomain, host.host);
		var port = host.port;
		if(port && !["80", "443"].contains(port)) {
			url += ":" + port;
		}
		return url;
	},
	disableTab: function(tabTiddler) {
		if(typeof(tabTiddler) == "string") {
			disabledTabs.push(tabTiddler);
		} else {
			for(var i = 0; i < tabTiddler.length; i++) {
				plugin.disableTab(tabTiddler[i]);
			}
		}
	},
    checkSyncStatus: function(tiddler) {
		if(tiddler) {
			var title = typeof(tiddler) === "string" ? tiddler : tiddler.title;
			var el = story.getTiddler(title) || false;
			if(el) {
				refreshElements(el);
			}
		}
	},
	isDisabledTab: function(tabTitle) {
		var match = new RegExp("(?:\\[\\[([^\\]]+)\\]\\])", "mg").exec(tabTitle);
		var tabIdentifier = match ? match[1] : tabTitle;
		return disabledTabs.contains(tabIdentifier);
	},
	getCSRFToken: window.getCSRFToken || null // this may not have been processed yet
};

currentSpace = plugin.currentSpace.name;

tweb.serverPrefix = tweb.host.split("/")[3] || ""; // XXX: assumes root handler
tweb.getStatus(function(status) {
	var url = plugin.getHost(status.server_host);
	tweb.status.server_host.url = url;
	config.messages.tsVersion = status.version;
});

if(window.location.protocol == "file:") {
	// enable AutoSave by default
	config.options.chkAutoSave = config.options.chkAutoSave === undefined ?
		true : config.options.chkAutoSave;
} else {
	// set global read-only mode based on membership heuristics
	var indicator = store.getTiddler("SiteTitle") || tiddler;
	readOnly = !(recipe.split("_").pop() == "private" ||
		tweb.hasPermission("write", indicator));
	// replace TiddlyWiki's ImportTiddlers due to cross-domain restrictions
	if(config.macros.fileImport) {
		$.extend(config.macros.importTiddlers, config.macros.fileImport);
	}
}

// hijack saveChanges to ensure SystemSettings is private by default
var _saveChanges = saveChanges;
saveChanges = function(onlyIfDirty, tiddlers) {
	if(tiddlers && tiddlers.length == 1 &&
			tiddlers[0] && tiddlers[0].title == "SystemSettings") {
		var fields = tiddlers[0].fields;
		delete fields["server.recipe"];
		fields["server.bag"] = plugin.getCurrentBag("private");
		fields["server.workspace"] = plugin.getCurrentWorkspace("private");
	}
	return _saveChanges.apply(this, arguments);
};

// ensure backstage is always initialized
// required to circumvent TiddlyWiki's read-only based handling
config.macros.backstageInit = {
	init: function() {
		showBackstage = true;
	}
};

// disable evaluated macro parameters for security reasons
config.evaluateMacroParameters = "none";
var _parseParams = String.prototype.parseParams;
String.prototype.parseParams = function(defaultName, defaultValue, allowEval,
		noNames, cascadeDefaults) {
	if(config.evaluateMacroParameters == "none") {
		arguments[2] = false;
	}
	return _parseParams.apply(this, arguments);
};

var _tabsMacro = config.macros.tabs.handler;
config.macros.tabs.handler = function(place, macroName, params) {
	var newParams = [params[0]]; // keep cookie name
	for(var i = 1; i < params.length; i += 3) {
		var tabTitle = params[i + 2];
		if(!plugin.isDisabledTab(tabTitle)){
			newParams = newParams.concat(params[i], params[i + 1], tabTitle);
		}
	}
	_tabsMacro.apply(this, [place, macroName, newParams]);
};

// disable ControlView for XHRs by default
$.ajaxSetup({
	beforeSend: function(xhr) {
		xhr.setRequestHeader("X-ControlView", "false");
	}
});
// TiddlyWeb adaptor currently still uses httpReq, which needs extra magic -- XXX: obsolete this!
var _httpReq = httpReq;
httpReq = function(type, url, callback, params, headers, data, contentType,
		username, password, allowCache) {
	headers = headers || {};
	headers["X-ControlView"] = "false";
	_httpReq.apply(this, arguments);
};

// register style sheet for backstage separately (important)
store.addNotification("StyleSheetBackstage", refreshStyles);

// option for default privacy setting
config.optionsDesc.chkPrivateMode = "Set your default privacy mode to private";
config.optionsSource.chkPrivateMode = "setting";
config.options.chkPrivateMode = config.options.chkPrivateMode || false;
saveSystemSetting("chkPrivateMode", true);
config.defaultCustomFields["server.workspace"] = plugin.
	getCurrentWorkspace(config.options.chkPrivateMode ? "private" : "public");

config.paramifiers.follow = {
	onstart: function(v) {
		if(!readOnly) {
			var bag = "%0_public".format(currentSpace);
			story.displayTiddler(null, v, DEFAULT_EDIT_TEMPLATE, null, null,
				"server.bag:%0 server.workspace:bags/%0".format(bag));
			story.setTiddlerTag(v, "follow", 1);
			story.focusTiddler(v, "text");
		}
	}
};

var fImport = config.macros.fileImport;
if(fImport) {
	fImport.uploadTo = "Upload to: ";
	var _createForm = config.macros.fileImport.createForm;
	config.macros.fileImport.createForm = function(place, wizard, iframeName) {
		var container = $("<div />").text(fImport.uploadTo).appendTo(place);
		var select = $('<select name="mode" />').appendTo(container)[0];
		$('<option value="private" selected>private</a>').appendTo(select);
		$('<option value="public">public</a>').appendTo(select);
		wizard.setValue("importmode", select);
		_createForm.apply(this, [place, wizard, iframeName]);
	};

	var _onGet = config.macros.importTiddlers.onGetTiddler;
	config.macros.importTiddlers.onGetTiddler = function(context, wizard) {
		var type = $(wizard.getValue("importmode")).val();
		var ws =  plugin.getCurrentWorkspace(type);
		wizard.setValue("workspace", ws);
		_onGet.apply(this, [context, wizard]);
	};
}

config.extensions.ServerSideSavingPlugin.reportSuccess = function(msg, tiddler) {
	plugin.checkSyncStatus(tiddler);
	msg = config.extensions.ServerSideSavingPlugin.locale[msg];
	var link = "/" + encodeURIComponent(tiddler.title);
	displayMessage(msg.format([tiddler.title]), link);
};


})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceFilters|
|''Description''|provide TiddlySpace-specific filter extensions|
|''Author''|Jon Robson|
|''Version''|0.6.1|
|''Status''|@@beta@@|
|''CoreVersion''|2.6.2|
|''Requires''|TiddlySpaceConfig|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage
{{{
<<tsList Private>>
<<tsList Public>>
<<tsList Draft>>
}}}
!Code
***/
//{{{
(function($) {

var tiddlyspace = config.extensions.tiddlyspace;
var privateBag = tiddlyspace.getCurrentBag("private");
var publicBag = tiddlyspace.getCurrentBag("public");

config.filterHelpers = {
	is: {
		"private": function(tiddler) {
			var bag = tiddler.fields["server.bag"];
			return bag == privateBag;
		},
		"public": function(tiddler) {
			var bag = tiddler.fields["server.bag"];
			return bag == publicBag;
		},
		draft: function(tiddler) {
			var fields = tiddler.fields;
			var bag = fields["server.bag"];
			return (privateBag == bag && fields["publish.name"]) ? true : false;
		},
		local: function(tiddler) {
			return config.filterHelpers.is["public"](tiddler) ||
				config.filterHelpers.is["private"](tiddler);
		},
		unsynced: function(tiddler) {
			return tiddler ? tiddler.isTouched() : false;
		}
	}
};

config.filters.is = function(results, match) {
	var candidates = store.getTiddlers("title");
	var type = match[3];
	for (var i = 0; i < candidates.length; i++) {
		var tiddler = candidates[i];
		var helper = config.filterHelpers.is[type];
		if(helper && helper(tiddler)) {
			results.pushUnique(tiddler);
		}
	}
	return results;
};

})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceFollowingPlugin|
|''Version''|0.7.1|
|''Description''|Provides a following macro|
|''Author''|Jon Robson|
|''Requires''|TiddlySpaceConfig TiddlySpaceTiddlerIconsPlugin ErrorHandler|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage
Tag a tiddler with "follow" to express a list of followers.
Using the {{{<<followTiddlers X>>}}}
will reveal the number of tiddlers with name X in the set of spaces the *current* user viewing your space follows.
{{{<<following jon>>}}} will list all the users following Jon.
{{{<<followers jon>>}}} will list all the followers of jon.
{{{<linkedTiddlers>>}}} will list all tiddlers across TiddlySpace linked to the current tiddler
{{{<linkedTiddlers follow:yes>>}}} will list all tiddlers across TiddlySpace that come from your list of followers
adds spaceLink view type {{{<<view server.bag spaceLink>>}}} creates a link to the space described in server.bag
{{{<<view server.bag spaceLink title>>}}} makes a link to the tiddler with title expressed in the field title in space server.bag
If no name is given eg. {{{<<following>>}}} or {{{<<follow>>}}} it will default the current user.
!StyleSheet
.followTiddlersList li {
	list-style:none;
}

.followButton {
	width: 2em;
}

.followTiddlersList li .siteIcon {
	height:48px;
	width: 48px;
}

#sidebarTabs .followers li a,
.followers .siteIcon,
.followers .siteIcon div {
	display: inline;
}

.followTiddlersList li .externalImage, .followTiddlersList li .image {
	display: inline;
}

.scanResults li {
	list-style: none;
}
!Code
***/
//{{{
(function($) {
var LIMIT_FOLLOWING = 100;

var tweb = config.extensions.tiddlyweb;
var tiddlyspace = config.extensions.tiddlyspace;
var currentSpace = tiddlyspace.currentSpace.name;

var shadows = config.shadowTiddlers;
config.annotations.ScanTemplate = "This tiddler is the default template used in the display of tiddlers founding using the tsScan macro. To access attributes use the view macro e.g. {{{<<view title text>>}}}";
shadows.ScanTemplate = "<<view modifier SiteIcon width:24 height:24 spaceLink:yes label:no>> <<view title link>>";
shadows.FollowersTemplate = "<<view server.bag SiteIcon width:24 height:24 spaceLink:yes label:no>> <<view server.bag spaceLink>>";
shadows.FollowingTemplate = "<<view title SiteIcon width:24 height:24 spaceLink:yes label:no>> <<view title spaceLink>>";
shadows.FollowTiddlersBlackList = "";
shadows.FollowTiddlersHeading = "There are tiddlers in spaces you follow using the follow tag which use the title <<view title text>>";
shadows.FollowTiddlersTemplate = ["* <<view server.space SiteIcon width:24 height:24 spaceLink:yes label:no>> ",
	"<<view server.space spaceLink title external:no>> modified by <<view modifier spaceLink>> ",
	"in the <<view server.space spaceLink>> space (<<view modified date>> @ <<view modified date 0hh:0mm>>).\n"].join("");

var name = "StyleSheetFollowing";
shadows[name] = "/*{{{*/\n%0\n/*}}}*/".
	format(store.getTiddlerText(tiddler.title + "##StyleSheet"));
store.addNotification(name, refreshStyles);

// provide support for sucking in tiddlers from the server
tiddlyspace.displayServerTiddler = function(src, title, workspace, callback) {
	var adaptor = store.getTiddlers()[0].getAdaptor();
	var localTitle = tiddlyspace.getLocalTitle(title, workspace);
	var tiddler = new Tiddler(localTitle);
	tiddler.text = "Please wait while this tiddler is retrieved...";
	tiddler.fields.doNotSave = "true";
	store.addTiddler(tiddler);
	src = story.displayTiddler(src || null, tiddler.title);
	tweb.getStatus(function(status) {
		var context = {
			host: tweb.host, // TODO: inherit from source tiddler?
			workspace: workspace,
			headers: { "X-ControlView": "false" }
		};
		var getCallback = function(context, userParams) {
			var tiddler = context.tiddler;
			tiddler.title = localTitle;
			store.addTiddler(tiddler);
			story.refreshTiddler(localTitle, null, true); // overriding existing allows updating
			if(callback) {
				callback(src, tiddler);
			}
		};
		adaptor.getTiddler(title, context, null, getCallback);
	});
};

tiddlyspace.scroller = {
	runHandler: function(title, top, bottom, height) {
		var i;
		var handlers = tiddlyspace.scroller.handlers;
		var tidEl = story.getTiddler(title);
		if(tidEl) {
			var topEl = $(tidEl).offset().top + 20;
			if(top === false || (topEl > top && topEl < bottom)) {
				var h = handlers[title];
				for(i = 0; i < h.length; i++) {
					h[i]();
				}
				tiddlyspace.scroller.clearHandlers(title);
			}
		} else {
			tiddlyspace.scroller.clearHandlers(title);
		}
	},
	clearHandlers: function(title) {
		tiddlyspace.scroller.handlers[title] = [];
	},
	registerIsVisibleEvent: function(title, handler) {
		tiddlyspace.scroller.handlers[title] = tiddlyspace.scroller.handlers[title] || [];
		tiddlyspace.scroller.handlers[title].push(handler);
	},
	init: function() {
		this.handlers = {};
		this.interval = window.setInterval(function() {
			var top = $(window).scrollTop();
			var height = $(window).height();
			var bottom = top + height;
			var title;
			for(title in tiddlyspace.scroller.handlers) {
				if(title) {
					tiddlyspace.scroller.runHandler(title, top, bottom, height);
				}
			}
		}, 2000); // every 2 seconds check scroll position
	}
};
tiddlyspace.scroller.init();

var followMacro = config.macros.followTiddlers = {
	locale: {
		followListHeader: "Here are tiddlers from spaces you follow using the follow tag which use this title.",
		noTiddlersFromFollowers: "None of the spaces you follow contain a tiddler with this name.",
		errorMessage: "There was a problem retrieving tiddlers from the server. Please try again later."
	},
	init: function() {
		followMacro.lookup = {};
	},
	followTag: "follow",
	getHosts: function(callback) {
		tweb.getStatus(function(status) {
			callback(tweb.host, tiddlyspace.getHost(status.server_host, "%0"));
		});
	},
	getBlacklist: function() {
		return store.getTiddlerText("FollowTiddlersBlackList").split("\n");
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var args = paramString.parseParams("anon")[0];
		var containingTiddler = story.findContainingTiddler(place).getAttribute('tiddler');
		var title = (args.anon && args.anon[0]) || tiddler.fields["server.title"] || tiddler.title;
		var tid = store.getTiddler(title);
		var user = params[1] || false;
		if(tid) {
			followMacro.makeButton(place, {
				url: "/search?q=title:%22" + encodeURIComponent(title) + "%22",
				containingTiddler: containingTiddler,
				blacklisted: followMacro.getBlacklist(), title: title, user: user,
				consultFollowRelationship: (args.follow &&
					args.follow[0] === 'false') ? false : true });
		}
	},
	makeButton: function(place, options) { // this is essentially the same code in TiddlySpaceFollowingPlugin
		var title = options.title;
		var blacklisted = options.blacklisted;
		var tiddler = store.getTiddler(title);
		var btn = $('<div class="followButton" />').addClass("notLoaded").appendTo(place)[0];
		if(blacklisted.contains(title)) {
			$(btn).remove();
			return;
		} else {
			var user = options.user;
			window.setTimeout(function() { // prevent multiple calls due to refresh
				tiddlyspace.scroller.registerIsVisibleEvent(options.containingTiddler, function() {
					var mkButton = function(followers, ignore) {
						if(!followers && !ignore) {
							$(btn).remove();
						} else {
							$("<a />").appendTo(btn);
							var scanOptions = { url: options.url,
								spaceField: options.spaceField || "bag", template: null, sort: "-modified",
								callback: function(tiddlers) {
									$(btn).removeClass("notLoaded");
									followMacro.constructInterface(btn, tiddlers);
								}
							};
							if(!ignore) {
								scanOptions.showBags = followMacro._getFollowerBags(followers);
							}
							scanOptions.hideBags = [tiddler.fields["server.bag"]];
							scanMacro.scan(null, scanOptions, user);
						}
					};
					if(options.consultFollowRelationship) {
						followMacro.getFollowers(mkButton);
					} else {
						mkButton([], true);
					}
				});
			}, 1000);
		}
	},
	constructInterface: function(container, tiddlers) {
		var txt = tiddlers.length;
		var className = txt > 0 ? "hasReplies" : "noReplies";
		var el = $(story.findContainingTiddler(container));
		$(container).empty().addClass(className);
		var btn = $("<a />").addClass("followedTiddlers").text(txt).
			click(function(ev) {
				followMacro.followingOnClick(ev);
			}).appendTo('<div class="followedTiddlers" />').appendTo(container)[0];
		$.data(btn, "tiddlers", tiddlers);
	},
	followingOnClick: function(ev) {
		var target = ev.target;
		var locale = followMacro.locale;
		var el = $('<div class="followTiddlersList" />')[0];
		var popup = Popup.create(target,"div");
		$(popup).addClass("taggedTiddlerList followList").click(function(ev) { // make it so only clicking on the document outside the popup removes the popup
			if(ev.target.parentNode != document) {
				ev.stopPropagation();
			}
		}).append(el);
		var tiddlers = $.data(target, "tiddlers") || [];
		scanMacro.template(el, tiddlers.slice(0,1), "FollowTiddlersHeading");
		scanMacro.template(el, tiddlers, "FollowTiddlersTemplate");
		if(tiddlers.length === 0) {
			$("<li />").text(locale.noTiddlersFromFollowers).appendTo(el);
		}
		Popup.show();
		ev.stopPropagation();
		return popup;
	},
	_getFollowerBags: function(followers) { // XXX: private or not?
		return $.map(followers, function(name, i) {
			return name != currentSpace ? "%0_public".format(name) : null;
		});
	},
	getFollowers: function(callback, username) {
		// returns a list of spaces being followed by the existing space
		var followersCallback = function(user) {
			if(!user.anon) {
				scanMacro.scan(null, { 
					url: "/search?q=bag:%0_public tag:%1 _limit:%2".format(user.name, followMacro.followTag, LIMIT_FOLLOWING),
					spaceField: "title", template: null, cache: true,
					callback: function(tiddlers) {
						var followers = [];
						for(var i = 0; i < tiddlers.length; i++) {
							followers.push(tiddlyspace.resolveSpaceName(tiddlers[i].title));
						}
						callback(followers);
					}
				});
			} else {
				callback(false);
			}
		};
		return !username ? tweb.getUserInfo(followersCallback) : followersCallback({ name: username });
	}
};

var scanMacro = config.macros.tsScan = {
	init: function () {
		this.scanned = {};
	},
	_tiddlerfy: function(jsontiddlers, options) {
		var tiddlers = [];
		var spaceField = options.spaceField || "bag"; // TODO: phase out use view types instead
		$.each(jsontiddlers, function(i, t) {
			var use = false;
			if(!options.showBags || (options.showBags && options.showBags.contains(t.bag))) {
				use = true;
			}
			if(options.hideBags && options.hideBags.contains(t.bag)) {
				use = false;
			}
			if(use) {
				var spaceName = t[spaceField];
				var tiddler = config.adaptors.tiddlyweb.toTiddler(t, tweb.host);
				tiddler.fields["server.space"] = tiddlyspace.resolveSpaceName(spaceName);
				tiddlers.push(tiddler);
			}
		});
		return tiddlers;
	},
	_scanCallback: function(place, jsontiddlers, options) {
		var locale = followersMacro.locale;
		var tiddlers = scanMacro._tiddlerfy(jsontiddlers, options);
		
		if(options.sort) {
			tiddlers = store.sortTiddlers(tiddlers, options.sort);
		}
		if(options.filter) {
			var _store = new TiddlyWiki();
			config.lastStore = _store;
			for(var i = 0; i < tiddlers.length; i++) {
				var clone = tiddlers[i];
				clone.title = tiddlyspace.getLocalTitle(clone.title, clone.fields['server.workspace']);
				_store.addTiddler(clone);
			}
			tiddlers = _store.filterTiddlers(options.filter);
		}
		if(place) {
			$(place).empty();
			var list = $("<ul />").appendTo(place)[0];
			scanMacro.template(list, tiddlers, options.template);
			if(tiddlers.length === 0) {
				$("<li />").text(options.emptyMessage || locale.noone).appendTo(list);
				$(list).addClass("emptyList");
			}
		}
		if(options.callback) {
			options.callback(tiddlers);
		}
	},
	constructSearchUrl: function(host, options) {
		if(options.url) {
			return options.url;
		}
		var inputs = options.searchValues;
		var tag = options.tag;
		var searchField = options.searchField || "title";
		var searchQuery = [];
		for(var i = 0; i < inputs.length; i++) {
			searchQuery.push('%0:"%1"'.format(searchField, inputs[i]));
		}
		var query = searchQuery.join(" OR ");
		query = tag ? "(%0) AND tag:%1".format(query, tag) : query;
		query = options.query ? "%0;%1;".format(query, options.query) : query;
		query = options.fat ? "%0&fat=1".format(query) : query;
		return '%0/search?q=%1'.format(host, query);
	},
	scan: function(place, options) { // TODO: make use of list macro with url filter
		var locale = followersMacro.locale;
		options.template = options.template ? options.template : "ScanTemplate";
		followMacro.getHosts(function(host, tsHost) {
			$(place).text(followersMacro.locale.pleaseWait);
			options = options ? options: {};
			var url = scanMacro.constructSearchUrl(host, options);
			if(options.cache && scanMacro.scanned[url]) {
				var tiddlers = scanMacro.scanned[url].tiddlers;
				var run = function(tiddlers) {
					scanMacro._scanCallback(place, tiddlers, options);
				};
				if(tiddlers) {
					run(tiddlers);
				} else {
					scanMacro.scanned[url].callbacks.push(run);
				}
			} else {
				var callback = function(tiddlers) {
					scanMacro._scanCallback(place, tiddlers, options);
				};
				if(scanMacro.scanned[url] && scanMacro.scanned[url].callbacks) {
					scanMacro.scanned[url].callbacks.push(callback);
				} else {
					scanMacro.scanned[url] = {
						callbacks: [callback]
					};
				}
				ajaxReq({
					url: url,
					dataType: "json",
					success: function(tiddlers) {
						scanMacro.scanned[url].tiddlers = tiddlers;
						var callbacks = scanMacro.scanned[url].callbacks;
						while(callbacks.length > 0) {
							callbacks.pop()(tiddlers);
						}
					},
					error: function(xhr) {
						$(place).empty();
						$("<span />").addClass("annotation error").text(locale.error.format(xhr.status)).appendTo(place);
					}
				});
			}
		});
	},
	template: function(place, tiddlers, template) { // TODO: make use of list macro.
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			var item = $('<li class="spaceName" />').appendTo(place)[0];
			var spaceName = tiddler.fields["server.space"] || "";
			var templateText = store.getTiddlerText(template).replace(/\$1/mg, spaceName);
			wikify(templateText, item, null, tiddler);
		}
	},
	getOptions: function(paramString, tiddler) {
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var options = { query: false, sort: false, tag: false, template: false, showBags: args.show || false,
			hideBags: args.hide || false, filter: false, spaceField: "bag", searchField: "title", fat: false,
			emptyMessage: false };
		for(var name in args) {
			if(name != "name") {
				if(name == "fat") {
					options[name] = true;
				} else {
					options[name] = args[name][0];
				}
			}
		}
		// if user has set searchField to modifier, then use the modifiers value if available otherwise use searchValues.
		var searchField = options.searchField;
		var searchValues = args[searchField] ? args[searchField] : args.searchValues;
		// if neither of those were used use the first parameter
		var defaultValues = tiddler ? [ tiddler.title ] : [];
		options.searchValues = searchValues ? searchValues : ( args.name ? [args.name[0]] : defaultValues);
		return options;
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var container = $("<div />").addClass("scanResults resultsArea").appendTo(place)[0];
		var options = scanMacro.getOptions(paramString, tiddler);
		scanMacro.scan(container, options);
	}
};

var followersMacro = config.macros.followers = {
	locale: {
		loggedOut: "Please login to see the list of followers",
		noSupport: "We were unable to retrieve followers as your browser does not support following.",
		pleaseWait: "Please wait while we look this up...",
		error: "Error %0 occurred whilst retrieving data from server",
		noone: "None."
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var locale = followersMacro.locale;
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var username = args.name ? args.name[0] : false;
		var container = $('<div class="followers" />').text(locale.pleaseWait).
			appendTo(place)[0];
		var followersCallback = function(user) {
			if(user.anon) {
				$("<span />").text(locale.loggedOut).appendTo(container);
			} else {
				var options = scanMacro.getOptions(paramString);
				$.extend(options, {
					url: "/search?q=title:@%0 OR title:%0 tag:%1 _limit:%2".
						format(user.name, followMacro.followTag, LIMIT_FOLLOWING),
					spaceField: "bag",
					template: options.template ? options.template : "FollowersTemplate"
				});
				scanMacro.scan(container, options);
			}
		};
		return !username ? followersCallback({ name: currentSpace }) : followersCallback({ name: username });
	}
};

var followingMacro = config.macros.following = {
	locale: {
		pleaseWait: followersMacro.locale.pleaseWait,
		loggedOut: "Please login to see who you are following",
		noSupport: followersMacro.locale.noSupport,
		error: followersMacro.locale.error,
		noone: followersMacro.locale.noone
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var locale = followingMacro.locale;
		var args = paramString.parseParams("name", null, true, false, true)[0];
		var fat = args.fat ? true : false;
		var username = args.name ? args.name[0] : false;
		var container = $('<div class="following" />').text(locale.pleaseWait).
			appendTo(place)[0];
		var followingCallback = function(user) {
			if(user.anon) {
				$("<span />").text(locale.loggedOut).appendTo(container);
			} else {
				var options = scanMacro.getOptions(paramString);
				$.extend(options, {
					url: "/search?q=bag:%0_public tag:%1 _limit:%2".format(user.name, followMacro.followTag, LIMIT_FOLLOWING),
					spaceField: "title",
					template: options.template ? options.template : "FollowingTemplate"
				});
				scanMacro.scan(container, options);
			}
		};
		return !username ? followingCallback({ name: currentSpace }) : followingCallback({ name: username });
	}
};

var linkedMacro = config.macros.linkedTiddlers = {
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var args = paramString.parseParams("anon")[0];
		var title = params[0] || tiddler.fields["server.title"] || tiddler.title;
		var tid = store.getTiddler(title);
		var containingTiddler = story.findContainingTiddler(place).getAttribute('tiddler');
		if(tid) {
			followMacro.makeButton(place, {
				spaceField: "recipe",
				url: "/bags/%0/tiddlers/%1/backlinks".format(tid.fields['server.bag'],
					encodeURIComponent(tid.title)),
				blacklisted: followMacro.getBlacklist(),
				title: title,
				containingTiddler: containingTiddler,
				user: params[1] || false,
				consultFollowRelationship: args.follow ? true : false });
		}
	}
};

if(config.options.chkFollowTiddlersIsLinkedTiddlers) {
	merge(config.macros.followTiddlers, config.macros.linkedTiddlers);
	config.shadowTiddlers.FollowTiddlersHeading = "These are the other tiddlers that link to this tiddler.";
}

})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceInitialization|
|''Version''|0.7.3|
|''Description''|Initializes new TiddlySpaces the first time they are created|
|''Status''|@@beta@@|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/blob/master/src/plugins/TiddlySpaceInit.js|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig RandomColorPalettePlugin chrjs ImageMacroPlugin|
!TODO
* robust error notification and recovery
!MarkupPreHead
<!--{{{-->
<link href="/bags/%0_public/tiddlers.atom" rel="alternate"
	type="application/atom+xml" title="%0's public feed" />
<link rel="canonical" href="%1/" />
<!--}}}-->
!Code
***/
//{{{
(function($) {

var versionField = "tiddlyspaceinit_version";
var markupPreHead = store.getTiddlerText(tiddler.title + "##MarkupPreHead", "");
var tiddlyspace = config.extensions.tiddlyspace;
var currentSpace = tiddlyspace.currentSpace;
var tweb = config.extensions.tiddlyweb;

var plugin = config.extensions.TiddlySpaceInit = {
	version: "0.6",
	SiteTitle: "%0",
	SiteSubtitle: "a TiddlySpace",
	flagTitle: "%0SetupFlag",
	flagWarning: "Please do not modify this tiddler; it was created " +
		"automatically upon space creation.",

	dispatch: function(ev) {
		var title = plugin.flagTitle.format([currentSpace.name]);
		config.annotations[title] = plugin.flagWarning;
		if(currentSpace.type != "private") {
			return;
		}
		var tiddlers = [];
		var tid = store.getTiddler(title);
		if(tid) {
			curVersion = parseFloat(tid.fields[versionField]);
			reqVersion = parseFloat(plugin.version);
			if(curVersion < reqVersion) {
				plugin.update(curVersion, tid);
				tid.fields[versionField] = plugin.version;
				tid.incChangeCount();
				tid = store.saveTiddler(tid);
				tiddlers.push(tid);
			}
		} else { // first run
			tid = new Tiddler(title);
			tid.tags = ["excludeLists", "excludeSearch", "excludePublisher"];
			tid.fields = $.extend({}, config.defaultCustomFields);
			tid.fields[versionField] = plugin.version;
			tid.text = "@@%0@@".format([plugin.flagWarning]);
			tid = store.saveTiddler(tid);
			tiddlers = tiddlers.concat(plugin.firstRun(), tid);
		}
		autoSaveChanges(null, tiddlers);
	},
	update: function(curVersion, flagTiddler) {
		if(curVersion < 0.2) {
			this.createAvatar();
		}
		if(curVersion < 0.3) {
			flagTiddler.tags.pushUnique("excludePublisher"); // XXX: never persisted
		}
		if(curVersion < 0.5) { // v0.4 was faulty
			this.setupMarkupPreHead();
		}
		if(curVersion < 0.6) {
			this.purgeSystemSettings();
		}
	},
	pubTid: {
		tags: ["excludeLists", "excludeSearch"],
		fields: $.extend({}, config.defaultCustomFields, {
			"server.workspace": tiddlyspace.getCurrentWorkspace("public")
		})
	},
	makeTiddlerIfNot: function(tiddler) {
		if (!store.tiddlerExists(tiddler.title)) {
			$.extend(true, tiddler, plugin.pubTid);
			return [store.saveTiddler(tiddler)];
		} else {
			return [];
		}
	},
	firstRun: function() {
		var tiddlers = [];
		// generate Site*itle
		$.each(["SiteTitle", "SiteSubtitle"], function(i, item) {
			var tid = new Tiddler(item);
			tid.text = plugin[item].format([currentSpace.name]);
			tiddlers.push.apply(tiddlers,
				plugin.makeTiddlerIfNot(tid));
		});
		// generate public ColorPalette
		var tid = new Tiddler("ColorPalette");
		tid.text = config.macros.RandomColorPalette.generatePalette({
			saturation_pale: 0.67, saturation_light: 0.53,
			saturation_mid: 0.43, saturation_dark: 0.06,
			pale: 0.99, light: 0.85, mid: 0.5, dark: 0.31
		},
			false);
		tiddlers.push.apply(tiddlers, plugin.makeTiddlerIfNot(tid));
		this.createAvatar();
		this.setupMarkupPreHead();
		return tiddlers;
	},
	// remove _cookie slices (TiddlyWiki 2.6.2 beta 6 remnants)
	purgeSystemSettings: function() {
		var ss = store.getTiddler("SystemSettings");
		if(ss) {
			var lines = ss.text.split("\n");
			var persistentOptions = $.grep(lines, function(line, i) {
				return line.indexOf("_cookie:") == -1;
			});
			ss.text = persistentOptions.join("\n");
			ss = store.saveTiddler(ss);
			autoSaveChanges(null, [ss]);
		}
	},
	createAvatar: function() {
		var avatar = "SiteIcon";
		var host = tweb.host;
		var notify = function(xhr, error, exc) {
			displayMessage("ERROR: could not create avatar - " + // TODO: i18n
				"%0: %1".format([xhr.statusText, xhr.responseText]));
			// TODO: resolve!?
		};

		var pubBag = tiddlyspace.getCurrentBag("public");
		var tid = new tiddlyweb.Tiddler(avatar);
		tid.bag = new tiddlyweb.Bag(pubBag, host);

		var callback = function(data, status, xhr) {}; // avatar already exists; do nothing
		var errback = function(xhr, error, exc) {
			if(xhr.status != 404) {
				return;
			}
			// copy default avatar
			var _notify = function(tid, status, xhr) {
				displayMessage("created avatar"); // TODO: i18n
				var image = config.macros.image;
				if(image && image.refreshImage) {
					var uri = "/%0/tiddlers/SiteIcon".
						format(tiddlyspace.getCurrentWorkspace("public"));
					image.refreshImage(uri);
					image.refreshImage("SiteIcon");
				}
			};
			var _callback = function(tid, status, xhr) {
				tid.title = avatar;
				tid.bag.name = pubBag;
				delete tid.etag;
				tid.put(_notify, notify); // TODO: add to current session document (via adaptor?)
			};
			tweb.getUserInfo(function(user) {
				var avatarTitle = currentSpace.name == user.name ?
					"defaultUserIcon" : "defaultSiteIcon";
				var tid = new tiddlyweb.Tiddler(avatarTitle);
				tid.bag = new tiddlyweb.Bag("common", host);
				tid.get(_callback, notify);
			});
		};
		tid.get(callback, errback);
	},
	savePublicTiddlerText: function(title, text, pubWorkspace) {
		var tid = new Tiddler(title);
		tid.text = text;
		tid.tags = ["excludeLists"];
		tid.fields = $.extend({}, config.defaultCustomFields);
		tid.fields["server.workspace"] = pubWorkspace;
		tid.fields["server.page.revision"] = "false";
		tid = store.saveTiddler(tid);
		autoSaveChanges(null, [tid]);
	},
	setupMarkupPreHead: function() {
		var pubWorkspace = tiddlyspace.getCurrentWorkspace("public");
		var existing = store.getTiddler("MarkupPreHead");
		if(!existing || existing.fields["server.workspace"] != pubWorkspace) {
			var context = this;
			tweb.getStatus(function(status) {
				var text = markupPreHead.format(currentSpace.name,
					tiddlyspace.getHost(status.server_host, currentSpace.name));
				context.savePublicTiddlerText("MarkupPreHead", text,
					pubWorkspace);
			});
		}
		// also set up DefaultTiddlers
		var title = "DefaultTiddlers";
		existing = store.getTiddler(title) || new Tiddler(title);
		if(existing.fields["server.workspace"] != pubWorkspace) {
			var text = existing.text || store.getShadowTiddlerText(title);
			this.savePublicTiddlerText(title, text, pubWorkspace);
		}
	}
};

$(document).bind("startup", plugin.dispatch);

})(jQuery);
//}}}
/***
|''Name:''|TiddlySpaceLinkPlugin|
|''Description:''|Formatter to reference other spaces from wikitext |
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com) |
|''Source:''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceLinkPlugin.js|
|''Version:''|1.4.2|
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''~CoreVersion:''|2.4|
!!Documentation
This plugin provides wikitext formatters for referencing another [[space|Space]] on the same TiddlySpace server, as in the following examples:
<<<
  {{{@space}}} -- @space 
  {{{~@space}}} -- ~@space 
  {{{Tiddler@space}}} -- Tiddler@space
  {{{[[Tiddler Title]]@space}}} -- [[Tiddler Title]]@space 
  {{{[[Link text|Tiddler Title]]@space}}} -- [[Link text|Tiddler Title]]@space
<<<
Links to tiddlers with a title begining with an "@" remain as tiddlyLinks:
<<<
  {{{[[@tiddler]]}}} -- [[@tiddler]]
<<<
and these may be changed into a space link using {{{@@}}}:
<<<
  {{{[[@@space]]}}} -- [[@@space]]
  {{{[[Link to an another space|@@space]]}}} -- [[Link to another space|@@space]]
  {{{[[@space|@@space]]}}} -- [[@space|@@space]]
<<<
TiddlySpace includes the [[TiddlySpaceLinkPlugin]] which provides WikiText markup for linking to other spaces on the same server. For example @glossary is a link to the {{{glossary}}} space and [[Small Trusted Group]]@glossary a link to an individual tiddler in the @glossary space. Prefixing the link with a tilde escapes the link, for example {{{~@space}}}.
Email addresses, for example joe.bloggs@example.com and mary@had.a.little.lamb.org should be unaffected.
!!Features
The plugin provides external links decorated so that other plugins may be included to add features such as the ability to dynamically pull externally linked tiddlers into the current TiddlyWiki.
Wikitext linking to a space on another server, for example from a tiddler in a space on tiddlyspace.com to a tiddler or a space on example.com, isn't currently supported. 
!!Code
***/
//{{{
/*jslint onevar: false nomen: false plusplus: false */
/*global jQuery config createTiddlyText createExternalLink createTiddlyLink */

function createSpaceLink(place, spaceName, title, alt, isBag) {
	var link, a, currentSpaceName, label;
	try {
		if (spaceName === config.extensions.tiddlyspace.currentSpace.name) {
			title = title || spaceName;
			a = createTiddlyLink(place, title, false);
			jQuery(a).text(alt || title);
			return a;
		}
	} catch (ex1) {
		currentSpaceName = false;
	}

	a = jQuery("<a />").addClass('tiddlySpaceLink externalLink').appendTo(place)[0];
	if(title) {
		jQuery(a).attr('tiddler', title);
	}
	if(isBag) {
		jQuery(a).attr('bag', spaceName);
	} else {
		jQuery(a).attr('tiddlyspace', spaceName);
	}

	config.extensions.tiddlyweb.getStatus(function(status) {
		link = status.server_host.url;
		if (title) {
			label = alt || title;
			link = link + "/" + encodeURIComponent(title);
		} else {
			label = alt || spaceName;
		}
		// assumes a http URI without user:pass@ prefix
		if(!isBag) {
			link = link.replace("http://", "http://" + spaceName.toLowerCase() + ".");
		} else {
			link += "/bags/" + spaceName + "/tiddlers.wiki";
		}
		jQuery(a).attr("href", link).text(label);
	});
	return a;
}

(function ($) {

	config.textPrimitives.spaceName = "[a-zA-Z][a-zA-Z0-9-]*[a-zA-Z0-9]";
	config.textPrimitives.spaceNameStrict = "[a-z][a-z0-9-]*";
	config.textPrimitives.bareTiddlerLetter = config.textPrimitives.anyLetterStrict;

	config.formatters.splice(0, 0, {
		name: "spacenameLink",
		match: config.textPrimitives.unWikiLink + "?" + config.textPrimitives.bareTiddlerLetter + "*@" + config.textPrimitives.spaceName + "\\.?.?",
		lookaheadRegExp: new RegExp(config.textPrimitives.unWikiLink + "?(" + config.textPrimitives.bareTiddlerLetter + "*)@(" + config.textPrimitives.spaceName + ")", "mg"),
		handler: function (w) {
			if (w.matchText.substr(w.matchText.length - 2, 1) === '.' && w.matchText.substr(w.matchText.length - 1, 1).match(/[a-zA-Z]/)) {
				w.outputText(w.output, w.matchStart, w.nextMatch);
				return;
			}
			if (w.matchText.substr(0, 1) === config.textPrimitives.unWikiLink) {
				w.outputText(w.output, w.matchStart + 1, w.nextMatch);
				return;
			}
			this.lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
			if (lookaheadMatch && lookaheadMatch.index === w.matchStart) {
				createSpaceLink(w.output, lookaheadMatch[2], lookaheadMatch[1]);
				w.nextMatch = this.lookaheadRegExp.lastIndex;
			}
		}
	},
	{
		name: "tiddlySpaceLink",
		match: "\\[\\[[^\\|\\]]*\\|*@@" + config.textPrimitives.spaceName + "\\]",
		lookaheadRegExp: new RegExp("\\[\\[(.*?)(?:\\|@@(.*?))?\\]\\]", "mg"),
		handler: function (w) {
			this.lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
			if (lookaheadMatch && lookaheadMatch.index === w.matchStart) {
				var alt = lookaheadMatch[2] ? lookaheadMatch[1] : lookaheadMatch[1].replace(/^@@/, "");
				var space = lookaheadMatch[2] || alt;
				createSpaceLink(w.output, space, "", alt);
				w.nextMatch = this.lookaheadRegExp.lastIndex;
			}
		}
	},
	{
		name: "tiddlyLinkSpacenameLink",
		match: "\\[\\[[^\\[]*\\]\\]@",
		lookaheadRegExp: new RegExp("\\[\\[(.*?)(?:\\|(.*?))?\\]\\]@(" + config.textPrimitives.spaceName + ")", "mg"),
		handler: function (w) {
			this.lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
			if (lookaheadMatch && lookaheadMatch.index === w.matchStart) {
				var title = lookaheadMatch[2] || lookaheadMatch[1];
				var alt = lookaheadMatch[1] || lookaheadMatch[2];
				createSpaceLink(w.output, lookaheadMatch[3], title, alt);
				w.nextMatch = this.lookaheadRegExp.lastIndex;
			}
		}
	});

	// ensure space links don't appear as missing links
	config.textPrimitives.brackettedLink = "\\[\\[([^\\]][^@\\]][^\\]]*)\\]\\](?=[^@])";
	config.textPrimitives.titledBrackettedLink = "\\[\\[([^\\[\\]\\|]+)\\|([^\\[\\]\\|]+)\\]\\](?=[^@])";

	// reevaluate derrived expressions ..
	config.textPrimitives.tiddlerForcedLinkRegExp = new RegExp("(?:" + config.textPrimitives.titledBrackettedLink + ")|(?:" +
		config.textPrimitives.brackettedLink + ")|(?:" +
		config.textPrimitives.urlPattern + ")","mg");
	config.textPrimitives.tiddlerAnyLinkRegExp = new RegExp("("+ config.textPrimitives.wikiLink + ")|(?:" +
		config.textPrimitives.titledBrackettedLink + ")|(?:" +
		config.textPrimitives.brackettedLink + ")|(?:" +
		config.textPrimitives.urlPattern + ")","mg");

	// treat space links in titledBracketedLink as external links
	var missingTiddlySpaceLink = new RegExp("^@@" + config.textPrimitives.spaceName + "$", "");
	var isExternalLink = config.formatterHelpers.isExternalLink;
	config.formatterHelpers.isExternalLink = function(link) {
		return missingTiddlySpaceLink.test(link) || isExternalLink(link);
	};

}(jQuery));
//}}}
/***
|''Name''|TiddlySpacePublishingCommands|
|''Version''|0.8.5|
|''Status''|@@beta@@|
|''Description''|toolbar commands for drafting and publishing|
|''Author''|Jon Robson|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpacePublishingCommands.js|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig TiddlySpaceFilters|
!Usage
Provides changeToPrivate, changeToPublic and saveDraft commands
Provides TiddlySpacePublisher macro.
{{{<<TiddlySpacePublisher type:private>>}}} make lots of private tiddlers public.
{{{<<TiddlySpacePublisher type:public>>}}} make lots of public tiddlers public.
!TODO
* add public argument?
!Code
***/
//{{{
(function($) {

var tiddlyspace = config.extensions.tiddlyspace;
var originMacro = config.macros.tiddlerOrigin;

tiddlyspace.getTiddlerStatusType = function(tiddler) {
	var isShadow = store.isShadowTiddler(tiddler.title);
	var exists = store.tiddlerExists(tiddler.title);
	if(isShadow && !exists) {
		return "shadow";
	} else if(!exists) {
		return "missing";
	} else {
		var types = ["private", "public"];
		var type = "external";
		for(var i = 0; i < types.length; i++) {
			var t = types[i];
			type = config.filterHelpers.is[t](tiddler) ? t : type;
		}
		if(config.filterHelpers.is.unsynced(tiddler)) {
			type = type == "private" ? "unsyncedPrivate" : "unsyncedPublic";
		}
		return type;
	}
};

var cmd = config.commands.publishTiddler = {
	text: "make public",
	tooltip: "Change this private tiddler into a public tiddler",
	errorMsg: "Error publishing %0: %1",

	isEnabled: function(tiddler) {
		return !readOnly && config.filterHelpers.is["private"](tiddler);
	},
	handler: function(ev, src, title) {
		var tiddler = store.getTiddler(title);
		if(tiddler) {
			var newBag = cmd.toggleBag(tiddler.fields["server.bag"]);
			this.moveTiddler(tiddler, {
				title: tiddler.fields["publish.name"] || tiddler.title,
				fields: { "server.bag": newBag }
			});
		}
	},
	toggleBag: function(bag, to) {
		var newBag;
		if(typeof bag != typeof "") {
			var tiddler = bag;
			bag = tiddler.fields["server.bag"];
		}
		if(bag.indexOf("_private") > -1) { // should make use of endsWith
			to = to ? to : "public";
			newBag = bag.replace("_private", "_" + to);
		} else {
			to = to ? to : "private";
			newBag = bag.replace("_public", "_" + to);
		}
		return newBag;
	},
	copyTiddler: function(title, newTitle, newBag, callback) {
		var original = store.getTiddler(title);
		newTitle = newTitle ? newTitle : title;
		var adaptor = original.getAdaptor();
		var publish = function(original, callback) {
			var tiddler = $.extend(new Tiddler(newTitle), original);
			tiddler.fields = $.extend({}, original.fields, {
				"server.bag": newBag,
				"server.workspace": "bags/%0".format(newBag),
				"server.page.revision": "false"
			});
			delete tiddler.fields["server.title"];
			tiddler.title = newTitle;
			adaptor.putTiddler(tiddler, null, null, callback);
		};
		publish(original, callback);
	},
	moveTiddler: function(tiddler, newTiddler, callback) {
			var info = {
			copyContext: {},
			deleteContext: {}
		};
		var _dirty = store.isDirty();
		var adaptor = tiddler.getAdaptor();
		var newTitle = newTiddler.title;
		var oldTitle = tiddler.title;
		delete tiddler.fields["server.workspace"];
		var oldBag = tiddler.fields["server.bag"];
		var newBag = newTiddler.fields["server.bag"];
		var newWorkspace = "bags/%0".format(newBag);
		cmd.copyTiddler(oldTitle, newTitle, newBag, function(ctx) {
				info.copyContext = ctx;
				var context = {
					tiddler: tiddler,
					workspace: newWorkspace
				};
				store.addTiddler(ctx.tiddler);
				tiddler.title = oldTitle; // for cases where a rename occurs
				if(ctx.status) { // only do if a success
					if(oldBag != newBag) {
						adaptor.deleteTiddler(tiddler, context, {}, function(ctx) {
							info.deleteContext = ctx;
							var el;
							if(tiddler) {
								tiddler.fields["server.workspace"] = newWorkspace;
								tiddler.fields["server.bag"] = newBag;
							}
							el = el ? el : story.refreshTiddler(oldTitle, null, true);
							if(oldTitle != newTitle) {
								store.deleteTiddler(oldTitle);
								store.notify(oldTitle, true);
							}
							if(el) {
								story.displayTiddler(el, newTitle);
							}
							if(oldTitle != newTitle) {
								story.closeTiddler(oldTitle);
							}
							if(callback) {
								callback(info);
							}
							store.setDirty(_dirty);
						});
					} else {
						if(callback) {
							callback(info);
						}
					}
					refreshDisplay();
				}
		});
	}
};

var changeToPrivate = config.commands.changeToPrivate = {
	text: "make private",
	tooltip: "turn this public tiddler into a private tiddler",
	isEnabled: function(tiddler) {
		return !readOnly && config.filterHelpers.is["public"](tiddler);
	},
	handler: function(event, src, title) {
		var tiddler = store.getTiddler(title);
		var newBag = cmd.toggleBag(tiddler, "private");
		var newTiddler = { title: title, fields: { "server.bag": newBag }};
		cmd.moveTiddler(tiddler, newTiddler);
	}
};
config.commands.changeToPublic = cmd;

/* Save as draft command */
var saveDraftCmd = config.commands.saveDraft = {
	text: "save draft",
	tooltip: "Save as a private draft",
	isEnabled: function(tiddler) {
		return changeToPrivate.isEnabled(tiddler);
	},
	getDraftTitle: function(title) {
		var draftTitle;
		var draftNum = "";
		while(!draftTitle) {
			var suggestedTitle = "%0 [draft%1]".format(title, draftNum);
			if(store.getTiddler(suggestedTitle)) {
				draftNum = !draftNum ? 2 : draftNum + 1;
			} else {
				draftTitle = suggestedTitle;
			}
		}
		return draftTitle;
	},
	createDraftTiddler: function(title, gatheredFields) {
		var tiddler = store.getTiddler(title);
		var draftTitle = saveDraftCmd.getDraftTitle(title);
		var draftTiddler = new Tiddler(draftTitle);
		if(tiddler) {
			$.extend(true, draftTiddler, tiddler);
		} else {
			$.extend(draftTiddler.fields, config.defaultCustomFields);
		}
		for(var fieldName in gatheredFields) {
			if(TiddlyWiki.isStandardField(fieldName)) {
				draftTiddler[fieldName] = gatheredFields[fieldName];
			} else {
				draftTiddler.fields[fieldName] = gatheredFields[fieldName];
			}
		}
		var privateBag = tiddlyspace.getCurrentBag("private");
		var privateWorkspace = tiddlyspace.getCurrentWorkspace("private");
		draftTiddler.title = draftTitle;
		draftTiddler.fields["publish.name"] = title;
		draftTiddler.fields["server.workspace"] = privateWorkspace;
		draftTiddler.fields["server.bag"] = privateBag;
		draftTiddler.fields["server.title"] = draftTitle;
		draftTiddler.fields["server.page.revision"] = "false";
		delete draftTiddler.fields["server.etag"];
		return draftTiddler;
	},
	handler: function(ev, src, title) {
		var tiddler = store.getTiddler(title); // original tiddler
		var tidEl = story.getTiddler(title);
		var uiFields = {};
		story.gatherSaveFields(tidEl, uiFields);
		var tid = saveDraftCmd.createDraftTiddler(title, uiFields);
		tid = store.saveTiddler(tid.title, tid.title, tid.text, tid.modifier,
			new Date(), tid.tags, tid.fields);
		autoSaveChanges(null, [tid]);
		story.closeTiddler(title);
		story.displayTiddler(src, title);
		story.displayTiddler(src, tid.title);
	}
};

var macro = config.macros.TiddlySpacePublisher = {
	locale: {
		title: "Batch Publisher",
		changeStatusLabel: "Make %0",
		noTiddlersText: "No tiddlers to publish",
		changeStatusPrompt: "Make all the selected tiddlers %0.",
		description: "Change tiddlers from %0 to %1 in this space"
	},

	listViewTemplate: {
		columns: [
			{ name: "Selected", field: "Selected", rowName: "title", type: "Selector" },
			{ name: "Tiddler", field: "tiddler", title: "Tiddler", type: "Tiddler" },
			{ name: "Status", field: "status", title: "Status", type: "WikiText" }
		],
		rowClasses: []
	},

	changeStatus: function(tiddlers, status, callback) { // this is what is called when you click the publish button
		var publicBag;
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			var newTiddler = {
				title: tiddler.title,
				fields: { "server.bag": cmd.toggleBag(tiddler, status) }
			};
			cmd.moveTiddler(tiddler, newTiddler, callback);
		}
	},
	getMode: function(paramString) {
		var params = paramString.parseParams("anon")[0];
		var status = params.type ?
			(["public", "private"].contains(params.type[0]) ? params.type[0] : "private") :
			"private";
		var newStatus = status == "public" ? "private" : "public";
		return [status, newStatus];
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var wizard = new Wizard();
		var locale = macro.locale;
		var status = macro.getMode(paramString);
		wizard.createWizard(place, locale.title);
		wizard.addStep(macro.locale.description.format(status[0], status[1]),
			'<input type="hidden" name="markList" />');
		var markList = wizard.getElement("markList");
		var listWrapper = $("<div />").addClass("batchPublisher").
			attr("refresh", "macro").attr("macroName", macroName).
			attr("params", paramString)[0];
		markList.parentNode.insertBefore(listWrapper, markList);
		$.data(listWrapper, "wizard", wizard);
		macro.refresh(listWrapper);
	},
	getCheckedTiddlers: function(listWrapper, titlesOnly) {
		var tiddlers = [];
		$(".chkOptionInput[rowName]:checked", listWrapper).each(function(i, el) {
			var title = $(el).attr("rowName");
			if(titlesOnly) {
				tiddlers.push(title);
			} else {
				tiddlers.push(store.getTiddler(title));
			}
		});
		return tiddlers;
	},
	refresh: function(listWrapper) {
		var checked = macro.getCheckedTiddlers(listWrapper, true);
		var paramString = $(listWrapper).empty().attr("params");
		var wizard = $.data(listWrapper, "wizard");
		var locale = macro.locale;
		var params = paramString.parseParams("anon")[0];
		var publishCandidates = [];
		var status = macro.getMode(paramString);
		var pubType = status[0];
		var newPubType = status[1];
		var tiddlers = params.filter ? store.filterTiddlers(params.filter[0]) :
			store.filterTiddlers("[is[%0]]".format(pubType));
		var enabled = [];
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			var title = tiddler.title;
			if(!tiddler.tags.contains("excludePublisher") && title !== "SystemSettings") {
				publishCandidates.push({ title: title, tiddler: tiddler, status: pubType});
			}
			if(checked.contains(title)) {
				enabled.push("[rowname=%0]".format(title));
			}
		}

		if(publishCandidates.length === 0) {
			createTiddlyElement(listWrapper, "em", null, null, locale.noTiddlersText);
		} else {
			var listView = ListView.create(listWrapper, publishCandidates, macro.listViewTemplate);
			wizard.setValue("listView", listView);
			var btnHandler = function(ev) {
				var tiddlers = macro.getCheckedTiddlers(listWrapper);
				var callback = function(status) {
					$(".batchPublisher").each(function(i, el) {
						macro.refresh(el);
					});
				};
				macro.changeStatus(tiddlers, newPubType, callback);
			};
			wizard.setButtons([{
				caption: locale.changeStatusLabel.format(newPubType),
				tooltip: locale.changeStatusPrompt.format(newPubType),
				onClick: btnHandler
			}]);
			$(enabled.join(",")).attr("checked", true); // retain what was checked before
		}
	}
};

})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceRevertRevision|
|''Description''|Revert to a previous revision|
|''Author''|BenGillies|
|''Version''|0.1|
|''Status''|unstable|
|''Source''|http://github.com/TiddlySpace/tiddlyspace|
|''CodeRepository''|http://github.com/TiddlySpace/tiddlyspace|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.6.0|
|''Requires''|TiddlyWebAdaptor TiddlySpaceRevisionView|
!Usage
Add a control button to revert to a particular revision.

The button must be called from within a revision, as generated by TiddlySpaceRevisionView
!Code
***/
//{{{
(function($) {

config.commands.revert = {
	text: "revert",
	tooltip: "make this revision the current one",
	handler: function(ev, src, title) {
		var revElem = story.getTiddler(title);
		var tidToRevert = store.getTiddler($(revElem).attr("revName"));

		var revision = store.getTiddler(title);
		if ((revision) && (tidToRevert)) {
			tidToRevert.text = revision.text;
			var newFields = merge({}, revision.fields);
			for (var fieldName in newFields) {
				if (fieldName.substr(0, 7) === "server.") {
					delete newFields[fieldName];
				}
			}
			merge(tidToRevert.fields, newFields);
			tidToRevert.tags = merge([], revision.tags);
			tidToRevert.fields.changecount = 1;
			delete tidToRevert.fields.doNotSave;

			store.saveTiddler(tidToRevert.title, tidToRevert.title,
				tidToRevert.text, null, null, tidToRevert.tags,
				tidToRevert.fields, false, tidToRevert.created, tidToRevert.creator);

			autoSaveChanges(true);
		}
	}
};

})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceRevisionView|
|''Description''|Show tiddler revisions in a stack of cards view|
|''Author''|BenGillies|
|''Version''|0.2.0|
|''Status''|beta|
|''Source''|http://github.com/TiddlySpace/tiddlyspace|
|''CodeRepository''|http://github.com/TiddlySpace/tiddlyspace|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.6.0|
|''Requires''|TiddlyWebAdaptor|
!Usage
The viewRevisions macro can be attached to any element, which should be passed
in as a parameter.

For example:

&lt;&lt;viewRevisions page:10 link:"<<view modified date>>"&gt;&gt;

would show the revisions "stack of cards" view, 10 at a time, when the modified
date is clicked.
!Code
***/
//{{{
(function($) {

var me = config.macros.viewRevisions = {
	revisionTemplate: "RevisionTemplate",
	revSuffix: " [rev. #%0]", // text to append to each tiddler title
	defaultPageSize: 5, // default number of revisions to show
	defaultLinkText: "View Revisions", // when there's nothing else to use
	offsetTop: 30, // in px
	offsetLeft: 10, // in px
	shiftDownDelay: 50, // in ms
	visibleSlideAmount: 20, // amount of revisions to show on left hand edge after sliding
	zIndex: 100, // default z-index
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		params = paramString.parseParams(null, null, true)[0];
		var tiddlerElem = story.findContainingTiddler(place);

		var revButton;
		var pageSize = parseInt(params.page[0], 10) || me.defaultPageSize;
		var linkObj = params.link ? params.link[0] || me.defaultLinkText : false;
		if(linkObj) {
			revButton = $('<span class="button openRevisions" />')
				.appendTo(place);
			wikify(linkObj, revButton[0], null, tiddler);
		} else {
			revButton = place;
		}

		$(revButton).click(function() {
			if (!$(tiddlerElem).hasClass("revisions")) {
				me.showRevisions(tiddlerElem, tiddler, pageSize);
			} else {
				me.closeRevisions(tiddlerElem);
			}
		});
	},

	// initialisation for revision view
	showRevisions: function(tiddlerElem, tiddler, pageSize) {
		var context = {
			host: tiddler.fields["server.host"],
			workspace: tiddler.fields["server.workspace"]
		};
		$(tiddlerElem).addClass("revisions").attr("revName", tiddler.title);
		// ensure toolbar commands deactivate RevisionsView
		$("a", ".toolbar", tiddlerElem).each(function(index, btn) {
			var _onclick = btn.onclick;
			btn.onclick = function(e) {
				me.closeRevisions(tiddlerElem);
				_onclick.apply(this, arguments);
			};
		});
		// ensure default action deactivates RevisionsView
		var _ondblclick = tiddlerElem.ondblclick;
		tiddlerElem.ondblclick = function(e) {
			me.closeRevisions(tiddlerElem);
			_ondblclick.apply(this, arguments);
		};
		var type = tiddler.fields["server.type"];
		var adaptor = new config.adaptors[type]();
		var userParams = {
			tiddlerElem: tiddlerElem,
			pageSize: pageSize,
			title: tiddler.title
		};
		me.createCloak(tiddlerElem);
		adaptor.getTiddlerRevisionList(tiddler.title, null, context, userParams,
				function(context, userParams) {
					// strip the current revision
					context.revisions.shift();
					me.expandStack(context, userParams);
				});
	},

	// fetch the actual revision and put it in the tiddler div
	showRevision: function(place, revision, callback) {
		var context = {
			host: revision.fields["server.host"],
			workspace: revision.fields["server.workspace"]
		};
		var userParams = {
			revElem: place
		};
		var type = revision.fields["server.type"];
		var adaptor = new config.adaptors[type]();
		var revNo = revision.fields["server.page.revision"];
		adaptor.getTiddlerRevision(revision.title, revNo, context, userParams,
			function(context, userParams) {
				var tiddler = context.tiddler;
				tiddler.title += me.revSuffix
					.format([$(place).attr("revision")]);
				tiddler.fields.doNotSave = true;
				if (store.getTiddler(tiddler.title)) {
					store.deleteTiddler(tiddler.title);
				}
				store.addTiddler(tiddler);

				//now, populate the existing div
				var revElem = userParams.revElem;
				$(revElem).attr("id", story.tiddlerId(tiddler.title));
				$(revElem).attr("refresh", "tiddler");
				var getTemplate = function() {
					var themeName = config.options.txtTheme;
					if (themeName) {
						return store.getTiddlerSlice(themeName,
							me.revisionTemplate) || me.revisionTemplate ||
							"ViewTemplate";
					} else {
						return (store.getTiddler(me.revisionTemplate)) ?
							me.revisionTemplate : "ViewTemplate";
					}
				};
				var template = getTemplate();
				story.refreshTiddler(tiddler.title, template, true);
				callback(tiddler);
			});
	},

	createCloak: function(promoteElem) {
		var el = $(promoteElem);
		// cache styles for resetting later
		el.data({
			top: el.css("top"),
			left: el.css("left"),
			zIndex: el.css("z-index")
		});

		$('<div class="revisionCloak" />').css("z-index", me.zIndex)
			.click(function() {
				me.closeRevisions(promoteElem);
			})
			.appendTo(document.body);

		el.css("z-index", me.zIndex + 1);
	},

	// clean up, removing all evidence of revision view
	closeRevisions: function(promoteElem) {
		var el = $(promoteElem);
		// revert the original tiddler back to its previous state
		el.removeAttr("revName").removeClass("revisions").css({
			top: el.data("top"),
			left: el.data("left"),
			zIndex: el.data("zIndex")
		});

		// remove any revisions still in the store
		var revisions = $(".revisions");
		revisions.each(function(index, revision) {
			var revAttributes = revision.attributes;
			if ((revAttributes.revname) &&
					(revAttributes.revision)) {
				var revName = revAttributes.revname.value;
				var revNo = revAttributes.revision.value;
				var title = revName + me.revSuffix.format([revNo]);

				if (store.getTiddler(title)) {
					store.deleteTiddler(title);
				}
			}
		});

		// delete the previous revisions
		revisions.remove();

		// remove the cloak
		$(".revisionCloak").remove();
	},

	// calback from getting list of revisions
	expandStack: function(context, userParams) {
		var pageSize = userParams.pageSize;

		var from = userParams.from || 0;
		var tiddlerElem = userParams.tiddlerElem;

		userParams.defaultHeight = $(tiddlerElem).height();
		userParams.defaultWidth = $(tiddlerElem).width();
		if (from < context.revisions.length) {
			me.displayNextRevision(tiddlerElem, userParams, context, from,
				from + pageSize - 1);
		}
	},

	// place the next div above and behind the previous one
	displayNextRevision: function(tiddlerElem, userParams, context, from, to) {
		var revision = context.revisions[from];
		var callback = function() {
			var revText = revBtn.getRevisionText(tiddlerElem, revision);
			tiddlerElem = me.createRevisionObject(tiddlerElem, context,
				userParams, revText);
			$(tiddlerElem)
				.attr("revision", (context.revisions.length - from));
			if ((from < to) && ((from + 1) < context.revisions.length)){
				me.displayNextRevision(tiddlerElem, userParams, context,
					from + 1, to);
			} else if ((context.revisions.length - 1) > to) {
				me.showMoreButton(tiddlerElem, context, userParams, to + 1);
			}
		};
		me.shiftVisibleDown(userParams.title, callback);
	},

	createRevisionObject: function(tiddlerElem, context, userParams, text) {
		var newPosition = me.calculatePosition(tiddlerElem, context);
		return $('<div class="revisions tiddler" />')
			.css({
				position: "absolute",
				top: newPosition.top,
				left: newPosition.left,
				"z-index": me.zIndex + 1,
				height: userParams.defaultHeight,
				width: userParams.defaultWidth
			})
			.attr("revName", userParams.title)
			.append(text)
			.insertBefore(tiddlerElem);
	},

	// move the already present revisions down by 1 to fit the next one in
	shiftVisibleDown: function(title, callback) {
		var revisions = $("[revName='%0'].revisions".format([title]));
		var revisionCount = revisions.length;

		$(revisions).animate({top: "+=" + me.offsetTop},
				me.shiftDownDelay, function() {
					revisionCount -= 1;
					if ((callback) && (!revisionCount)) {
						callback();
					}
				});
	},

	// where we put the new revision
	calculatePosition: function(elem, context) {
		var offset = $(elem).offset();
		var currentPosition = $(elem).position();
		var newPosition = {
			top: currentPosition.top - me.offsetTop
		};
		if ((context.restrictLeft) ||
				((offset.left - me.offsetLeft) <
				$("#contentWrapper").offset().left)) {
			newPosition.left = $(elem).position().left;
			context.restrictLeft = true;
		} else {
			newPosition.left = currentPosition.left - me.offsetLeft;
		}
		return newPosition;
	},

	// equivalent of displayNextRevision, but for the more button
	showMoreButton: function(tiddlerElem, context, userParams, moreIndex) {
		userParams.from = moreIndex + 1;
		me.shiftVisibleDown(userParams.title, function() {
			var btn = me.createRevisionObject(tiddlerElem, context, userParams,
				"");

			var more = createTiddlyButton(btn[0], "more...", "show more revisions",
				function() {
					if ($(".viewRevision").length) {
						return;
					}
					userParams.tiddlerElem = btn[0];
					$(btn).text("")
						.append(revBtn
							.getRevisionText(btn[0], context.revisions[moreIndex]))
						.attr("revision", context.revisions.length - moreIndex);
					me.expandStack(context, userParams);
				});
			$(more).css("float", "right");
		});
	},

	stripRevFromTitle: function(revisionTitle) {
		return revisionTitle.split(/ ?\[rev\. #[0-9]+\]$/)[0];
	},

	onClickRevision: function(revElem, revision, callback) {
		// don't do anything if we are still loading
		if ($(".revisions").hasClass("loading")) {
			return null;
		}

		var origTitle = me.stripRevFromTitle(revision.title);
		if ($(revElem).hasClass("viewRevision")) {
			$(".revisions").addClass("loading");
			me.slideIn(revElem, revision, origTitle, function() {
				store.deleteTiddler(revision.title);
				revision.title = origTitle;
				$(revElem).text("").append(revBtn.getRevisionText(revElem,
						revision))
					.removeAttr("tags").removeAttr("tiddler")
					.removeAttr("refresh").removeAttr("template")
					.removeAttr("id");
				$(".revisions").removeClass("loading");
				if (callback) {
					callback();
				}
			});
			$(revElem).removeAttr("prevPos").removeClass("viewRevision");
		} else {
			var viewRevision = function() {
				var prevPos = $(revElem).position().left;
				$(revElem).addClass("viewRevision").attr("prevPos", prevPos);
				$(".revisions").addClass("loading");
				me.showRevision(revElem, revision, function(rev) {
					me.slideOut(revElem, rev, origTitle, function() {
						$(".revisions").removeClass("loading");
					});
				});
			};
			// make sure another revision isn't already out
			if ($(".viewRevision").length) {
				var newRevElem = $(".viewRevision")[0];
				var newRevision = store.getTiddler($(newRevElem)
					.attr("tiddler"));
				me.onClickRevision(newRevElem, newRevision, viewRevision);
			} else {
				viewRevision();
			}
		}
	},

	slideOut: function(revElem, revision, title, callback) {
		var leftMostPos = $("[revName='%0'].revisions".format([title]))
			.offset().left;
		var width = $(revElem).width();
		var originalLeftPos = $(story.getTiddler(title))
			.position().left;

		var slideAmount = leftMostPos + width - me.visibleSlideAmount;
		$("[revName='%0'].revisions:not(.viewRevision)".format([title]))
			.animate({left: "-=" + slideAmount}, 1000);
		$(revElem)
			.attr("baseHeight", $(revElem).css("height"))
			.css("height", "auto")
			.animate({left: originalLeftPos}, 1000, callback);
	},

	slideIn: function(revElem, revision, title, callback) {
		var slideAmount = $(revElem).offset().left -
			$(story.getTiddler(title)).offset().left;
		var origRevPos = $(revElem).attr("prevPos");

		$("[revName='%0'].revisions:not(.viewRevision)".format([title]))
			.animate({left: "+=" + slideAmount}, 1000);
		$(revElem).animate({left: origRevPos}, 1000, function() {
			$(revElem)
				.css("height", $(revElem).attr("baseHeight"))
				.removeAttr("baseHeight");
			callback();
		});
	}
};

var revBtn;
config.macros.slideRevision = revBtn = {
	btnText: "created by %0 at %1 on %2",
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var btn = revBtn.getRevisionText(place, tiddler);
		$(place).append(btn);
	},

	getRevisionText: function(place, revision) {
		var text = revBtn.btnText.format([revision.modifier,
			revision.modified.formatString("0hh:0mm"),
			revision.modified.formatString("0DD MMM YYYY")]);
		var btn = $('<a href="javascript:;" class="button revButton" />')
			.text(text)
			.click(function() {
				var revElem = story.findContainingTiddler(this);
				me.onClickRevision(revElem, revision);
			});
		return btn;
	}
};

})(jQuery);
//}}}
/***
|''Description''|Sanitisation for dynamically pulling tiddlers into your space and displaying them|
!Notes
Works both inside and outside TiddlyWiki. Uses the HTML Sanitizer provided by the Google Caja project
(see http://code.google.com/p/google-caja/wiki/JsHtmlSanitizer for more on this), which is licensed under
an Apache License (see http://www.apache.org/licenses/LICENSE-2.0).
!Code
***/
//{{{
(function($) {

var cleanURL = function(url) {
	var regexp = /^(?:http|https|mailto|ftp|irc|news):\/\//;
	return (regexp.test(url)) ? url : null;
};

$.sanitize = function(html) {
	return html_sanitize(html, cleanURL);
};

/*
 * HTML Sanitizer, provided by Google Caja
 */

/* Copyright Google Inc.
 * Licensed under the Apache Licence Version 2.0
 * Autogenerated at Tue May 17 17:39:24 BST 2011
 * @provides html4
 */var html4={};html4.atype={NONE:0,URI:1,URI_FRAGMENT:11,SCRIPT:2,STYLE:3,ID:4,IDREF:5,IDREFS:6,GLOBAL_NAME:7,LOCAL_NAME:8,CLASSES:9,FRAME_TARGET:10},html4.ATTRIBS={"*::class":9,"*::dir":0,"*::id":4,"*::lang":0,"*::onclick":2,"*::ondblclick":2,"*::onkeydown":2,"*::onkeypress":2,"*::onkeyup":2,"*::onload":2,"*::onmousedown":2,"*::onmousemove":2,"*::onmouseout":2,"*::onmouseover":2,"*::onmouseup":2,"*::style":3,"*::title":0,"a::accesskey":0,"a::coords":0,"a::href":1,"a::hreflang":0,"a::name":7,"a::onblur":2,"a::onfocus":2,"a::rel":0,"a::rev":0,"a::shape":0,"a::tabindex":0,"a::target":10,"a::type":0,"area::accesskey":0,"area::alt":0,"area::coords":0,"area::href":1,"area::nohref":0,"area::onblur":2,"area::onfocus":2,"area::shape":0,"area::tabindex":0,"area::target":10,"bdo::dir":0,"blockquote::cite":1,"br::clear":0,"button::accesskey":0,"button::disabled":0,"button::name":8,"button::onblur":2,"button::onfocus":2,"button::tabindex":0,"button::type":0,"button::value":0,"canvas::height":0,"canvas::width":0,"caption::align":0,"col::align":0,"col::char":0,"col::charoff":0,"col::span":0,"col::valign":0,"col::width":0,"colgroup::align":0,"colgroup::char":0,"colgroup::charoff":0,"colgroup::span":0,"colgroup::valign":0,"colgroup::width":0,"del::cite":1,"del::datetime":0,"dir::compact":0,"div::align":0,"dl::compact":0,"font::color":0,"font::face":0,"font::size":0,"form::accept":0,"form::action":1,"form::autocomplete":0,"form::enctype":0,"form::method":0,"form::name":7,"form::onreset":2,"form::onsubmit":2,"form::target":10,"h1::align":0,"h2::align":0,"h3::align":0,"h4::align":0,"h5::align":0,"h6::align":0,"hr::align":0,"hr::noshade":0,"hr::size":0,"hr::width":0,"iframe::align":0,"iframe::frameborder":0,"iframe::height":0,"iframe::marginheight":0,"iframe::marginwidth":0,"iframe::width":0,"img::align":0,"img::alt":0,"img::border":0,"img::height":0,"img::hspace":0,"img::ismap":0,"img::name":7,"img::src":1,"img::usemap":11,"img::vspace":0,"img::width":0,"input::accept":0,"input::accesskey":0,"input::align":0,"input::alt":0,"input::autocomplete":0,"input::checked":0,"input::disabled":0,"input::ismap":0,"input::maxlength":0,"input::name":8,"input::onblur":2,"input::onchange":2,"input::onfocus":2,"input::onselect":2,"input::readonly":0,"input::size":0,"input::src":1,"input::tabindex":0,"input::type":0,"input::usemap":11,"input::value":0,"ins::cite":1,"ins::datetime":0,"label::accesskey":0,"label::for":5,"label::onblur":2,"label::onfocus":2,"legend::accesskey":0,"legend::align":0,"li::type":0,"li::value":0,"map::name":7,"menu::compact":0,"ol::compact":0,"ol::start":0,"ol::type":0,"optgroup::disabled":0,"optgroup::label":0,"option::disabled":0,"option::label":0,"option::selected":0,"option::value":0,"p::align":0,"pre::width":0,"q::cite":1,"select::disabled":0,"select::multiple":0,"select::name":8,"select::onblur":2,"select::onchange":2,"select::onfocus":2,"select::size":0,"select::tabindex":0,"table::align":0,"table::bgcolor":0,"table::border":0,"table::cellpadding":0,"table::cellspacing":0,"table::frame":0,"table::rules":0,"table::summary":0,"table::width":0,"tbody::align":0,"tbody::char":0,"tbody::charoff":0,"tbody::valign":0,"td::abbr":0,"td::align":0,"td::axis":0,"td::bgcolor":0,"td::char":0,"td::charoff":0,"td::colspan":0,"td::headers":6,"td::height":0,"td::nowrap":0,"td::rowspan":0,"td::scope":0,"td::valign":0,"td::width":0,"textarea::accesskey":0,"textarea::cols":0,"textarea::disabled":0,"textarea::name":8,"textarea::onblur":2,"textarea::onchange":2,"textarea::onfocus":2,"textarea::onselect":2,"textarea::readonly":0,"textarea::rows":0,"textarea::tabindex":0,"tfoot::align":0,"tfoot::char":0,"tfoot::charoff":0,"tfoot::valign":0,"th::abbr":0,"th::align":0,"th::axis":0,"th::bgcolor":0,"th::char":0,"th::charoff":0,"th::colspan":0,"th::headers":6,"th::height":0,"th::nowrap":0,"th::rowspan":0,"th::scope":0,"th::valign":0,"th::width":0,"thead::align":0,"thead::char":0,"thead::charoff":0,"thead::valign":0,"tr::align":0,"tr::bgcolor":0,"tr::char":0,"tr::charoff":0,"tr::valign":0,"ul::compact":0,"ul::type":0},html4.eflags={OPTIONAL_ENDTAG:1,EMPTY:2,CDATA:4,RCDATA:8,UNSAFE:16,FOLDABLE:32,SCRIPT:64,STYLE:128},html4.ELEMENTS={a:0,abbr:0,acronym:0,address:0,applet:16,area:2,b:0,base:18,basefont:18,bdo:0,big:0,blockquote:0,body:49,br:2,button:0,canvas:0,caption:0,center:0,cite:0,code:0,col:2,colgroup:1,dd:1,del:0,dfn:0,dir:0,div:0,dl:0,dt:1,em:0,fieldset:0,font:0,form:0,frame:18,frameset:16,h1:0,h2:0,h3:0,h4:0,h5:0,h6:0,head:49,hr:2,html:49,i:0,iframe:4,img:2,input:2,ins:0,isindex:18,kbd:0,label:0,legend:0,li:1,link:18,map:0,menu:0,meta:18,nobr:0,noframes:20,noscript:20,object:16,ol:0,optgroup:0,option:1,p:1,param:18,pre:0,q:0,s:0,samp:0,script:84,select:0,small:0,span:0,strike:0,strong:0,style:148,sub:0,sup:0,table:0,tbody:1,td:1,textarea:8,tfoot:1,th:1,thead:1,title:24,tr:1,tt:0,u:0,ul:0,"var":0},html4.ueffects={NOT_LOADED:0,SAME_DOCUMENT:1,NEW_DOCUMENT:2},html4.URIEFFECTS={"a::href":2,"area::href":2,"blockquote::cite":0,"body::background":1,"del::cite":0,"form::action":2,"img::src":1,"input::src":1,"ins::cite":0,"q::cite":0},html4.ltypes={UNSANDBOXED:2,SANDBOXED:1,DATA:0},html4.LOADERTYPES={"a::href":2,"area::href":2,"blockquote::cite":2,"body::background":1,"del::cite":2,"form::action":2,"img::src":1,"input::src":1,"ins::cite":2,"q::cite":2};var html=function(a){function x(b,c,d){var e=[];w(function(b,e){for(var f=0;f<e.length;f+=2){var g=e[f],h=e[f+1],i=null,j;if((j=b+"::"+g,a.ATTRIBS.hasOwnProperty(j))||(j="*::"+g,a.ATTRIBS.hasOwnProperty(j)))i=a.ATTRIBS[j];if(i!==null)switch(i){case a.atype.NONE:break;case a.atype.SCRIPT:case a.atype.STYLE:h=null;break;case a.atype.ID:case a.atype.IDREF:case a.atype.IDREFS:case a.atype.GLOBAL_NAME:case a.atype.LOCAL_NAME:case a.atype.CLASSES:h=d?d(h):h;break;case a.atype.URI:h=c&&c(h);break;case a.atype.URI_FRAGMENT:h&&"#"===h.charAt(0)?(h=d?d(h):h,h&&(h="#"+h)):h=null;break;default:h=null}else h=null;e[f+1]=h}return e})(b,e);return e.join("")}function w(b){var c,d;return v({startDoc:function(a){c=[],d=!1},startTag:function(e,f,g){if(!d){if(!a.ELEMENTS.hasOwnProperty(e))return;var h=a.ELEMENTS[e];if(h&a.eflags.FOLDABLE)return;if(h&a.eflags.UNSAFE){d=!(h&a.eflags.EMPTY);return}f=b(e,f);if(f){h&a.eflags.EMPTY||c.push(e),g.push("<",e);for(var i=0,j=f.length;i<j;i+=2){var k=f[i],l=f[i+1];l!==null&&l!==void 0&&g.push(" ",k,'="',r(l),'"')}g.push(">")}}},endTag:function(b,e){if(d)d=!1;else{if(!a.ELEMENTS.hasOwnProperty(b))return;var f=a.ELEMENTS[b];if(!(f&(a.eflags.UNSAFE|a.eflags.EMPTY|a.eflags.FOLDABLE))){var g;if(f&a.eflags.OPTIONAL_ENDTAG)for(g=c.length;--g>=0;){var h=c[g];if(h===b)break;if(!(a.ELEMENTS[h]&a.eflags.OPTIONAL_ENDTAG))return}else for(g=c.length;--g>=0;)if(c[g]===b)break;if(g<0)return;for(var i=c.length;--i>g;){var h=c[i];a.ELEMENTS[h]&a.eflags.OPTIONAL_ENDTAG||e.push("</",h,">")}c.length=g,e.push("</",b,">")}}},pcdata:function(a,b){d||b.push(a)},rcdata:function(a,b){d||b.push(a)},cdata:function(a,b){d||b.push(a)},endDoc:function(a){for(var b=c.length;--b>=0;)a.push("</",c[b],">");c.length=0}})}function v(c){return function(d,e){d=String(d);var f=null,g=!1,h=[],j=void 0,l=void 0,m=void 0;c.startDoc&&c.startDoc(e);while(d){var n=d.match(g?t:u);d=d.substring(n[0].length);if(g){if(n[1]){var o=b(n[1]),p;if(n[2]){var q=n[3];switch(q.charCodeAt(0)){case 34:case 39:q=q.substring(1,q.length-1)}p=k(i(q))}else p=o;h.push(o,p)}else if(n[4]){l!==void 0&&(m?c.startTag&&c.startTag(j,h,e):c.endTag&&c.endTag(j,e));if(m&&l&(a.eflags.CDATA|a.eflags.RCDATA)){f===null?f=b(d):f=f.substring(f.length-d.length);var r=f.indexOf("</"+j);r<0&&(r=d.length),l&a.eflags.CDATA?c.cdata&&c.cdata(d.substring(0,r),e):c.rcdata&&c.rcdata(s(d.substring(0,r)),e),d=d.substring(r)}j=l=m=void 0,h.length=0,g=!1}}else if(n[1])c.pcdata&&c.pcdata(n[0],e);else if(n[3])m=!n[2],g=!0,j=b(n[3]),l=a.ELEMENTS.hasOwnProperty(j)?a.ELEMENTS[j]:void 0;else if(n[4])c.pcdata&&c.pcdata(n[4],e);else if(n[5]&&c.pcdata)switch(n[5]){case"<":c.pcdata("&lt;",e);break;case">":c.pcdata("&gt;",e);break;default:c.pcdata("&amp;",e)}}c.endDoc&&c.endDoc(e)}}function s(a){return a.replace(m,"&amp;$1").replace(n,"&lt;").replace(o,"&gt;")}function r(a){return a.replace(l,"&amp;").replace(n,"&lt;").replace(o,"&gt;").replace(p,"&#34;").replace(q,"&#61;")}function k(a){return a.replace(j,g)}function i(a){return a.replace(h,"")}function g(a,b){return f(b)}function f(a){a=b(a);if(c.hasOwnProperty(a))return c[a];var f=a.match(d);if(f)return String.fromCharCode(parseInt(f[1],10));if(!!(f=a.match(e)))return String.fromCharCode(parseInt(f[1],16));return""}var b;"script"==="SCRIPT".toLowerCase()?b=function(a){return a.toLowerCase()}:b=function(a){return a.replace(/[A-Z]/g,function(a){return String.fromCharCode(a.charCodeAt(0)|32)})};var c={lt:"<",gt:">",amp:"&",nbsp:"240",quot:'"',apos:"'"},d=/^#(\d+)$/,e=/^#x([0-9A-Fa-f]+)$/,h=/\0/g,j=/&(#\d+|#x[0-9A-Fa-f]+|\w+);/g,l=/&/g,m=/&([^a-z#]|#(?:[^0-9x]|x(?:[^0-9a-f]|$)|$)|$)/gi,n=/</g,o=/>/g,p=/\"/g,q=/\=/g,t=new RegExp("^\\s*(?:(?:([a-z][a-z-]*)(\\s*=\\s*(\"[^\"]*\"|'[^']*'|(?=[a-z][a-z-]*\\s*=)|[^>\"'\\s]*))?)|(/?>)|[\\s\\S][^a-z\\s>]*)","i"),u=new RegExp("^(?:&(\\#[0-9]+|\\#[x][0-9a-f]+|\\w+);|<!--[\\s\\S]*?-->|<!\\w[^>]*>|<\\?[^>*]*>|<(/)?([a-z][a-z0-9]*)|([^<&>]+)|([<&>]))","i");return{escapeAttrib:r,makeHtmlSanitizer:w,makeSaxParser:v,normalizeRCData:s,sanitize:x,unescapeEntities:k}}(html4),html_sanitize=html.sanitize

// stop here if we're not in TiddlyWiki
// XXX: is this the correct way of checking for TiddlyWiki?
if (!window.TiddlyWiki || !window.store || !store instanceof TiddlyWiki) {
	return;
}

var tiddlyspace = config.extensions.tiddlyspace;

var _subWikify = Wikifier.prototype.subWikify;

var cleanedTitle = 'This section has been cleaned of any potentially harmful code';

var replaceFunctions = {
	html: function(w) {
		var sanitizedHTML, spanEl;
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			sanitizedHTML = $.sanitize(lookaheadMatch[1]);
			spanEl = createTiddlyElement(w.output, 'span', null, 'sanitized');
			spanEl.innerHTML = sanitizedHTML;
			spanEl.setAttribute('title', cleanedTitle);
			w.nextMatch = this.lookaheadRegExp.lastIndex;
		}
	},
	customFormat: function(w) {
		switch(w.matchText) {
			case '@@':
				var e = createTiddlyElement(w.output, 'span');
				var styles = config.formatterHelpers.inlineCssHelper(w);
				if (styles.length === 0) {
					e.className = 'marked';
				}
				w.subWikifyTerm(e, /(@@)/mg);
				break;
			case '{{':
				var lookaheadRegExp = /\{\{[\s]*([\w]+[\s\w]*)[\s]*\{(\n?)/mg;
				lookaheadRegExp.lastIndex = w.matchStart;
				var lookaheadMatch = lookaheadRegExp.exec(w.source);
				if(lookaheadMatch) {
					w.nextMatch = lookaheadRegExp.lastIndex;
					e = createTiddlyElement(w.output,lookaheadMatch[2] == "\n" ? "div" : "span",null,lookaheadMatch[1]);
					w.subWikifyTerm(e,/(\}\}\})/mg);
				}
				break;
		}
	}
};

Wikifier.prototype.subWikify = function(output, terminator) {
	var tid = this.tiddler,
		spaceName = tiddlyspace.currentSpace.name,
		tidSpace, recipeName, stripped;
	try {
		recipeName = tid.fields['server.recipe'] ||
			tid.fields['server.workspace'];
		tidSpace = tiddlyspace.resolveSpaceName(recipeName);
		if (tidSpace !== spaceName) {
			// external tiddler, so replace dangerous formatters
			stripped = stripHTML(tid, this.formatter);
		}
	} catch(e) {
		// do nothing. There's no tiddler, so assume it's safe (?!?!?)
	}

	_subWikify.apply(this, arguments);

	if (stripped) {
		// change back to the original function
		unstripHTML(stripped, this.formatter);
	}
};

// replace potentially unsafe formatters with versions that strip bad HTML/CSS
var stripHTML = function(tid, formatter) {
	var popped = {}, _handler;
	for (var i = 0; i < formatter.formatters.length; i++) {
		var f = formatter.formatters[i];
		if (replaceFunctions[f.name]) {
			_handler = f.handler;
			popped[f.name] = _handler;
			f.handler = replaceFunctions[f.name];
		}
	};

	return popped;
};

// put the original formatters back where they belong
var unstripHTML = function(stripped, formatter) {
	for (var i = 0; i < formatter.formatters.length; i++) {
		var f = formatter.formatters[i];
		if (stripped[f.name]) {
			f.handler = stripped[f.name];
		}
	};
};

})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceSearcher|
|''Version''|0.2.5|
|''Requires''|TiddlySpaceConfig TiddlySpaceFollowingPlugin|
***/
//{{{
(function($) {
var tiddlyspace = config.extensions.tiddlyspace;
var tsScan = config.macros.tsScan;

config.shadowTiddlers.SearchTemplate = "<<view server.bag SiteIcon label:no width:24 height:24 preserveAspectRatio:yes>> <<view server.bag spaceLink title external:no>> in space <<view server.bag spaceLink>>";
config.shadowTiddlers.StyleSheetSearch = [".resultsArea .siteIcon { display: inline; }",
	".searchForm {text-align: left;}"].join("\n");
store.addNotification("StyleSheetSearch", refreshStyles);

var search = config.macros.tsSearch = {
	locale: {
		advanced: "Advanced Options",
		header: "Search",
		resultsHeader: "Results (%0)",
		find: "find",
		noResults: "No tiddlers matched your search query",
		query: "QUERY: ",
		error: "please provide a search query or a tag, modifier or title!",
		titleAdvanced: "where the title is",
		modifierAdvanced: "where the last modifier is",
		spaceAdvanced: "only in the space: ",
		notspaceAdvanced: "but not in the spaces: ",
		tagsAdvanced: "with the tags: "
	},
	andConstructor: function(container, label, fieldname, negationMode) {
		var tags = $("<div />").appendTo(container);
		$('<span />').text(label).appendTo(tags);
		var id = "area" + Math.random();
		container = $("<span />").attr("id", id).appendTo(tags)[0];
		function add(container) {
			var el = $('<input type="text" />').attr("field", fieldname).appendTo(container);
			if(negationMode) {
				el.attr("negation", "true");
			}
		}
		add(container);
		var el = $("<button />").text("AND").click(function(ev) {
			add($(ev.target).data("container"));
			ev.preventDefault();
		}).appendTo(tags);
		$(el).data("container", container);
	},
	fieldConstructor: function(container, label, field) {
		container = $("<div />").appendTo(container)[0];
		$("<span />").text(label).appendTo(container);
		$("<input />").attr("text", "input").attr("field", field).appendTo(container);
	},
	advancedOptions: function(form) {
		var locale = search.locale;
		var container = $("<div />").addClass("tsAdvancedOptions").appendTo(form)[0];
		$("<h2/ >").text(search.locale.advanced).appendTo(container);
		$("<div />").addClass("separator").appendTo(container);
		search.fieldConstructor(container, locale.titleAdvanced, "title");
		search.fieldConstructor(container, locale.modifierAdvanced, "modifier");
		search.fieldConstructor(container, locale.spaceAdvanced, "space");
		search.andConstructor(container, locale.notspaceAdvanced, "space", true);
		search.andConstructor(container, locale.tagsAdvanced, "tag");
	},
	constructSearchQuery: function(form) {
		var data = [], select = [];
		var query = $("[name=q]", form).val();
		if(query) {
			data.push("q=%0".format(query));
		}

		// add tags, fields etc..
		$("[field]", form).each(function(i, el) {
			var val = $(el).val();
			var name = $(el).attr("field");
			var negate = $(el).attr("negation") == "true";
			if(val && name) {
				val = encodeURIComponent(val);
				val = negate ? "!" + val : val;
				if(name == "space") {
					val += "_public";
					name = "bag";
				}
				if(negate) {
					select.push("select=%0:%1".format(name,val));
				} else {
					var prefix = data.length === 0 ? "q=" : "";
					data.push('%0%1:"%2"'.format(prefix, name, val));
				}
			}
		});
		var dataString = data.join(" ");
		if(dataString.length === 0 && !query) {
			return false;
		}
		var selectStatement = select.join("&");
		if(dataString.length > 0 && selectStatement.length > 0) {
			dataString += "&";
		}
		dataString += selectStatement;
		return "/search?%0".format(dataString);
	},
	constructForm: function(place) {
		var locale = search.locale;
		$("<h1 />").text(locale.header).appendTo(place);
		var form = $("<form />").appendTo(place)[0];
		$('<input type="text" name="q" />').appendTo(form);
		$('<input type="submit" />').val(locale.find).appendTo(form);
		search.advancedOptions(form);
		var query = $('<h2 class="query"/>').appendTo(place)[0];
		var results = $("<div />").appendTo(place).addClass("resultsArea")[0];
		var lookup = function(url) {
			if(!url) {
				results.empty().addClass("error").text(locale.error);
				return;
			}
			config.extensions.tiddlyweb.getStatus(function(status) {
				$(query).text(locale.query);
				var href = status.server_host.url + url;
				$("<a />").attr("href", href).text(href).appendTo(query);
				tsScan.scan(results, { url: url, emptyMessage: search.locale.noResults, cache: true,
					template: "SearchTemplate", sort: "title", callback: function(tiddlers) {
						$("<h2 />").text(locale.resultsHeader.format(tiddlers.length)).prependTo(results);
					}
				});
			});
		};
		$(form).submit(function(ev) {
			ev.preventDefault();
			var url = search.constructSearchQuery(form);
			config.macros.tsSearch.lastSearch = url;
			lookup(url);
		});
		if(search.lastSearch) {
			lookup(search.lastSearch);
		}
		return form;
	},
	handler: function(place) {
		var container = $("<div />").addClass("searchForm").appendTo(place)[0];
		search.constructForm(container);
	}
};

})(jQuery);
//}}}
!Spaces
<<groupBy server.bag>>

!Private
<<list filter [is[private]]>>

!Public
<<list filter [is[public]]>>

!Drafts
<<list filter [is[draft]]>>
/***
|''Name''|TiddlySpaceTiddlerIconsPlugin|
|''Version''|0.8.10|
|''Status''|@@beta@@|
|''Author''|Jon Robson|
|''Description''|Provides ability to render SiteIcons and icons that correspond to the home location of given tiddlers|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceTiddlerIconsPlugin.js|
|''Requires''|TiddlySpaceConfig BinaryTiddlersPlugin ImageMacroPlugin TiddlySpacePublishingCommands|
!Notes
{{{<<tiddlerOrigin>>}}} shows the origin of the tiddler it is being run on.
In TiddlySpace terms this means it will determine whether the tiddler is external, public or private.
Where private it will analyse whether a public version exists and distinguish between the different scenarios.
If a tiddler is external, the SiteIcon of that external space will be shown

!Parameters
width / height : define a width or height of the outputted icon
label: if label parameter is set to yes, a label will accompany the icon.
!Code
***/
//{{{
(function($) {

if(!config.macros.image) {
	throw "Missing dependency: ImageMacroPlugin";
}

var imageMacro = config.macros.image;
var tiddlyspace = config.extensions.tiddlyspace;
var tweb = config.extensions.tiddlyweb;
var cmds = config.commands;
var cmd = cmds.publishTiddler;
tiddlyspace.resolveSpaceName = function(value) {
	var endsWith = config.extensions.BinaryTiddlersPlugin.endsWith;
	if(value) {
		value = value.indexOf("bags/") === 0 ? value.substr(5) : value;
		value = value.indexOf("recipes/") === 0 ? value.substr(8) : value;
		if(value.indexOf("@") === 0) {
			value = value.substr(1);
		}
		if(endsWith(value, "_public")) {
			value = value.substr(0, value.length - 7);
		} else if(endsWith(value, "_private")) {
			value = value.substr(0, value.length - 8);
		}
		value = value.toLowerCase();
	}
	return value;
};

tiddlyspace.renderAvatar = function(place, value, options) {
	options = options ? options : {};
	options.labelOptions = options.labelOptions ? options.labelOptions : { include: false, height: 48, width: 48 };
	options.imageOptions = options.imageOptions ? options.imageOptions : {};
	options.imageOptions.altImage = "/bags/common/tiddlers/defaultUserIcon";
	var container = $('<div class="siteIcon" />').appendTo(place);
	value = tiddlyspace.resolveSpaceName(value);

	tweb.getStatus(function(status) {
		var link, noLabel;
		if(!value || value == config.views.wikified.defaultModifier ||
			value == config.views.wikified.shadowModifier) {
			var icon = config.views.wikified.shadowModifier == value ? "shadowIcon" : "missingIcon";
			if(store.tiddlerExists(icon)) {
				imageMacro.renderImage(container, icon, options.imageOptions);
			} else {
				noLabel = true;
			}
		} else {
			var spaceURI;
			if(value != tiddlyspace.currentSpace.name) {
				spaceURI = options.notSpace ? tiddlyspace.getHost(status.server_host) :
					tiddlyspace.getHost(status.server_host, value);
			}
			link = spaceURI ? $("<a />").attr("href", spaceURI) : $("<span />");
			link.text(value);

			var imageOptions = options.imageOptions;
			if(options.spaceLink && !imageOptions.link) {
				imageOptions.link = spaceURI;
			}
			var avatar = options.notSpace ? false : value;
			var uri = tiddlyspace.getAvatar(status.server_host, avatar);
			imageMacro.renderImage(container, uri, options.imageOptions);
			if(!value) {
				value = "tiddlyspace";
			}
		}
		if(!noLabel && options.labelOptions.include) {
			var prefix = $("<span />").text(options.labelOptions.prefix || "")[0];
			var suffix = $("<span />").text(options.labelOptions.suffix || "")[0];
			$('<div class="label" />').append(prefix).append(link).
				append(suffix).appendTo(container);
		}
	});
	if(value) {
		var prefix = options.labelOptions.prefix || "";
		var suffix = options.labelOptions.suffix || "";
		var label = "%0%1%2".format(prefix, value, suffix);
		$(container).attr("title", label);
	}
};

var originMacro = config.macros.tiddlerOrigin = {
	locale: {
		"shadow": "shadow tiddler",
		"missing": "missing tiddler",
		"private": "private",
		"unknown": "unknown state",
		"public": "public",
		"unsyncedPrivate": "unsynced and private",
		"unsyncedPublic": "unsynced and public",
		externalPrefix: "from ",
		externalBagSuffix: " bag",
		externalSuffix: " space",
		publishPrivateDeletePrivate: "Are you sure you want to make this tiddler public?",
		moveToPrivate: "Are you sure you want to make this tiddler private? Only members will be able to see it.",
		pleaseWait: "please wait..",
		keepPublic: "keep public",
		cannotPublishDirtyTiddler: "The current tiddler is unsaved so cannot be published. Please save the tiddler first.",
		keepPrivate: "keep private",
		makePublic: "make public",
		makePrivate: "make private"
	},
	handler: function(place, macroName, params,wikifier, paramString, tiddler){
		var adaptor = tiddler.getAdaptor();
		var btn = $("<div />").addClass("originButton").attr("params", paramString).
			attr("refresh", "macro").attr("macroName", macroName).appendTo(place)[0];
		$(btn).data("tiddler", tiddler);
		originMacro.refresh(btn);
	},
	refresh: function(btn) {
		$(btn).empty();
		var paramString = $(btn).attr("params");
		var tiddler = $(btn).data("tiddler");
		var options = originMacro.getOptions(paramString);
		var type = tiddlyspace.getTiddlerStatusType(tiddler);
		originMacro.renderIcon(tiddler, type, btn, options);
	},
	getOptions: function(paramString) {
		paramString = "%0 label:no width:48 height:48 spaceLink:yes preserveAspectRatio:yes".format(paramString);
		var parsedParams = paramString.parseParams("name");
		var params = parsedParams[0].name;
		var options = {
			labelOptions: originMacro._getLabelOptions(parsedParams),
			imageOptions: imageMacro.getArguments(paramString, []),
			noclick: parsedParams[0].interactive &&
				parsedParams[0].interactive[0] == "no" ? true : false
		};
		if(!options.noclick) {
			var spaceLink = parsedParams[0].spaceLink;
			options.spaceLink = spaceLink && spaceLink[0] == "no" ? false : true;
		} else {
			options.spaceLink = false;
		}
		return options;
	},
	_getLabelOptions: function(parsedParams) {
		parsedParams = parsedParams[0];
		var includeLabel = !parsedParams.label || ( parsedParams.label && parsedParams.label[0] == "yes" );
		var prefix = parsedParams.labelPrefix ? parsedParams.labelPrefix[0] : false;
		var suffix = parsedParams.labelSuffix ? parsedParams.labelSuffix[0] : false;
		return { include: includeLabel, suffix: suffix, prefix: prefix };
	},
	_isSpace: function(value) {
		value = value ? value : "";
		var endsWith = config.extensions.BinaryTiddlersPlugin.endsWith;
		if(endsWith(value, "_private") || endsWith(value, "_public")) {
			return true;
		} else {
			return false;
		}
	},
	renderIcon: function(tiddler, type, button, options) {
		var locale = originMacro.locale;
		originMacro.annotateTiddler(button, type);
		if(type != "external") {
			originMacro.showPrivacyRoundel(tiddler, type, button,
				options);
		} else {
			var prefix = options.labelOptions.prefix, suffix = options.labelOptions.suffix;
			var space = tiddler.fields["server.bag"];
			options.notSpace = !originMacro._isSpace(space);
			options.labelOptions.prefix = prefix ? prefix : locale.externalPrefix;
			options.labelOptions.suffix = suffix ? suffix : (options.notSpace ? locale.externalBagSuffix : locale.externalSuffix);

			tiddlyspace.renderAvatar(button, space, options);
		}
	},
	showPrivacyRoundel: function(thisTiddler, privacyType, button, options) {
		// there is a public tiddler as well as the current tiddler!
		// TODO: not this is not enough.. we also need to check if the public tiddler is the same as..
		// .. the private tiddler to determine whether this is a draft
		// use of hashes would be useful here.
		$(button).empty();
		var icon = "%0Icon".format(privacyType);
		if(privacyType.indexOf("unsynced") === 0 && !store.tiddlerExists(icon)) {
			icon = "unsyncedIcon";
		}
		if(privacyType == "shadow") {
			if(!store.tiddlerExists(icon)) {
				icon = "bags/tiddlyspace/tiddlers/SiteIcon";
			}
		}
		if(privacyType == "missing" && !store.tiddlerExists(icon)) {
			return; // the user is not making use of the missingIcon
		} else {
			imageMacro.renderImage(button, icon, options.imageOptions);
			originMacro.showLabel(button, privacyType, options.labelOptions);
			var cmd = originMacro.iconCommands[privacyType];
			if(cmd && thisTiddler && !options.noclick) {
				$(button).click(function(ev) {
					cmd(ev, thisTiddler);
				});
			}
		}
	},
	annotateTiddler: function(place, type) {
		var tidEl = $(story.findContainingTiddler(place));
		tidEl.
			removeClass("private public external privateAndPublic privateNotPublic shadow").
			addClass(type);
	},
	showLabel: function(button, type, options) {
		var locale = originMacro.locale;
		var label = options.label ? options.label : locale[type];
		label = label ? label : locale.unknown;
		if(options && options.include) {
			$('<div class="roundelLabel" />').html(label).appendTo(button);
		}
		$(button).attr("title", label);
	},
	confirm: function(ev, msg, onYes, options) {
		options = options ? options : {};
		onYes = onYes ? onYes : function(ev) {};
		var btn = $(".originButton", $(ev.target).parents())[0];
		var popup = Popup.create(btn);
		$(popup).addClass("confirmationPopup");
		$("<div />").addClass("message").text(msg).appendTo(popup);
		$("<button />").addClass("button").text(options.yesLabel || "yes").appendTo(popup).click(onYes);
		$("<button />").addClass("button").text(options.noLabel || "no").click(function(ev) {
			Popup.remove();
		}).appendTo(popup);
		Popup.show();
		ev.stopPropagation();
		return false;
	},
	alert: function(ev, msg) {
		var popup = Popup.create(ev.target);
		$(popup).addClass("confirmationPopup alert");
		$("<div />").addClass("message").text(msg).appendTo(popup);
		Popup.show();
		ev.stopPropagation();
	},
	reportDirty: function(el) {
		originMacro.alert(el, originMacro.locale.cannotPublishDirtyTiddler);
	},
	iconCommands: {
		"public": function(ev, tiddler) {
			if(!readOnly) {
				var locale = originMacro.locale;
				var msg = locale.moveToPrivate;
				if(story.isDirty(tiddler.title)) {
					originMacro.reportDirty(ev);
				} else {
					originMacro.confirm(ev, msg, function(ev) {
						var target = $(ev.target);
						var onComplete = function(info) {};
						var privateBag = cmd.toggleBag(tiddler, "private");
						cmd.moveTiddler(tiddler, {
							title: tiddler.title,
							fields: { "server.bag": privateBag }
						}, onComplete);
					}, { yesLabel: locale.makePrivate, noLabel: locale.keepPublic });
				}
			}
		},
		"private": function(ev, tiddler) {
			if(!readOnly) {
				var locale = originMacro.locale;
				var adaptor = tiddler.getAdaptor();
				var publishTo = tiddler.fields["publish.name"] || tiddler.title;
				var workspace = "bags/%0".format(tiddler.fields["server.bag"]);
				tiddler.fields["server.workspace"] = workspace;
				var publicBag = cmd.toggleBag(tiddler, "public");
				var msg;
				msg = locale.publishPrivateDeletePrivate;
				var title = tiddler.title;
				var newTitle = publishTo || tiddler.title;
				tiddler.fields["server.page.revision"] = "false";
				store.addTiddler(tiddler);
				if(story.isDirty(tiddler.title)) {
					originMacro.reportDirty(ev);
				} else {
					originMacro.confirm(ev, msg, function(ev) {
						var onComplete = function(info) {};
						cmd.moveTiddler(tiddler, {
							title: newTitle,
							fields: { "server.bag": publicBag }
						}, onComplete);
					}, { yesLabel: locale.makePublic, noLabel: locale.keepPrivate });
				}
			}
		}
	}
};

})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceToolbar|
|''Description''|augments tiddler toolbar commands with SVG icons|
|''Author''|Osmosoft|
|''Version''|0.6.6|
|''Status''|@@beta@@|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceToolbar.js|
|''CodeRepository''|http://github.com/TiddlySpace/tiddlyspace|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5.0|
|''Requires''|ImageMacroPlugin|
|''Keywords''|toolbar icons SVG|
!Description
replaces tiddler toolbar commands with SVG icons if available
!Notes
requires [[ImageMacroPlugin|http://svn.tiddlywiki.org/Trunk/contributors/JonRobson/plugins/ImageMacroPlugin/plugins/ImageMacroPlugin.tid]]

SVG icons are drawn from tiddlers titled {{{<command>.svg}}}
In readonly mode a tiddler called {{{<command>ReadOnly.svg}}} will be used if it exists.
!TODO
* rename (IconToolbarPlugin?)
* support more than one more popup menu in the toolbar.
!Code
***/
//{{{
(function($) {

if(!config.macros.image) {
	throw "Missing dependency: ImageMacroPlugin";
}

var macro = config.macros.toolbar;

macro.icons = {
	cloneTiddler: "editTiddler"
};

var _handler = macro.handler;
macro.handler = function(place, macroName, params, wikifier,
		paramString, tiddler) {
	var toolbar = $(place);
	toolbar.attr({
		refresh: "macro",
		macroName: macroName
	}).data("args", arguments);
	var status = _handler.apply(this, arguments);
	if(tiddler.isReadOnly()) {
		toolbar.addClass("toolbarReadOnly");
	} else {
		toolbar.removeClass("toolbarReadOnly");
	}
	var parsedParams = paramString.parseParams("name")[0];
	if(parsedParams.icons && parsedParams.icons == "yes") {
		this.augmentCommandButtons(place);
	}
	if(parsedParams.more && parsedParams.more == "popup") {
		// note we must override the onclick event like in createTiddlyButton
		// otherwise the click event is the popup AND the slider
		$(".moreCommand", place).each(function(i, el) {
			el.onclick = macro.onClickMorePopUp;
		});
		// buttons that are after a less command should not be in more menu.
		$(".lessCommand ~ .button", place).appendTo(place);
		$(".lessCommand", place).remove();
	}
	return status;
};

macro.refresh = function(place, params) {
	var args = $(place).empty().data("args");
	this.handler.apply(this, args);
};

var imageMacro = config.macros.image;
macro.augmentCommandButtons = function(toolbar) {
	$(".button", toolbar).each(function(i, el) {
		var cmd = $(el).attr("commandname");
		cmd = cmd ? cmd : "moreCommand"; // XXX: special-casing of moreCommand due to ticket #1234
		var icon = store.tiddlerExists(cmd) ? cmd : macro.icons[cmd];
		var text = $(el).text();
		if(readOnly) {
			var readOnlyAlternative = "%0ReadOnly".format([icon]);
			if(store.tiddlerExists(readOnlyAlternative)) {
				icon = readOnlyAlternative;
			}
		}
		if(store.tiddlerExists(icon)) {
			$(el).css({display: "inline-block"}).empty();
			imageMacro.renderImage(el, icon, { alt: text });
		}
	});
};

// provide onClickMore to provide extra commands in a popup
macro.onClickMorePopUp = function(ev) {
	ev = ev || window.event;
	var sibling = this.nextSibling;
	if(sibling) {
		var commands = sibling.childNodes;
		var popup = Popup.create(this);
		$(popup).addClass("taggedTiddlerList");
		for(var i = 0; i < commands.length; i++) {
			var li = createTiddlyElement(popup, "li", null);
			var oldCommand = commands[i];
			var command = oldCommand.cloneNode(true);
			command.onclick = oldCommand.onclick;
			li.appendChild(command);
		}
		Popup.show();
	}
	ev.cancelBubble = true;
	if(ev.stopPropagation) {
		ev.stopPropagation();
	}
	return false;
};

})(jQuery);
//}}}
/***
|''Name''|TiddlySpaceViewTypes|
|''Version''|0.6.0|
|''Status''|@@beta@@|
|''Description''|Provides TiddlySpace specific view types|
|''Author''|Jon Robson|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceViewTypes.js|
|''Requires''|TiddlySpaceConfig TiddlySpaceTiddlerIconsPlugin|
!Usage
Provides replyLink, spaceLink and SiteIcon view types.
!!SiteIcon view parameters
* labelPrefix / labelSuffix : prefix or suffix the label with additional text. eg. labelPrefix:'modified by '
* spaceLink: if set to "yes" will make any avatars link to the corresponding space. {{{<<originMacro spaceLink:yes>>}}}

!Code
***/
//{{{
(function($) {

var tiddlyspace = config.extensions.tiddlyspace;
var originMacro = config.macros.tiddlerOrigin;
var tweb = config.extensions.tiddlyweb;

config.macros.view.replyLink = {
	locale: {
		label: "Reply to this tiddler"
	}
};

var _replyButtons = [];
var _replyInitialised, _replyScriptLoaded;
config.macros.view.views.replyLink = function(value, place, params, wikifier,
		paramString, tiddler) {
	var valueField = params[0];
	var imported;
	if(valueField == "title") { // special casing for imported tiddlers
		var localTitle = tiddler.title;
		var serverTitle = tiddler.fields["server.title"];
		if(serverTitle && localTitle != serverTitle) {
			value = serverTitle ? serverTitle : localTitle;
			imported = true;
		}
	} else {
		title = tiddler[valueField] ? tiddler[valueField] : tiddler.fields[valueField];
	}
	var args = paramString.parseParams("anon")[0];
	var label = (args.label) ? args.label : config.macros.view.replyLink.locale.label;
	var space;
	if(tiddler) {
		var bag = tiddler.fields["server.bag"];
		space = tiddlyspace.resolveSpaceName(bag);
	}
	var container = $('<span class="replyLink" />').appendTo(place)[0];

	tweb.getUserInfo(function(user) {
		if ((!user.anon) && ((space && user.name != space &&
				user.name != tiddlyspace.currentSpace.name) || imported)) {
			var link = $("<a />")
				.text(config.macros.view.replyLink.locale.label)
				.appendTo(container)[0];

			if(typeof(createReplyButton) === "undefined") {
				_replyButtons.push(link);
			}
			if(_replyInitialised) {
				createReplyButton(link);
			} else if(!_replyScriptLoaded) {
				_replyScriptLoaded = true;
				$.getScript("/bags/common/tiddlers/_reply-button.js",
					function() {
						_replyInitialised = true;
						for(var i = 0; i < _replyButtons.length; i++) {
							createReplyButton(_replyButtons[i]);
						}
						_replyButtons = [];
					});
			}
		}
	});

};

config.macros.view.views.spaceLink = function(value, place, params, wikifier,
		paramString, tiddler) {
		var spaceName = tiddlyspace.resolveSpaceName(value);
		var isBag = params[0] == "server.bag" && value === spaceName ? true : false;
		var args = paramString.parseParams("anon")[0];
		var titleField = args.anon[2];
		var labelField = args.labelField ? args.labelField[0] : false;
		var label;
		if(labelField) {
			label = tiddler[labelField] ? tiddler[labelField] : tiddler.fields[labelField];
		} else {
			label = args.label ? args.label[0] : false;
		}
		var title = tiddler[titleField] ? tiddler[titleField] : tiddler.fields[titleField];

		var link = createSpaceLink(place, spaceName, title, label, isBag);
		if(args.external && args.external[0] == "no") {
			$(link).click(function(ev) {
				var el = $(ev.target);
				var title = el.attr("tiddler");
				var bag = el.attr("bag");
				var space = el.attr("tiddlyspace");
				bag = space ? space + "_public" : bag;
				if(title && bag) {
					ev.preventDefault();
					tiddlyspace.displayServerTiddler(el[0], title,
						"bags/" + bag);
				}
				return false;
			});
		}
};

config.macros.view.views.SiteIcon = function(value, place, params, wikifier,
		paramString, tiddler) {
	var options = originMacro.getOptions(paramString);
	if(!tiddler || value == "None") { // some core tiddlers lack modifier
		value = false;
	}
	var field = params[0];
	if(field == "server.bag") {
		options.notSpace = !originMacro._isSpace(value);
	}
	tiddlyspace.renderAvatar(place, value, options);
};

})(jQuery);
//}}}
[[TiddlySpot.com|http://tiddlyspot.com]] has been one of the early providers for hosting TiddlyWiki and much contributed to engaging the community. For more information, check out the [[TiddlySpot FAQ|http://faq.tiddlyspot.com]].
[[TiddlyTools|http://www.tiddlytools.com]] is a treasure trove of high quality, well maintained TiddlyWiki plugins created by [[Eric Shulman]] of ELSDesign.
Some say it's a parallel universe full of magic and miracles...
[[TiddlyWeb|http://tiddlyweb.com]] is an open source implementation of a server side for TiddlyWiki with a [[HTTP API]] for storing and accessing content on the web. TiddlyWeb is developed by [[Osmosoft]] and available from the [[TiddlyWeb Project Page|http://github.com/tiddlyweb]] on [[github|http://github.com]] or via [[PyPI|http://pypi.python.org/pypi/tiddlyweb]].
/***
|''Name''|TiddlyWebAdaptor|
|''Description''|adaptor for interacting with TiddlyWeb|
|''Author:''|FND|
|''Contributors''|Chris Dent, Martin Budden|
|''Version''|1.4.10|
|''Status''|stable|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/adaptors/TiddlyWebAdaptor.js|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/association/|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5|
|''Keywords''|serverSide TiddlyWeb|
!Notes
This plugin includes [[jQuery JSON|http://code.google.com/p/jquery-json/]].
!To Do
* createWorkspace
* document custom/optional context attributes (e.g. filters, query, revision) and tiddler fields (e.g. server.title, origin)
!Code
***/
//{{{
(function($) {

var adaptor = config.adaptors.tiddlyweb = function() {};

adaptor.prototype = new AdaptorBase();
adaptor.serverType = "tiddlyweb";
adaptor.serverLabel = "TiddlyWeb";
adaptor.mimeType = "application/json";

adaptor.parsingErrorMessage = "Error parsing result from server";
adaptor.noBagErrorMessage = "no bag specified for tiddler";
adaptor.locationIDErrorMessage = "no bag or recipe specified for tiddler"; // TODO: rename

// retrieve current status (requires TiddlyWeb status plugin)
adaptor.prototype.getStatus = function(context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/status";
	var uri = uriTemplate.format([context.host]);
	var req = httpReq("GET", uri, adaptor.getStatusCallback, context,
		null, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getStatusCallback = function(status, context, responseText, uri, xhr) {
	context.status = responseText ? status : false;
	try {
		context.statusText = xhr.statusText;
	} catch(exc) { // offline (Firefox)
		context.status = false;
		context.statusText = null;
	}
	context.httpStatus = xhr.status;
	if(context.status) {
		context.serverStatus = $.evalJSON(responseText); // XXX: error handling!?
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// retrieve a list of workspaces
adaptor.prototype.getWorkspaceList = function(context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.workspaces = [];
	var uriTemplate = "%0/recipes"; // XXX: bags?
	var uri = uriTemplate.format([context.host]);
	var req = httpReq("GET", uri, adaptor.getWorkspaceListCallback,
		context, { accept: adaptor.mimeType }, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getWorkspaceListCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		try {
			var workspaces = $.evalJSON(responseText);
		} catch(ex) {
			context.status = false; // XXX: correct?
			context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
			if(context.callback) {
				context.callback(context, context.userParams);
			}
			return;
		}
		context.workspaces = workspaces.map(function(itm) { return { title: itm }; });
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// retrieve a list of tiddlers
adaptor.prototype.getTiddlerList = function(context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/%1/%2/tiddlers%3";
	var params = context.filters ? "?" + context.filters : "";
	if(context.format) {
		params = context.format + params;
	}
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name), params]);
	var req = httpReq("GET", uri, adaptor.getTiddlerListCallback,
		context, merge({ accept: adaptor.mimeType }, context.headers), null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerListCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		context.tiddlers = [];
		try {
			var tiddlers = $.evalJSON(responseText); //# NB: not actual tiddler instances
		} catch(ex) {
			context.status = false; // XXX: correct?
			context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
			if(context.callback) {
				context.callback(context, context.userParams);
			}
			return;
		}
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = adaptor.toTiddler(tiddlers[i], context.host);
			context.tiddlers.push(tiddler);
		}
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// perform global search
adaptor.prototype.getSearchResults = function(context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/search?q=%1%2";
	var filterString = context.filters ? ";" + context.filters : "";
	var uri = uriTemplate.format([context.host, context.query, filterString]); // XXX: parameters need escaping?
	var req = httpReq("GET", uri, adaptor.getSearchResultsCallback,
		context, { accept: adaptor.mimeType }, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getSearchResultsCallback = function(status, context, responseText, uri, xhr) {
	adaptor.getTiddlerListCallback(status, context, responseText, uri, xhr); // XXX: use apply?
};

// retrieve a particular tiddler's revisions
adaptor.prototype.getTiddlerRevisionList = function(title, limit, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions";
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name), adaptor.normalizeTitle(title)]);
	var req = httpReq("GET", uri, adaptor.getTiddlerRevisionListCallback,
		context, merge({ accept: adaptor.mimeType }, context.headers), null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerRevisionListCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		context.revisions = [];
		try {
			var tiddlers = $.evalJSON(responseText); //# NB: not actual tiddler instances
		} catch(ex) {
			context.status = false; // XXX: correct?
			context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
			if(context.callback) {
				context.callback(context, context.userParams);
			}
			return;
		}
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = adaptor.toTiddler(tiddlers[i], context.host);
			context.revisions.push(tiddler);
		}
		var sortField = "server.page.revision";
		context.revisions.sort(function(a, b) {
			return a.fields[sortField] < b.fields[sortField] ? 1 :
				(a.fields[sortField] == b.fields[sortField] ? 0 : -1);
		});
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// retrieve an individual tiddler revision -- XXX: breaks with standard arguments list -- XXX: convenience function; simply use getTiddler?
adaptor.prototype.getTiddlerRevision = function(title, revision, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.revision = revision;
	return this.getTiddler(title, context, userParams, callback);
};

// retrieve an individual tiddler
//# context is an object with members host and workspace
//# callback is passed the new context and userParams
adaptor.prototype.getTiddler = function(title, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = title;
	if(context.revision) {
		var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions/%4";
	} else {
		uriTemplate = "%0/%1/%2/tiddlers/%3";
	}
	if(!context.tiddler) {
		context.tiddler = new Tiddler(title);
	}
	context.tiddler.fields["server.type"] = adaptor.serverType;
	context.tiddler.fields["server.host"] = AdaptorBase.minHostName(context.host);
	context.tiddler.fields["server.workspace"] = context.workspace;
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name), adaptor.normalizeTitle(title),
		context.revision]);
	var req = httpReq("GET", uri, adaptor.getTiddlerCallback, context,
		merge({ accept: adaptor.mimeType }, context.headers), null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		try {
			var tid = $.evalJSON(responseText);
		} catch(ex) {
			context.status = false;
			context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
			if(context.callback) {
				context.callback(context, context.userParams);
			}
			return;
		}
		var tiddler = adaptor.toTiddler(tid, context.host);
		tiddler.title = context.tiddler.title;
		tiddler.fields["server.etag"] = xhr.getResponseHeader("Etag");
		// normally we'd assign context.tiddler = tiddler here - but we can't do
		// that because of IE, which triggers getTiddler in putTiddlerCallback,
		// and since ServerSideSavingPlugin foolishly relies on persistent
		// object references, we need to merge the data into the existing object
		$.extend(context.tiddler, tiddler);
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// retrieve tiddler chronicle (all revisions)
adaptor.prototype.getTiddlerChronicle = function(title, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = title;
	var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions?fat=1";
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name), adaptor.normalizeTitle(title)]);
	var req = httpReq("GET", uri, adaptor.getTiddlerChronicleCallback,
		context, { accept: adaptor.mimeType }, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerChronicleCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		context.responseText = responseText;
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// store an individual tiddler
adaptor.prototype.putTiddler = function(tiddler, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = tiddler.title;
	context.tiddler = tiddler;
	context.host = context.host || this.fullHostName(tiddler.fields["server.host"]);
	var uriTemplate = "%0/%1/%2/tiddlers/%3";
	try {
		context.workspace = context.workspace || tiddler.fields["server.workspace"];
		var workspace = adaptor.resolveWorkspace(context.workspace);
	} catch(ex) {
		return adaptor.locationIDErrorMessage;
	}
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name),
		adaptor.normalizeTitle(tiddler.title)]);
	var etag = adaptor.generateETag(workspace, tiddler);
	var headers = etag ? { "If-Match": etag } : null;
	var payload = {
		type: tiddler.fields["server.content-type"] || null,
		text: tiddler.text,
		tags: tiddler.tags,
		fields: $.extend({}, tiddler.fields)
	};
	delete payload.fields.changecount;
	$.each(payload.fields, function(key, value) {
		if(key.indexOf("server.") == 0) {
			delete payload.fields[key];
		}
	});
	payload = $.toJSON(payload);
	var req = httpReq("PUT", uri, adaptor.putTiddlerCallback,
		context, headers, payload, adaptor.mimeType, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.putTiddlerCallback = function(status, context, responseText, uri, xhr) {
	context.status = [204, 1223].contains(xhr.status);
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(context.status) {
		var loc = xhr.getResponseHeader("Location");
		var etag = xhr.getResponseHeader("Etag");
		if(loc && etag) {
			var bag = loc.split("/bags/").pop().split("/")[0];
			context.tiddler.fields["server.bag"] = bag;
			context.tiddler.fields["server.workspace"] = "bags/" + bag;
			var rev = etag.split("/").pop().split(/;|:/)[0];
			context.tiddler.fields["server.page.revision"] = rev;
			context.tiddler.fields["server.etag"] = etag;
			if(context.callback) {
				context.callback(context, context.userParams);
			}
		} else { // IE
			context.adaptor.getTiddler(context.tiddler.title, context,
				context.userParams, context.callback);
		}
	} else if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// store a tiddler chronicle
adaptor.prototype.putTiddlerChronicle = function(revisions, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = revisions[0].title;
	var headers = null;
	var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions";
	var host = context.host || this.fullHostName(tiddler.fields["server.host"]);
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name),
		adaptor.normalizeTitle(context.title)]);
	if(workspace.type == "bag") { // generate ETag
		var etag = [adaptor.normalizeTitle(workspace.name),
			adaptor.normalizeTitle(context.title), 0].join("/"); //# zero-revision prevents overwriting existing contents
		headers = { "If-Match": '"' + etag + '"' };
	}
	var payload = $.toJSON(revisions);
	var req = httpReq("POST", uri, adaptor.putTiddlerChronicleCallback,
		context, headers, payload, adaptor.mimeType, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.putTiddlerChronicleCallback = function(status, context, responseText, uri, xhr) {
	context.status = [204, 1223].contains(xhr.status);
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// store a collection of tiddlers (import TiddlyWiki HTML store)
adaptor.prototype.putTiddlerStore = function(store, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/%1/%2/tiddlers";
	var host = context.host;
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name)]);
	var req = httpReq("POST", uri, adaptor.putTiddlerStoreCallback,
		context, null, store, "text/x-tiddlywiki", null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.putTiddlerStoreCallback = function(status, context, responseText, uri, xhr) {
	context.status = [204, 1223].contains(xhr.status);
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// rename an individual tiddler or move it to a different workspace -- TODO: make {from|to}.title optional
//# from and to are objects with members title and workspace (bag; optional),
//# representing source and target tiddler, respectively
adaptor.prototype.moveTiddler = function(from, to, context, userParams, callback) { // XXX: rename parameters (old/new)?
	var self = this;
	var newTiddler = store.getTiddler(from.title) || store.getTiddler(to.title); //# local rename might already have occurred
	var oldTiddler = $.extend(true, {}, newTiddler); //# required for eventual deletion
	oldTiddler.title = from.title; //# required for original tiddler's ETag
	var _getTiddlerChronicle = function(title, context, userParams, callback) {
		return self.getTiddlerChronicle(title, context, userParams, callback);
	};
	var _putTiddlerChronicle = function(context, userParams) {
		if(!context.status) {
			return callback(context, userParams);
		}
		var revisions = $.evalJSON(context.responseText); // XXX: error handling?
		// change current title while retaining previous location
		for(var i = 0; i < revisions.length; i++) {
			delete revisions[i].revision;
			if(!revisions[i].fields.origin) { // NB: origin = "<workspace>/<title>"
				revisions[i].fields.origin = ["bags", revisions[i].bag, revisions[i].title].join("/");
			}
			revisions[i].title = to.title;
		}
		// add new revision
		var rev = $.extend({}, revisions[0]);
		$.each(newTiddler, function(i, item) {
			if(!$.isFunction(item)) {
				rev[i] = item;
			}
		});
		rev.title = to.title;
		rev.created = rev.created.convertToYYYYMMDDHHMM();
		rev.modified = new Date().convertToYYYYMMDDHHMM();
		delete rev.fields.changecount;
		revisions.unshift(rev);
		if(to.workspace) {
			context.workspace = to.workspace;
		} else if(context.workspace.substring(0, 4) != "bags") { // NB: target workspace must be a bag
			context.workspace = "bags/" + rev.bag;
		}
		var subCallback = function(context, userParams) {
			if(!context.status) {
				return callback(context, userParams);
			}
			context.adaptor.getTiddler(newTiddler.title, context, userParams, _deleteTiddler);
		};
		return self.putTiddlerChronicle(revisions, context, context.userParams, subCallback);
	};
	var _deleteTiddler = function(context, userParams) {
		if(!context.status) {
			return callback(context, userParams);
		}
		$.extend(true, newTiddler, context.tiddler);
		context.callback = null;
		return self.deleteTiddler(oldTiddler, context, context.userParams, callback);
	};
	callback = callback || function() {};
	context = this.setContext(context, userParams);
	context.host = context.host || oldTiddler.fields["server.host"];
	context.workspace = from.workspace || oldTiddler.fields["server.workspace"];
	return _getTiddlerChronicle(from.title, context, userParams, _putTiddlerChronicle);
};

// delete an individual tiddler
adaptor.prototype.deleteTiddler = function(tiddler, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = tiddler.title; // XXX: not required!?
	var uriTemplate = "%0/bags/%1/tiddlers/%2";
	var host = context.host || this.fullHostName(tiddler.fields["server.host"]);
	var bag = tiddler.fields["server.bag"];
	if(!bag) {
		return adaptor.noBagErrorMessage;
	}
	var uri = uriTemplate.format([host, adaptor.normalizeTitle(bag),
		adaptor.normalizeTitle(tiddler.title)]);
	var etag = adaptor.generateETag({ type: "bag", name: bag }, tiddler);
	var headers = etag ? { "If-Match": etag } : null;
	var req = httpReq("DELETE", uri, adaptor.deleteTiddlerCallback, context, headers,
		null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.deleteTiddlerCallback = function(status, context, responseText, uri, xhr) {
	context.status = [204, 1223].contains(xhr.status);
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// compare two revisions of a tiddler (requires TiddlyWeb differ plugin)
//# if context.rev1 is not specified, the latest revision will be used for comparison
//# if context.rev2 is not specified, the local revision will be sent for comparison
//# context.format is a string as determined by the TiddlyWeb differ plugin
adaptor.prototype.getTiddlerDiff = function(title, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = title;

	var tiddler = store.getTiddler(title);
	try {
		var workspace = adaptor.resolveWorkspace(tiddler.fields["server.workspace"]);
	} catch(ex) {
		return adaptor.locationIDErrorMessage;
	}
	var tiddlerRef = [workspace.type + "s", workspace.name, tiddler.title].join("/");

	var rev1 = context.rev1 ? [tiddlerRef, context.rev1].join("/") : tiddlerRef;
	var rev2 = context.rev2 ? [tiddlerRef, context.rev2].join("/") : null;

	var uriTemplate = "%0/diff?rev1=%1";
	if(rev2) {
		uriTemplate += "&rev2=%2";
	}
	if(context.format) {
		uriTemplate += "&format=%3";
	}
	var host = context.host || this.fullHostName(tiddler.fields["server.host"]);
	var uri = uriTemplate.format([host, adaptor.normalizeTitle(rev1),
		adaptor.normalizeTitle(rev2), context.format]);

	if(rev2) {
		var req = httpReq("GET", uri, adaptor.getTiddlerDiffCallback, context, null,
			null, null, null, null, true);
	} else {
		var payload = {
			title: tiddler.title,
			text: tiddler.text,
			modifier: tiddler.modifier,
			tags: tiddler.tags,
			fields: $.extend({}, tiddler.fields)
		}; // XXX: missing attributes!?
		payload = $.toJSON(payload);
		req = httpReq("POST", uri, adaptor.getTiddlerDiffCallback, context,
			null, payload, adaptor.mimeType, null, null, true);
	}
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerDiffCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	context.uri = uri;
	if(status) {
		context.diff = responseText;
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// generate tiddler information
adaptor.prototype.generateTiddlerInfo = function(tiddler) {
	var info = {};
	var uriTemplate = "%0/%1/%2/tiddlers/%3";
	var host = this.host || tiddler.fields["server.host"]; // XXX: this.host obsolete?
	host = this.fullHostName(host);
	var workspace = adaptor.resolveWorkspace(tiddler.fields["server.workspace"]);
	info.uri = uriTemplate.format([host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name),
		adaptor.normalizeTitle(tiddler.title)]);
	return info;
};

// create Tiddler instance from TiddlyWeb tiddler JSON
adaptor.toTiddler = function(json, host) {
	var created = Date.convertFromYYYYMMDDHHMM(json.created);
	var modified = Date.convertFromYYYYMMDDHHMM(json.modified);
	var fields = json.fields;
	fields["server.type"] = adaptor.serverType;
	fields["server.host"] = AdaptorBase.minHostName(host);
	fields["server.bag"] = json.bag;
	fields["server.title"] = json.title;
	if(json.recipe) {
		fields["server.recipe"] = json.recipe;
	}
	if(json.type && json.type != "None") {
		fields["server.content-type"] = json.type;
	}
	fields["server.permissions"] = json.permissions.join(", ");
	fields["server.page.revision"] = json.revision;
	fields["server.workspace"] = "bags/" + json.bag;
	var tiddler = new Tiddler(json.title);
	tiddler.assign(tiddler.title, json.text, json.modifier, modified, json.tags,
		created, json.fields, json.creator);
	return tiddler;
};

adaptor.resolveWorkspace = function(workspace) {
	var components = workspace.split("/");
	return {
		type: components[0] == "bags" ? "bag" : "recipe",
		name: components[1] || components[0]
	};
};

adaptor.generateETag = function(workspace, tiddler) {
	var revision = tiddler.fields["server.page.revision"];
	var etag = revision == "false" ? null : tiddler.fields["server.etag"];
	if(!etag && workspace.type == "bag") {
		if(typeof revision == "undefined") {
			revision = "0";
		} else if(revision == "false") {
			return null;
		}
		etag = [adaptor.normalizeTitle(workspace.name),
			adaptor.normalizeTitle(tiddler.title), revision].join("/");
		etag = '"' + etag + '"';
	}
	return etag;
};

adaptor.normalizeTitle = function(title) {
	return encodeURIComponent(title);
};

})(jQuery);


/*
 * jQuery JSON Plugin
 * version: 1.3
 * source: http://code.google.com/p/jquery-json/
 * license: MIT (http://www.opensource.org/licenses/mit-license.php)
 */
(function($){function toIntegersAtLease(n)
{return n<10?'0'+n:n;}
Date.prototype.toJSON=function(date)
{return this.getUTCFullYear()+'-'+
toIntegersAtLease(this.getUTCMonth())+'-'+
toIntegersAtLease(this.getUTCDate());};var escapeable=/["\\\x00-\x1f\x7f-\x9f]/g;var meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};$.quoteString=function(string)
{if(escapeable.test(string))
{return'"'+string.replace(escapeable,function(a)
{var c=meta[a];if(typeof c==='string'){return c;}
c=a.charCodeAt();return'\\u00'+Math.floor(c/16).toString(16)+(c%16).toString(16);})+'"';}
return'"'+string+'"';};$.toJSON=function(o,compact)
{var type=typeof(o);if(type=="undefined")
return"undefined";else if(type=="number"||type=="boolean")
return o+"";else if(o===null)
return"null";if(type=="string")
{return $.quoteString(o);}
if(type=="object"&&typeof o.toJSON=="function")
return o.toJSON(compact);if(type!="function"&&typeof(o.length)=="number")
{var ret=[];for(var i=0;i<o.length;i++){ret.push($.toJSON(o[i],compact));}
if(compact)
return"["+ret.join(",")+"]";else
return"["+ret.join(", ")+"]";}
if(type=="function"){throw new TypeError("Unable to convert object of type 'function' to json.");}
var ret=[];for(var k in o){var name;type=typeof(k);if(type=="number")
name='"'+k+'"';else if(type=="string")
name=$.quoteString(k);else
continue;var val=$.toJSON(o[k],compact);if(typeof(val)!="string"){continue;}
if(compact)
ret.push(name+":"+val);else
ret.push(name+": "+val);}
return"{"+ret.join(", ")+"}";};$.compactJSON=function(o)
{return $.toJSON(o,true);};$.evalJSON=function(src)
{return eval("("+src+")");};$.secureEvalJSON=function(src)
{var filtered=src;filtered=filtered.replace(/\\["\\\/bfnrtu]/g,'@');filtered=filtered.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']');filtered=filtered.replace(/(?:^|:|,)(?:\s*\[)+/g,'');if(/^[\],:{}\s]*$/.test(filtered))
return eval("("+src+")");else
throw new SyntaxError("Error parsing JSON, source is not valid.");};})(jQuery);
//}}}
/***
|''Name''|TiddlyWebConfig|
|''Description''|configuration settings for TiddlyWebWiki|
|''Author''|FND|
|''Version''|1.3.2|
|''Status''|stable|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/TiddlyWebConfig.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''Requires''|TiddlyWebAdaptor ServerSideSavingPlugin|
|''Keywords''|serverSide TiddlyWeb|
!Code
***/
//{{{
(function($) {

if(!config.extensions.ServerSideSavingPlugin) {
	throw "Missing dependency: ServerSideSavingPlugin";
}
if(!config.adaptors.tiddlyweb) {
	throw "Missing dependency: TiddlyWebAdaptor";
}

if(window.location.protocol != "file:") {
	config.options.chkAutoSave = true;
}

var adaptor = tiddler.getAdaptor();
var recipe = tiddler.fields["server.recipe"];
var workspace = recipe ? "recipes/" + recipe : "bags/common";

var plugin = config.extensions.tiddlyweb = {
	host: tiddler.fields["server.host"].replace(/\/$/, ""),
	username: null,
	status: {},

	getStatus: null, // assigned later
	getUserInfo: function(callback) {
		this.getStatus(function(status) {
			callback({
				name: plugin.username,
				anon: plugin.username ? plugin.username == "GUEST" : true
			});
		});
	},
	hasPermission: function(type, tiddler) {
		var perms = tiddler.fields["server.permissions"];
		if(perms) {
			return perms.split(", ").contains(type);
		} else {
			return true;
		}
	}
};

config.defaultCustomFields = {
	"server.type": tiddler.getServerType(),
	"server.host": plugin.host,
	"server.workspace": workspace
};

// modify toolbar commands

config.shadowTiddlers.ToolbarCommands = config.shadowTiddlers.ToolbarCommands.
	replace("syncing ", "revisions syncing ");

config.commands.saveTiddler.isEnabled = function(tiddler) {
	return plugin.hasPermission("write", tiddler) && !tiddler.isReadOnly();
};

config.commands.deleteTiddler.isEnabled = function(tiddler) {
	return !readOnly && plugin.hasPermission("delete", tiddler);
};

// hijack option macro to disable username editing
var _optionMacro = config.macros.option.handler;
config.macros.option.handler = function(place, macroName, params, wikifier,
		paramString) {
	if(params[0] == "txtUserName") {
		params[0] = "options." + params[0];
		var self = this;
		var args = arguments;
		args[0] = $("<span />").appendTo(place)[0];
		plugin.getUserInfo(function(user) {
			config.macros.message.handler.apply(self, args);
		});
	} else {
		_optionMacro.apply(this, arguments);
	}
};

// hijack isReadOnly to take into account permissions and content type
var _isReadOnly = Tiddler.prototype.isReadOnly;
Tiddler.prototype.isReadOnly = function() {
	return _isReadOnly.apply(this, arguments) ||
		!plugin.hasPermission("write", this);
};

var getStatus = function(callback) {
	if(plugin.status.version) {
		callback(plugin.status);
	} else {
		var self = getStatus;
		if(self.pending) {
			if(callback) {
				self.queue.push(callback);
			}
		} else {
			self.pending = true;
			self.queue = callback ? [callback] : [];
			var _callback = function(context, userParams) {
				var status = context.serverStatus || {};
				for(var key in status) {
					if(key == "username") {
						plugin.username = status[key];
						config.macros.option.propagateOption("txtUserName",
							"value", plugin.username, "input");
					} else {
						plugin.status[key] = status[key];
					}
				}
				for(var i = 0; i < self.queue.length; i++) {
					self.queue[i](plugin.status);
				}
				delete self.queue;
				delete self.pending;
			};
			adaptor.getStatus({ host: plugin.host }, null, _callback);
		}
	}
};
(plugin.getStatus = getStatus)(); // XXX: hacky (arcane combo of assignment plus execution)

})(jQuery);
//}}}
[[TiddlyWiki|http://tiddlywiki.com]] is a single-file wiki containing all the features of a [[wiki|http://en.wikipedia.org/wiki/WikiWikiWeb]] such as layout, styles, code and functionality for editing, saving, tagging and searching content.

In its basic form of a single html file it's highly portable -- so you can email it, put it on a web server or take it with you on a usb stick.
;[[TiddlyWiki Wiki|http://tiddlywiki.org/]]
:&raquo; general documentation included at http://tiddlywiki.org
;[[TiddlyWikiDev|http://tiddlywikidev.tiddlyspace.com/#Welcome]]
:&raquo; TiddlyWiki Development Space
;[[TiddlyWikiDocco|Extracted Source Code]]
:&raquo; Annotated Source Code
;[[TiddlySpaceDev|http://developers.tiddlyspace.com/]]
:&raquo; TiddlySpace Development Space
<<tiddler FAQ>>
* short walk through the code design, for reading the source code

* it would be great to have a quick walk through the TW5 high level design and to give people like me some guidance in how to start reading TW5 code.

* A tutorial on how to write TW5 plugins

* Probably TW5 design/code overview will be spread across several hangouts. It would be great to annotate the recording and eventually pull those pieces together to produce a video lecture about TW5 design/implementation/extension.

* Progress to beta

* Tiddler link formatting

* Tiddler state for reveal widget etc.

* Transclude widget being split into tiddler and transclude widgets

* Tagged entries in ViewTemplate


* Progress to beta

* ThemeTweaks

* WikiInfo

* MathML support

* AndTidWiki support

----

Left over from Hangout #10:

* A tutorial on how to write TW5 plugins

* Tiddler link formatting

* Tiddler state for reveal widget etc.

* Transclude widget being split into tiddler and transclude widgets

* Tagged entries in ViewTemplate

Proposed:

* Freedombits
* Data tiddlers
* Forum software
* Video plugin
* Authentication
* Tiddler state for reveal widget etc.
Join the TiddlyWiki IRC channel at...
<<<
;irc://irc.freenode.net/tiddlywiki
:» irc.freenode.net
:» """#tiddlywiki"""
<<<
Or directly use the web interface below...

<html><div align="center"><iframe src="http://webchat.freenode.net?channels=tiddlywiki&uio=MTE9MjE131" style="width:100%;height:400px;"></iframe></div></html>
The layout of a TiddlyWiki is defined in shadow tiddlers which serve as templates that contain HTML...
;[[PageTemplate|PageTemplate...]]
:» the overall page layout
;[[ViewTemplate|ViewTemplate...]]
:» the layout for an individual tiddler when viewing it |
;[[EditTemplate|EditTemplate...]]
:» the layout for a tiddler when editing it
''Note'': The commands in a tiddler toolbar are defined in a shadow tiddler called [[ToolbarCommands]].

![[Visual Layout|Layout]]
<<tiddler "Layout">>

![[TiddlySpace Layout]]
<<tiddler "TiddlySpace Layout">>
<<tiddler Markup>>
Type the text for 'New Tiddler'

TiddlyWiki Resources
Contents
[show]
Official

    tiddlywiki.com is the primary TiddlyWiki web site.
    wiki.tiddlywiki.org is this documentation wiki.
    trac.tiddlywiki.org Trac site for submitting/viewing bug reports and seeing the core development progress.
    Getting Started on TiddlyWiki.com 

Books

    TiddlyWiki維基寫作-知識管理最佳工具 ("TiddlyWiki - An excellent tool for knowledge management."; Traditional Chinese) 

Guides and Tutorials

    TW Help a TiddlyWiki help file for beginners maintained by Morris Gray
    TiddlyWiki for the rest of us by Dave G (Also available in Spanish)
    Intro: TiddlyWiki is a very versatile program, but has an initial learning curve to it. Much of the documentation is written by and for people immersed day after day in computer code, so, um, how do I put this delicately, it is not always written in helpful everyday language. Not being a computer genius myself, I found the TiddlyWiki learning curve daunting, but well worth it. For those of you like me, newcomers to TiddlyWiki who don't know "Tiddly Squat", I would like you to discover this great program without having to commit as much time and energy to it as I did. Enjoy!
    Tiddler Toddler A guide for absolute beginners by Julie Starr, an absolute beginner
    TiddlyWikiTutorial a tutorial in the form of a TiddlyWiki
    TiddlyWiki Basics by Denise Olson
    Writing Macros and Core Code Overview now contain what had been at The Macrocodex a guide to writing TiddlyWiki macros by Gimcrack'd. (That link now produces 301.)
    Tid-Help a primer for tiddlywiki by Jim Ventola
    TiddlyWiki Getting Started Guide by Daniel Baird
    A Getting Started Guide in development that might still be the first in a series of standalone guides to TiddlyWiki. See the latest sample for a preview.
    TiddlyWiki quick reference card by Dmitri Popov (CheatSheet PDF) (Broken)
    TiddlyWiki Format Reference One page reference for TiddlyWiki markup (without resorting to view tiddler source)
    Start here: The making of a presentation manager part 1 to part 3 - A step by step HowTo get this: a-pm presentation manager by Mario Pietsch 

Other Useful Sites

    TiddlySpot (free TiddlyWiki hosting)
    TiddlySnip a firefox extension that allows you to use TiddlyWiki as a scrapbook! (this wouldn't work in Firefox 3.5.12 because of an invalid security certificate)
    TiddlyThemes a gallery of themes for TiddlyWiki 

Community Support

    Users' mailing list at Google Groups (Newcomers welcome!)
    Developers' mailing list at Google Groups
    IRC chat (#tiddlywiki on Freenode)
    Facebook Groups 

Benefactors

    UnaMesa
    Osmosoft 

More

Some of these might be past their use-by date.

    Tid-Help 2 a screencast also by Jim Ventola
    TiddlyWikiTutorial by Blog Jones
    Intro: Welcome to TiddlyWikiTutorial, an introduction to one of the most efficient ways of communicating information ever devised.
    Getting Started Guide by Russ Lipton 404
    Contents About Getting Started, What Is TiddlyWiki? What You Can Do With TiddlyWiki, Getting Around TiddlyWiki...
    TiddlyWikiFAQ by Simon Baird. Has some stuff that should be migrated over here.
    Some useful reference stuff by Julian Knight (Jules) including lists of built-in macros, formatting rules and useful JavaScript methods for developers.
    TiddlyWikiTips by Jim Barr
    A screencast by Leon Kilat. Unfortunately he choose an old version of GTD-TiddlyWiki. (Full screen version here).
    An old but good introduction to/description of TiddlyWiki from euicho.com
    Some older stuff at zrenard.com.
    TiddlyWikiPlugin on delicious a list of plugins maintained by BidiX
    Guida a TiddlyWiki an italian TiddlyWiki tutorial 

Searches

    Search for code at GitHub.
    Search for code at SourceForge.
    Search for shareable adaptations and user creations at LimeBits.
    Search for anything "TiddlyWiki" at Delicious. 
!Introduction to TiddlyWiki
<html>
<iframe width="420" height="345" src="http://www.youtube.com/embed/ezNScBd7_h4" frameborder="0" allowfullscreen></iframe>
</html>
See [[TiddlyFox]]...
[[TiddlyWiki.com|http://tiddlywiki.com]] is the main TiddlyWiki website, providing download options for the main distribution as well as lots of information on...
*[[the basics for you to get started|http://tiddlywiki.com/#GettingStarted]]
*[[references for formatting, configuration, macros, etc...|http://tiddlywiki.com/#Reference]]
*[[tips for customizing TiddlyWiki|http://tiddlywiki.com/#Customisation]]
*[[examples and showcases|http://tiddlywiki.com/#Examples]]
*[[information on the TiddlyWiki community|http://tiddlywiki.com/#Community]] and [[how to get help|http://tiddlywiki.com/#%5B%5BHelp%20and%20Support%5D%5D]]
[[TiddlyWiki.org|http://tiddlywiki.org]] is the TiddlyWiki documentation powered by the TiddlyWiki community on TiddlySpace.
The ''getTiddler'' method of the [[store|TiddlyWiki Class]] object returns the DOM element of a tiddler in the ''store''. It takes one parameter, the name of a tiddler.  If the tiddler does not exist, null is returned.

It can be used like so
{{{
store.getTiddler("GettingStarted");
}}}
The TiddlyWiki Address Book (twab) is a system for keeping your Address Book within your TiddlyWiki.

It supports the addition of contacts via a simple macro that can be placed in any Tiddler.
It also supports the import and export of your contacts to and from major webmail providers such as Google, Yahoo, and Hotmail as well as Microsoft Outlook.  Twab is customizable and comes fully documented.
!!!Link:
http://www.tiddly-twab.com
At [[Tiddlyspot|http://tiddlyspot.com]] you can quickly create an online web site using TiddlyWiki. You can save your changes online (using [[UploadPlugin]]) and you can even download your site, work on it offline, then upload it back to the web when you want to.

!Features
* Select from several different TiddlyWiki distributions known as "flavours".
* Can customise your site and use any plugin you want.
* Choose a private or public site.
* Keep some backups of your site in case you need to restore a previous version.

!More Information
* [[Tiddlyspot FAQ|http://faq.tiddlyspot.com]]
* [[Tiddlyspot Blopg|http://tiddlyspot.blogspot.com]]
* [[About Tiddlyspot|http://tiddlyspot.com/?page=about]]
<<slider chkTimelineModified Timeline##MODIFIED "by Modified Date...">>
<<slider chkTimelineCreated Timeline##CREATED "by Created Date...">>/%
!MODIFIED
><<timeline "modified" template:"TEMPLATES##MODIFIER">><<listfiltr>>
!CREATED
><<timeline "created" template:"TEMPLATES##EXCLUDE+LIST">><<listfiltr>>
!END%/
/***
|''Name''|ToggleTiddlerPrivacyPlugin|
|''Version''|0.7.1|
|''Status''|@@beta@@|
|''Description''|Allows you to set the privacy of new tiddlers and external tiddlers within an EditTemplate, and allows you to set a default privacy setting|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/ToggleTiddlerPrivacyPlugin.js|
!Notes
When used in conjunction with TiddlySpaceTiddlerIconsPlugin changing the privacy setting will also interact with any privacy icons.

Currently use of
{{{<<setPrivacy defaultValue:public>>}}} is in conflict with {{{<<newTiddler fields:"server.workspace:x_private">>}}}

There is an option, found in the tweak tab of the backstage, called txtPrivacyMode. Set this to either ''public'' or ''private'' depending on your security preference. If you choose not to set it then it will default to ''public''.
!Params
defaultValue:[private|public]
Allows you to set the default privacy value (Default is private)

!Code
***/
//{{{
(function($) {

	var tiddlyspace = config.extensions.tiddlyspace,
		macro;
	macro = config.macros.setPrivacy = {
		handler: function(place, macroName, params, wikifier, paramString, tiddler) {
			if(readOnly) {
				return;
			}
			var el = $(story.findContainingTiddler(place)),
				args = paramString.parseParams("name",
					null, true, false, true)[0],
				container = $("<div />").
					addClass("privacySettings").
					appendTo(place)[0],
				currentSpace = tiddlyspace.currentSpace.name,
				currentBag = tiddler ? tiddler.fields["server.bag"] : false,
				// XXX: is the following reliable?
				isNewTiddler = el.hasClass("missing") || !currentBag,
				tiddlerStatus = tiddlyspace.getTiddlerStatusType(tiddler),
				customFields = el.attr("tiddlyfields"),
				defaultValue = "public",
				options = config.macros.tiddlerOrigin ?
						config.macros.tiddlerOrigin.getOptions(paramString) :
						{};
			customFields = customFields ? customFields.decodeHashMap() : {};
			if(isNewTiddler || !["public", "private", "unsyncedPrivate",
					"unsyncedPublic"].contains(tiddlerStatus)) {
				if(args.defaultValue) {
					defaultValue = args.defaultValue[0].toLowerCase();
				} else {
					defaultValue = config.options.chkPrivateMode ?
							"private" : "public";
				}
				defaultValue = defaultValue ?
						"%0_%1".format(currentSpace, defaultValue) :
						customFields["server.bag"];
				this.createRoundel(container, tiddler, currentSpace,
						defaultValue, options);
			}
		},
		updateEditFields: function(tiddlerEl, bag) {
			var saveBagField = $('[edit="server.bag"]', tiddlerEl),
				saveWorkspaceField = $('[edit="server.workspace"]', tiddlerEl),
				input = $("<input />").attr("type", "hidden"),
				workspace = "bags/" + bag;
			if(saveBagField.length === 0) {
				input.clone().attr("edit", "server.bag").val(bag).
					appendTo(tiddlerEl);
			} else {
				saveBagField.val(bag);
			}
			// reset to prevent side effects
			$(tiddlerEl).attr("tiddlyFields", "");
			if(saveWorkspaceField.length === 0) {
				input.clone().attr("edit", "server.workspace").
					val(workspace).appendTo(tiddlerEl);
			} else {
				saveWorkspaceField.val(workspace);
			}
		},
		setBag: function(tiddlerEl, newBag, options) {
			var bagStatus,
				title = $(tiddlerEl).attr("tiddler"),
				tiddler = store.getTiddler(title),
				originButton = $(".originButton", tiddlerEl)[0],
				refreshIcon,
				newWorkspace = "bags/" + newBag,
				rPrivate = $("input[type=radio].isPrivate", tiddlerEl),
				rPublic = $("input[type=radio].isPublic", tiddlerEl);
			refreshIcon = function(type) {
				var originMacro = config.macros.tiddlerOrigin;
				if(originButton && originMacro) {
					options.noclick = true;
					originMacro.showPrivacyRoundel(tiddler, type,
							originButton, options);
				}
			};
			macro.updateEditFields(tiddlerEl, newBag);
			if(tiddler) {
				tiddler.fields["server.bag"] = newBag;
				// for external tiddlers
				tiddler.fields["server.workspace"] = newWorkspace;
			}
			if(newBag.indexOf("_public") > -1) {
				rPrivate.attr("checked", false);
				rPublic.attr("checked", true);
				bagStatus = "public";
			} else {
				rPublic.attr("checked", false); // explicitly do this for ie
				rPrivate.attr("checked", true);
				bagStatus = "private";
			}
			refreshIcon(bagStatus);
		},
		createRoundel: function(container, tiddler, currentSpace,
							   defaultValue, options) {
			var privateBag = "%0_private".format(currentSpace),
				publicBag = "%0_public".format(currentSpace),
				rbtn = $("<input />").attr("type", "radio").
					attr("name", tiddler.title),
				el = story.findContainingTiddler(container);
			rbtn.clone().val("private").addClass("isPrivate").
				appendTo(container);
			$("<label />").text("private").appendTo(container); // TODO: i18n
			rbtn.clone().val("public").addClass("isPublic")
				.appendTo(container);
			$("<label />").text("public").appendTo(container); // TODO: i18n
			$("[type=radio]", container).click(function(ev) {
				var btn = $(ev.target);
				tiddler.fields["server.page.revision"] = "false";
				if(btn.hasClass("isPrivate")) { // private button clicked.
					$(el).addClass("isPrivate").removeClass("isPublic");
					macro.setBag(el, privateBag, options);
				} else {
					$(el).addClass("isPublic").removeClass("isPrivate");
					macro.setBag(el, publicBag, options);
				}
			});
			window.setTimeout(function() {
				macro.setBag(el, defaultValue, options);
			}, 100);
			// annoyingly this is needed as customFields are added to end of EditTemplate so are not present yet
			// and don't seem to respect any existing customFields.
		}
	};

}(jQuery));
//}}}
The ToolbarCommands shadow tiddler allows you to configure the [[commands|ToolbarCommands...]] by default displayed in a toolbar in the upper right area of a tiddler allowing you to inspect and interact with a tiddler.
<<<

[[ToolbarCommands]]
<<tiddler ToolbarCommands>>
<<<
Both the TiddlyWiki and the TiddlySpace core provide a number of commands, others are provided by plugins.
!Command Prefixes
A toolbar command can have the following prefixes...
|!Prefix|!Description|h
| {{{-}}} |invoked when the ESC key is pressed whilst in a text input field;<br>by default used to cancel the editing of a tiddler in EditMode|
| {{{+}}} |it will be invoked when you double-click on a tiddler;<br>by default used with the editTiddler command in ViewMode to trigger EditMode|
If you don't want to use either functionality, remove the prefixes and use the toolbar commands normally.
<<<
''Caution:''
When using these prefixes, make sure you fully understand what will happen, e.g. putting {{{+}}} before the {{{deleteTiddler}}} command will delete a tiddler every time you double click on it
<<<
!Expanding and Collapsing
The toolbar can be partially collapsed. Use the separators {{{<}}} and {{{>}}} to specify where exactly the {{button{more »}}} and {{button{« less}}} buttons will be rendered in order to expand and collapse the toolbar into its full state.
<<<
In TiddlySpace, instead of expanding and collapsing the toolbar a button is used providing you with a popup of those commands that are by default hidden.
<<<
!Command Reference
The following provides a list of toolbar commands made available by the TiddlyWiki or TiddlySpace core or certain plugins...
|!Command|!Description|>|!Available In|!Provided By|
|~|~|!ViewMode|!EditMode|~|
|>|>|>|>|!TiddlyWiki Core Commands|
|{{{cancelTiddler}}}|Leaves EditMode without saving changes| / | Default | TiddlyWiki Core |
|{{{closeTiddler}}}|Closes this tiddler| Default | Optional |TiddlyWiki Core |
|{{{closeOthers}}}|Closes all other tiddlers except this one| Default | Optional | TiddlyWiki Core |
|{{{deleteTiddler}}}|Deletes the current tiddler| Optional | Default |TiddlyWiki Core |
|{{{editTiddler}}}|Opens the tiddler in [[EditMode]]| Default | / |TiddlyWiki Core |
|{{{fields}}}|Opens a field viewer popup listing all tiddler fields| Default | Optional |TiddlyWiki Core |
|{{{jump}}}|Opens a popup that allows to jump to any of the open tiddlers| Default | Optional |TiddlyWiki Core |
|{{{permalink}}}|Sets the browsers address bar to provide a reference opening the current tiddler on startup| Default | Optional |TiddlyWiki Core |
|{{{references}}}|Shows the references of a tiddler in terms of other Tiddlers linking to the current one| Default | Optional |TiddlyWiki Core |
|{{{refreshTiddler}}}|Refreshes the display of the current tiddler| Default | / |TiddlyWiki Core |
|{{{saveTiddler}}}|Saves the current tiddler and leaves edit mode| / | Default |TiddlyWiki Core |
|>|>|>|>|!TiddlySpace Commands|
|{{{changeToPublic}}}|Turns a private tiddler into a public tiddler| Default | / |TiddlySpace Core|
|{{{changeToPrivate}}}|Turns a public tiddler into a private tiddler| Default | / |TiddlySpace Core|
|{{{revisions}}}|Shows the edit history as revisions of a tiddler| Default | / |TiddlySpace Core|
|{{{saveDraft}}}|Saves the current edit as a draft to a tiddler| / | Default |TiddlySpace Core|
|{{{revert}}}|Reverts to this revision of a tiddler|>| only for ~RevisionToolbar |TiddlySpace Core|
|>|>|>|>|!Plugin Commands|
|>|>|>|>|to be done|
|~ViewToolbar|+editTiddler +cloneTiddler > fields refreshTiddler changeToPublic changeToPrivate revisions permalink references jump closeOthers < closeTiddler|
|~EditToolbar|+saveTiddler saveDraft -cancelTiddler deleteTiddler|
|~RevisionToolbar|> fields revert|
<<tiddler Toolbar>>
This term is introduced in [[wikipedia|http://en.wikipedia.org/wiki/Transclusion]] as:
> In computer science, transclusion is the inclusion of a document or part of a document into another document by reference.
In TiddlyWiki, the tiddler macro can be used to embed the entire content, sections or slices of one tiddler into another tiddler.
!!"""Parametric Transclusion"""
Using the {{{with:}}} parameter in the tiddler macro, placeholders {{{$1..$9}}} in the transcluded contents are replaced with the specified value.
!!!Example
''Tiddler: Prince Hamlet''
{{{<<tiddler [[QuoteTemplate]] with: "Alas poor Yorick" "Shakespeare">>}}}

''Tiddler: ~QuoteTemplate''
{{{
<<<
$1
<<<
{{{$2}}}
}}}
Using the [[tiddler macro]] as in the tiddler ''Prince Hamlet'' above the output will be...
<<<
Alas poor Yorick
<<<
{{{Shakespeare}}}

!!!"""Editing Transcluded Contents"""
* [[TiddlerWithEditPlugin|http://tiddlywiki.squize.org/#TiddlerWithEditPlugin]] adds "double-click to edit source" capabilities to the core Tiddler macro
* [[EditTiddlerPlugin|http://www.tiddlytools.com/#EditTiddlerPlugin]] embeds an "edit" link in tiddler content to invoke edit on any specified tiddler title

!!"""StyleSheet Transclusion"""
In StyleSheet tiddlers, the following references are treated like import statements; whereas the contents of the referenced tiddler, section or slice is included as [[CSS]] code:
;tiddler
:&raquo; {{{[[Tiddler Title]]}}}
:&raquo; imports the entire tiddler
;section
:&raquo; {{{[[Tiddler Title##Some Section]]}}}
:&raquo; imports a tiddler section
;slice
:&raquo; {{{[[Tiddler Title##Some Section}}}
:&raquo; imports a tiddler slice
!!"""Transcluded HTML Scripts"""
(from Eric in [[google group|http://groups.google.com/group/tiddlywiki/browse_thread/thread/c4aa71ecb0f7d4cf/7e2272e3bc4593eb?#7e2272e3bc4593eb]])
{{{
Transclusions can be used generate program- driven output, embedded in specific
tiddler content (like an inline script or a plugin-defined macro).

Transclusions are invoked by using the
   <<tiddler TiddlerName with: param param param ...>>
syntax.  The 'param' values are automatically inserted in place of
any 'substitution markers' ("$1" through "$9") that are embedded in the
transcluded content.  This allows you to use the transclusion as if it was a
macro function: passing in parameter values and generating enhanced output in
response.

Some transclusions are simple substitutions, allowing you to use an abbreviated
syntax to render pre-formatted blocks of content, like this:
   <<tiddler ShowQuotation with: [[...quote...]] [[author]]>>

where ShowQuotation contains:
   $2 wrote:
   {{{
   $1
   }}}

Transclusions can do much more than simply insert a few values into a
pre-defined format.  By using a combination of 'hidden sections' and some
cleverly written 'evaluated parameters' invoked from the <<tiddler>> macro, it
is possible to build some complex programmed behaviors
into a transcluded tiddler.

However, while macros and inline scripts can use virtually any javascript coded
logic you can imagine, transclusions only contain standard TW syntax, without
relying upon installation of any supporting plugins (i.e.,
InlineJavascriptPlugin).  Although this limits their abilities somewhat, there
are still a wide variety of programmatically-generated output and/or behaviors
that they can produce.

In fact, when possible, I have been converting many of my previously written
TiddlyTools inline scripts into 'transclusions', in order to completely
eliminate their dependence on InlineJavascriptPlugin.  By using only TW native
syntax, it allows these former scripts to work properly and consistently,
regardless of whether they are installed in an empty TW document or one that
has been highly customized with lots of plugins.

For the current listing of 'transclusions' available on TiddlyTools, see:
   http://www.TiddlyTools.com#txtCatalogTab:transclusions
}}}
See [[Transclusion]]...
See http://trac.tiddlywiki.org/wiki/Translations for a current list of translations, and information on how to do new translations.

See http://trac.tiddlywiki.org/browser/Trunk/association/locales/core to view the source code of existing translations.

See http://translations.tiddlyspace.com/ to view and get information on how to include translations on TiddlySpace.
First of all, please review the ''Troubleshooting'' section in the [[FAQ]].
!Plugin Failures
On [[plugin|Plugins]] errors, the [[PluginManager...]] will automatically be displayed on startup, highlighting failing plugins allong with error messages.
!Macro Errors
This is a [[macro]] error: <<?>> — clicking the error message reveals error details.
!Something Stopped Working
Deleting browser cookies or [[creating a fresh browser profile|http://kb.mozillazine.org/Profile_Manager]] might help creating a clean setup.

Also, [[try to disable plugins|PluginManager...]], e.g. recently installed plugins, plugins providing or using the feature that now fails or simply all plugins. If the problem disappeared, re-enabling plugins ''one at a time'' helps identifying failing plugin.
! Community Support
The [[TiddlyWike community|http://groups.google.com/group/TiddlyWiki]] is always glad to help out.

Please provide
* a concise description of the problem
* if applicable, the exact error messages
* step-by-step instructions for reproducing the issue
* system information
** TiddlyWiki [[version number|version]]
** relevant plugins (with links)
** operating system
** browser version (and extensions, if any)
** working online (via HTTP) or local (document on hard drive)
* if possible, a [[minimal test case|http://webkit.org/quality/reduction.html minimal test case]] (a sample document illustrating the issue, using as few components as possible). [[Tiddlyspot]] and [[TiddlySpace]] provide free hosting for TiddlyWiki documents.

''Note:'' It is advised to use a descriptive topic title and provide a ''concise'' description of the problem. Unrelated problems should be discussed in separate threads.

[[Eric says|http://groups.google.com/group/tiddlywiki/browse_thread/thread/5ac0d9749df4958c/89339ebfe98624f4?#89339ebfe98624f4]]:
> In order to test in any kind of useful way, I need a //minimal// test case that demonstrates the problem //and// eliminates as many causes as possible.  Typically this is done by installing the suspected plugin "in an empty TW", [...] so that I can immediately try a //simple// test case, without needing to suss what the rest of the document is about or how it has been customized.  Of course, some problems aren't reproducible with a simple test case, so the fully- customized document //must// be used, but this should be avoided if at all possible.

[[FND says|http://groups.google.com/group/TiddlyWiki/msg/7d674a17d6a39898 FND]]:
<<<
Generally speaking, there are a variety of reasons which could result in lack of feedback, e.g.
* bad timing: we might simply have missed your post (e.g. due to stress, holidays etc.) - bumping the thread after a few days usually helps
* reproducibility: it's important for us to have all the details we need to properly analyze the problem (cf. http://tiddlywiki.org/wiki/Troubleshooting)
* unclear expectations: sometimes it's not immediately obvious what the question is (also see below)
* mixing topics: separate issues should be discussed separate threads - this also helps recognizing which issues are still unsolved
* excessive verbosity: concise posts often have better chances of getting a response (AKA TLDR... ); while the personal background story might be (and indeed, often is) interesting, it's usually secondary to the actual issue
<<<

!See Also

* [[Safe Mode]]
* <<tag errors>>
* <<tag [[browser issues]]>>
TiddlyWiki can be tweaked in a number of ways...
;Styles
:&raquo; change text font's, colours an other display options using CSS StyleSheets
;Layout
:&raquo; change the general layout and contents using shadow tiddlers
:&raquo; SiteTitle, SiteSubtitle, MainMenu, SideBarOptions, SideBarTabs
;Default Options
:&raquo; override default settings and localizarion by [[changing default options|Changing Default Options]]
Tiddlers tagged <<tag Tweak>> provide tweaking examples.
A TiddlyWiki file must be saved or served using [[UTF-8 Encoding|http://en.wikipedia.org/wiki/UTF-8]]. 
!"""Serving TiddlyWiki"""
If you are serving TiddlyWiki using a web server you may need to add a ''.htaccess'' file containing:
{{{
AddCharset utf-8 .html
}}}
!"""Saving TiddlyWiki"""
If you """edit""" the source of TiddlyWiki directly in a text editor, make sure that it can handle UTF-8 and is set to use it, otherwise it might save TiddlyWiki using [[ASCII Encoding|http://en.wikipedia.org/wiki/ASCII]] or [[Latin Encoding (IEC 8859-1)|http://en.wikipedia.org/wiki/ISO/IEC_8859-1]] which will break special characters such as the &raquo; character in ''"""options """&raquo;''.
[[UnaMesa|http://unamesa.org]] acts as the custodian of the [[open source|http://en.wikipedia.org/wiki/Open_source]] license for [[TiddlyWiki]]'s source code. [[Jeremy Ruston|JeremyRuston]] transferred the full copyright to UnaMesa before [[Osmosoft]]'s acquisition by [[BT]].

<<<
A non-profit, world-wide association of individuals from industry, academia, and ~NGOs, UnaMesa, provides free software tools and web services for schools, clinics, and other community organizations.

It acts as an R&D organization to meet its goal; "for every student, educator, patient, and caregiver to have access to the information they need when they need it."
<<<
{{source{...from [[about.unamesa.org|http://about.unamesa.org]]}}}

<<<
For UnaMesa, the TiddlyWiki project is part of a greater endeavor "to improve the interoperability of digital records, especially educational materials" 
<<<
{{source{...from [[projects.unamesa.org|http://tiddlywiki.projects.unamesa.org]]}}}

<<<
UnaMesa operates at the intersection between open source, fair trade and social networks so that it can develop new models of trust and hold information for public benefit.
<<<
{{source{...from [[unamesa.org|http://www.unamesa.org/about/overview.pdf]]}}}

!!External Resources
[[UnaMesa Videos|http://vimeo.com/tag:unamesa]]

!!"""TiddlyWiki StakeHolders"""
<<list filter [tag[StakeHolders]]>>
Attempting to close or refresh the page, your browser may display the following warning:
{{{
WARNING! There are unsaved changes in TiddlyWiki.

Choose OK to save.
Choose CANCEL to discard.
}}}
This message may be provoked when saving failed due to losing connection to the server when the [[user|User]] is...
* offline
* experiencing a bad network connection
* faced with an [[Edit Conflict]]

Clicking <<saveChanges>> in the sidebar of a standard TiddlyWiki will cause any unsaved changes to be pushed to the server.
<<upgrade>>
Versions of TiddlyWiki before and including 2.6.3 are known to have an issue with the upgrade function. To upgrade these versions you will need to download an empty latest version of TiddlyWiki and import your content into it using the "import" function in the backstage.

# Download http://www.tiddlywiki.com/empty.zip (the latest TiddlyWiki version is in there).
# Make a copy of empty.html and either place it in the same directory as the TiddlyWiki you want to upgrade or give it the same name of the TiddlyWiki you want to upgrade and place it in a different directory.
# Load your new empty latest version of TiddlyWiki.
# Go to the backstage area and select import.
# Select the TiddlyWiki you want to have upgraded.
# Import everything from the old TiddlyWiki into this new latest version of TiddlyWiki.
# Save your changed TiddlyWiki and reload it.
# Should work.

This is inverse of the normal way of upgrading: instead of upgrading the core of your TiddlyWiki you are adding all the non-core content of your current TiddlyWiki into a new latest core of TiddlyWiki.

Once you have upgraded your TiddlyWiki to version 2.6.4 or later you will be able to upgrade to subsequent versions in the normal manner.
You can use ~BidiX's UploadPlugin to enable editing and saving your TiddlyWiki to your web host.

The plugin and documentation are available from [[BidiX's site|http://tiddlywiki.bidix.info]]; this document is a quick-start to getting it going.

!!!Simple instructions for BidiX's UploadPlugin
''Extracted from [[TiddlyWiki for the rest of us - by Dave Gifford|http://www.giffmex.org/twfortherestofus.html#%5B%5BSimple%20instructions%20for%20BidiX's%20UploadPlugin%5D%5D]]''
#'''Import the plugin and its friends.''' In your TiddlyWiki file, go to the backstage section and import the following tiddlers from http://tiddlywiki.bidix.info/
##PasswordOptionPlugin
##UploadPlugin
##store.php
#'''Save changes''' to your file '''and reload''' / refresh your browser.
#'''Create a store.php file.''' Open the store.php tiddler in your file and copy its contents. In Notepad, or whatever program you use to create webpages, paste the contents you've copied, and save the file as store.php. Be sure your program hasn't added any extensions such as .html, etc. The file should be called 'store' and its extension should be .php.
#'''Set your username and password.''' In the store.php file, add your username(s) and password(s). Do this by going to the line $USERS = array( '~UserName1'=>'Password1', etc) and replacing Username1 with your username, and Password1 with your password. Be sure to leave all the punctuation and code, such as the single quotes, intact. Save your file.
#'''Upload store.php.''' Use your FTP client (the program you use to upload files to your website - I use ~FileZilla) to upload store.php to the directory (folder) where you are going to put your ~TiddlyWiki file. If it's been uploaded correctly, you should be able to open your file from your browser (e.g. http://www.giffmex.org/experiments/store.php) and see ~BidiX's message.
#'''Go to the Upload options panel.''' Now go to your TiddlyWiki file and in the backstage area at the top you should be able to see an 'upload' button. Click it.
#'''Fill in the Upload options panel.''' 
##Set the same username and password that you placed in your store.php file
##Add the url of your store.php file (e.g., http://www.giffmex.org/experiments/store.php)
##Leave the Relative directory blank, and it will use default settings
##For filename, add the filename of the ~TiddlyWiki you are uploading
##If you have created a special directory on your site for backups, enter it in the Relative Directory for backups line. You don't add the entire url, just the name of the directory.
##Decide whether you want the ~UploadLog tiddler in your file to display the new logging data every time you save changes to the web, and check the box accordingly.
##Decide how many lines of data you want to appear in UploadLog, or leave it at a default of 10.
#'''Click 'Upload' in the Upload with options panel.''' There will be a delay as your file is uploaded, but a message area should appear saying that your file is saved and about to upload. When done it should say 'Main TiddlyWiki file uploaded'. You are done!
#'''Upload to your heart's content.''' Now, every time you want to upload the changes from your local file to the file on your website, go to the upload section of the backstage area, be sure your username and password are correct, and hit the upload button. That's it!
In TiddlyWiki, the user name is stored in a browser cookie as:
{{{
''UserName'': <<option txtUserName>>
}}}
''Displayed as:''
''UserName'': <<option txtUserName>>

In [[TiddlySpace]], anyone [[registered|Register]] is considered a [[User]].
In a classical TiddlyWiki, the UserName as entered in the OptionsPanel in the sidebar is saved to the [[modifier field|Fields]] when saving edits to a [[tiddler|Tiddler]].

It can be used to enable low level access restrictions when the wiki is viewed by anyone over http, see [[How to use TiddlyWiki as a Website?]]
The view mode refers to the mode of viewing a tiddler.

By default, how a tiddler is displayed is defined by one of the shadow tiddlers that control the layout of TiddlyWiki called [[ViewTemplate]].
<!--{{{-->
<div class='toolbar'
	macro='toolbar [[ToolbarCommands::ViewToolbar]] icons:yes height:16 width:16 more:popup'>
</div>
<div class='heading'>
	<span class="titleBar">
		<div class='title' macro='view title text'>
			<span macro='showWhenTagged ShadowTiddler'>
				<span macro='tiddler DOMAIN with: "ShadowTiddler " "ShadowTiddler"'></span>
			</span>
			<span macro='showWhenTagged FAQ'>
				<span macro='tiddler DOMAIN with: "FAQ " "FAQ"'></span>
			</span>
			<span macro='showWhenTagged Plugins'>
				<span macro='tiddler DOMAIN with: "Plugins " "Plugin"'></span>
			</span>
			<span macro='showWhenTagged Macro'>
				<span macro='tiddler DOMAIN with: "Macro " "Macro"'></span>
			</span>
		</div>
		<span class="subtitle" macro='viewRevisions page:5'>
			<span class='spaceSiteIcon' macro='tiddlerOrigin label:yes spaceLink:yes height:12 width:12 preserveAspectRatio:yes'></span>
			&mdash; last modified on
			<span macro="view modified date"></span>
			<span macro='view modifier SiteIcon spaceLink:yes label:yes height:16 width:16'>by&nbsp;</span>
		</span>
	</span>
	<div class='tagClear'></div>
</div>
<div class='content'>
    <div macro='showWhenTagged Dev'>
        <span macro="tiddler Dev"></span>
    </div>
    <div macro='orgDoc'></div>
    <div class='viewer' macro='view text wikified'></div>
    <div class='viewer' macro='showWhenTagged FAQ'>
        <span macro='tiddler TEMPLATES##FAQ'></span>
    </div>
    <div macro='more'></div>
</div>
<div macro='hideWhenTagged no-tag-info'>
	<div class='tagInfo'>
		<div macro='hideWhenTagged no-tags'>
			<div class='tidTags' macro='tags'></div>
		</div>
		<div macro='hideWhenTagged no-tagging'>
			<div class='tagging' macro='tagging'></div>
		</div>
	</div>

	<!--let's see if someone misses that
	<div class='serialized' macro='serializerLinks'>view as:&nbsp;</div>
	-->
</div>
<!--}}}-->
!Summary
The shadow tiddler ViewTemplate contains the HTML markup that defines how individual tiddlers are displayed.  You can change the markup to create a custom tiddler view.
!Default Contents
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'>
<span macro='view modifier link'></span>,
<span macro='view modified date'></span> (
<span macro='message views.wikified.createdPrompt'></span>
<span macro='view created date'></span>)
</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
Welcome to tiddlywiki.org

Note that this site contains information about the original [[TiddlyWiki Classic|http://classic.tiddlywiki.com]], and does not apply to the newer version [[TiddlyWiki 5|http://tiddlywiki.com]]

<<tabs txtMainTab "Activity" "Activity"   TabAll "following" "followers" followers "followers>>
''Source'': [[Google Discussion Groups|http://groups.google.com/group/tiddlywiki/browse_thread/thread/f440f280a8098592/58fc107fd0fe86ed]]
!Description
This [[script|Scripts]] allows you to insert the current time.
!Code
{{{
<script label="What time is it?">
	return "<br>" + new Date().toString();
</script>
}}}
{{annotation{
''Note:'' A similar result can be achieved using the [[today macro|today]], e.g.:
{{{
''What time is it?''
<<today 0hh:0mm:0ss>>
}}}
''What time is it?''
<<today 0hh:0mm:0ss>>
}}}
:» organise notes and access them quickly
:» keep a journal
:» manage todo lists, if not a full fledged [[GTD system|What is GTD?]]
:» publish [[dynamic websites|How to use TiddlyWiki as a Website?]]
:» do most anything that you can do in other wikis but with almost no setup hassle
:» easily find your tidbits using search and tagging
:» write a "Choose Your Own Adventure" style book
All you need to run TiddlyWiki is your web browser. Though it must be a reasonably recent browser that supports javascript. Firefox is reported to have the best support, but IE (6 or better), Opera, and Safari are also supported.

If you want to [[Editing and Saving over HTTP|publish your TiddlyWiki]] then you'll need a web host (or a hosting service like the free http://www.tiddlyspot.com).

[[Category:FAQ]]
[[Category:Basics]]
//Getting Things Done// or short //GTD// is...
> a powerful work-life management system and book by David Allen that transforms personal overwhelm and overload into an integrated system of stress-free productivity.

For more information see...
:» [[Wikipedia/GTD|http://en.wikipedia.org/wiki/Getting_Things_Done]]
:» [[David Allen's website|http://www.davidco.com/what_is_gtd.php What is GTD?]]
:» [[Can I use TiddlyWiki for GTD?]]
* a wiki, notebook, information manager
* a wiki programmed in ~JavaScript running entirely self-contained in the browser
* a revolutionary new way to manage information using [[microcontent|http://www.useit.com/alertbox/980906.html]]
* a web framework and its own development environment
!!TiddlyWiki in ten seconds...
[[by TomO from d³|http://dcubed.com/#TiddlyWiki]]
;10...
:TiddlyWiki is a web-based [[wiki|http://en.wikipedia.org/wiki/Wiki]] that has a very rich Javascript runtime built into every page. If you are reading a TiddlyWiki document, you have the //entire// TiddlyWiki application, in addition to all the "articles" that make up the wiki itself.
;9
:The "articles" within a TiddlyWiki are called ''tiddlers'', and they are saved with the main HTML page used to view the document. If you open a TW document, you can see all the tiddlers saved at the bottom of the file.
;8
:When you view a TW document over the web, you are usually prohibited from making changes. For interactive, modifiable documents like this one, you typically need to save the document locally to your machine and work with it there.
;7
:Tiddlers can be referenced by their name but, more importantly, they can be arbitrarily ''tagged'' to categorize them. Tags may be freely modified, and there are numerous interface widgets within TW to list or find tiddlers by their tags.
;6
:When you click on an internal hyperlink to a tiddler, it will usually open up directly above or below the tiddler you are currently reading and should scroll immediately into view.
;5
:When you hover your mouse over a tiddler, a small context-sensitive ''tiddler menu'' appears above and to the right of the tiddler. One of the important items in this menu is ''edit'' (or ''view''), which allows you to view and modify the source for a tiddler.
;4
:Tiddler source is a combination of just plain text, plus special formatting commands in ''wiki-text'' that allow you to express style and layout for tiddlers without knowing any HTML. It is important to know that the formatting commands, tiddler menus, and just about everything else can be arbitrarily extended by third-party ''plug-ins'' to create custom solutions like this one.
;3...2...1
:That is it in a nutshell, but if you are still feeling a little lost, try this [[tutorial|http://www.blogjones.com/TiddlyWikiTutorial.html ]]
{{right title{[[Core Macros]]}}}A [[macro|Macro]] provides predefined functions or operations that are performed when inserted into tiddler text. It is invoked whenever the tiddler is rendered and typically performs one of the fllowing actions...
*inserts computed content into the rendered text at the point where it is referenced
*manipulates or enhances any content that is so far rendered

Embedding a macro is done using the following markup...
;plain
: {{{<<macroName>>}}}
;w/ simple parameters
:{{{<<macroName paramValue1 paramValue2>>}}}
;w/ named parameters
:{{{<<macroName param1:value1 param2:'value2 with spaces'>>}}}
;w/ mixed parameters
:{{{<<macroName paramValue1 param2:[[value 2]]>>}}}
There are several standard macros built into the TiddlyWiki core. Many additional macros are available by installing plugins.
The latest TiddlyWiki development build can be obtained from http://nightly.tiddlywiki.org.

Nightly builds may have bugs or be unstable and therefore should not to be relied on for regular use. They are intended for testing purposes only.
> Your best bet is to upload them and maintain them on tiddlyspace.com

People use several approaches for distributing TiddlyWiki plugins:

- Publish at tiddlyspace
- Publish on github
- Publish on your own site (eg tiddlytools.com)
- Publish on [[tiddlyspot|http://www.tiddlyspot.com]]

TiddlyHub didn't really take off; it doesn't really achieve much more
than doing a Google search.

The most important thing is probably to announce your plugin in a
message to the group.
By default, Chrome doesn't save *local* cookies (i.e., cookies associated with locally-stored files, such as TW documents).

Fortunately, there is a command line option, {{{--enable-file-cookies}}}, that you can use to force Chrome to accept local cookies.  All you need to do is edit the properties for the icon you use to launch Chrome, and add the option to the end of the "target" field, like this:
{{{
   ...\chrome.exe --enable-file-cookies
}}}

''Source:'' reply by ''Eric Shulman'' at https://groups.google.com/d/msg/tiddlywiki/lbGyZHb2Mvc/B-dbZ0_lzWAJ
See TiddlyLink...
See TiddlyLink...
WikiText is a markup language that defines special text markup that must be used in order to produce a desired output, e.g. {{{__underline__}}} eventually being displayed as __underline__. TiddlyWiki uses its own [[TiddlyWiki Markup]] for [[formatting text|Formatting Text]].

For examples see...
<<list filter [tag[Formatting]]>>
!!Also see
;@WikiText
:a dedicated space for explaining [[TiddlyWiki Markup]]
WikiWords are are automatically understood by TiddlyWiki as [[internal links|Links]] and are usually formed by joining two or more capitalized words, e.g. GettingStarted.

In detail, a WikiWord...
#starts with an uppercase character
#is composed of other words that are...
##concatenated together
##each word with (at least) their first letters capitalised
From the [[Glossary|WikiWord]]...
<<<
<<tiddler WikiWord>>
<<<

In conventional wikis, this notation is also referred to as [[CamelCase|http://en.wikipedia.org/wiki/CamelCase]] and used to name individual pages. Used in the content, a WikiWord automatically creates a link to the page called WikiWord. Clicking such a link opens that page or -- if it doesn't exist yet -- an editor to create it.

A standard TiddlyWiki uses WikiWords as titles, especially for predefined [[shadow tiddlers|ShadowTiddler]].
!!"""Disabling WikiWords"""
If you don't want SomeWord to be a WikiWord, escape it by prefixing it with a tilde (~), e.g. {{{~SomeWord}}} renders as ~SomeWord.

For globaly deactivating WikiWords, see [[How to deactivate automatic WikiWords?]]...
TiddlyWiki provides [[its own markup syntax|TiddlyWiki Markup]] for tiddler text which it translates into the HTML representation displayed by your browser; a process referred to as wikification.
<<tiddler SiteTitle>> <<tiddler SiteSubtitle>>
!Summary
Use the shadow tiddler WindowTitle to define the text you wish displayed as the window title of your TiddlyWiki in the the browser.
!Default Contents
{{{
<<tiddler SiteTitle>> - <<tiddler SiteSubtitle>>
}}}
This then displays something like...
{{{
TiddlyWiki - Community Documentation
}}}

You can change this at any time. For example:
{{{
Shadow Tiddlers Documentation | TiddlyWiki.com
}}}

|''Name:''|YourSearchPlugin|
|''Version:''|2.1.6 (2012-04-19)|
|''Summary:''|Search your TiddlyWiki with advanced search features such as result lists, tiddler preview, result ranking, search filters, combined searches and many more.|
|''Source:''|http://tiddlywiki.abego-software.de/#YourSearchPlugin|
|''Twitter:''|[[@abego|https://twitter.com/#!/abego]]|
|''GitHub:''|https://github.com/abego/YourSearchPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''License:''|[[BSD open source license|http://www.abego-software.de/legal/apl-v10.html]]|
!About YourSearch
YourSearch gives you a bunch of new features to simplify and speed up your daily searches in TiddlyWiki. It seamlessly integrates into the standard TiddlyWiki search: just start typing into the 'search' field and explore!
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
	<title>Account</title>
	<link href="/bags/common/tiddlers/profile.css" type='text/css' rel='stylesheet' >
	<link href="/bags/common/tiddlers/admin.css" type='text/css' rel='stylesheet' >
	<link href="/bags/common/tiddlers/jquery-ui.custom.css" type='text/css' rel='stylesheet' >
</head>
<body>

<div id="container">
	<div class="main section">
		<a class="app" href="/">home</a>
		<div class="left">
		<div id="siteiconArea">
		<h2>User Icon</h2>
		<div>
			<img id="siteicon" class="siteicon">
			<form id="upload" method="POST" enctype="multipart/form-data">
				<input type="hidden" name="title" value="SiteIcon" />
				<input type="hidden" name="tags" value="excludeLists">
				<input type="hidden" name="csrf_token" class="csrf" />
				<input type="file" name="file" accept="image/*" />
				<input type="submit" value="upload" />
			</form>
			<div id="dropzone">Drop file here
				<img class="notloading" src="/bags/common/tiddlers/ajax-loader.gif" alt="submitting SiteIcon" />
			</div>
		</div>
		</div>
		<h2>Find Space</h2>
		<form class="spaceSearch">
			<input class="inputBox" type="text" placeholder="find space" />
			<a href="http://docs.tiddlyspace.com/What%20is%20a%20Space%3F" class="help"
				title="What is a space?">What is a space?</a>
			<button>view all</button>
		</form>
		<div class='list-container'>
			You are a member of the following spaces:
			<ul class='ts-space-search'>
			</ul>
		</div>
		<h2>Create New Space</h2>
		<form class="ts-spaces">
			<input class="inputBox" type="text" name="spacename" placeholder="space name"><span class="hostSuffix">.tiddlyspace.com</span>
			<input type="submit" value="Create Space" />
		</form>
		</div>
		<div class="right">
		<h2>Change Password</h2>
		<form class="ts-password">
			<input class="inputBox" placeholder="existing password" type="password" name="password">
			<input class="inputBox" placeholder="new password" type="password" name="new_password">
			<input class="inputBox" placeholder="new password"	type="password" name="new_password_confirm">
			<input type="submit" value="Change password">
		</form>
		<h2>OpenID</h2>
		<h3>Why OpenID?</h3>
		<a href="http://openid.net/"><img src="/bags/common/tiddlers/openid.png" alt="openid" ></a><br />
		Use just one username and password across hundreds of OpenID-enabled sites.<br />
		It's an open standard.<br />
		<a href="http://openid.net/what/">learn more</a>
		<ul class="ts-identities"></ul>
		<form class="ts-openid" target="_top">
			<div>
				Add an openid:
			</div>
			<input class="inputBox" type="text" name="openid" placeholder="your openid" />
			<input type="submit" value="Register" />
			<a href="http://openid.net/get-an-openid/" class="help"
			title="What is an open id?">What is an open id?</a>
		</form>
		</div>
		<div class="clear"></div>
	</div>
</div>
<script src="/bags/common/tiddlers/backstage.js"></script>
<script src='/bags/common/tiddlers/jquery.js'></script>
<script src='/bags/tiddlyspace/tiddlers/chrjs'></script>
<script src='/bags/common/tiddlers/chrjs.space'></script>
<script src='/bags/common/tiddlers/chrjs.users'></script>
<script src='/bags/common/tiddlers/chrjs.identities'></script>
<script src="/bags/common/tiddlers/jquery-ui.custom.js"></script>
<script src='/bags/common/tiddlers/jquery-form.js'></script>
<script src="/bags/common/tiddlers/siteiconupload.js"></script>
<script src='/bags/common/tiddlers/ts.js'></script>
<script src="/status.js"></script>
<script type="text/javascript">
/*
 * jQuery UI Autocomplete HTML Extension
 *
 * Copyright 2010, Scott González (http://scottgonzalez.com)
 * Dual licensed under the MIT or GPL Version 2 licenses.
 *
 * http://github.com/scottgonzalez/jquery-ui-extensions
 */
(function( $ ) {

var proto = $.ui.autocomplete.prototype,
	initSource = proto._initSource;

function filter( array, term ) {
	var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
	return $.grep( array, function(value) {
		return matcher.test( $( "<div>" ).html( value.label || value.value || value ).text() );
	});
}

$.extend( proto, {
	_initSource: function() {
		if ( this.options.html && $.isArray(this.options.source) ) {
			this.source = function( request, response ) {
				response( filter( this.options.source, request.term ) );
			};
		} else {
			initSource.call( this );
		}
	},

	_renderItem: function( ul, item) {
		return $( "<li></li>" )
			.data( "item.autocomplete", item )
			.append( $( "<a></a>" )[ this.options.html ? "html" : "text" ]( item.label ) )
			.appendTo( ul );
	}
});

})( jQuery );

/***
_accounts application specific javascript
***/
var link;
ts.init(function(ts) {
	if(ts.user.anon) { // redirect to homepage when user not logged in
		window.location = ts.getHost();
	} else if(ts.user.name === ts.currentSpace){
		initSiteIconUpload(ts.user.name);
	} else {
		link = $("<a />").attr("href", ts.getHost(ts.user.name) + "/_account").text("Change User Icon");
		$("#siteiconArea div").empty().append(link);
	}
	$(".hostSuffix").text("." + ts.getHost("").split("//")[1]);
	ts.getSpaces(function(spaces) {
		$("<div class='info' />").text("You have " + spaces.length + " spaces.").insertBefore($(".spaceSearch")[0]);
		$("form.spaceSearch input").autocomplete({
			html: true,
			source: function(req, response) {
				ts.getSpaces(function(spaces) {
					var selected = [];
					for(var i = 0; i < spaces.length; i++) {
						var space = spaces[i];
						if(space.name.indexOf(req.term) > -1) {
							var host = ts.getHost(space.name) ;
							var img = host + "/SiteIcon";
							selected.push({
								value: space.name,
								label: '<a href="' + host + '" target="_parent" class="autocompleteLink"><img src="' + img + '" style="height:24px;width:auto;max-height:24px;max-width:24px;"/>' + space.name + '</a>'
							});
						}
					}
					response(selected);
				});
			},
			select: function(event, ui) {
				window.top.location = ts.getHost(ui.item.value);
			}
		});

		var $ul = $('.ts-space-search');
		$.each(spaces, function(i, space) {
			$ul.append($('<li/>').html($('<a/>').attr('href', space.uri)
				.text(space.name)));
		});

		$('form.spaceSearch button').click(function(ev) {
			$('.list-container').slideToggle('fast');
			ev.preventDefault();
			return false;
		});
	});
});

if(window != window.top) {
	$("html").addClass("iframeMode");
	$("a").live("click",function(ev) {
		$(ev.target).attr("target", "_parent");
	});
}
</script>
<!--[if lt IE 8]>
<script type="text/javascript" src="/bags/common/tiddlers/json2.js"></script>
<![endif]-->
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
	<title>Reply</title>
	<link rel="stylesheet" href="//tiddlyspace.com/bags/benspa_public/tiddlers/bootvelcro.css">
	<style>
		html,
		body {
			overflow: hidden;
			background-color: transparent;
		}

		#container {
			/* prevent a fouc if no images present */
			display: none;
		}

		.modal-header {
			border-bottom: none;
			padding: 5px 0 0;
			position: absolute;
			width: 100%;
			background-color: #e0e0e0;
			-webkit-border-radius: 6px 6px 0 0;
			-moz-border-radius: 6px 6px 0 0;
			border-radius: 6px 6px 0 0;
			cursor: move;
		}

		.form-actions {
			position: absolute;
			bottom: 0;
			box-sizing: border-box;
			-moz-box-sizing: border-box;
			width: 100%;
			margin: 0;
			border-radius: 0 0 6px 6px;
			background-color: #e0e0e0;
			border-top: 1px solid gray;
		}

		.form-actions input.btn {
			width: auto;
			float: right;
			margin: 0 0.2em;
		}

		.closeBtn {
			background-color: #DCE7F1 !important;
		}

		.primary {
			background-color: #09F !important;
		}

		h1 {
			margin-bottom: 9px;
			margin-top: 9px;
		}

		body {
			width: 100%;
			height: 100%;
			position: absolute;
		}

		.modal {
			margin: 10px;
			top: 0;
			left: 0;
			bottom: 0;
			width: 510px;
			position: absolute;
			box-shadow: #444 0px 0px 10px 2px;
			border-radius: 6px;
			background-color: white;
			border: 1px solid gray;
			background-color: #F0F4F8;
		}

		label em {
			cursor: pointer;
		}

		.modal-body {
			overflow: auto;
			position: absolute;
			top: 0;
			bottom: 0;
			left: 0;
			right: 0;
			margin: 65px 20px 67px;
			background-color: transparent;
		}

		.nav-tabs {
			padding-left: 1%;
			margin: 0;
			width: 99%;
			border-color: gray;
		}

		.nav-tabs > li {
			cursor: pointer;
		}

		.nav-tabs > li > a {
			line-height: 2.4em;
			font-weight: bold;
			font-size: 100%;
		}

		.nav-tabs > li.active > a{
			background-color: #F0F4F8;
			border-color: gray;
			border-bottom-color: #F0F4F8;
		}

		.active {
			display: block;
		}

		input,
		textarea,
		select,
		.uneditable-input {
			color: #606060;
		}

		.imagePicker {
			-moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
			-webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
			box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
			border: 1px solid #CCC;
			height: 110px;
			overflow: auto;
			-webkit-border-radius: 3px;
			-moz-border-radius: 3px;
			border-radius: 3px;
			margin-left: 0;
		}

		.imagePicker img {
			margin: 5px;
			border: 2px solid transparent;
		}

		.imagePicker .current {
			border: 2px dotted #555;
		}

		label {
			font-weight: bold;
		}

		.form-actions label {
			float: left;
			margin-top: 0.75em;
		}

		fieldset input,
		fieldset textarea {
			width: 90%;
			border-color: gray;
		}

		@media all and (max-width: 550px) {
			.modal {
				width: 95%;
			}
		}

		#help {
			position: absolute;
			border: 0;
			right: 4px;
			top: 5px;
			text-indent: -9999px;
			color: transparent;
			height: 16px;
			width: 16px;
			background: none;
			background-image: url(/bags/common/tiddlers/help.png);
			background-repeat: no-repeat;
			background-color: white;
			z-index: 2;
			border-radius: 10px;
		}

		#help-info {
			padding: 0;
			border: 1px solid gray;
			width: 60%;
			height: 50px;
			color: #404040;
			background-color: white;
			position: absolute;
			top: 5px;
			right: 5px;
			z-index: 1;
			cursor: auto;
			border-radius: 5px;

		}

		#help-info p {
			padding: 10px 25px;
			margin-bottom: 0;
		}
	</style>
</head>
<body>
	<div id="container">
		<form action="#" class="modal">
			<div class="modal-header">
				<button id="help">help</button>
				<div id="help-info" style="display:none;"><p>
				Found something interesting? Write about it in your own space. <a href="//docs.tiddlyspace.com/Reply to this Tiddler" target="_blank">Find out more</a>
				</p></div>
				<ul class="nav nav-tabs" data-tabs="tabs">
					<li class="active" data-tab-name="post"><a href="#postForm">Reply</a></li>
				</ul>
			</div>


			<fieldset id="postForm" class="modal-body">
				<label>Title
					<input type="text" name="title">
				</label>
				<input type="hidden" name="url">
				<label>Post
					<textarea name="text" rows="8"></textarea>
				</label>
				<label>Tags
					<input type="text" name="tags" value="">
				</label>
			</fieldset>


			<div class="form-actions">
				<label class="checkbox">
					<input type="checkbox" name="private" val="private">
					keep private
				</label>
				<input type="submit" class="btn primary btn-large" value="Done">
				<input type="button" class="btn btn-large closeBtn" value="Cancel">
			</div>
		</form>
	</div>

	<script type="text/javascript"
            src="/bags/common/tiddlers/jquery.js"></script>
	<script type="text/javascript" src="/bags/tiddlyspace/tiddlers/chrjs"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/_reply.js"></script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
	<title>This Space</title>
	<link href="/bags/common/tiddlers/profile.css" type='text/css' rel='stylesheet' >
	<link href="/bags/common/tiddlers/admin.css" type='text/css' rel='stylesheet' >
	<!--[if lte IE 8]>
	<script type="text/javascript" src="/bags/common/tiddlers/json2.js"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/es5-shim.min.js"></script>
	<![endif]-->
</head>
<body>
<div id="container">
	<div id="text-html" class="main section">
		<a class="app" href="/">home</a>
		<div class="left">
		<h2>About this space <button class='toggleNext'></button></h2>
		<div id="siteinfo"></div>
		<h2>Site Icon</h2>
		<div>
			<img id="siteicon" class="siteicon">
			<form id="upload" method="POST" enctype="multipart/form-data">
				<input type="hidden" name="title" value="SiteIcon" />
				<input type="hidden" name="tags" value="excludeLists">
				<input type="hidden" name="csrf_token" class="csrf" />
				<input type="file" name="file" accept="image/*" />
				<input class="btn" type="submit" value="upload" />
			</form>
			<div id="dropzone">Drop file here
				<img class="notloading" src="/bags/common/tiddlers/ajax-loader.gif" alt="submitting SiteIcon" />
			</div>
		</div>
		<h2>Vital Statistics</h2>
		<div id="info">please wait while information is loaded about this space...</div>
		<button class="spacereset">Reset Space</button>
		<div class="reset-confirm-wrap messageArea">
			<button class="close-btn" title="cancel reset">×</button>
			<p>Are you sure you want to reset the space? You can't go back! This will remove all the content from the space!</p>
			<form class="cf">
				<label for="reset-confirm">Enter the space name to confirm.</label>
				<input type="text" name="reset-confirm" class="reset-confirm-input inputBox" />
				<button type="submit">Reset Now</button>
			</form>
			<div class="reset-message-area">
				<p class="performing">Resetting...</p>
				<p class="finished">Reset Done!</p>
				<p class="recipe-error-msg">Error removing includes. Please remove manually.</p>
			</div>
		</div>
		</div>
		<div class="right">
		<div class="ts-membership">
			<h2>
				Add Member
				<a href="http://docs.tiddlyspace.com/What%20is%20a%20member%3F" title="What is a Member?" class="help">What is a Member?</a>
			</h2>
			<div>
				<p>Add a new member to your space by entering their name below. Enter a space name instead and prefix with @ to add everyone who is already a member of that space.</p>
				<form class="ts-members">
					<input class="inputBox" type="text" name="username">
					<input type="submit" value="Add Member" class="btn" />
				</form>
			</div>
			<h2>
				Existing Members <button class='toggleNext'></button>
			</h2>
			<div>
				Your space currently has the following members: 
				<ul class="ts-members"></ul>
			</div>
			<h2>
				Include Space
				<a class="help" href="http://docs.tiddlyspace.com/What%20is%20space%20inclusion%3F" title="What is inclusion?">What is Inclusion?</a>
			</h2>
			<form class="ts-includes">
				<input class="inputBox" type="text" name="spacename">
				<input type="submit" value="Include Space" class="btn" />
			</form>
		</div>
		<div>
			<h2>Included Spaces <button class='toggleNext'></button></h2>
			<div>
			This space includes the following spaces:
			<ul class="ts-includes"></ul>
			</div>
		</div>
		</div>
		<div class="clear"></div>
	</div>
</div>
<script src='/bags/common/tiddlers/backstage.js'></script>
<script src='/bags/common/tiddlers/jquery.js'></script>
<script src='/bags/tiddlyspace/tiddlers/chrjs'></script>
<script src='/bags/common/tiddlers/chrjs.space'></script>
<script src='/bags/common/tiddlers/chrjs.users'></script>
<script src='/bags/common/tiddlers/chrjs.identities'></script>
<script src='/bags/tiddlyspace/tiddlers/TiddlySpaceCSRF'></script>
<script src='/bags/common/tiddlers/jquery-form.js'></script>
<script src="/bags/common/tiddlers/siteiconupload.js"></script>
<script src="/bags/common/tiddlers/ts.js"></script>
<script src="/status.js"></script>
<script src="/bags/common/tiddlers/space.js"></script>
</body>
</html>
!Description
This macro outputs a list of all tags in this TiddlyWiki whereas clicking on a tag opens a popup listing all tiddlers for the corresponding tag. Compare to [[tag]] macro.
!Usage
{{{
<<allTags>>
}}}
<<allTags>>
!Description
The [[annotations]] helper macro is used in the shadow tiddlers ViewTemplate and EditTemplate to define where annotations are rendered, e.g.:
* the information displayed in view mode when a """tiddler""" does not exist yet
* the information displayed in edit mode for a tiddler that is a shadow tiddler
!Usage
{{{
<div macro='annotations'></div>
}}}
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="utf-8"/>
	<title>TiddlySpace Apps</title>
	<link rel="stylesheet" href="/bags/common/tiddlers/reset.css" />
	<link rel="stylesheet" href="/bags/common/tiddlers/appspage.css" />
	<!--[if lt IE 7 ]>
	<link rel="stylesheet" href="/bags/common/tiddlers/appspageie6.css" />
	<![endif]-->
</head>
<body>
	
	<div id="wrapper">
		<div id="TSbar"></div>
		<div id="main-content">
			<div id="space-details">
				<a href="/_space"><img class="siteicon"></a>
				<div id="title-subtitle">
					<h1 class="spaceaddress">
						<span class="spaceName"></span><span class="hostName"></span>
					</h1>
					<p class="tagline"><span class="subTitle"></span><a class="managespaces" href="/_space">manage space</a></p>
				</div>
			</div>
			<div id="holder">
				<div id="appswitcher-wrapper">
					<div id="appswitcher">
						<h2>Your Apps</h2>
						<ul id="app-list">
							<li class="htmlserialisation">
								<a href="/tiddlers.html?select=tag:!excludeLists;sort=-modified">
									<img src="/bags/common/tiddlers/browse_read_blue.png" alt="Icon for the HTML Serialisation" class="app-img" />
									BROWSE
								</a>
							</li>
							<li class="tiddlywiki">
								<a href="/tiddlers.wiki">
									<img src="/bags/common/tiddlers/tiddlywiki2_blue.png" alt="Icon for TiddlyWiki" class="app-img" />
									TIDDLYWIKI
								</a>
							</li>
						</ul>
						<div id="addapp">
							<button class="inactive">Add More!</button>
						</div>
					</div>
					<div id="app-desc">
						<ul>
							<li class="htmlserialisationdesc"><p>an easy to understand HTML representation of your content.</p></li>
							<li class="tiddlywikidesc"><p>use TiddlyWiki to create, edit and organise your content.</p></li>
						</ul>
					</div>
					<div style="clear: both;"></div>
				</div>
			</div>
		</div>
		<div id="footer"><!-- ie doesn't support footer tag -->
			<div id="footer-content">
				<div class="links">
					<a href="http://blog.tiddlyspace.com">blog</a>
					<a href="http://featured.tiddlyspace.com">featured</a>
					<a href="http://docs.tiddlyspace.com">documentation</a>
					<a href="https://github.com/TiddlySpace/tiddlyspace">source</a>
				</div>
				<p>TiddlySpace 2011, created by <a href="http://osmosoft.com">Osmosoft</a></p>
			</div>
		</div>
	</div>
	
	<script type="text/javascript" src="/bags/common/tiddlers/backstage.js"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/jquery.js"></script>
	<script type="text/javascript" src="/bags/tiddlyspace/tiddlers/chrjs"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/chrjs-store.js"&