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'>
  <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]]; }
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: -moz-linear-gradient(to bottom, [[ColorPalette::PrimaryLight]], [[ColorPalette::PrimaryMid]]);
	background: linear-gradient(to bottom, [[ColorPalette::PrimaryLight]], [[ColorPalette::PrimaryMid]]);
}
.header a:hover {background:transparent;}
.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]]; }
.wizard__title    { color:[[ColorPalette::PrimaryDark]]; border:none; }
.wizard__subtitle { color:[[ColorPalette::Foreground]]; border:none; }
.wizardStep { background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]]; }
												
.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 { background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; box-shadow: 1px 2px 5px [[ColorPalette::TertiaryMid]]; }
.messageToolbar__button { color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none; }
.messageToolbar__button_withIcon { background:inherit; }
.messageToolbar__button_withIcon:active { background:inherit; border:none; }
.messageToolbar__icon { fill:[[ColorPalette::TertiaryDark]]; }
.messageToolbar__icon:hover { fill:[[ColorPalette::Foreground]]; }

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

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

.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::TertiaryLight]]; }
.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]]; }

.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 th, .viewer thead td, .twtable th, .twtable thead td { background: [[ColorPalette::SecondaryMid]]; color: [[ColorPalette::Background]]; }
.viewer td, .viewer tr, .twtable td, .twtable tr { border: 1px solid [[ColorPalette::TertiaryLight]]; }
.twtable caption { color: [[ColorPalette::TertiaryMid]]; }

.viewer pre {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);}
/*}}}*/
/*{{{*/
body { font-size:.75em; font-family:arial,helvetica,sans-serif; margin:0; padding:0; }

* html .tiddler {height:1%;}

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;}

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;}

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

a {text-decoration:none;}

.externalLink {text-decoration:underline;}

.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;}			 
.headerShadow {position:relative; padding:3em 0 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:3em 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 2em 0; }
.wizard__title    { font-size:2em; }
.wizard__subtitle { font-size:1.2em; }
.wizard__title, .wizard__subtitle { font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em; }
.wizardStep { padding:1em; }
.wizardFooter { padding: 0.8em 0; }
.wizardFooter .status { padding: 0.3em 1em; }
.wizardFooter .button { margin:0.5em 0 0; font-size:1.2em; padding:0.2em 0.5em; }

#messageArea { position:fixed; top:2em; right:0; margin:0.5em; padding:0.7em 1em; z-index:2000; }
.messageToolbar { text-align:right; padding:0.2em 0; }
.messageToolbar__button { text-decoration:underline; }
.messageToolbar__icon { height: 1em; width: 1em; } /* width for IE */
.messageArea__text a { text-decoration:underline; }

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

.tiddlerPopupButton {padding:0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em; margin: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;}
.tagged li, .tagging li { margin: 0.3em 0; }
.tagClear {clear:both;}

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

.annotation { padding: 0.5em 0.8em; margin: 0.5em 1px; }
												  
.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 0; }
.viewer th, .viewer td, .viewer tr, .viewer caption, .twtable th, .twtable td, .twtable tr, .twtable caption { padding: 0.2em 0.4em; }
.twtable caption { font-size: 0.9em; }
table.listView { margin: 0.8em 1.0em; }
table.listView th, table.listView td, table.listView tr { text-align: left; }
.listView > thead { position: sticky; top: 0; }

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer pre {padding:0.5em; overflow:auto;}
pre, code { font-family: monospace, monospace; font-size: 1em; }
.viewer pre, .viewer code { line-height: 1.4em; }

.editor {font-size:1.1em; line-height:1.4em;}
.editor input, .editor textarea {display:block; width:100%; box-sizing: border-box; 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 0;}

.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; }
.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; }
}
/*}}}*/
<!--{{{-->
<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>
Extensions to the primitive {{{Array}}} type in JavaScript...
<<list filter [startsWith[title,Array.]][sort[title]]>>
!Summary
Find the index for an element in the elements of an array for which a given field has a certain value.
!Signature
{{{Array.prototype.findByField = function(field,value) {} }}}
!Returns
integer: the index of the element where field matches value
!Arguments
;1. field
:the field to find the index for
;2. value
:the value to match against the elements field
!Example
{{{
var ti = 'Some Tiddler',
tids = store.getTiddlers();
tids.findByField("title",ti);
}}}
''returns:'' {{{true}}} when there is a tiddler with s title of {{{Some Tiddler}}}
!Summary
This function of the <<tag Array "array class">> returns the index of a given element in an array.
!Signature
{{{Array.prototype.indexOf = function(item,from) {} }}}
!Returns
integer: the index of an element in an array
!Arguments
;1. item
:the item to find the index for
;2. from
:the array in which to find the item
!Example
{{{
var el = "Foo",
arr = ["Foo","Bar"];
return arr.indexOf(el);
}}}
''returns:'' integer: 0
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]]
!UserUnplugged
<<TiddlySpaceLogin>>

!SpaceUnplugged
{{unpluggedSpaceTab{
{{wizard{
<<image unsyncedIcon width:48>> <<message messages.syncExplanation>>
}}}
{{wizard syncKey{
{{keyHeading{
Key}}}
{{changedServer keyItem{<<message macros.sync.syncStatusList.changedServer.text>>}}} {{changedBoth keyItem{<<message macros.sync.syncStatusList.changedBoth.text>>}}} {{changedLocally keyItem{<<message macros.sync.syncStatusList.changedLocally.text>>}}} {{notFound keyItem{<<message macros.sync.syncStatusList.notFound.text>>}}}
}}}
<<sync>>

!User
{{textRight{
<<TiddlySpaceLogout>>
<<tabs txtUserTab
	"Your Identities" "Manage your identities" [[Backstage##Identities]]
	"Your Spaces" "Maintain your spaces and create new ones" [[Backstage##UserSpaces]]
	"Your Password" "Change your password" [[Backstage##Password]]
>>
}}}

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

<<tabs txtTiddlySpaceTab
search "search across TiddlySpace" Backstage##Search
help "quick access to useful space resources" Backstage##Resources
>>
running TiddlySpace@glossary version <<message extensions.tiddlyweb.status.tiddlyspace_version>>
<<tsfeedback "Provide feedback">>
}}}

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

!Search
<<tsSearch>>

!Space
<<followSpace>>
<<tabs txtSpaceTab
	members Members Backstage##SpaceMembers
	includes "include spaces" Backstage##SpaceInclusions
	tiddlers "tiddlers control panel" Backstage##Tiddlers
	plugins "Manage installed plugins" PluginManager
	batch "Perform batch operations on public/private tiddlers" Backstage##BatchOps
	options "TiddlyWiki options" Backstage##Options
	tweaks "Tweak the appearance and behaviour of TiddlyWiki" AdvancedOptions
	import "Import tiddlers from a TiddlyWiki" Backstage##FileImport
	export "Export this TiddlySpace for offline use" Backstage##Export
>>

!FileImport
<<fileImport>>

!Export
You can download this TiddlySpace as an offline TiddlyWiki:
{{chunkyButton{<<exportSpace>>}}}

!Identities
You can associate your account with multiple identities. If you have an open id for example you could log into TiddlySpace with that as well as a TiddlySpace user account.
<<TiddlySpaceIdentities add>>
{{inlineList{
	<<TiddlySpaceIdentities list>>
}}}
{{backstageClear{}}}

!Login
<<tabs txtLoginTab 
"TiddlySpace Username" "Login via a TiddlySpace username and password" Backstage##UserUnplugged
"OpenID" "Login via an OpenID"  Backstage##TabOpenID
"Register" "Register a TiddlySpace account" Backstage##TabRegister
>>

!TabOpenID
<<TiddlySpaceLogin openid>>

!TabRegister
<<TiddlySpaceRegister>>

!Options
upload a <<message messages.privacySetting>> file:
<<binaryUpload>>
<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "options ยป" "Change TiddlyWiki advanced options">>

!Password
<<TiddlySpaceChangePassword>>

!SpaceInclusions
This space includes the public tiddlers from the following spaces:
<<TiddlySpaceInclusion list>>
<<TiddlySpaceInclusion passive>>

!SpaceMembers
The following people are members of the space ''<<message extensions.tiddlyspace.currentSpace.name>>''. Only members have access to the private tiddlers in a space.
<<TiddlySpaceMembers list>>
<<TiddlySpaceMembers add>>

!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>>

!UserSpaces
<<TiddlySpaceSpaces add>>
You are currently a member of the following spaces.
{{inlineList{
<<TiddlySpaceSpaces list>>
}}}
{{backstageClear{}}}
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
TiddlyWiki currently does not extend this primitive type of JavaScript.
''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
!Summary
This page explains the build process for TiddlyWiki.
!Methods
/%
!NEW
The new build process using...
* Git / GitHub
* node.js
[[Instructions for building|https://github.com/TiddlyWiki/TiddlyWiki/tree/master/build]]

!OLD
The old build process using...
* Git / GitHub
* Ruby
* Cook
* Ginsu
;Instructions for linux based systems
:http://dev-template-doc.tiddlyspace.com/#About

!TINY
The build process for TinyTiddlyWiki...


!TESTS
Test resources can be found here...
ยป https://github.com/TiddlyWiki/tiddlywiki/tree/master/test

;testing with the new build process
:ยปThe new build process doesn't yet provide / run tests.

!END%/<<tabs
chkBuildProcess
New 'The new build process using node.js' Build##NEW
Old 'The old build process using cook and ginsu' Build##OLD
Tiny 'The build process for TinyTiddlyWiki' Build##TINY
Tests 'Some information on testing a TiddlyWiki build' Build##TESTS
>>
See [[Plugin StyleSheets]]...
Some macros render a button or link which performs a dedicated action when clicked...
<<get ##Description filter:[tag[Button]] format:'!!![[%1]]
<<<
%0
<<<'>>
From [[Wikipedia|http://en.wikipedia.org/wiki/CSS]]...
<<<
[[Cascading Style Sheets (CSS)|http://en.wikipedia.org/wiki/CSS]] is a style sheet language used for describing the presentation semantics (the look and formatting) of a document written in a markup language. Its most common application is to style web pages written in HTML and XHTML, but the language can also be applied to any kind of XML document, including plain XML, SVG and XUL.
<<<

The presentational style in terms of layout, design & typography in TiddlyWiki entirely rely on [[CSS]] with a structural basis rooted in [[HTML]].
!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)";
}}}
!Summary
[[Chef|http://chef.tiddlywiki.org]] provides a simple way to [[cook|Cook]] TiddlyWiki [[recipes|Recipe]].
!See Also...
* [[Cook]]
* [[Ginsu]]
* [[Recipes|Recipe]]
Toplevel classes provided by the TiddlyWiki core...
A TiddlyWiki is built on the following classes implemented in JavaScript...
;[[Tiddler.class]]
:&raquo; the atomic base elements in the TiddlyVerse -- tiddlers
;[[TiddlyWiki.class]]
:&raquo; the framework that brings [[tiddlers|Tiddler]] to life
;[[Story.class]]
:&raquo; manages the display area where TiddlyWiki renders tiddlers
;[[Wikifier.class]]
:&raquo; manages conversion of representations, e.g. [[TiddlyWiki Markup]]@tiddlywiki to [[HTML]]
* ''[[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
{{{
!Template
<<view modifier spaceLink>> on <<view modified date>> at <<view server.bag spaceLink>>{{right{<<view modifier SiteIcon width:24 height:24 preserveAspectRatio:yes label:no>>}}}
<<<
<<view text wikified>>
<<<
!EndTemplate
}}}
<<list filter [tag[common]]>>
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)
This page is meant as an overview of the basic TiddlyWiki architecture.
* [[store|Store]] -- [[TiddlyWiki.class]]
* [[story|Dev:Story]]
* [[notifications|config.options.notify]]
* [[wikifier|Dev:Wikifier]]
* [[formatters|Dev:Formatters]]
* [[macros|Dev:Macros]]
* [[toolbar commands|Dev:Toolbar Commands]]
* [[saving|Dev:FileSystem]]
* [[adaptors|Dev:Server Adaptor Mechanism]]
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.
{{right{
Rather interested in
[[Core Development]]?

}}} To suggest a change, you can currently fork the [[TW site repo|https://github.com/tiddlyWiki/tiddlywiki.github.com]] and [[make a PR|Using GitHub: your first Pull Request]] or just [[create|Using GitHub issues]] [[an issue|https://github.com/TiddlyWiki/tiddlywiki.github.com/issues/new]] in the repo.
See the [[/dev/docs_from_TiddlyWikiDev.tiddlyspace.com.html|https://github.com/TiddlyWiki/tiddlywiki.github.com/blob/master/dev/docs_from_TiddlyWikiDev.tiddlyspace.com.html]] file which is this ~TiddlyWiki page.

If you want to help, but don't know where to start, please check:
* [[Contribution Central]];
* or just think of an important scenario (like creating a new plugin), try to get info in these docs, and if you face issues, report them and suggest a possible fix.

When documenting a core function, please refer to the [[template|FUNCTION TEMPLATE]].
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]]
''TODO:'' Functions that lack brackets at the end would probably profit from a rewrite.
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.
!Summary
Cook is deprecated: up-to-date build tools and their docs can be found at https://github.com/TiddlyWiki/TiddlyWiki/tree/master/build

Cook is the build tool for ~TiddlyWiki. It utilizes [[recipes|Recipe]] to stitch together ~TiddlyWiki HTML files from their constituent chunks.
!External Resources
* [[Cook|https://github.com/TiddlyWiki/cooker]]
!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 the javascript that comes with a standard TiddlyWiki. The following topics provide inside knowledge in core processes...
<<get ##Summary filter:[tag[Core]] table>>
Are you interested in contributing to the core development? Hop over to [[TiddlyWiki@GitHub|https://github.com/TiddlyWiki]], fork the master branch and start making pull requests.

If unsure how to contribute on ~GitHub, take a look [[here|Using git and GitHub]].
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
!Summary
Are you starting to develop plugins? Don't be afraid of the core code! Most of it is quite self-explanatory. Some things -- like Wikifier and formatters -- can be hard to grasp though.
!Reading The Core
To look at the TiddlyWiki core, either open your TiddlyWiki in your preferred editor or have a look at the core namespace components at https://github.com/TiddlyWiki/tiddlywiki/tree/master/js
!Finding Stuff
!![[~ a function of a class ~|Dev.Core]]
e.g. [[TiddlyWiki|TiddlyWiki.class]] ([[store]]), [[Story|Story.class]], [[Tiddler|Tiddler.class]] or [[Array]], [[String]]...
;example
:ยป {{{story.setDirty(title,true);}}}
;look for
:ยป {{{Story.prototype.setDirty}}}
;search for
:ยป {{{'pe.some'}}}
<<<
For a list of classes implemented or extended by TiddlyWiki, see [[Dev.Core]]. There also are some prototype functions for primitive types, like [[Array|Array.class]] and [[String|String.class]].

The function you look for is not a prototype function? It may be a static function, like fetchTiddler: https://github.com/TiddlyWiki/tiddlywiki/blob/master/js/TiddlyWiki.js#L19
<<<
!![[~ some macro ~|Core Macros]]
;example
:ยป {{{<<list>>}}} or {{{<<tiddler>>}}}
;look for
:ยป {{{config.macros.someMacro}}}
;search for
:ยป {{{'os.some'}}}
!![[~ a global function ~|Global Functions]]
;example
:ยป [[createTiddlyElement(parent, element, id, className, text, attribs)|createTiddlyElement()]]
;look for
:ยป {{{createTiddlyElement = function}}} or
:ยป {{{function createTiddlyElement}}}
;search for
:ยป {{{'ent = fun'}}} or
:ยป {{{'ion cre'}}}
<<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...
The content of these tiddlers which have a prefix of {{{DEV.}}} are prepended to tiddlers that originate from @TiddlyWiki.
{{annotation{

<<tag DEV "Developer Info">>: For the class documentation see Tiddler.class!

}}}
{{annotation{

<<tag DEV "Developer Info">>: For the class documentation see [[TiddlyWiki.class]]!

}}}
!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]]
From [[WikiPedia||http://en.wikipedia.org/wiki/Document_Object_Model]]...
<<<
The [[Document Object Model (DOM)|http://en.wikipedia.org/wiki/Document_Object_Model]] is a cross-platform and language-independent convention for representing and interacting with objects in HTML, [[XHTML|http://en.wikipedia.org/wiki/XHTML]] and [[XML|http://en.wikipedia.org/wiki/XML]] documents. Objects in the DOM tree may be addressed and manipulated by using methods on the objects. The public interface of a DOM is specified in its [[application programming interface (API)|http://en.wikipedia.org/wiki/Application_programming_interface]].
<<<
A DOM reference points to an element in the DOM.
[[$1|$2]] <<tag [[$1]] ยป>>
For the default JavaScript date functions are, see...
http://www.w3schools.com/jsref/jsref_obj_date.asp

Below are extensions in Tiddlywiki on the primitive {{{Date}}} type...
<<list filter [startsWith[title,Date.]][sort[title]]>>
Some [[macros|Macros]]@tiddlywiki like the [[today|today (macro)]]@tiddlywiki or [[newJournal|newJournal (macro)]]@tiddlywiki take a [[Date Format String|Date Formats]] as an optional argument which is a combination of ordinary text and special ''patterns'' substituted with formatted 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
Date formats can be combined to date templates for use in TiddlyWiki, e.g.
{{{
var template = "DDth MMM YYYY";
date.formatString(template);
}}}
''returns:'' {{{27th January 2011}}} &laquo; for example
{{{
var template = "DDth mmm hh:mm:ss";
date.formatString(template);
}}}
''returns:'' {{{27th Jan 18:54:23}}} &laquo; for example
!!"""More Format Examples"""
;<nowiki>DDth MMM YYYY</nowiki>
:<<today "DDth MMM YYYY">>
;<nowiki>DDth mmm 0hh:0mm:0ss</nowiki>
:<<today "DDth mmm 0hh:0mm:0ss">>
!Summary
This prototype function of the Date class converts a string in the format YYYYMMDDHHMM to a date object.
!Signature
{{{Date.prototype.YYYYMMDDHHMM = function() {} }}}
!Returns
''Date:'' the date object
!Arguments
none
!Example
{{{
var date = Date.convertFromYYYYMMDDHHMM('201301010000')
}}}
''returns:'' Date: {{{Tue Jan 01 2013 01:00:00 GMT+0100 (CET)}}}
!Summary
This prototype function of the Date class returns the days suffix in English, i.e. ''th'', ''rd'', ''st''.
!Signature
{{{Date.prototype.getHours12 = function() {} }}}
!Returns
''integer:'' the date's hours
!Arguments
none
!Example
{{{
var date = new Date();
// Sun Sep 29 2013 09:37:06 GMT+0200 (CET)
date.daySuffix();
}}}
''returns:'' {{{th}}}
!Summary
This prototype function of the Date class returns a formatted string for a date object given the desired [[date format|Date Formats]] via a template...
!Signature
{{{Date.prototype.formatString = function(template) {} }}}
!Returns
''string:'' the date converted to a string
!Arguments
;1. (string) template
:ยป the [[date format|Date Formats]]
!Example
{{{
var date = new Date();
// Sun Sep 29 2013 09:37:06 GMT+0200 (CET)
date.formatString('YYYY-0MM-0DD');
}}}
''returns:'' {{{2013-09-29}}}
!Summary
This prototype function of the Date class returns the am / pm indicator for a given date object.
!Signature
{{{Date.prototype.getAmPm = function() {} }}}
!Returns
''string:'' either ''am'' or ''pm''
!Arguments
none
!Example
{{{
var date = new Date();
// Sun Sep 29 2013 09:37:06 GMT+0200 (CET)
date.getAmPm();
}}}
''returns:'' {{{'am'}}}
!Summary
This prototype function of the Date class returns the hours using a 12 hour clock.
!Signature
{{{Date.prototype.getHours12 = function() {} }}}
!Returns
''integer:'' the date's hours
!Arguments
none
!Example
{{{
var date = new Date();
// Sun Sep 29 2013 09:37:06 GMT+0200 (CET)
date.getHour12();
}}}
''returns:'' {{{4}}}
!Summary
This prototype function of the Date class returns the week number for a given date object, ranging from 1 to 52.
!Signature
{{{Date.prototype.getYearForWeekNo = getWeek() {} }}}
!Returns
''integer:'' the date's week
!Arguments
none
!Example
//{{{
var date = new Date();
// Sun Sep 29 2013 09:37:06 GMT+0200 (CET)

date.getWeek();
//}}}
''returns:'' {{{6}}}
!Summary
This prototype function of the Date class returns the __full__ year for the beginning of the week of a given date object.
!Signature
{{{Date.prototype.getYearForWeekNo = function() {} }}}
!Returns
''integer:'' the __full__ year of the week
!Arguments
none
!Example
{{{
var date = new Date();
var year = date.getYearForWeekNo();
}}}
''returns:'' the current year{{{2011}}}
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>>
[[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]].
}}}
!Backstage Tabs
The following sample code adds the contents of [[SideBarOptions]] as a new backstage tab (called "myTab"):
{{{
config.tasks.myTab = {
	text: "my custom tab",
	tooltip: "A custom backstage tab",
	content: "<<tiddler SideBarOptions>>"
};
config.backstageTasks.push("myTab");
}}}
!Command Buttons
In order to add a command button directly to the backstage bar, the ''action'' property should be used to reference a JavaScript function (no arguments are passed).

For example, the standard backstage button for ''Save'' is defined as follows:
{{{
save: {
	text: "save",
	tooltip: "Save your changes to this TiddlyWiki",
	action: saveChanges
}
}}}
If the desired function does not have a convenient entry point, or if certain functions need arguments passed to them, an anonymous function declaration can be used as a "wrapper":
{{{
config.tasks.myTab = {
	text: "username",
	tooltip: "set your TiddlyWiki user name",
	action: function() {
		var newName = prompt("Please enter a new username:", config.options.txtUserName);
		if(!newName || !newName.length)
			return false; // canceled by user
		config.options.txtUserName = newName;
		saveOptionCookie("txtUserName");
	}
};
config.backstageTasks.push("myTab");
}}}
!Other Elements
Adding content other than tabs or buttons to the backstage bar requires hijacking the [[backstage.init()]] function in order to render those elements directly into the ''backstageToolbar'' element.
{{annotation{
''Note'': While hijacking the core function is necessary for this purpose, it could corrupt the backstage if there is an error in the respective code. Since the backstage serves as a fallback mechnanism in case there are other problems, this should be used with caution.
}}}

For example, the following code adds the search box to the backstage toolbar (inside a container with the custom searchBox):
{{{
backstage.init_old = backstage.init;
backstage.init = function() {
	var s = "{{searchBox{<<search>>}}}";
	this.init_old.apply(this, arguments);
	wikify(s, document.getElementById("backstageToolbar"));
};
}}}
!See Also
* [[Backstage Area]]
@@color:darkred;display:block;padding:5px;background:#eee;"""Unfortunately, these references neither are complete nor up to date""" -- we are working on it.
Interested in [[Core Development]]?@@
;[[Core]]
:topics covering know how & best practices regarding the TiddlyWiki core
;[[All Functions|Functions]]
:a quick reference of [[all core functions|Functions]]...
;[[Global Functions]]
:functions in the global JavaScript namespace
;[[Tiddler.class]], aka the [[store]]
:the atomic base elements in the TiddlyVerse -- tiddlers
;[[TiddlyWiki.class]]
:the framework that brings [[tiddlers|Tiddler]] to life
;[[Story.class]], aka the story
:manages the display area where TiddlyWiki renders tiddlers
;[[Wikifier.class]]
:manages conversion of representations, e.g. [[TiddlyWiki Markup]]@tiddlywiki to [[HTML]]
;[[Primitive Types]]
:[[String]]
:[[Array]]
:[[Date]]
Also see [[Commonly Used Functions]]...
!Unnamed Parameters
{{{<<foo value1 value2 value3>>}}}
With the example macro call above, the params variable passed to the macro's handler is an array, created by parsing the space-separated list of strings. For multi-word parameters, use a param.

''Example''
{{{
config.macros.myMacro.handler = function(place,macroName,params,...) {
   if(params[0])
      var length = params[0];
   if(params[1])
      var width = params[1];
...
}}}
!Named Parameters
The semantics of [[parseParams()|String.prototype.parseParams()]] are that either defaultName or defaultValue can be provided. If defaultName is provided, then any single token parameters are taken to be values, with the name being specified in defaultName. If instead defaultValue is defined, then any single token parameters are taken to be names, with the value being specified in defaultValue.

There is a potential error condition if neither defaultName or defaultValue is provided, but this only occurs if the parameter string in question includes any single token values. The current patch incorrectly treats a missing defaultName as an error.

Code for parsing named parameters:
{{{
config.macros.foo.handler = function(place, macroName, params, wikifier, paramString) {
	var prms = paramString.parseParams(null, null, true);
	var value = getParam(prms, "key");
};
}}}
;Usage
:{{{<<foo key:value>>}}}
:{{{<<foo key:"value">>}}}
:{{{<<foo key:[[value]]>>}}}
!Default Names
The first (required) parameter of parseParams() will be used as the default name for unnamed parameters:
{{{
p = paramString.parseParams("anon", null, true);
}}}
;Usage
:{{{<<foo value1 value2 value3>>}}}
In this example, anon is used as the default name when processing parameters.
!Default Values
If you set the second parameter of parseParams but not the first, that will be taken as the default value for named parameters without values:
{{{
p = paramString.parseParams(null, "val", true);
}}}
;Usage
:{{{<<foo p1:A p2:B p3: p4:D>>}}}
In this example, val is used as the default value when processing parameters.

The optional ''init()'' function of a TiddlyWiki macro is automatically invoked by the TW core during the [[startup process]], but ''after'' all the plugins have been loaded.
{{{
config.macros.MacroName={
     init: function() {
        ...
	// your init code
	...
     },
    handler: function(place, macroName, params, wikifier, paramString, tiddler){
     }
}
}}}
<<tiddler "TiddlyWiki Internals">>
!Best Pracices
;[[Plugin Template]]
:a plugin template -- your's too should look like it before releasing to the general public
;[[Hijacking Functions|Hijacking]]
:replacing core or other functions with custom code...
;[[Parsing Parameters|Macro Parameters]]
:[[ParamParser|ParamParserMacro]] explains how TiddlyWiki evaluates parameters...
;[[Mario's Tips & Videos @HowTo-Plugin-Creation|http://howto-plugin-creation.tiddlyspace.com/]] """///""" [[the youtube playlist|https://www.youtube.com/watch?v=J5tq5xv0FHU&list=PL19F78517CB1EDC08&feature=view_all]] """///""" [[his youtube channel|https://www.youtube.com/user/pmariojo]]
:<<slider chkMariosVids "Dev.Plugins##MARIO" "Click to see the list of videos..." "Click me..."
>>
;[[ShowObject|http://tiddlytools.com/#ShowObject]]
:this transclusion by Eric Shulman allows to display the underlying core code of an object
/%
!MARIO
ยป [[How to Setup a TiddlyWiki Development Space|http://www.youtube.com/watch?v=J5tq5xv0FHU]]
ยป [[How TiddlyWiki Plugins Work|http://www.youtube.com/watch?v=XEXIIs16yto]]
ยป [[How to Debug a Plugin|http://www.youtube.com/watch?v=h3NjTLQXWRc]]
ยป [[Why Inline Scripts should be Plugins|http://www.youtube.com/watch?v=Hc6IPovgvbo]]
ยป [[From Inline Script to Plugin|http://www.youtube.com/watch?v=6u7-GdAsukw]]
!END%/

! Code Structure
{{annotation{The samples provided here are merely suggestions, not strictly-enforced regulations.}}}
!! Namespacing
Plugins' functions should be registered in the {{{config.extensions}}} namespace (built in from v2.5):
{{{
config.extensions.SamplePlugin = {
	sampleFunction: function() {
		/* ... */
	}
};
}}}
Similarly, functions specific to a certain macro or toolbar should be attached to the {{{config.macros}}} or {{{config.commands}}} object, respectively:
{{{
config.macros.SampleMacro = {
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		/* ... */
	}
};

config.commands.sampleCommand = {
	handler: function(event, src, title) {
		/* ... */
	}
};
}}}

Overview of common TiddlyWiki namespaces:
* {{{config.extensions}}}: [[DevPlugins]]
* {{{config.macros}}}: [[DevMacros]]
* {{{config.commands}}}: [[DevToolbarCommands]]
* {{{config.paramifiers}}}: [[DevParamifiers]]
* {{{config.formatters}}}: [[DevFormatters]]
* {{{config.adaptors}}}: [[DevAdaptors]]
!! Documentation
Well-structured code simplifies readability and maintainability. Commenting is an important part of structuring code.

There are two basic levels of comments:
* block comments ({{{/* [...] */}}})
* inline comments ({{{// [...]}}})
This distinction can be used to create a semantic and visual distinction between headers and annotations:
{{{
/*
** [section]
*/

// [function description]
function foo() {
	// [procedure description]
	var foo = bar; // [explanatory comment]
}

/* [sub-section] */

function bar() {
	var foo = bar;
}
}}}
{{annotation{While CSS only provides syntax for block comments, the same principle can be applied to [[StyleSheets]].}}}
!Extending Core Functionality
Instead of ''overwriting'' [[core functions|Functions]], [[hijacking|DevHijacking]] should be used whenever possible to add the desired functionality either before or after invoking the hijacked code (via the {{{apply(this,arguments);}}} method). This allows other plugins relying on these functions to continue to operate.

However, hijacking the function is not always possible, given the nature of the specific core function or the desired changes. In that case, it is important to clearly note in the respective plugin's documentation that installing the plugin may have adverse affects on other plugins installed in the same document.
! Declaring Global Functions
Function statements should be avoided within plugins. Function statements are of the form:
{{{
function foo() {
	// ...
}
}}}
Because plugins' code is processed using {{{eval()}}}, certain browsers (e.g. IE7 and Safari 3) leave the function in {{{eval()}}}'s local scope.

The way around this is to use expressions to declare such functions as variables, ideally adding an explicit {{{window}}} prefix:
{{{
window.foo = function() {
	// ...
}
}}}
This is especially relevant when overriding core functions that are declared using function statements, such as {{{displayMessage()}}}, event handlers, etc.
!Dependency Handling
While TiddlyWiki recognizes a ''Requires'' slice in plugins, this is only used to determine plugins' loading order and will not result in an error if the respective dependencies are not found in the document.

Strict dependency checking has to be implemented by the respective plugin itself. However, rather than checking for the respective plugin's name, object detection should be employed for maximum flexibility:
{{{
if(!window.foo) { //# "window" only required to prevent ReferenceError if "foo" is a global variable 
	throw "Missing dependency: Foo";
}
}}}
({{{foo}}} might be a property of TiddlyWiki's ''config'' namespace, e.g {{{config.extensions.SamplePlugin}}}

{{annotation{The {{{pluginInfo.log}}} array can be extended to add a message without stopping execution of the plugin:}}}
{{{
pluginInfo.log.push("lorem ipsum");
}}}
!Creating Aliases
Sometimes variable names can become very long - especially when using namespaces.

A closure (anonymous wrapper function) can be used to create a local scope in which local variables can be used as [[aliases|http://docs.jquery.com/Plugins/Authoring#Custom_Alias]], essentially providing "shortcuts" for accessing variables from the parent scope:
{{{
(function($) { //# set up local scope and jQuery alias

var plugin; //# alias
plugin = config.extensions.SamplePlugin = {
	sampleMessage: "lorem ipsum",

	sampleFunction: function() {
		/* ... */
	}
};

displayMessage(plugin.sampleMessage);
plugin.sampleFunction();

})(jQuery); //# end of local scope, passing in jQuery object
}}}
Here {{{$}}} is used as a local alias for {{{jQuery}}}. Similarly, {{{plugin}}} works as an alias for {{{config.extensions.SamplePlugin}}}.

!See also [[Dev:PluginSpecifications|http://oldwiki.tiddlywiki.org/wiki/Dev:Plugin_Specifications]]...
There are four basic stages in TiddlyWiki's startup process:
;oninit
:when ''main()'' starts
;onload
:after tiddlers have been loaded (including shadow tiddlers)
;onconfig
:right after plugins are loaded
;onstart
:when [[restarting|Dev.Restart]]
These are defined within the paramifier mechanism.
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='heading editorHeading'>
	<div class='editor title' macro='edit title'></div>
	<div class='tagClear'></div>
</div>
<div class='annotationsBox' macro='annotations'>
	<div class='editSpaceSiteIcon'
		macro='tiddlerOrigin height:16 width:16 label:no interactive:no'>
	</div>
	<div class="privacyEdit" macro='setPrivacy label:no interactive:no'></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='niceTagger'></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.3.3|
|''Status''|beta|
|''Author''|Jon Robson|
|''Description''|Provides editing of custom fields|
|''Requires''||
|''Source''||
!Usage
put {{{<div macro="editFields"></div>}}} into your EditTemplate.
!Todo
Support newlines in input boxes.
!Code
***/
//{{{
(function($) {
var editFields = config.macros.editFields = {
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var options = {
			fields: params
		};
		this.createInterface(place, tiddler, options);
	},
	createInterface: function(place, tiddler, options) {
		var whitelisted = ["changecount"];
		var fieldContainer = $("<div class='tiddlerCustomFields' />").appendTo(place);
		var included = [];
		if(tiddler) {
			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)) {
					this.addNewField(fieldContainer, i, val);
					included.push(i);
				}
			}
		}
		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);
		var 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 = $(this).attr("field");
				$(this).parent().remove();
			}
		}).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]]...
/*!**
|''Name''|ExtraFilters|
|''Author''|Jon Robson|
|''Version''|0.6.8|
|''Status''|@@experimental@@|
|''Requires''|TiddlySpaceFilters ImageMacroPlugin|
|''CodeRepository''|<...>|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Notes
* Updates shadow tiddlers to known TiddlySpace shadow tiddlers
* adds the following filters 
{{{
[is[tiddler]] - allows you to match all tiddlers - useful for applying the isnot filter (see later)
[is[image]] - returns only image tiddlers (e.g. png, jpeg, gif etc..)
[is[shadow]] - returns if the tiddler is a known shadow tiddler
[is[svg]] - returns only svg tiddlers
[is[tagged]] - returns tiddlers with tags
[isnot[image]] - filters result of previous filters for ones that are not images
[notag[<tag>]] - filters result of previous filters for ones without a tag
[nofield[<field>]] - check for absence of field or field value in previous filters
[has[<field or attribute>]] - match tiddlers which have a field or attribute set.
[and[<filter expression>]] - e.g.[and[tag:foo]] checks all tiddlers from previous filters for a tag foo.
[nobag[foo]] - removes any tiddlers previously returned by a previous filter that belong to the given bag
[is[open]]
[startsWith[title,Foo]] returns all tiddlers who's titles start with Foo.

}}}
***/
//{{{
(function($) {
Story.prototype.displayTiddler__ExtraFilters = Story.prototype.displayTiddler;
Story.prototype.displayTiddler = function() {
	var res =  Story.prototype.displayTiddler__ExtraFilters.apply(this, arguments);
	$("[macroName=list]").each(function(i, el) {
		config.macros.list.refresh(el);
	});
	return res;
};
Story.prototype.closeTiddler__ExtraFilters = Story.prototype.closeTiddler;
Story.prototype.closeTiddler = function() {
	var res =  Story.prototype.closeTiddler__ExtraFilters.apply(this, arguments);
	$("[macroName=list]").each(function(i, el) {
		config.macros.list.refresh(el);
	});
	return res;
};

config.shadowTiddlers.SiteIcon = "";
config.shadowTiddlers.SiteInfo = "";
config.shadowTiddlers.SystemSettings = "";
config.shadowTiddlers[config.extensions.tiddlyspace.currentSpace.name + "SetupFlag"] = "";

config.filterHelpers["is"].image = config.macros.image.isImageTiddler;
config.filterHelpers["is"].svg = config.macros.image.isSVGTiddler;
config.filterHelpers["is"].tiddler = function(tiddler) {
	return tiddler ? true : false;
}
config.filterHelpers["is"].open = function(tiddler) {
	return story.getTiddler(tiddler.title) ? true : false;
}
config.filterHelpers["is"].shadow = function(tiddler) {
	return tiddler && tiddler.title && tiddler.title in config.shadowTiddlers ? true : false;
}
config.filterHelpers["is"].tagged = function(tiddler) {
	return tiddler && tiddler.tags.length > 0 ? true : false;
};
config.filterHelpers["is"].external = function(tiddler) {
	var endsWith = config.extensions.BinaryTiddlersPlugin.endsWith;
	var fields = tiddler.fields;
	var bag = fields["server.bag"] || "";
	var local = config.filterHelpers["is"].local(tiddler);
	if(!local && endsWith(bag, "_public") || bag.indexOf("_") === -1) {
		return true;
	} else {
		return false;
	}
};

config.filterHelpers["is"].privateAndExternal = function(tiddler) {
	var endsWith = config.extensions.BinaryTiddlersPlugin.endsWith;
	var fields = tiddler.fields;
	var bag = fields["server.bag"] || "";
	return !config.filterHelpers["is"].local(tiddler) && endsWith(bag, "_private");
};

config.filters.isnot = function(candidates, match) {
	var type = match[3];
	var results = [];
	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;
};

config.filters.nobag = function(results, match) {
	var bag = match[3];
	var newResults = [];
  for(var i = 0; i < results.length; i++) {
    var tiddler = results[i];
    if(tiddler.fields["server.bag"] !== bag) {
      newResults.push(tiddler);
    }
  }
  return newResults;
};

config.filters.linksTo = function(results, match) {
	var name = match[3];
	results = this.getTiddlers();
  var newResults = [];
  for(var i = 0; i < results.length; i++) {
    var tiddler = results[i];
    var links = tiddler.getLinks("title", "excludeLists");
    if(links.contains(name)) {
      newResults.push(tiddler);
    }
  }
  return newResults;
};

config.filters.notag = function(results, match) {
  var tag = match[3];
  var newResults = [];
  for(var i = 0; i < results.length; i++) {
    var tiddler = results[i];
    if(!tiddler.tags.contains(tag)) {
      newResults.push(tiddler);
    }
  }
  return newResults;
};
config.filters.nofield = function(results, match) {
  var fieldname = match[3];
  var newResults = [];
  for(var i = 0; i < results.length; i++) {
    var tiddler = results[i];
    if(!tiddler.fields[fieldname]) {
      newResults.push(tiddler);
    }
  }
  return newResults;
};

config.filters.and = function(results, match) {
	var args = match[3].split(":");
	var negationMode = false;
	var handler = args[0];
	if(handler.indexOf("!") === 0) {
		handler = handler.substr(1);
		negationMode = true;
	}
	var value = args[1];
	if(config.filters[handler]) {
		var titles = [];
		var matches = config.filters[handler].call(this, [], [null, null, handler, value]); // note some filters require second argument :(
		for(var i = 0; i < matches.length; i++) {
			titles.push(matches[i].title);
		}
		var newResults = [];
		for(var i = 0; i < results.length; i++) {
			var tid = results[i];
			if(!negationMode && titles.contains(tid.title)) {
				newResults.push(tid);
			} else if(negationMode && !titles.contains(tid.title)) {
				newResults.push(tid);
			}
		}
		return newResults;
	} else {
		return results;
	}
};

config.filters.has = function(results, match) {
	var field = match[3];
	var results = [];
	this.forEachTiddler(function(title, tid) {
		if(tid[field] || tid.fields[field]) {
			results.push(tid);
		}
	});
	return results;
};

config.filters.startsWith = function(results, match) {
	var args = match[3].split(",");
	var field, str;
	if(args.length === 1) {
		field = "title";
		str = args[0]
	} else {
		field = args[0];
		str = args[1];
	}
	var newResults = [];
	// use this to keep the current store context
	this.forEachTiddler(function(i, tid) {
		var val = this.getValue(tid, field);
		if(val && val.indexOf(str) === 0) {
			newResults.push(tid);
		}
	})
	return newResults;
}

var scanMacro = config.macros.tsScan;
config.filterHelpers.loadingTiddler = new Tiddler("Loading...");
config.filterHelpers.loadingTiddler.text = "loading...";
config.filterHelpers.loadingTiddler.fields["msg.loading"] = "loading...";
config.filterHelpers.url = {};
config.filters.url = function(results, match) {
	var url = match[3];
	var tiddlers = config.filterHelpers.url[url];
	if(tiddlers) {
		return tiddlers;
	} else if(!status) {
		config.filterHelpers.url[url] = [ config.filterHelpers.loadingTiddler ];
		$.ajax({type:"get", url: url, dataType: "json", success: function(jstiddlers) {
			var tiddlers = scanMacro._tiddlerfy(jstiddlers, {});
			config.filterHelpers.url[url] = tiddlers;
			refreshDisplay();
		}, error: function() {
			displayMessage("unable to connect to %0".format(url));
		}
		});
	}
	return config.filterHelpers.url[url];
};

}(jQuery));
//}}}
[[AdaptorBase.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/AdaptorBase.js]]
[[Animator.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Animator.js]]
[[Backstage.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Backstage.js.js]]
[[BasicTypes.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/BasicTypes.js]]
[[Commands.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Commands.js]]
[[Config.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Config.js]]
[[ConfigBrowser.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/ConfigBrowser.js]]
[[Crypto.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Crypto.js]]
[[Dates.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Dates.js]]
[[Dom.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Dom.js]]
[[FileAdaptor.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/FileAdaptor.js]]
[[FileSystem.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/FileSystem.js]]
[[Filters.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Filters.js]]
[[Formatter.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Formatter.js]]
[[FormatterHelpers.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/FormatterHelpers.js]]
[[Guide.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Guide.js]]
[[Http.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Http.js]]
[[Import.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Import.js]]
[[Lingo.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Lingo.js]]
[[ListView.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/ListView.js]]
[[LoaderSaver.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/LoaderSaver.js]]
[[Macros.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Macros.js]]
[[Manager.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Manager.js]]
[[Messages.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Messages.js]]
[[Morpher.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Morpher.js]]
[[NewTiddler.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/NewTiddler.js]]
[[Options.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Options.js]]
[[Paramifiers.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Paramifiers.js]]
[[Popup.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Popup.js]]
[[RGB.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/RGB.js]]
[[Refresh.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Refresh.js]]
[[Saving.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Saving.js]]
[[SavingRSS.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/SavingRSS.js]]
[[Scroller.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Scroller.js]]
[[Search.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Search.js]]
[[Slider.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Slider.js]]
[[Sparkline.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Sparkline.js]]
[[Story.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Story.js]]
[[Strings.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Strings.js]]
[[Sync.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Sync.js]]
[[TW21Loader.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/TW21Loader.js]]
[[TW21Saver.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/TW21Saver.js]]
[[Tabs.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Tabs.js]]
[[Tiddler.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Tiddler.js]]
[[TiddlerFields.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/TiddlerFields.js]]
[[TiddlyWiki.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/TiddlyWiki.js]]
[[Toolbar.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Toolbar.js]]
[[Upgrade.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Upgrade.js]]
[[Utilities.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Utilities.js]]
[[UtilitiesPopup.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/UtilitiesPopup.js]]
[[Version.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Version.js]]
[[Wikifier.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Wikifier.js]]
[[Wizard.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Wizard.js]]
[[Zoomer.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/Zoomer.js]]
[[main.js|https://github.com/TiddlyWiki/TiddlyWiki/blob/master/js/main.js]]
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:''|FE2|
|''Description:''|create, edit, view and delete commands in the toolbar fields popup|
|''Version:''|1.0.5|
|''Date:''|2011.07.21|
|''Source:''|http://tbGTD.tiddlyspot.com#FE2|
|''Author:''|Tobias Beer|
|''License:''|[[BSD open source license|License]]|
|''~CoreVersion:''|2.5.3|
|''Browser:''|Firefox 2.0; InternetExplorer 6.0, others|
!Note
This is a refactored version of [[FieldsEditorPlugin|http://visualtw.ouvaton.org/VisualTW.html#FieldsEditorPlugin]] by Pascal Collin
!Installation:
*import this tiddler, keep tagged as systemConfig, save and reload
!Inline use
Allows to edit fields on a remote tiddler...
{{{<<FE2 tidName btnText btnTooltip>>}}}
*{{{tidName}}} is required 
*{{{btnText}}} and {{{btnTooltip}}} are optional
!Options
*add {{{config.options.chkHideServerFieldsFromFE2 = false;}}} to your zzConfig to also show TiddlySpace fields
!Code
***/
//{{{
(function($){
//general options
config.options.chkHideServerFieldsFromFE2='true';
//language options
config.commands.fields.lang={
	field:"field",
	actions:"actions",
	value:"value",
	'delete':'delete',
	rename:'rename',
	create:'add new field...',
	edit:'edit',
	inline:'fields',
	thisfield:' this field',
	lineBreaks:"The field value contains linebreaks.\nEditing here will convert it to a single line!\nProceed?",
	enterName:"Enter new field name...",
	enterNewName:"Enter new name for '%1'...",
	enterVal:"Enter field value for '%1'...", 
	enterNewVal:"Enter new value for '%1'..",
	doDelete:"Delete field '%1' from tiddler '%2' ?",
	existing:"This field already exists! ",
	btnInline:'edit fields',
	btnInlineTooltip:'Click to edit the fields of tiddler "%0"...'
};
config.commands.fields.handlePopup=function(popup,title){
	var f,action,
		ls=[],
		fields={},
		pre='<<FE2 [['+title+']] POPUPMODE ',
		tid=store.fetchTiddler(title);
	$(popup).addClass('FE2');
	if(!tid)return;
	store.forEachField(
		tid,
		function(tid,f,v){fields[f]=v;},
		true
	);
	for(f in fields){
		if(config.options.chkHideServerFieldsFromFE2&&(f.substr(0,7)=='server.'||f=='_hash'))continue;
		action=pre+'[['+f+']] ';
		ls.push({
			field:f,
			value:fields[f],
			actions:action+"edit>> "+action+"rename>> "+action+"delete>>"
		});
	}
	ls.sort(
		function(a,b){return a.field<b.field?-1:(a.field==b.field?0:+1);}
	);
	ls.push({field:'',value:"",actions:pre+"[[]] create>>"});
	ListView.create(popup,ls,{
		columns:[
			{
				name:'Field',
				field:'field',
				title:this.lang.field,
				type:'String'
			},{
				name:'Value',
				field:'value',
				title:this.lang.value,
				type:'WikiText'
			},{
				name:'Actions',
				field:'actions',
				title:this.lang.actions,
				type: 'WikiText'
			}
		],
		rowClasses:[
				{field:'actions'}
		],
		buttons:[
			//can't use button for selected then delete
			//because click on checkbox will hide the popup
		]
	});
}
config.macros.FE2={
	handler:function(place,macroName,params,wikifier,paramString,tiddler){
		if(!readOnly){
			var mode,field,
				tid = params[0],
				lang=config.commands.fields.lang;
			if(!store.getTiddler(tid))return;
			if(params[1]=='POPUPMODE'){
				field=params[2];
				mode=params[3];
				$(createTiddlyButton(
					place,
					lang[mode],
					lang[mode]+lang['thisfield'],
					this.clicked
				)).attr({
					'tiddler':tid,
					'field':field,
					'mode':mode
				});
			} else {
				$(createTiddlyButton(
					place,
					params[1]?params[1]:lang['btnInline'],
					(params[2]?params[2]:lang['btnInlineTooltip']).format([tid]),
					config.macros.toolbar.onClickPopup
				)).attr({
					'commandName':'fields',
					'tiddler':tid
				}).addClass('command_fields');
			}
		}
	},
	clicked:function(){
		var btn=$(this),
			mode=btn.attr('mode'),
			field=btn.attr('field'),
			title=btn.attr('tiddler'),
			tid=store.getTiddler(title),
			lang=config.commands.fields.lang;
		if(!tid)return;
		switch(mode){
			case'create':
				var first="";
				do{
					field=prompt(first+ lang.enterName,"");
					first=lang.existing;
				}while(store.getValue(tid,field));
				if(field){
					var v=prompt(lang.enterVal.replace(/%1/,field),"");
					if(v)tid.fields[field]=v;else return;
				}else return;
				break;
			case'delete':
				if(confirm(lang.doDelete.replace(/%1/,field).replace(/%2/,title))){
					delete tid.fields[field];
				}else return;
				break;
			case'edit':
				var v=tid.fields[field]||'';
				if(!v.match(/\n/mg)||confirm(lang.lineBreaks)){
					var v=prompt(lang.enterNewVal.replace(/%1/,field),v);
					if(v||v=='')tid.fields[field]=v;else return;
				}else return;
				break;
			case'rename':
				var name=prompt(lang.enterNewName.replace(/%1/,field),field);
				if(name){
					tid.fields[name]=tid.fields[field];
					delete tid.fields[field];
				}else return;
				break;
			default:return;
		}
		store.saveTiddler(
			tid.title,
			tid.title,
			tid.text,
			tid.modifier,
			tid.modified,
			tid.tags,
			tid.fields
		);
		autoSaveChanges();
		story.refreshTiddler(title,null,true);
		return false;
	}
}

config.shadowTiddlers.StyleSheetFE2=
	".FE2 td br{display:block;}\n"+
	".FE2 td {font-size:12px;padding:1px 3px}\n"+
	".FE2 .button {border:0;padding:0 0.2em;color:#999;}\n"+
	".FE2 .button:hover {color:#CCC;background:transparent;}\n"+
	".FE2 .twtable,.FE2 .twtable thead, .FE2 .twtable tr{border:0}\n"+
	".FE2 .twtable tr:hover{color:"+store.getTiddlerSlice('ColorPalette','TertiaryPale')+";background:"+store.getTiddlerSlice('ColorPalette','TertiaryDark')+"}\n"+
	".FE2 .twtable thead{font-size:13px;}";
store.addNotification("StyleSheetFE2",refreshStyles);
})(jQuery);
//}}}
!Summary
The global function daDaDa() does...
<<<
Briefly summarize the function.
<<<
!Signature
{{{TiddlyWiki.prototype.foo = function(arg1, arg2) {} }}}
<<<
Copy exactly as-is from source!
<<<
!Returns
type: short summary of the returned value
<<<
''For example...''
undefined
boolean: {{{true}}} means blabla
integer: the number of blabla
string: the <title> of blabla
array[string]: a list of <title> of blabla
object: the <class> that blabla
DOM reference: to blabla
<<<
!Arguments
;1. (boolean) arg1
:what arg1 is (for)
;2. (integer) arg2
:what arg2 is (for)
;3. (object) arg3
:what arg3 is (for)
!Example
{{{
store.foo(exampleValForArg1,exampleValForArg2);
}}}
''result / returns / outputs:'' this and that
/***
|''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?
%/
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.
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
<<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]].
}}}
A reference of all [[TiddlyWiki Core|Dev.Core]] functions...
{{functions{<<list filter [tag[Function]][tag[function]][sort[title]]>>}}}<<listfiltr>>
/***
|''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]]
<<tiddler SiteInfo>>

Welcome to your brand new [[TiddlySpace]]@glossary.

To get started with this blank [[TiddlySpace]]@glossary, you'll need to modify the following [[tiddlers|Tiddler]]@glossary:
* If you don't like the color scheme click <<RandomColorPaletteButton>> to generate a new random color scheme.
* Upload a [[SiteIcon|SiteIcon tiddler]]@glossary. [[Your SiteIcon|SiteIcon]] gives your space an identity to make it recognisable to others. A good site icon will be square and at least 48*48 pixels size.
<<binaryUploadPublic title:SiteIcon>>
* [[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 ~TiddlySpace is opened
* Many features of ~TiddlySpace are accessed via the backstage bar located at the top of the page. You can toggle it on or off using the button in the top right corner of the screen.
!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]].
!Summary
Ginsu is deprecated: up-to-date build tools and their docs can be found at https://github.com/TiddlyWiki/TiddlyWiki/tree/master/build

Ginsu splits the tiddlers in a TiddlyWiki HTML out into separate files ready for checking in to Subversion.
!External Resouces
* [[Ginsu|https://github.com/TiddlyWiki/cooker]]
!!See Also
* [[Cook]]
* [[Recipes|Recipe]]
* [[Chef]]
!Summary
What to consider when using GitHub can be used for core development...
!Details
See [[Using git and GitHub]]
The following functions are implemented in the ''global'' namespace...
{{functions{<<list filter [tag[global]][sort[title]] template:Templates##Function>>}}}<<listfiltr>>
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.
!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>
From [[Wikipedia|http://en.wikipedia.org/wiki/HTML5]]...
<<<
[[HTML5|http://en.wikipedia.org/wiki/HTML5]] is a markup language for structuring and presenting content for the World Wide Web and a core technology of the Internet ...

In particular, HTML5 adds many new syntactic features. These include the new {{{<video>}}}, {{{<audio>}}} and {{{<canvas>}}} elements, as well as the integration of {{{SVG}}} (Scalable Vector Graphics) content that replaces the uses of generic {{{<object>}}} tags and {{{MathML}}} for mathematical formulas.
<<<
|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
See [[Welcome]]...
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.
JavaScript allows you to dynamically overwrite functions during runtime -- this is called hijacking.

However, most of the time you want to also execute the original function before or after your custom code, or simply always run the replaced code after yours...
* to ensure that you don't break anything
* to simply chain the execution of function calls
!The Process
Assume you want to hijack a function called 'foo':
{{{
// original or core code for 'foo'
name.space.foo = function {
  alert('foo');
}
}}}
''"""1. Backup"""''
Before you overwrite anything, be sure to backup the function that you are about to replace or extend in the __same namespace__...
{{{
name.space.foo__bar = name.space.foo;
}}}
@@color:red;Important!@@ Do not just create a local variable to store the function in. For later introspection it is crucial to realise that another plugin (and also which) hijacked the same function.

''"""2. Overwrite"""''
Now you can actually replace the original code with yours...
{{{
// overwrite the original 'foo'
name.space.foo = function (args){
  // custom code for 'foo' as needed for plugin 'bar'
  alert('bar');
  // when done, invoke the original as saved before
  return name.space.foo_bar.apply(this, arguments);
}
}}}
''Note:'' In the example above, you will actually get two alert boxes!

@@color:red;Important:@@ If the original function had a return value, be sure to also return the result with your function call!
See [[Hijacking]]...
The [[space|Space]] created for a [[user|User]] when registering 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 and/or the ColorPalette tiddler. For editing ColorPalette, https://tiddlytools.com/Classic/#ColorPalette may be useful.

Check out https://yakovl.github.io/TiddlyThemes/ for a list of existing 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";}}}
When a custom theme is not applied, the layout is defined by shadow tiddlers that you can edit:
* PageTemplate defines the overall layout (along with styles that you can adjust in StyleSheet);
* ViewTemplate defines the layout of a single tiddler in the view mode;
* EditTemplate does the same for the edit mode.

Themes allow to pack all such adjustments into a single tiddler; you can find some examples at https://yakovl.github.io/TiddlyThemes/

{{inviteToContribute{
TODO: explain some examples of tweaking here}}}
#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
/bags/common/tiddlers/jquery.js
/TSFeedback
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]]
TiddlyWiki currently does not extend this primitive type of JavaScript.
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]]
The functional side of TiddlyWiki is entirely implemented using JavaScript while the [[HTML]] provides the structure and [[CSS]] the design, all of this in a single, dynamic wiki.
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>>
Array|array*
Boolean|boolean*|false|true
CSS|Css Class|element id|^css rule*
Classes|Class
Date Formats|Date Format|date template*
Date|date*
DOM Reference
DOM
Fields|field|changecount|core field*|created field|modifier fields|modifier|modified field|title fields|standard fields|tiddler text
HTML
Integer|interger*
JavaScript|js
Markup|markup|formatting|inline|block|nest*|text formatting|formatting|re-render*|render*
Object|object*
Primitive Types|Primitive Type|type*
Properties|property
Story.class|story
String|string*
Tiddler.class|tiddler class|tiddler object*|tiddler*
TiddlyWiki.class|tiddlywiki class|tiddlywiki
Undefined|void|null|none
Wikifier.class|wikifier*|format*|markup

~Button
~Community
~Contributors
~Dev
~DEV
~Follow
~Functions
~Help
~message
~REVIEW
~search
~Search
~version


!the below entries were bluntly copied over from @TiddlyWiki...


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
Changing Default Options|zzConfig|zzTweaks
~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 macro
Escaping
Evaluated Parameters|evaluated parameter*
External Link|external link*
FAQ
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*
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
Sections|tiddler##section
Slices|slice*|tiddler::slice
Space
StyleSheets|cascading style sheet*|custom style*|style sheet*|style*
Tables|table format*|cell*|column*|row*
Tags|tag*
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
See [[Extracted Source Code]]...
<<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]] [[TiddlyWiki Core|Dev.Core]] [[Plugin Development|Dev.Plugins]] [[Using git and GitHub]] [[Contribute]]
~TiddlyWiki source, translations, docs, and various extensions are developed on ~GitHub, but not all of us are equally familiar with ~GitHub and git. Here are some recipes for those who are willing to contribute, but lack knowledge of the tools to do so:
* If you don't know how to use ~GitHub and git, you can always start from [[issues|Using GitHub issues]].
* If you'd like to propose specific changes (edits of docs or code), you can [[master Pull Requests|Using GitHub: your first Pull Request]].
Pull requests allow anybody to propose a specific change, like this [[update|https://github.com/TiddlyWiki/translations/pull/10/files]] to the German translation.

They are not difficult to do, but making them correctly (both the first one and the second one to the same repository) requires a bit of learning, so here's how you can do your first PR:
# If you don't have a ~GitHub account, register one.
# Start by understanding what you are going to propose. It's usually good to propose one change at a time, for instance "update the Dutch translation to version 2.9.4" or "fix a bug that breaks the Dutch translation". Mixing things usually cause a longer review and slows down the overall process.
# Fork the repository: open it (example: [[translations|https://github.com/TiddlyWiki/translations]]), find the fork button (somewhere on the top right), and click it. Typically, you won't need to adjust anything on the next screen, so click "Create fork". Once done, your fork will be opened ([[example|https://github.com/retostauss/translations]]).
# [[Create a new branch|https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-and-deleting-branches-within-your-repository]] in your fork (forked repository). Give it a name that represents what you are trying to do, like {{{translation-nl-294}}} (update Dutch translation to 2.9.4).
# Edit the files and commit the changes. These days, you can do it without using git or even downloading anything locally. For instance, [[using GitHub.dev|Using GitHub.dev]].
# Visit your fork repo again. On the top of it, you'll see a proposition to create a PR; click the "Compare & pull request" button there.
# Give the PR a meaningful title. Usually, that's what you have come up with in the beginning (see above). Add the necessary context to the main text: explain nonobvious decisions, mention previous discussions, etc., if needed. Click "Create pull request".
Congratulations! Your first PR is now online! Be prepared, though: it's normal to make mistakes in the first contribution, so your fellow community members will review it and probably ask to make some corrections or point out some problems that need thinking through before going further. To add more changes, you'll need to visit your fork repo again, open the branch you've created, and edit files and commit changes again. They'll be added to the PR automatically as long as it is open.
{{{GitHub.dev}}} is a neat feature of ~GitHub: basically, you can edit files, rename/move/remove them online in a VS Code-like editor. It also includes the git functionality, so you can preview changes (diff), commit, etc in your browser.

!!!Editing and committing a file
Let's say you want to edit a translation file and you have forked it already (like mentioned [[here|Using GitHub: your first Pull Request]]). Here's how you open the editor:
# Open your fork (like https://github.com/YourGithubName/translations),
# Switch to the branch you want to edit (will result in something like https://github.com/YourGithubName/translations/tree/translation-nl-294),
# Change {{{github.com}}} in the url to {{{github.dev}}} โ€“ i.e. open a url like https://github.dev/YourGithubName/translations/tree/translation-nl-294.
In fact, you can open it [[via UI|https://docs.github.com/en/codespaces/the-githubdev-web-based-editor#opening-the-githubdev-editor]], too.

Now you can edit the files. The file manager can be found on the left panel (or opened via {{{Ctrl + Shift + E}}}). Once you're happy with the changes, you can commit them:
# Open the Source Control panel (find it on the left panel or press {{{Ctrl + Shift + G}}}).
# Add (stage) the edited files by pressing "+" next to them.
# Write the commit message, i.e. explain what your change does. Typically, a commit message looks like {{{feature: update the Dutch (nl) translation to 2.9.4}}}.
# Press the Commit & Push button.
If something isn't clear, check out [[github docs|https://docs.github.com/en/codespaces/the-githubdev-web-based-editor#commit-your-changes]].
Issues are basically pieces of feedback. If you have faced a problem or would like to suggest an improvement (to either ~TiddlyWiki, its extensions, or docs), you can create an issue: this doesn't require any special knowledge.

All you need to start is:
# Register on ~GitHub if you haven't already.
# Open a project repository, click Issues on the top, and then the "New issue" button;
** for issues regarding ~TiddlyWiki itself or [[classic.tiddlywiki.com|https://classic.tiddlywiki.com]], use the [[main repo|https://github.com/TiddlyWiki/TiddlyWiki]];
** for these dev docs, use the [[GitHub Pages|https://github.com/tiddlyWiki/tiddlywiki.github.com]] repo;
** translations repo is [[here|https://github.com/TiddlyWiki/translations]];
** extensions are stored in various repos created by different contributors; sometimes they are mentioned in their Source slice;
** when unsure where to write, you can always ask [[the community|https://classic.tiddlywiki.com/#DiscussionForums]].
# Describe the issue.
~GitHub provides plenty of features for discussing issues. Once you get used to it, you'll love it!

To help others help you, you should follow some best practices:
* Before reporting an issue, check if it was discussed previously; if it was, it's usually better to comment on an existing one (checking in [[the community|https://classic.tiddlywiki.com/#DiscussionForums]] is useful, too): you can find solutions there and you'll get a response faster.
* When reporting a bug, explain the expected behavior, the actual one, and how to reproduce it (compare: "search hangs in my TW" and "in an empty TW 2.9.4 with ~plugin A (~link) and B (~link) installed, when I search for {{{/^/m}}}, Firefox 99 hangs" โ€“ the second one can be reproduced by anyone, while the first one is only available to you).
!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/tiddlywikidev_public/tiddlers/favicon.ico" />
<link href="/bags/tiddlywikidev_public/tiddlers.atom" rel="alternate"
	type="application/atom+xml" title="tiddlywikidev'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
/***
|Name|MatchTagsPlugin|
|Source|http://www.TiddlyTools.com/#MatchTagsPlugin|
|Documentation|http://www.TiddlyTools.com/#MatchTagsPluginInfo|
|Version|2.0.6|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|'tag matching' with full boolean expressions (AND, OR, NOT, and nested parentheses)|
!!!!!Documentation
> see [[MatchTagsPluginInfo]]
!!!!!Revisions
<<<
2011.10.28 2.0.6 added .matchTags CSS class to popups to enable custom styling via StyleSheet
2011.01.23 2.0.5 fix core tweak for TW262+: adjust code in config.filters['tag'] instead of filterTiddlers()
2010.08.11 2.0.4 in getMatchingTiddlers(), fixed sorting for descending order (e.g, "-created")
| please see [[MatchTagsPluginInfo]] for additional revision details |
2008.02.28 1.0.0 initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.MatchTagsPlugin= {major: 2, minor: 0, revision: 6, date: new Date(2011,10,28)};

// store.getMatchingTiddlers() processes boolean expressions for tag matching
//    sortfield (optional) sets sort order for tiddlers - default=title
//    tiddlers (optional) use alternative set of tiddlers (instead of current store)
TiddlyWiki.prototype.getMatchingTiddlers = function(tagexpr,sortfield,tiddlers) {

	var debug=config.options.chkDebug; // abbreviation
	var cmm=config.macros.matchTags; // abbreviation
	var r=[]; // results are an array of tiddlers
	var tids=tiddlers||store.getTiddlers();
	if (tids && sortfield) tids=store.sortTiddlers(tids,sortfield);
	if (debug) displayMessage(cmm.msg1.format([tids.length]));

	// try simple lookup to quickly find single tags or tags that
	// contain boolean operators as literals, e.g. "foo and bar"
	for (var t=0; t<tids.length; t++)
		if (tids[t].isTagged(tagexpr)) r.pushUnique(tids[t]);
	if (r.length) {
		if (debug) displayMessage(cmm.msg4.format([r.length,tagexpr]));
		return r;
	}
	
	// convert expression into javascript code with regexp tests,
	// so that "tag1 AND ( tag2 OR NOT tag3 )" becomes
	// "/\~tag1\~/.test(...) && ( /\~tag2\~/.test(...) || ! /\~tag3\~/.test(...) )"

	// normalize whitespace, tokenize operators, delimit with "~"
	var c=tagexpr.trim(); // remove leading/trailing spaces
	c = c.replace(/\s+/ig," "); // reduce multiple spaces to single spaces
	c = c.replace(/\(\s?/ig,"~(~"); // open parens
	c = c.replace(/\s?\)/ig,"~)~"); // close parens
	c = c.replace(/(\s|~)?&&(\s|~)?/ig,"~&&~"); // &&
	c = c.replace(/(\s|~)AND(\s|~)/ig,"~&&~"); // AND
	c = c.replace(/(\s|~)?\|\|(\s|~)?/ig,"~||~"); // ||
	c = c.replace(/(\s|~)OR(\s|~)/ig,"~||~"); // OR
	c = c.replace(/(\s|~)?!(\s|~)?/ig,"~!~"); // !
	c = c.replace(/(^|~|\s)NOT(\s|~)/ig,"~!~"); // NOT
	c = c.replace(/(^|~|\s)NOT~\(/ig,"~!~("); // NOT(
	// change tag terms to regexp tests
	var terms=c.split("~"); for (var i=0; i<terms.length; i++) { var t=terms[i];
		if (/(&&)|(\|\|)|[!\(\)]/.test(t) || t=="") continue; // skip operators/parens/spaces
		if (t==config.macros.matchTags.untaggedKeyword)
			terms[i]="tiddlertags=='~~'"; // 'untagged' tiddlers
		else
			terms[i]="/\\~"+t+"\\~/.test(tiddlertags)";
	}
	c=terms.join(" ");
	if (debug) { displayMessage(cmm.msg2.format([tagexpr])); displayMessage(cmm.msg3.format([c])); }

	// scan tiddlers for matches
	for (var t=0; t<tids.length; t++) {
	 	// assemble tags from tiddler into string "~tag1~tag2~tag3~"
		var tiddlertags = "~"+tids[t].tags.join("~")+"~";
		try { if(eval(c)) r.push(tids[t]); } // test tags
		catch(e) { // error in test
			displayMessage(cmm.msg2.format([tagexpr]));
			displayMessage(cmm.msg3.format([c]));
			displayMessage(e.toString());
			break; // skip remaining tiddlers
		}
	}
	if (debug) displayMessage(cmm.msg4.format([r.length,tagexpr]));
	return r;
}
//}}}
//{{{
config.macros.matchTags = {
	msg1: "scanning %0 input tiddlers",
	msg2: "looking for '%0'",
	msg3: "using expression: '%0'",
	msg4: "found %0 tiddlers matching '%1'",
	noMatch: "no matching tiddlers",
	untaggedKeyword: "-",
	untaggedLabel: "no tags",
	untaggedPrompt: "show tiddlers with no tags",
	defTiddler: "MatchingTiddlers",
	defTags: "",
	defFormat: "[[%0]]",
	defSeparator: "\n",
	reportHeading: "Found %0 tiddlers tagged with: '{{{%1}}}'\n----\n",
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var mode=params[0]?params[0].toLowerCase():'';
		if (mode=="inline")
			params.shift();
		if (mode=="report" || mode=="panel") {
			params.shift();
			var target=params.shift()||this.defTiddler;
		}
		if (mode=="popup") {
			params.shift();
			if (params[0]&&params[0].substr(0,6)=="label:") var label=params.shift().substr(6);
			if (params[0]&&params[0].substr(0,7)=="prompt:") var prompt=params.shift().substr(7);
		} else {
			var fmt=(params.shift()||this.defFormat).unescapeLineBreaks();
			var sep=(params.shift()||this.defSeparator).unescapeLineBreaks();
		}
		var sortBy="+title";
		if (params[0]&&params[0].substr(0,5)=="sort:") sortBy=params.shift().substr(5);
		var expr = params.join(" ");
		if (mode!="panel" && (!expr||!expr.trim().length)) return;
		if (expr==this.untaggedKeyword)
			{ var label=this.untaggedLabel; var prompt=this.untaggedPrompt };
		switch (mode) {
			case "popup": this.createPopup(place,label,expr,prompt,sortBy); break;
			case "panel": this.createPanel(place,expr,fmt,sep,sortBy,target); break;
			case "report": this.createReport(target,this.defTags,expr,fmt,sep,sortBy); break;
			case "inline": default: this.createInline(place,expr,fmt,sep,sortBy); break;
		}
	},
	formatList: function(tids,fmt,sep) {
		var out=[];
		for (var i=0; i<tids.length; i++) { var t=tids[i];
			var title=t.title;
			var who=t.modifier;
			var when=t.modified.toLocaleString();
			var text=t.text;
			var first=t.text.split("\n")[0];
			var desc=store.getTiddlerSlice(t.title,"description");
			desc=desc||store.getTiddlerSlice(t.title,"Description");
			desc=desc||store.getTiddlerText(t.title+"##description");
			desc=desc||store.getTiddlerText(t.title+"##Description");
			var tags=t.tags.length?'[['+t.tags.join(']] [[')+']]':'';
			out.push(fmt.format([title,who,when,text,first,desc,tags]));
		}
		return out.join(sep);
	},
	createInline: function(place,expr,fmt,sep,sortBy) {
		wikify(this.formatList(store.sortTiddlers(store.getMatchingTiddlers(expr),sortBy),fmt,sep),place);
	},
	createPopup: function(place,label,expr,prompt,sortBy) {
		var btn=createTiddlyButton(place,
			(label||expr).format([expr]),
			(prompt||config.views.wikified.tag.tooltip).format([expr]),
			function(ev){ return config.macros.matchTags.showPopup(this,ev||window.event); });
		btn.setAttribute("sortBy",sortBy);
		btn.setAttribute("expr",expr);
	},
	showPopup: function(here,ev) {
		var p=Popup.create(here,null,"matchTags popup"); if (!p) return false;
		var tids=store.getMatchingTiddlers(here.getAttribute("expr"));
		store.sortTiddlers(tids,here.getAttribute("sortBy"));
		var list=[]; for (var t=0; t<tids.length; t++) list.push(tids[t].title);
		if (!list.length) createTiddlyText(p,this.noMatch);
		else {
			var b=createTiddlyButton(createTiddlyElement(p,"li"),
				config.views.wikified.tag.openAllText,
				config.views.wikified.tag.openAllTooltip,
				function() {
					var list=this.getAttribute("list").readBracketedList();
					story.displayTiddlers(null,tids);
				});
			b.setAttribute("list","[["+list.join("]] [[")+"]]");
			createTiddlyElement(p,"hr");
		}
		var out=this.formatList(tids," &nbsp;[[%0]]&nbsp; ","\n"); wikify(out,p);
		Popup.show();
		ev.cancelBubble=true;
		if(ev.stopPropagation) ev.stopPropagation();
		return false;
	},
	createReport: function(target,tags,expr,fmt,sep,sortBy) {
		var tids=store.sortTiddlers(store.getMatchingTiddlers(expr),sortBy);
		if (!tids.length) { displayMessage('no matches for: '+expr); return false; }
		var msg=config.messages.overwriteWarning.format([target]);
		if (store.tiddlerExists(target) && !confirm(msg)) return false;
		var out=this.reportHeading.format([tids.length,expr])
		out+=this.formatList(tids,fmt,sep);
		store.saveTiddler(target,target,out,config.options.txtUserName,new Date(),tags,{});
		story.closeTiddler(target); story.displayTiddler(null,target);
	},
	createPanel: function(place,expr,fmt,sep,sortBy,tid) {
		var s=createTiddlyElement(place,"span"); s.innerHTML=store.getTiddlerText("MatchTagsPlugin##html");
		var f=s.getElementsByTagName("form")[0];
		f.expr.value=expr; f.fmt.value=fmt; f.sep.value=sep.escapeLineBreaks();
		f.tid.value=tid; f.tags.value=this.defTags;
	}
};
//}}}
/***
//{{{
!html
<form style='display:inline;white-space:nowrap'>
<input type='text'    name='expr' style='width:50%' title='tag expression'><!--
--><input type='text'    name='fmt'  style='width:10%' title='list item format'><!--
--><input type='text'    name='sep'  style='width:5%'  title='list item separator'><!--
--><input type='text'    name='tid'  style='width:12%' title='target tiddler title'><!--
--><input type='text'    name='tags' style='width:10%' title='target tiddler tags'><!--
--><input type='button'  name='go'   style='width:8%'  value='go' onclick="
	var expr=this.form.expr.value;
	if (!expr.length) { alert('Enter a boolean tag expression'); return false; }
	var fmt=this.form.fmt.value;
	if (!fmt.length) { alert('Enter the list item output format'); return false; }
	var sep=this.form.sep.value.unescapeLineBreaks();
	var tid=this.form.tid.value;
	if (!tid.length) { alert('Enter a target tiddler title'); return false; }
	var tags=this.form.tags.value;
	config.macros.matchTags.createReport(tid,tags,expr,fmt,sep,'title');
	return false;">
</form>
!end
//}}}
***/
//{{{
// SHADOW TIDDLER for displaying default panel input form
config.shadowTiddlers.MatchTags="<<matchTags panel>>";
//}}}
//{{{
// TWEAK core filterTiddlers() or config.filters['tag'] (in TW262+)
// to use getMatchingTiddlers instead getTaggedTiddlers
// for enhanced boolean matching in [tag[...]] syntax
var TW262=config.filters && config.filters['tag']; // detect TW262+
var fname=TW262?"config.filters['tag']":"TiddlyWiki.prototype.filterTiddlers";
var code=eval(fname).toString().replace(/getTaggedTiddlers/g,'getMatchingTiddlers');
eval(fname+'='+code);
//}}}
//{{{
// REDEFINE core handler for enhanced boolean matching in tag:"..." paramifier
// use filterTiddlers() instead of getTaggedTiddlers() to get list of tiddlers.
config.paramifiers.tag = {
	onstart: function(v) {
		var tagged = store.filterTiddlers("[tag["+v+"]]");
		story.displayTiddlers(null,tagged,null,false,null);
	}
};
//}}}
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.
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]]
/***
|''Name''|MySearchPlugin|
|''Description''|displays search results as a simple list of matching tiddlers. Allows you to define a filter to limit search results to a certain subset.|
|''Authors''|FND, Jon Robson|
|''Version''|0.3.3|
!Code
***/
//{{{
if(typeof(config.options.txtSearchFilter) === 'undefined') {
	config.options.txtSearchFilter = "[is[local]]";
}
config.optionsDesc.txtSearchFilter = "Provide a filter to be run on any search query";
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) {
			jQuery(el).empty();
		} 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";
		var preamble =  "''" + config.macros.search.successMsg.format(matches.length.toString(), query) + ":''";
		if(matches.length > 0) {
			msg += preamble + "\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);
		var links = [preamble];
		for(var i = 0; i < matches.length; i++) {
			links.push("[[" + matches[i].title + "]]")
		}
		config.shadowTiddlers.MyLastSearch = links.join("\n");
	},

	closeResults: function() {
		var el = document.getElementById(config.extensions.SimpleSearchPlugin.containerId);
		jQuery(el).remove();
		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 = store.filterTiddlers(config.options.txtSearchFilter);
	var primary = [];
	var secondary = [];
	var tertiary = [];
	var quaternary = [];
	for(var t = 0; t < candidates.length; t++) {
		var tiddler = candidates[t];
		if(tiddler.title.search(searchRegExp) != -1) {
			primary.push(tiddler);
		} else if(tiddler.tags.join(" ").search(searchRegExp) != -1) {
			secondary.push(tiddler);
		} else if(tiddler.text.search(searchRegExp) != -1) {
			tertiary.push(tiddler);
		} else {
			for(var j in tiddler.fields) {
				if(tiddler.fields[j] && typeof(tiddler.fields[j]) === 'string' && tiddler.fields[j].search(searchRegExp) != -1) {
					quaternary.push(tiddler);
					break;
				}
			}
		}
	}
	var results = primary.concat(secondary).concat(tertiary).concat(quaternary);
	if(sortField) {
		results.sort(function(a, b) {
			return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);
		});
	}
	return results;
};
//}}}
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
//}}}
//{{{
config.filters.numbersort = function(results,match) {
	var field = match[3];
	results = results.sort(function(a, b) {
		var val1 = a[field] || a.fields[field];
		var val2 = b[field] || b.fields[field];
		return parseFloat(val1, 10) < parseFloat(val2, 10) ? -1 : 1;
	});
	return results;
};
//}}}
Besides [[primitive types|Primitive Types]], objects provide the basic element in JavaScript for you to get creative -- you can equip it with [[Properties]] and [[Functions]] or turn it into a [[Class|Classes]] to create new instanciate from.
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]].
See [[TiddlyWiki Core]]...
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)]]
To permanently save a [[tiddler|Tiddler.class]], TiddlyWiki needs to be saved in its entirety.
{{annotation{
''Note:'' While the above is true in a classical TiddlyWiki, this is not so in many [[Server-Side Solutions]]@tiddlywiki for TiddlyWiki, such as [[TiddlyWeb]]@TiddlyWiki (or TiddlySpace@TiddlyWiki respectively) where edits on tiddlers are saved individually, including a check for [[Editing Conflicts]]@tiddlywiki.
}}}
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
<<tiddler Persistence>>
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.
You can bundle CSS in a plugin using the following mechanism taking advantage of [[Section Transclusion]]

To do this in your plugin, first include a section in a comment like so...
{{{
/*
!CSS
body { border: solid 1px black; }
!END*/
}}}
Be sure touse the {{{!END}}} heading to signal the end of the ''CSS'' section and thus the StyleSheet. Then include the following lines in your plugin code...
{{{
var name = "StyleSheet" + tiddler.title;
config.shadowTiddlers[name] = "/*{{{*/\n%0\n/*}}}*/".
	format(store.getTiddlerText(tiddler.title + "##CSS"));
store.addNotification(name, refreshStyles);
}}}
This accesses the ''CSS'' section of the plugin tiddler and creates and registers a StyleSheet shadow tiddler for it, e.g. for a plugin tiddler called ''~FooPlugin'', the StyleSheet would be called ''~StyleSheetFooPlugin''.
/***
|''Name:''|ExamplePlugin|
|''Description:''|To demonstrate how to write TiddlyWiki plugins|
|''Version:''|2.0.3|
|''Date:''|Sep 22, 2006|
|''Source:''|http://www.tiddlywiki.com/#ExamplePlugin|
|''Author:''|JeremyRuston -- jeremy (at) osmosoft (dot) com|
|''License:''|[[BSD open source license]]|
|''~CoreVersion:''|2.1.0|
***/
//{{{
//The code goes here...
//}}}
<<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)
!"""Extended Types"""
TiddlyWiki extends the following primitive types provided by JavaScript, see below...
* [[Array]]
* [[Date]]
* [[String]]
!"""Other Types"""
The following primitive types have not been extended by TiddlyWiki...
* [[Boolean]]
* [[Integer]]
* [[Object]]
!Extensions
<<tiddler extension>>
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]].
Here is a refernce of all properties of TiddlyWiki class objects...
~tbd~
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>>
[[r4tw|http://simonbaird.com/r4tw/]] is a collection of Ruby classes for manipulating [[TiddlyWiki]] files.

[[tiddlywiki_cp|http://rubyforge.org/projects/tiddlywikicp/]] is a Ruby gem based on ''r4tw'', providing a library and command-line interface to create tiddlers from files and vice versa.

!!See Also

* [[Dev:PyTiddlyWiki]]
Tiddlers that have been redirected tag to <<tag REDIRECTED>>.
Someone has tagged a tiddler tagging here for review...
/***
|''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''|RandomSortFilter|
|''Version''|0.1.2|
!Description
Updates the sort filter to take a keyword *random
!Usage
{{{
[sort[*random]]
}}}
***/
//{{{
(function() {
var _sort = config.filters.sort;
config.filters.sort = function(results,match) {
	if(match[3] === "*random") {
		results = results.sort(function(a, b) {
			var r = Math.random();
			return r < 0.5 ? -1 : 1;
		});
		return results;
	} else {
		return _sort.apply(this, arguments);
	}
};
})();
//}}}
/***
|''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'
!Summary
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
[[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
The default [[default recipe file|http://svn.tiddlywiki.org/Trunk/core/tiddlywiki.html.recipe]] for TiddlyWiki:
{{{
template: html/tiddlywiki.template.html
recipe: tiddlers/split.recipe
recipe: js/split.recipe
copy: java/TiddlySaver.jar
}}}
!!External Resources
* [[Recipe Files|Recipe]]
!!See Also
* [[Cook]]
* [[Ginsu]]
* [[Chef]]
//{{{
config.macros.references = {
  handler: function(place, m, p, w, pa, tiddler) {
    if(!tiddler) return;
    else invokeMacro(place, "list", "filter \"[linksTo[%0]]\" emptyMessage:'No references'".format(tiddler.title), null, tiddler);
  }
};
//}}}
/***
|''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);
//}}}
/***
|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.
//{{{
TiddlyWiki.prototype.reverseLookup = function(lookupField,lookupValue,lookupMatch,sortField)
{
	var results = [];
	this.forEachTiddler(function(title,tiddler) {
		var f = !lookupMatch;
		var values;
		if(["links", "tags"].contains(lookupField)) {
			values = tiddler[lookupField];
		} else {
			var accessor = TiddlyWiki.standardFieldAccess[lookupField];
			if(accessor) {
				values = [ accessor.get(tiddler) ];
			} else {
				values = tiddler.fields[lookupField] ? [tiddler.fields[lookupField]] : [];
			}
		}
		for(var lookup=0; lookup<values.length; lookup++) {
			if(values[lookup] == lookupValue)
				f = lookupMatch;
		}
		if(f)
			results.push(tiddler);
	});
	if(!sortField)
		sortField = "title";
	return this.sortTiddlers(results,sortField);
};
//}}}
<!--{{{-->
<div macro='slideRevision'></div>
<div class='heading'>
	<span class="titleBar">
		<div class='title' macro='view title text'></div>
	</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);
//}}}
!Summary
This tiddler explains ruby requirements for the old build process.
!Details
Install [[ruby|http://www.ruby-lang.org/de/]] and then use Cook.
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]]...
[[store.getTiddlerText()]] supports accessing sections in a tiddler. If a tiddler has a heading ({{{!Heading}}}) in the markup of its text anything that follows that heading up until the next heading or the end of the tidler is returned.

For example, given a tiddler called ''Foo'' has the following text...
{{{
!Bar
baz
}}}
...calling...
{{{
store.getTiddlerText("Foo##Bar")
}}}
''returns:'' "baz"
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]]
This tiddler has been deleted.
<<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>>
}}}
<<tiddler Backstage##Tiddlers>>

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|
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
Discussion around TiddlyWiki's core functions from a developers perspective.
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]].
core documentation | resources for plugin development
!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 Developer Space|GettingStarted]]
!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|
In a standard TiddlyWiki, one instance of the [[TiddlyWiki.class]], namely the ''store'' is running. Hence, you can call any ''"""TiddlyWiki.prototype.functionFoo()"""'' on it.
See [[Story.class]]...
The ''Story'' class governs what is visible to the user on the page, and is instantiated by TiddlyWiki when the page loads as the global story ''object'' of which there is __one__ in a standard TiddlyWiki.
!!Properties
;container
:the DOM id of the Element that tiddlers are being displayed in
;highlightRegExp'
:the current search string, if any
;idPrefix'
:the string prepended to the DOM ids of tiddlers being displayed
!Functions
{{functions{<<list filter [startsWith[title,story.]][sort[title]] template:Templates##Function>>}}}<<listfiltr>>
!More Functions
* [[blurTiddler|Story.prototype.blurTiddler]]: remove focus from a tiddler
* [[chooseTemplateForTiddler|Story.prototype.chooseTemplateForTiddler]]: find the template name for a tiddler
* [[closeAllTiddlers|Story.prototype.closeAllTiddlers]]: close all tiddlers on the page
* [[closeTiddler|Story.prototype.CloseTiddler]]: close a single tiddler
* [[createTiddler|Story.prototype.createTiddler]]: show a tiddler on the page
* [[displayTiddler|Story.prototype.displayTiddler]]: animate showing a tiddler on the page
* [[displayTiddlers|Story.prototype.displayTiddlers]]: display many tiddlers simultaneously
* [[findContainingTiddler|Story.prototype.findContainingTiddler]]: find the tiddler containing an Element
* [[focusTiddler|Story.prototype.focusTiddler]]: give a tiddler's edit field keyboard focus
* [[forEachTiddler|Story.prototype.forEachTiddler]]: execute a function on every visible tiddler
* [[gatherSaveFields|Story.prototype.gatherSaveFields]]: gather all saveable edit fields from tiddlers on the page
* [[getTemplateForTiddler|Story.prototype.getTemplateForTiddler]]: return template source code for a tiddler
* [[hasChanges|Story.prototype.hasChanges]]: returns whether there are unsaved changes to a tiddler
* [[permaView|Story.prototype.permaView]]: change the address bar to a permalink to all visible tiddlers
* [[refreshAllTiddlers|Story.prototype.refreshAllTiddlers]]: re-display all tiddlers on the page
* [[refreshTiddler|Story.prototype.refreshTiddler]]: re-display a tiddler
* [[saveTiddler|Story.prototype.saveTiddler]]: save user changes to a tiddler
* [[scrubTiddler|Story.prototype.scrubTiddler]]: remove all DOM ids from a tiddler on the page
* [[search|Story.prototype.search]]: start a user-visible search
* [[setDirty|Story.prototype.setDirty]]: set the dirty flag of a single tiddler
* [[setTiddlerTag|Story.prototype.setTiddlerTag]]: specify tags for a tiddler
The //chooseTemplateForTiddler// method of the [[Story class]] returns the name of a template for a tiddler view. It takes two parameters:

* the title of the tiddler
* a constant corresponding to the type of template to use

The second parameter may be omitted, in which case //~DEFAULT_VIEW_TEMPLATE// is assumed.
The //createTiddler// method of the Story.class opens a tiddler on the page. If a tiddler by the requested name doesn't exist, it appears ready to edit. This method takes four parameters:

* the overall parent DOM element to display the tiddler inside.
* the DOM element inside the first parameter to display directly after. A null value places it at the end of the entire element.
* the title of the tiddler to display.
* the template to use to display the tiddler. It should be either the constant //~DEFAULT_VIEW_TEMPLATE// or //~DEFAULT_EDIT_TEMPLATE//.

This method returns the newly created DOM element.
The //getTemplateForTiddler// method of the [[Story]] class returns HTML source code ready to be used as a template that is stored inside a tiddler. This method takes three parameters:

* the title of the tiddler that is about to be displayed
* the title of the tiddler containing the template source code. Note that the constants //~DEFAULT_VIEW_TEMPLATE// and //~DEFAULT_EDIT_TEMPLATE// do not work here.
* a reference to the Tiddler about to be displayed

Only the second parameter is actually used by the TiddlyWiki code, but the other information is passed for the benefit of plugin developers who override this method.
The refreshAllTiddlers method of the [[Story]] class re-renders all tiddlers currently visible on the page by individually calling the [[refreshTiddler|Story.prototype.refreshTiddler]] for each of the open tiddlers in the story. It does not take any parameters nor does it return any value. Tiddlers with unsaved changes are forced to be re-rendered.
The refreshTiddler method of the [[Story]] class re-renders a tiddler's source code on the page through the given template. It takes three parameters:

* the title of the tiddler to display
* the template to use for display. You should use either the constant //~DEFAULT_VIEW_TEMPLATE// or //~DEFAULT_EDIT_TEMPLATE// in most cases.
* a boolean representing whether to force re-rendering even if the tiddler and template has not changed, or if there are unsaved changes to the tiddler.

This method returns an DOM element reference to the tiddler on the page.
Note this is a destructive event which will force the complete re-rendering of a tiddler in the story re-executing any macros within a template will be re-executed so much be used wisely.
/***
|''Name''|StoryFilters|
|''Author''|Jon Robson|
|''Version''|0.6.7|
|''Status''|@@experimental@@|
|''Source''|https://raw.github.com/jdlrobson/TiddlyWikiPlugins/master/plugins/Filters/StoryFiltersPlugin.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Notes
Adds the following filters
{{{
[story[open]]
[story[sort]]
}}}
***/
//{{{
(function($) {
Story.prototype.displayTiddler__StoryFilters = Story.prototype.displayTiddler;
Story.prototype.displayTiddler = function() {
	var res =  Story.prototype.displayTiddler__StoryFilters.apply(this, arguments);
	$("[macroName=list]").each(function(i, el) {
		config.macros.list.refresh(el);
	});
	return res;
};
Story.prototype.closeTiddler__StoryFilters = Story.prototype.closeTiddler;
Story.prototype.closeTiddler = function() {
	var res =  Story.prototype.closeTiddler__StoryFilters.apply(this, arguments);
	$("[macroName=list]").each(function(i, el) {
		config.macros.list.refresh(el);
	});
	return res;
};

config.storyFilters = {
	open: function(tiddler) {
		return story.getTiddler(tiddler.title) ? true : false;
	},
	sort: function(a, b) {
		var i = $(story.getTiddler(a.title)).index();
		var j = $(story.getTiddler(b.title)).index();
		return i < j ? -1 : 1;
	}
};
config.filters.story = function(results, match) {
	var arg = match[3];
	var newresults = [];
	var handler = config.storyFilters[arg];
	if(arg == "sort") {
		return results.sort(handler);
	} else {
		var tiddlers = store.getTiddlers();
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			if(handler && handler(tiddler)) {
				newresults.push(tiddler);
			}
		}
	}
	return newresults;
}

}(jQuery));
//}}}
Extensions to the primitive {{{String}}} type in JavaScript...
<<list filter [startsWith[title,String.]][sort[title]]>>
!Summary
This extension to the [[String]] object is used to parse a space-separated string of {{{name:value}}} pairs used to pass parameters to a TiddlyWiki macro. For detailed examples, see [[ParamParser|http://paramparser.tiddlyspace.com/#ParamParserMacro]].
!Signature
{{{String.prototype.parseParams = function(defaultName,defaultValue,allowEval,noNames,cascadeDefaults) {} }}}
!Returns
returns an array of objects
;result[0]
:an object containing all params as {{{key:value}}} pairs
;result[1..n]
:each parameter is represented as a{{{ {name="parsedName", value="parsedValue"} }}}member of the return object
!Arguments
;1. defaultName
:used as the key of a {{{key:value}}} pair when ''lone words'' are used
;2. defaultValue
:used as the value of  {{{key-value}}} pair when ''lone words'' are used
;3. allowEval
:when {{{true}}}, allows you to use [[Evaluated Parameters]]@tiddlywiki, which by default are disabled in TiddlySpace
;4. noNames
:when {{{true}}}, the string is just split on the spaces
;5. cascadeDefaults
:when {{{true}}}, takes the first ''lone word'' or first key as the key for all subsequent ''lone words'' until another {{{key:value}}} pair is parsed
!Example
{{{
str = "foo:bar";
str.parseParams(null, null, false, false, false);
}}}
''returns:''
<<<
{{{result[0] = { foo=["bar"] } }}}
{{{result[1] = { name="foo", value="bar" } }}}
<<<
{{{
str = "test foo:bar";
str.parseParams("xyz", null, false, false, false);
}}}
''returns:''
<<<
{{{result[0] = { xyz="test", foo=["bar"] } }}}
{{{result[1] = { name="xyz", value="test" } }}}
{{{result[2] = { name="foo", value="bar" } }}}
<<<
[[StyleSheetTiddlySpace]]

/*{{{*/
.tidTags .tiddlyLink {
	margin-left: 8px;
}

.info_source {
	margin-left: 56px;
}
.tidTags .tiddlyLink {
	display: inline-block;
}

.tidTags .emptyList {
	display:none;
}

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;
}

.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;
}

.inviteToContribute {
	padding: 0.6em 1em;
	background: #baf8a6;
	border-radius: 3px;
}

#sidebarTabs .tabsetWrapper .tabset .tabSelected {
	border-color: [[ColorPalette::PrimaryLight]];
}

#sidebarTabs .tabsetWrapper .tabContents {
	border-color: [[ColorPalette::PrimaryLight]];
}

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

.tagInfo {
	margin:0;
}

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

#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;
}

.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;
}

.tiddlerCustomFields input {
	width:300px;
}

.tiddlerCustomFields .fieldName {
	width:100px;
}

.right {
	float:right;
}

.scanResults > ul{
	margin-left:0;
	padding:0;
}

.scanResults >ul > li {
	padding:5px;
}

.scanResults >ul > li:hover {
	background:[[ColorPalette::PrimaryPale]];
}

.scanResults blockquote {
	border-left:1px solid [[ColorPalette::PrimaryLight]];
	margin-left: 0.5em;
	padding-left:10px;
}

.functions > div > ul,
.functions > div > ul > li{
    margin:0;
    padding:0;
    list-style-type:none;
}

dd {
    margin-left: 20px;
}

dd:before {
    content: 'ยป ';
}
/*}}}*/
!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 .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 .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,
.tiddler .subtitle {
	cursor: pointer;
}

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

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

.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 .titleBar {
	display: block;
}

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

.tiddler {
	position: relative;
	padding: 0;
	margin-bottom: 3em;
	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;
}

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 .heading {
		margin-bottom: 48px;
	}

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

	.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 {
	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: 28px;
	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 .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,
	#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/]].
}}}
/***
|Name|TSFeedback|
|Version|0.2.0|
|Author|Colm Britton|
|Type|plugin|
|Description|Generate a bookmarklet that will pop up a feedback form from html or wiki serialization|
!Usage
!!In TiddlyWiki....
To generate the bookmarklet, use:
{{{
<<tsfeedback "label">>
}}}
where label is the name you want the link to have.
It can accept ascii codes which make it possible to have labels like ''+ Feedback''

This plugin requires the @feedback space to be set up correctly.
!!In HtmlJavascript
Simply include the lines
{{{
/bags/common/tiddlers/jquery.js
/TSFeedbackPlugin
}}}
!Code
***/
//{{{
(function($) {
function feedback(place, spaceName, username, label) {
	if(!label) {
		label = "&#43; feedback";
	}
	
	var eventListener;
	if(document.attachEvent) {
		eventListener = "a.onreadystatechange=function()%7Bif(a.readyState=='complete' || a.readyState=='loaded')%7Ba.onreadystatechange='';loadBookmarker('http://feedback.tiddlyspace.com/feedback','" + spaceName + "',u);%7D%7D";
	} else {
		eventListener = "a.addEventListener('load',function()%7BloadBookmarker('http://feedback.tiddlyspace.com/feedback','" + spaceName + "',u);%7D,false);";
	}
	
	var bookmarklet = "javascript:(function(a,b,u)%7Ba=b.createElement('script');a.setAttribute('type','text/javascript');a.setAttribute('charset','UTF-8');a.setAttribute('src','http://feedback.tiddlyspace.com/feedback-loader.js');b.body.appendChild(a);u='" + username + "'||'Addtitle';" + eventListener + "%7D(null,document,null));";

	var link = jQuery('<a/>')
		.attr('href', bookmarklet)
		.attr('title', "Please give us some feedback")
		.addClass("tsfeedback-btn")
		.html(label)
		.appendTo(place);
}
if(typeof(version) !== "undefined" && version.title === "TiddlyWiki") {
	config.macros.tsfeedback = {
		handler: function(place, macroName, params, wikifier, paramString, tiddler) {
			var container = $("<div />").appendTo(place)[0];
			config.extensions.tiddlyweb.getStatus(function(status) {
				var bookmarklet,
				label = params[0] || document.title,
				spacename = config.extensions.tiddlyspace.currentSpace.name,
				username = config.extensions.tiddlyweb.username;
				feedback(container, spacename, username, label);
			});
		}
	};
} else {
	$.getJSON("/status", function(data) {
		if(data && data.username !== "GUEST") {
			feedback(document.body, data.space.name, data.username);
			$('head').append('<link rel="stylesheet" href="http://feedback.tiddlyspace.com/button.css" type="text/css" />');
		}
	});
}
})(jQuery);
//}}}
(function($){
	
	var spaceName = null;
	var bookmarklet;
	
	$.getJSON("/status", function(data) {
		if(data && data.username !== "GUEST") {
			console.log(data);
			bookmarklet = "javascript:(function(a,b,u)%7Ba=b.createElement('script');a.setAttribute('src','http://feedback.tiddlyspace.com/feedback-loader.js');b.body.appendChild(a);u='" + data.username + "'||'Add title';a.addEventListener('load',function()%7BloadBookmarker('http://feedback.tiddlyspace.com/feedback','" + spaceName + "',u);%7D,false);%7D(null,document,null))";
			attachFeedbackBtn();
		}
	});
	
	var attachFeedbackBtn = function() {
		$('head').append('<link rel="stylesheet" href="http://feedback.tiddlyspace.com/button.css" type="text/css" />');
		var link = jQuery('<a/>')
			.attr('href', bookmarklet)
			.attr('alt', "Give us some feedback")
			.addClass("tsfeedback-btn")
			.html("&#43; feedback")
			.appendTo('body');
	}
		
})(jQuery);
(function($){
	
	var spaceName = null;
	var bookmarklet;
	
	$.getJSON("/status", function(data) {
		if(data && data.username !== "GUEST") {
			bookmarklet = "javascript:(function(a,b,u)%7Ba=b.createElement('script');a.setAttribute('src','http://feedback.tiddlyspace.com/feedback-loader.js');b.body.appendChild(a);u='" + data.username + "'||'Add title';a.addEventListener('load',function()%7BloadBookmarker('http://feedback.tiddlyspace.com/feedback','" + spaceName + "',u);%7D,false);%7D(null,document,null))";
			attachFeedbackBtn();
		}
	});
	
	var attachFeedbackBtn = function() {
		$('head').append('<link rel="stylesheet" href="http://feedback.tiddlyspace.com/button.css" type="text/css" />');
		var link = jQuery('<a/>')
			.attr('href', bookmarklet)
			.attr('alt', "Give us some feedback")
			.addClass("tsfeedback-btn")
			.html("&#43; feedback")
			.appendTo('body');
	}
		
})(jQuery);
TW5 is (or will be) the next generation TiddlyWiki...
http://five.tiddlywiki.com

''Note:'' It's not actually version 5 but rather a complete rewrite leveraging ''"""HTML5"""'' (and ''"""CSS3"""'').
|''ViewTemplate''|##TWDocViewTemplate|
|''EditTemplate''|##EditTemplate|
|''StyleSheet''|##StyleSheet|

!ViewTemplate
[[TWDocViewTemplate]]

!EditTemplate
[[EditTemplate]]

!StyleSheet
[[StyleSheet]]
[[ViewTemplate]]
<!--{{{-->
<hr/>
<div class='answers' macro='tsScan fat:y template:"CommentTemplate##Template" hide:tiddlywikidev_public sort:modified'></div>
<!--}}}-->
<<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>>
!Function
;<<view title link>>
:<<get ##Summary plain>>
|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
/*{{{*/

/*}}}*/
/***
|''Name:''|ThemedTiddlerPlugin |
|''Description:''|Per-Tiddler Mini-Themes |
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com) |
|''Source:''|http://whatfettle.com/2008/07/ThemedTiddlerPlugin/ |
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/PaulDowney/plugins/ThemedTiddlerPlugin/ |
|''Version:''|0.1|
|''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
The extended field "theme" is used to reference a tiddler containing a "mini-theme"

A mini-theme is a tiddler containing a [[ViewTemplate]], [[EditTemplate]] and [[StyleSheet]] sections which are applied when the tiddler is displayed. 

In addition, a CSS class of the theme name is added to the tiddler which may be useful when writing a mini-theme [[StyleSheet]]. 
!!Code
***/
//{{{
/*jslint onevar: false nomen: false plusplus: false */
/*global Story, store, setStylesheet, jQuery */
if (!version.extensions.ThemedTiddlerPlugin) {
    version.extensions.ThemedTiddlerPlugin = {installed: true};

    Story.prototype.__chooseTemplateForTiddler = Story.prototype.chooseTemplateForTiddler;
    Story.prototype.chooseTemplateForTiddler = function (title, n)
    {
        // translate number into template name
        var template = ["ViewTemplate", "EditTemplate"][n ? n - 1 : 0];

        var tiddler = store.getTiddler(title);

        if (tiddler) {
            var theme = tiddler.fields.theme;
            if (theme) {

                // assert stylesheet
                var style = store.getTiddlerText(theme + '##StyleSheet');
                if (style) {
                    setStylesheet(style, theme);
                }

                // return theme template
                var slice = theme + '##' + template;
                if (store.getTiddlerText(slice)) {
                    return slice;
                }
            }
        }

        // default template
        return this.__chooseTemplateForTiddler.apply(this, arguments);
    };

    // assert theme name as a class on the tiddler
    Story.prototype.__refreshTiddler = Story.prototype.refreshTiddler;
    Story.prototype.refreshTiddler = function (title, template, force, customFields, defaultText)
    {
        var tiddlerElem = this.__refreshTiddler.apply(this, arguments);
        var tiddler = store.getTiddler(title);
        if (tiddler) {
			jQuery(tiddlerElem).addClass(store.getTiddler(title).fields.theme);
        }
        return tiddlerElem;
    };
}
//}}}
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...
https://yakovl.github.io/TiddlyThemes/
!"""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?]]
Each tiddler instance has the following properties...
|!Property|!Description|
|color:red;''Important:'' Do not set the properties of a tiddler instance manually, use the [[tiddler.set()|Tiddler.prototype.set()]] method!|>|
|title|a string with the tiddler's name|
|text|the source code of the tiddler|
|modifier|a string with the modifier of the tiddler's name|
|modified|a Date object corresponding to when the tiddler was last changed|
|links|an array of strings, one per link in the tiddler's source code|
|tags|an array of strings, one per tag assigned to the tiddler|
|created|a Date object corresponding to when the tiddler was created|
|creator|a string with the creator of the tiddler's name (TW core 2.6)|
|linksUpdated|a boolean corresponding to whether the links property is up-to-date|
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()]]...
Transcluded tiddlers are rendered inside a span like this:
{{{
<span refresh="content" tiddler="SomethingOrOther">
...wikified content
</span>
}}}
-- [[Jeremy Ruston, Google Groups|https://mail.google.com/mail/?ui=2&shva=1#inbox/12e97211750da57c]]
For a basic description for tiddlers, see [[Tiddler Properties]]<<slider chkTiddlerProperties "Tiddler Properties" "ยป" "click to reveal tiddler properties">> and [[Tiddler]].

The [[Tiddler]] class represents a single tiddler. Instances of this class are created as the user creates tiddlers; they are not deleted if a user closes the corresponding tiddler in the story.

Changing an instantiated tiddler object does not affect the tiddler as saved by the author; to make changes to the tiddler that will be saved the next time the [[TiddlyWiki|TiddlyWiki.class]] is saved, call ''store.saveTiddler''.

!"""Tiddler Functions"""
<<list filter [startsWith[title,Tiddler.]][sort[title]]>>
!! Methods (docs need update)
* [[autoLinkWikiWords|Tiddler.prototype.autoLinkWikiWords]]: returns whether the tiddler should have WikiWords linked.
* [[changed|Tiddler.prototype.changed]]: a hook to be called after the Tiddler object has been modified.
* [[escapeLineBreaks|Tiddler.prototype.escapeLineBreaks]] and [[unescapeLineBreaks|Tiddler.unescapeLineBreaks]]: converts line breaks from textual and HTML representations.
* [[generateFingerprint|Tiddler.prototype.generateFingerprint]]: return a SHA-1 hash of the tiddler's text.
* [[getSubtitle|Tiddler.prototype.getSubtitle]]: returns a subtitle with author name and modification date.
* [[isTagged|Tiddler.prototype.isTagged]]: returns whether the tiddler has been assigned a specific tag.
* [[isReadOnly|Tiddler.prototype.isReadOnly]]: returns whether the tiddler can be edited.
* [[Tiddler.LoadFromDiv|Tiddler.prototype.loadFromDiv]]: instantiate a Tiddler from HTML.
* [[saveToDiv|Tiddler.prototype.saveToDiv]]: render HTML for storing the tiddler.
!! Modifying Tiddler Contents
Assigning contents directly to the ''tiddler.text'' property of a retrieved tiddler object *can* be tricky ([[link|http://groups.google.com/group/TiddlyWiki/browse_thread/thread/44edde8c58e99892]]).

Normally, the TW core functions, {{{store.saveTiddler()}}} or {{{tiddler.set()}}} (for low-level internal operations) are used to change the value in the tiddler data, and these functions trigger furtherprocessing, such as refreshing the display or even auto-saving the file in response to changes in tiddler content.

In addition, many plugins hijack these functions in order to add system-level extensions that are triggered whenever a tiddler is changed. Directly setting the value of {{{tiddler.text}}} completely bypasses these functions, preventing all add-on ''and'' core side-effects behaviors from being triggered.
!!How TiddlyWiki Stores Tiddlers
TiddlyWiki's saves each tiddler in the hidden store area in the following format:
{{{
<div title="tiddler title" modifier="author/editor" modified="YYYY0MM0DD0hh0mm" created="YYYY0MM0DD0hh0mm" tags="foo [[bar baz]]">
<pre>
Body of the tiddler
</pre>
</div>
}}}
!Summary
This function of the <<tag Tiddler "Tiddler Class">> returns an array of strings corresponding to [[TiddlyLinks|TiddlyLink]]@tiddlywiki present in the tiddler text. Use instead of accessing the links property directly.
!Signature
{{{Tiddler.prototype.getLinks = function() {} }}}
!Returns
array[string]: titles of all [[TiddlyLinks|TiddlyLink]]@tiddlywiki in a tiddler text
!Arguments
none
!Example
{{{
var tiddlerObj = store.getTiddler('Functions');
tiddlerObj.getLinks();
}}}
''returns:'' an array of all [[TiddlyLinks|TiddlyLink]]@tiddlywiki in the tiddler [[Functions]], e.g. {{{["TiddlyWiki Core"]}}}
!Summary
This function of the <<tag Tiddler "Tiddler Class">> returns a string representing all tags of a tiddler, separated by spaces -- tags with spaces are wrapped in {{{[[double square brackets]]}}}.
!Signature
{{{Tiddler.prototype.getTags = function() {} }}}
!Returns
String: the tags of a tiddler
!Arguments
none
!Example
{{{
var tid = store.getTiddler('MyPlugin');
tiddler.getTags();
}}}
''returns:'' {{{"systemConfig [[My Plugins]]"}}} -- assuming it's a plugin also tagged <<tag "My Plugins">>
!Summary
This function of the <<tag Tiddler "Tiddler Class">> determines whether a tiddler has been changed, e.g. edited, since it was last saved.
!Signature
{{{Tiddler.prototype.isTouched = function() {} }}}
!Returns
boolean: {{{true}}} means the tiddler was modified
!Arguments
none
!Example
Assume ''"""some tiddler"""'' has been modified, yet not [[persisted|Persistence]]...
{{{
tid = store.getTiddler('some tiddler');
tid.isTouched();
}}}
''returns:'' {{{true}}}
!Summary
Use this function to modify a tiddlers' properties instead of changing them directly -- it does some recalculations in the background.
!Signature
{{{Tiddler.prototype.set = function(title,text,modifier,modified,tags,created,fields,creator) {} }}}
!Returns
object: the tiddler
!Arguments
all optional
;1. title
:the (new) title of the tiddler
;2. text
:the source code, e.g. wiki text, of the tiddler
;3. modifier
:the name of the author who last modified the tiddler
;4. modified
:a [[date object|Date]] corresponding to the last time the tiddler was changed
;5. tags
:an array of strings, each with a name of a tag applied to the tiddler
;6. created
:a [[date object|Date]] corresponding to when the tiddler was created
;7. fields
:a JavaScript object containing extended fields in the tiddler, primarily used with [[story.forEachField()]]
!Example
Here is what [[story.saveTiddler()]] eventually does to save a tiddler...
{{{
tiddler.set(newTitle,newBody,modifier,modified,tags,created,fields,creator);
}}}
!How It Works
tbd -- describe the logical flow in a diagram
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.
Here we are -- on TiddlySpace -- more precisely, the @TiddlyWikiDev space.
!"""What is TiddlySpace?"""
=> http://tiddlyspace.com
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, the TiddlyVerse is a place where magical things happen and [[tiddlers|Tiddler.class]] come together to form a virtual representation of whatever your dreams desire.
[[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>
While a bit dated, [[Tiddlywiki Internals|http://softwareas.com/tiddlywiki-internals-1-of-3-architectural-concepts]] -- a series of three articles by Michael Mahemoff -- gives a detailed introduction on the internal workings of TiddlyWiki...
* [[Architectural Concepts|http://softwareas.com/tiddlywiki-internals-1-of-3-architectural-concepts]]
* [[List of Javascript Files|http://softwareas.com/tiddlywiki-internals-2-of-3-list-of-javascript-files]]
* [[Key Javascript Classes and Files|http://softwareas.com/tiddlywiki-internals-3-of-3-key-javascript-classes-and-files]]
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>>
This is a copy-pasted list of resources from the old tiddlywiki.org. Some links were updated, but many of them are still to be fixed/removed.

Official

    [[classic.tiddlywiki.com|https://classic.tiddlywiki.com]] is the primary ~TiddlyWiki web site.
    [[Sources on GitHub|https://github.com/TiddlyWiki/TiddlyWikiClassic/]] (submit/view bug reports, see the core development progress there)

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

    [[TiddlyHost|https://tiddlyhost.com]] (free TiddlyWiki hosting)
    [[TiddlyThemes|https://yakovl.github.io/TiddlyThemes/]] a gallery of themes for TiddlyWiki 
    [[TiddlySnip|https://github.com/JulianSchuette/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)

[[Community Support|https://classic.tiddlywiki.com/#DiscussionForums]]

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 
!Introduction to TiddlyWiki
<html>
<iframe width="420" height="345" src="http://www.youtube.com/embed/ezNScBd7_h4" frameborder="0" allowfullscreen></iframe>
</html>
See [[TiddlyFox]]...
The TiddlyWiki class represents an entire TiddlyWiki. It is normally instantiated once when the page is first loaded into the global [[store]] object. It has one notable property, ''dirty'', which is a boolean representing whether the TiddlyWiki contains unsaved changes.
!Store Functions
{{functions{<<list filter [startsWith[title,store.]][sort[title]] template:Templates##Function>>}}}<<listfiltr>>
!More Functions
* [[getMissingLinks|TiddlyWiki.prototype.getMissingLinks]]: retrieves a list of missing links
* [[getRecursiveTiddlerText|TiddlyWiki.prototype.getRecursiveTiddlerText]]: retrieves tiddler source code, replacing links with source code
* [[getReferringTiddlers|TiddlyWiki.prototype.getReferringTiddlers]]: finds tiddlers that refer to a particular tiddler
* [[getShadowed|TiddlyWiki.prototype.getShadowed]]: returns an array of all shadow tiddlers available
* [[getTags|TiddlyWiki.prototype.getTags]]: retrieves a list of all tags used in the TiddlyWiki
* [[getTiddlers|TiddlyWiki.prototype.getTiddlers]]: returns all tiddlers sorted by a criteria
* [[isDirty|TiddlyWiki.prototype.isDirty]]: returns whether there are unsaved changes to the TiddlyWiki
* [[isShadowTiddler|TiddlyWiki.prototype.isShadowTiddler]]: returns whether a tiddler is shadowed
* [[loadFromDiv|TiddlyWiki.prototype.loadFromDiv]]: initializes a TiddlyWiki from saved HTML
* [[.notify|TiddlyWiki.prototype.notify]]: invoke notification handlers for a tiddler
* [[notifyAll|TiddlyWiki.prototype.notifyAll]]: invoke all notification handlers
* [[resumeNotifications|TiddlyWiki.prototype.resumeNotifications]]: resumes update notifications
* [[saveTiddler|TiddlyWiki.prototype.saveTiddler]]: saves changes to a tiddler
* [[search|TiddlyWiki.prototype.search]]: search for tiddlers whose source code contains a string
* [[setDirty|TiddlyWiki.prototype.setDirty]]: sets the TiddlyWiki's dirty flag
* [[setTiddlerTag()|TiddlyWiki.prototype.setTiddlerTag()]]: set or remove a tag for a tiddler
* [[suspendNotifications()|TiddlyWiki.prototype.suspendNotifications]]: halt update notifications
* [[tiddlerExists|TiddlyWiki.prototype.tiddlerExists]]: returns whether a tiddler exists
<<list filter [startsWith[title,TiddlyWiki.]][sort[title]]>>

<<list filter "[tag[Function AND TiddlyWiki.class]][sort[title]]">>
[[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 getRecursiveTiddlerText method of a [[store object|TiddlyWiki.class]] returns the source code of a tiddler with links replaced with their contents. That is, if two tiddlers are defined like so:

 '''tiddler1'''
{{{
 Hello, [[tiddler2]].
}}}

 '''tiddler2'''
{{{
 world
}}}

executing 
{{{
getRecursiveTiddlerText('tiddler1', '', 1)
}}}
returns ''Hello world.'' This method expects three parameters in order:
* the title of the tiddler to retrieve
* default text to return if the tiddler does not exist
* the maximum depth of links to follow
The ''getShadowTiddlerText'' method of the [[Tiddlywiki Class]] allows you to retrieve the contents of a shadow tiddler. The returned ''string'' is not wikified so will be in it's raw wikitext format.
It takes one parameter, the tiddler of one of the shadow tiddlers. Such as:
{{{
store.getShadowTiddlerText("SiteSubtitle");
}}}
which returns:
{{{
"a reusable non-linear personal web notebook"
}}}
If you provide a name which doesn't exist or doesn't belong to a shadow tiddler this method will return an empty string. E.g.
{{{
""
}}}
See [[store.getTaggedTiddlers()]]...
The ''getTags'' method that belongs to the ''store'' object is used to return a list of all the tags used in your tiddlywiki and the number of times each is used.
It takes one optional parameter, an array of all the tags you wish to exclude from the returned results.

You can use it without excluding some tags like so:
{{{
store.getTags();
}}}
This will return something like this:
{{{
[["command", 1], ["concept", 3], ["Developer Tools", 5], ["excludeLists", 74], ["excludeMissing", 7], ["excludePublisher", 1], ["excludeSearch", 72], ["global", 3], ["method", 17], ["store", 4], ["story", 4], ["systemConfig", 39], ["tiddler", 3], ["tiddlywiki api", 1]]
}}}

To filter out certain tags use it like this:
{{{
store.getTags(["excludeLists", "excludeSearch", "excludePublisher", "excludeMissing", "systemConfig"]);
}}}
This will return something like this:
{{{
[["command", 1], ["concept", 3], ["Developer Tools", 5], ["global", 3], ["method", 17], ["store", 4], ["story", 4], ["tiddler", 3], ["tiddlywiki api", 1]]
}}}
The ''getTiddler'' method of the [[story]] class returns the DOM element of a tiddler displayed in the story. It takes one parameter, the name of a tiddler.
If the given name isn't currently displayed then it will return ''null''

It can be used like so
{{{
story.getTiddler("GettingStarted");
}}}
See [[store.getTiddlerText()]]...
The ''getTiddlers'' method of a [[store object|TiddlyWiki.class]] object returns an array of every tiddler in the TiddlyWiki, sorted by a field. Its only parameter, the name of the field to sort on, is optional. This can be any property of the [[Tiddler]] class. If the TiddlyWiki is empty, an empty array is returned.
{{{
var tiddlers = store.getTiddlers();
}}}
It takes 2 parameters, the first being a tiddler object, the second being the name of the attribute or field to be accessed (a string).

Soon this should also support access to slices, which is achieved by preceding the second parameter string with ## or :: as appropriate.
For example
{{{
store.getValue(tiddler, "##foo")
}}}
should return the value of the section foo.
Takes 3 arguments: field (can also be a tiddler attribute),value,sortField (optional)

Returns all tiddlers that match the given field and value. If sortField is given the resulting tiddlers are sorted.

See the similiar [[TiddlyWiki.prototype.getTaggedTiddlers()]]
The ''isDirty'' method of a [[TiddlyWiki class|TiddlyWiki]] object returns whether there are unsaved changes to it. This method expects no parameters.

Use:
{{{
store.isDirty();
}}}

See also: [[Story.setDirty]]
The notifyAll method of a [[TiddlyWiki class|TiddlyWiki]] object runs all notification function currently registered to it via [[addNotification|TiddlyWiki.prototype.addNotification]]. If a notification function was tied to a particular tiddler, it is invoked with that tiddler, as usual, and blanket notifications (registered to the null value) are run as well. This method takes no parameters.

This method is called by the TiddlyWiki code starts up as the page loads, but this is an easy way to force a reload of page title, subtitle, stylesheet, and so on.
The resumeNotifications method of a [[TiddlyWiki class|TiddlyWiki]] object resumes issuing notifications after [[suspendNotifications|TiddlyWiki.prototype.suspendNotifications]] is called. If  [[suspendNotifications|TiddlyWiki.prototype.suspendNotifications]] was called multiple times, this method must be called an equal number of times in order for notifications to occur. This method does not expect any parameters.
See [[store.reverseLookup()]]...
The ''search'' method of a [[store.object|TiddlyWiki.class]] returns an array of [[Tiddler]] objects whose source code contains a string. This method takes three parameters:

* a regular expression to search for
* the field to sort results by. This can be any property of a [[Tiddler]] object.
* a tag to exclude from search results.

If no tiddlers match the search, an empty array is returned.
The ''setDirty'' method of the [[Story]] class sets the dirty flag of a single tiddler, which indicates whether it contains unsaved changes. It takes two parameters:

* the title of the tiddler
* the boolean value to set the dirty flag to

This method does not return any value.

For example to set this tiddler to dirty you would do the following:
{{{
story.setDirty('Story.setDirty', true);
}}}
!Summary
Use the [[store|TiddlyWiki.class]] function [[setTiddlerTag()|TiddlyWiki.prototype.setTiddlerTag()]] to set or remove a tag for a tiddler.
!Signature
{{{TiddlyWiki.prototype.setTiddlerTag = function(title,status,tag) {} }}}
!Returns
undefined
!Arguments
;1. (string) title
:&raquo; the tiddler title
;2. (boolean) status
:&raquo; true = set tag | false = remove tag
;3. (string) tag
:&raquo; the tag to be set
!Example
{{{
store.setTiddlerTag('SomeToDo',true,'#done');
}}}
''result:'' the tag {{{#done}}} is set for tiddler {{{SomeToDo}}}
Another example:
{{{
var toggleTagBasedOnFoo = function(tiddler, tag){
  store.setTiddlerTag(tiddler, config.options.chkFoo, tag);
}
}}}
''result:'' sets a {{{tag}}} on a {{{tiddler }}} depending on the state of the checkbox option {{{chkFoo}}}.
!Best Practice
Each time {{{setTiddlerTag()}}} is called, it triggers a //notify// event for the changed tiddler, which causes re-rendering of  any content depending on the changed tiddler. 

Therefore, when programatically setting or removing a number of tags, temporarily block notification of changes in order to defer re-rendering until all tag changes are completed using:
{{{
store.suspendNotifications(); 
store.setTiddlerTag(...); 
store.setTiddlerTag(...); 
store.resumeNotifications(); 
store.notify("SomeTitle",true); 
}}}
<<<
''Note:'' After calling {{{resumeNotifications()}}} invoke {{{store.notify("SomeTitle",true)}}} in order to re-render the current page display for affected tiddlers due to the changed tag values.
<<<
The [[suspendNotifications|TiddlyWiki.prototype.suspendNotifications]] method of a [[TiddlyWiki class|TiddlyWiki]] object suspends notifications from being issued by the [[notify|TiddlyWiki.prototype.notify]] and [[notifyAll|TiddlyWiki.prototype.notifyAll]] methods. The [[resumeNotifications|TiddlyWiki.prototype.resumeNotifications]] method must be called in order to resume notifications.

This method takes no parameters. It may be called multiple times; [[resumeNotifications|TiddlyWiki.prototype.resumeNotifications]] must be called an equal number of times in order for notifications to be issued.
The ''tiddlerExists'' method of a [[TiddlyWiki class|TiddlyWiki]] object returns whether a tiddler exists in the TiddlyWiki. If a shadow tiddler exists for the title, it will return true. This method expects one parameter: the title of the tiddler.
It is used like so:
{{{
// store is the TiddlyWiki class
store.tiddlerExists('TiddlerExists');
}}}
Which returns {{{"true"}}}
[[five.tiddlywiki.com|http://five.tiddlywiki.com]] -- the next generation TiddlyWiki, currently under heavy development, leveraging [[HTML5]]
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>>
!!TiddlyWiki Assembly

* [[Cook]]
* [[Ginsu|Dev:Ginsu]]
* [[Recipes|Recipe]]
* [[Chef|Dev:Chef]]
* [[r4tw]]

!!Debugging and Testing

* [[Firebug|http://www.getfirebug.com]] (Firefox extension)
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 https://github.com/TiddlyWiki/translations for a current list of translations, and information on how to do new translations.

See https://github.com/TiddlyWiki/translations/tree/master/locales/core to view the source code of existing translations.
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.
See [[Primitive Types]]...
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]]>>
In JavaScript, a function without a return statement by default returns undefined.

Here's an overview of things in JavaScript that mean some form of //nothing//...
;undefined (global variable)
:&raquo; the requested object is undefined -- it neither has a value nor a type
:&raquo; if you set an object or its property to undefined you effectively delete it
:&raquo; if you declare {{{var a;}}} then {{{a}}} is undefined -- same as {{{var a = undefined;}}}
;null (literal)
:&raquo; means that an object is defined but does not (yet) have a value
:&raquo; in other words, if you declare {{{var a;}}} then {{{typeof a;}}} returns object
:&raquo; neither an empty string ({{{''}}} / {{{""}}}) nor the number {{{0}}} are null
;void (operator)
:&raquo; this operator evaluates an expression and then returns undefined
:&raquo; when {{{var a = 1;}}} and {{{var b = void a++;}}} then {{{b}}} is undefined but {{{a}}} now is 2
:&raquo; while {{{typeof undefined;}}} returns undefined -- {{{typeof void;}}} returns object
:&raquo; a browser following a {{{javascript:}}} URI evaluates it and then replaces the contents of the page with the return value -- unless that value is undefined{{sub{
<<<
{{{<a href="javascript:void(0);">Click does nothing!</a>}}}
<html><a href="javascript:void(0);">Click does nothing!</a></html>
{{{<a href="javascript:void(document.body.style.color='red');">Click!</a>}}}
<html><a href="javascript:void(document.body.style.color='red');">Click!</a> &mdash; <a href="javascript:void(document.body.style.color=store.getTiddlerText('ColorPalette::Foreground'));">(revert)</a></html>
<<<
}}}
[[Unit tests|http://en.wikipedia.org/wiki/Unit_testing]] increase confidence in the quality and reliability of source code.

From release 2.5, The TiddlyWiki core uses the [[QUnit|http://docs.jquery.com/QUnit]] framework (gradually transitioning from [[JSSpec|http://jania.pe.kr/aw/moin.cgi/JSSpec]]).

The [[test suite|https://github.com/TiddlyWiki/TiddlyWikiClassic/blob/master/test/recipes/tests.html.recipe]] [[Dev:Recipe|recipe]] provides a simple way to get started.

Individual tests are located in the [[test/js directory|https://github.com/TiddlyWiki/TiddlyWikiClassic/tree/master/test/js]].
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.
/***
|''Name''|UntaggedPlugin|
|''Author''|[[Tobias Beer|http://tobibeer.tiddlyspace.com]]|
|''Description''|provides an """<<untagged>>""" macro<br>adds an untagged button to the tags tab<br>allows to hide (empty) tags / tagging|
|''Source''|https://raw.github.com/tobibeer/TiddlyWikiPlugins/master/plugins/UntaggedPlugin.min.js|
|''Documentation''|http://untagged.tiddlyspace.com|
|''Version''|1.0.8 (2013-10-08)|
|''~CoreVersion''|2.5.2|
|''License''|Creative Commons 3.0|
<<option chkShowUntagged>> chkShowUntagged
<<option chkShowUntaggedShadows>> chkShowUntaggedShadows
<<option chkHideEmptyTags>> chkHideEmptyTags
<<option chkHideEmptyTagging>> chkHideEmptyTagging
***/
// /%
(function(e){var t=config.options;["chkShowUntagged","chkShowUntaggedShadows-","chkHideEmptyTags","chkHideEmptyTagging"].map(function(e){e=e.split("-");if(undefined==t[e[0]])t[e[0]]=!e[1]});merge(config.views.wikified.tag,{untaggedButton:"untagged (%0)",untaggedTooltip:"Show untagged tiddlers...",untaggedListTitle:"Untagged tiddlers:",untaggedNone:"There are no untagged tiddlers...",openUntagged:"Open '%0'"});var n=config.views.wikified.tag;var r=config.macros.untagged={selectorTags:".tagged, .tidTags, .infoTags",selectorTagging:".tagging, .infoTagging",noTagsWhenTagged:"no-tags",noTaggingWhenTagged:"no-tagging",untaggedTiddler:"untagged",hideTags:"excludeLists excludeMissing excludePublisher excludeSearch no-tags no-tagging noLinkify",hideTagsReadOnly:"systemConfig",handler:function(e,t,n,i,s,o){r.refresh(e,s)},refresh:function(i,s){var o,u=[],a,f=s.parseParams("anon",null,true),l=f[0]["anon"]||[],c=l.contains("list"),h=e(i).attr("macroName")=="untagged",p=e(i),d=h?p.parent()[0]:i;if(h)p.hide();store.getTiddlers("title").map(function(e){if(!t.chkShowUntaggedShadows&&config.shadowTiddlers[e.title])return true;if(!e.tags||!e.tags.length)u.push(e)});o=e(c?createTiddlyElement(d,"ul"):createTiddlyButton(d,n.untaggedButton.format([u.length]),n.untaggedTooltip,r.showList,"tiddlyLink untagged")).data("tids",u).attr({tiddlyLink:r.untaggedTiddler?r.untaggedTiddler:"",refresh:"macro",macroName:"untagged",params:s});if(c)r.showList(null,o[0]);else if(l.contains("alltags")){o.appendTo(e("<li/>").appendTo(o.prev()))}if(h){o.insertAfter(p);p.remove()}},showList:function(i,s){var o,u=i||window.event,a=e(s?s:this).data("tids"),f=s?s:Popup.create(this),l=e(f);l.addClass("taggedTiddlerList untaggedTiddlerList");if(a.length>0){if(s){createTiddlyElement(f,"li",null,"listTitle",n.untaggedListTitle)}else if(!t.chkSinglePageMode){createTiddlyButton(createTiddlyElement(f,"li"),n.openAllText.format([n.untaggedButton]),n.untaggedTooltip,r.openAll);createTiddlyElement(createTiddlyElement(f,"li",null,"listBreak"),"div")}a.map(function(e){createTiddlyLink(createTiddlyElement(f,"li"),e.title,true)});if(r.untaggedTiddler&&!s){createTiddlyElement(createTiddlyElement(f,"li",null,"listBreak"),"div");o=createTiddlyLink(createTiddlyElement(f,"li"),r.untaggedTiddler,false);createTiddlyText(o,n.openUntagged.format([r.untaggedTiddler]))}}else{createTiddlyElement(f,"li",null,"disabled",n.untaggedNone)}l.data("tids",a);if(!s){Popup.show();u.cancelBubble=true;if(u.stopPropagation)u.stopPropagation();return false}},openAll:function(){story.displayTiddlers(this,e(this).closest(".taggedTiddlerList").data("tids"));return false},hide:function(n,i){var s=r.hideTags;hideR=r.hideTagsReadOnly;if(s||hideR){s=s.readBracketedList();hideR=hideR.readBracketedList();e(".button, .tiddlyLink",n).each(function(){var t=e(this),n=t.attr("tag");if(s.contains(n)||readOnly&&hideR.contains(n)){t.hide();t=t.parent();if(t.is("li")&&t.children().length<2)t.hide()}});if(t["chkHideEmpty"+i]&&!e(".button, .tiddlyLink",n).filter(":visible").length){n.remove()}}}};config.shadowTiddlers.StyleSheetUntagged="/*{{{*/\n"+".untagged {color:[[ColorPalette::TertiaryDark]];}\n"+"/*}}}*/";store.addNotification("StyleSheetUntagged",refreshStyles);config.macros.allTags.handlerUNTAGGED=config.macros.allTags.handler;config.macros.allTags.handler=function(n,i,s){config.macros.allTags.handlerUNTAGGED.apply(this,arguments);r.hide(e(n).last());if(t.chkShowUntagged){wikify("<<untagged alltags>>",n)}};config.macros.tags.handlerUNTAGGED=config.macros.tags.handler;config.macros.tags.handler=function(t,n,i,s,o,u){config.macros.tags.handlerUNTAGGED.apply(this,arguments);r.hide(e(t).last(),"Tags")};Story.prototype.displayTiddlerUNTAGGED=Story.prototype.displayTiddler;Story.prototype.displayTiddler=function(n,i,s,o,u,a,f,l){var c=Story.prototype.displayTiddlerUNTAGGED.apply(this,arguments),h=i instanceof Tiddler?i.title:i,p=store.getTiddler(h);if(p&&p.tags&&p.tags.containsAny(r.noTagsWhenTagged.readBracketedList())||t.chkHideEmptyTags&&e(r.selectorTags,c).find("a:visible").length==0){e(r.selectorTags,c).hide()}if(p&&p.tags&&p.tags.containsAny(r.noTaggingWhenTagged.readBracketedList())||t.chkHideEmptyTagging&&e(r.selectorTagging,c).find("a:visible").length==0){e(r.selectorTagging,c).hide()}return c}})(jQuery)
// %/
<<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 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?]]
/***
@@color:red;For now, this is a custom plugin for the @TiddlyWikiDev space.@@

Renders the actual source of a core or other function into a slider...
!Usage
;{{{<<code>>}}}
:&raquo; when the tiddler title already is the path, e.g. [[Tiddler.prototype.set()]]
:&raquo; if that has been hijacked, use the field {{{function}}} to define an alternative path
;{{{<<code some.js.path>>}}}
:&raquo; for any desired path
!Example
{{{
<<code config.macros.code.handler>>
}}}
<<code config.macros.code.handler>>

Assuming you set the custom field {{{function}}} to the above, this also works...
{{{
<<code>>
}}}
<<code>>
***/
///%
config.macros.code = {
  dict : {
    undefined: 'undefined',
    txtName: 'of function %0',
    btnTitle: 'View source code%0...',
    btnTooltip: 'Click to see the source code%0...'
  },
  handler : function(place,macroName,params) {
    var f, field, ip, noBrackets, slider, tid, displayName,
      d = this.dict,
      path = params[0],
      showname = params.contains('showname');

    if(!path){
      tid = story.findContainingTiddler(place);
      path = tid ? tid.getAttribute('tiddler') : '';
    }

    field = store.getValue( path, 'function');
    if(field) path = field;

    if(path) {
      ip = path.indexOf('.prototype.');
      noBrackets = '()' != path.substr(path.length-2);
      path = noBrackets ? path : path.substr(0,path.length-2);
      console.log(path);
      f = eval(path);
      if(!f && ip > 0 )f = eval(path.substr(0,ip));
      f = f ? f.toString() : d.undefined;
      config.shadowTiddlers['CODE_' + path] = '{{{\n' + f +'\n}}}';
      displayName = showname ? d.txtName.format([path]) : '';
      slider = '<<slider chkCode.' +
        path + ' "' +
        'CODE_' + path + '" "' +
        d.btnTitle.format([displayName]) + '" "' +
        d.btnTooltip.format([displayName]) +
        path + '...">>'
      wikify(slider, place);
    }
  }
};
//%/
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'></div>
		<span class="subtitle" macro='viewRevisions page:5'>
			last modified on
			<span macro="view modified date"></span>
		</span>
	</span>
	<div class='tagClear'></div>
</div>
<div class='content'>
	<div class='viewer' macro='view text wikified'>
		<div macro='transclude DEV.'></div>
		<div macro='showWhenTaggedAny function Function'>
			<div macro='code'></div>
		</div>
	</div>
	<div macro='more'></div>
	<div class='info_source' macro='originalSource'></div>
</div>
<div class='tagInfo'>
	<div class='tidTags' macro='tags'></div>

<!-- LETS SEE IF SOMEONE IS MISSING THIS>>
	<div>Linked to from: <span class='tidTags' macro='references'</span></div>
-->
	<div class='tagging' macro='tagging'></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>
<!--}}}-->
{{inviteToContribute{
Are you developing ~TiddlyWiki Plugins? Please [[help|Contribute]] improve this documentation.}}}
This page provides developer documentation ~about:
: [[how TiddlyWiki works internally|Dev.Core]]
: [[custom plugin development|Dev.Plugins]]
The source ~code itself can be found [[on GitHub|https://github.com/TiddlyWiki/TiddlyWiki]]. /% For an annotated reference to the source ~code, have a look at the [[Extracted Source Code]]... %/
A tiddler is often opened using the [[displayTiddler()]] method of the ''Story'' object.
When opened, the TW core creates and inserts a DOM element.  This element is given an ''id'' comprising of the prefix ''tiddler'' and the ''tiddler title'', such as {{{tiddlerSiteTitle}}}.
The tiddler is opened in a HTML element. The ''Story'' object, by default, uses an element that has it's id set to ''tidderDisplay''.
All tiddlers you currently have open will be contained in the ''#tiddlyDisplay'' element.

The core renders the ViewTemplate (HTML syntax) into that DOM element, and then processes any special extended TW syntax defined within that template.  An example of this extended TW syntax would be
{{{
<div class='title' macro='view title text'></div>
}}}
which enables TW to retrieve and display the title of the tiddler. [[Read more about how TW handles this extended syntax|Extended HTML Syntax Handling]]

After handling the extended HTML syntax and rendering the output within the #tiddlerTiddlerTitle element the process of opening a tiddler is complete.
''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.
See [[Wikifier.class]]...
!Functions
<<list filter [startsWith[title,Wikifier.]][sort[title]]>>
!Global methods
;[[getParser()]]
:selects the correct formatter for a tiddler

;[[wikify()]]
:creates a ''wikifier'' object and then calls [[wikifier.subWikifyUnterm()]]

;[[wikifyStatic()]]
:returns the html directly

;[[wikifyPlain()]]
:calls [[wikifyPlainText()]] on a single tiddler

;[[wikifyPlainText()]]
:calls [[wikifyPlain()]] on the text

;[[highlightify()]]
:calls [[wikifier.outputText()]]
!Static methods
The ''Wikifier'' object constructor takes a formatter. [[getParser()]] figures out which one. [[config.parsers()]] is examined but is empty by default, which means that in the default setup, calls to [[getParser()]] return the global formatter object.
;[[wikifier.wikifyPlain()]]
:calls [[subWikify()]] on itself

;[[wikifier.subWikify()]]
:calls either [[wikifier.subWikifyTerm()]] or [[wikifier.subWikifyUnterm()]] depending on whether it has a terminator provided or not (see below).

Example uses are in the gradient macro's handler, where it is called with a terminator, and [[wikifier.wikifyPlain()]] where it is called without.

;[[wikifier.subWikifyUnterm()]]
:gets called by [[wikify()]] and [[wikifyStatic()]], [[wikifyPlain()]] and [[wikifyPlainText()]] calls [[wikifier.subWikify()]] with one argument, so that ends up calling [[wikifier.subWikifyUnterm()]] as well

The function finds the strings that match with the formatter, outputs whatever is before the first as ordinary text, then goes into a loop through the matches until they run out. The mechanism for figuring out which part of the formatter and therefore which handler to call depends on the result of an exec() call being an array where the elements correspond to the paranthesized parts of the regex - if there is a match, that element contains something in it, if not, it is undefined.

After the matches are finished, it outputs the rest of the text. The handlers tend to wikify their contents, so the wikification process is recursive. The upshot of this is that care has to be taken to keep the regex's lastIndex property and the output pointer in check.

;[[wikifier.subWikifyTerm()]]
:is similar to [[wikifier.subWikifyUnTerm()]]. It takes a terminator regex to match the end of the string in question and wikifies (again a use of recursion) whatever is in between a formatter match and a terminator match.

;[[wikifier.outputText()]]
:outputs text without wikifying it. Copes with highlighting text (via highlightify).
This function is the main entry point for wikification.

It chooses between [[wikifier.subWikifyTerm()]] and [[wikifier.subWikifyUnterm()]] depending upon whether a terminator was passed into the function or not.
!Arguments
;output
:the object to output into
;terminator
:a regexp that defines the end of the block, e.g. ''}}}'' being the end of a code block.

It does not return anything, but rather, renders HTML directly into the output object.
!Summary
Returns the plain text version of wikitext, i.e. strips the markup and returns just the text.
!Signature
{{{Wikifier.prototype.wikifyPlain = function(){} }}}
!Returns
string: the text representation of wikitext
!Arguments
none
!Example
{{{
var markup = 'I like //italics//.'
wikifyPlain(markup);
}}}
''return:'' 'I like italics.'
!How It Works
This function wikifies the markup into a hidden <div> using the [[Wikifier.prototype.subWikify()]], and calling [[getPlainText()]] on the hidden <div>. It then removes the hidden div and returns the text.
{{annotation{
''Note:'' this does not return html.
}}}
<<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"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/jquery-json.js"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/appspage.js"></script>
</body>
</html>
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="100%" width="100%" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40"><metadata><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:title/></cc:Work></rdf:RDF></metadata><defs><linearGradient id="lG3826" x1="7.0996" gradientUnits="userSpaceOnUse" y1="18.829" gradientTransform="matrix(1.5858347,0,0,1.8078238,1098.1851,351.13716)" x2="1.5461" y2="-0.95166"><stop stop-color="#000" offset="0"/><stop stop-color="#9c9b99" offset="1"/></linearGradient><linearGradient id="lG3828" y2="372.44" gradientUnits="userSpaceOnUse" y1="375.7" x2="1111.7" x1="1097.7"><stop style="stop-color:#ac9393;" offset="0"/><stop style="stop-color:#c8b7b7;" offset="1"/></linearGradient></defs><g transform="translate(-1080.9375,-357.3329)"><path style="stroke-width:0;stroke-miterlimit:4;fill:url(#lG3826);" d="m1080.9,357.32,39.996-0.0426-0.01,40.008c-15.507-25.519-15.36-25.95-39.988-39.965z"/><path style="stroke-dashoffset:0;stroke:#7aa3be;stroke-linecap:round;stroke-miterlimit:4;stroke-width:1.49999988;fill:#c1e6fd;" d="m1091.9,363.55c6.5716-6.4925,16.576-7.3925,23.147-0.90003,6.5717,6.4925,6.5717,17.019,0,23.511-4.4424-8.6113-12.288-15.713-23.147-22.611z"/><path style="stroke-dashoffset:0;stroke:#ce81b0;stroke-linecap:round;stroke-miterlimit:4;stroke-width:1.5;fill:#f4c4e2;" d="m1110.2,367.62c3.217,3.2168,3.217,8.4323,0,11.649-3.8194-4.2357-8.3307-8.1824-11.649-11.649,3.217-3.2168,8.4325-3.2168,11.649-0.00002z"/><path style="stroke-linejoin:bevel;stroke:#000000;stroke-linecap:round;stroke-dasharray:none;stroke-miterlimit:4;stroke-width:0.80000001;fill:url(#lG3828);" d="m1081,357.34c18.79,6.4752,32.53,16.56,39.894,39.892-11.19-17.028-14.878-19.19-27.352-14.96,6.2984-12.098,3.9371-13.19-12.542-24.932z"/></g></svg>
<html>
<head>
<title>Bulk Deletion Application</title>
<link rel="stylesheet" href="/bags/common/tiddlers/profile.css" type="text/css">
<script src="/bags/common/tiddlers/jquery.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="container">
	<div id="header">
		<h1>Bulk Deletion Application</h1>
	</div>
	<div class="main section">
	Please take care when using this space as it can delete everything in your private and public bags. To use simply select the tiddlers you want to delete and click the delete all button.

	<form id="filter" style="display:none;">
		<p>Note you can filter this list using <a href="http://tweb-filters.tiddlyspace.com/GettingStarted">tiddlyweb filters</a>.</p>
		<h2>Filter this list:</h2>
		<input name="value" type='text' placeholder='select=tag:systemConfig'>
		<button>Apply Filter</button>
	</form>
	<h2>Select tiddlers to delete</h2>
	<table id='bulk'>
	</table>
	</div>
</div>
<script type='text/javascript'>
var space = window.location.host.split(".")[0];
var tableObj = {};
var url = "/recipes/" + space + "_private/tiddlers";
var hash = window.location.hash;
if(hash.indexOf("?") === 1) {
	url += hash.substr(1, hash.length);
}
$("#filter").submit(onSubmit).show();
var onSubmit = function(ev) {
	var filterVal = $("#filter [name=value]").val();
	if(filterVal.indexOf("?") === 0) {
		filterVal = filterVal.substr(1, filterVal.length);
	}
	window.location.hash = "#?" + filterVal;
	window.location.reload();
	ev.preventDefault();
};
if(window.location.hash.indexOf("#?") > -1) {
	$("#filter [name=value]").val(window.location.hash.substr(2));
}
$("#filter button").click(onSubmit);
$.ajax({ url: url,
	dataType: "json", success: function(tiddlers) {
		var table = $("#bulk")[0];
		$("<tr><th>Title</th><th>Status</th><th>Select <input type='checkbox' class='batchSelect' /></th></tr>").appendTo(table);
		$(".batchSelect").click(function(ev) {
			var ch = $(ev.target).attr("checked") ? true : false;
			$("input.tidCheckBox:visible").attr("checked", false).each(function(i, el) {
				$(el).attr("checked", ch);
			});
		});
		$("<button />").text("delete all selected tiddlers").insertBefore(table).click(function(ev) {
			if(!confirm("DELETE all the tiddlers that have been selected before? Be warning that this is irreversable!")) {
				return;
			}
			var tiddlers = [];
			$("input.tidCheckBox:checked:visible").each(function(i, el) {
				var tid = $(el).data("tiddler");
				if(tid) {
					tiddlers.push(tid);
				}
			});
			function deletetid(tid) {
				$.ajax({ url: "/bags/" + tid.bag + "/tiddlers/" + encodeURIComponent(tid.title),
					type: "DELETE",
					success: function(r) {
						var el = tableObj[tid.title];
						$(el).animate({ opacity: 0}, {
							complete: function(el) {
								$(this).remove();
								}
							});
					}
				});
			}
			for(var i = 0; i < tiddlers.length; i++) {
				var tid = tiddlers[i];
				deletetid(tid);
			}
		});
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			if(tiddler.bag.indexOf(space) === 0) {
				var row = $("<tr />").appendTo(table)[0];
				$("<td />").text(tiddler.title).appendTo(row);
				var status = tiddler.bag.split("_")[1];
				$("<td />").text(status).appendTo(row);
				var deletecol = $("<td />").appendTo(row)[0];
				tableObj[tiddler.title] = row;
				$("<input />").addClass("tidCheckBox").attr("type", "checkbox").data("tiddler", tiddler).appendTo(deletecol);
			}
		}
	}
});
</script>
</body>
</html>
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="72 648 70 70" 
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 77.59005 669.34003 C 71.532745 681.90424 73.714462 697.4441 84.135193 707.86475 
		C 97.315445 721.0451 118.684715 721.0451 131.8649 707.86475 
		C 145.04515 694.68457 145.04515 673.31537 131.8649 660.13513 
		C 121.4441 649.7141 105.90419 647.53253 93.339905 653.5899 L 102.047455 662.2976 
		C 109.58637 660.2373 117.987976 662.16803 123.90997 668.08997 
		C 132.69673 676.8767 132.69673 691.12317 123.90997 699.90985 
		C 115.12313 708.6966 100.87699 708.6966 92.09012 699.90985 
		C 86.168266 693.98804 84.23744 685.58643 86.297653 678.04755 Z M 72 648 L 72 668.25 L 78.75 661.49957 
		L 99.00019 681.7502 L 105.750175 675.00006 L 85.50013 654.75012 L 92.249985 648 Z" fill="black"
		class="glyph"/>
	</g>
</g>
</svg>
!Download (1.7.6)
http://oldwiki.tiddlywiki.org/ccTiddly/ccTiddly_v1.7.6.zip

!Download (1.9 - requires PHP5)
http://oldwiki.tiddlywiki.org/ccTiddly/ccTiddly_1.9.minimal.zip

!Demo
http://wiki.osmosoft.com/alpha http://wiki.osmosoft.com/alpha

!Release Notes
[[CcTiddlyReleases|ccTiddly Alpha Release Notes]]

!Community
If you would like to report a bug, request a feature or just ask for some help please post a message on the ccTiddly google group : [[ccTiddly Google Groups|http://groups.google.com/group/ccTiddly ccTiddly]]


''ccTiddly is a collaborative server side version of TiddlyWiki. (tiddlywiki.com)  Its features include :'''
* Multiple workspaces (TiddlyWiki files)
* User Management 
* OpenID, LDAP and Delegated Session management support. 
* Revision management
* Tag based permissions model
* File Uploading 
* Shows workspace viewing statistics
* Offline working (sync)


!!Additional Info
* CcTiddlyDeveloper
* CcTiddlyInstallation
* CcTiddlyConfig
* CcTiddlyPermissions

''NB:'' ccTiddly currently has no official maintainer.
/***
https://raw.github.com/tiddlyweb/chrjs/master/main.js
***/
//{{{
// TiddlyWeb adaptor
// v0.14.3

/*jslint vars: true, unparam: true, nomen: true, white: true */
/*global jQuery */

var tiddlyweb = (function($) {

"use strict";

var tw = {
	routes: {
		// host is the TiddlyWeb instance's URI (including server_prefix)
		// placeholders "_type" & "name" refer to the respective bag/recipe
		root     : "{host}/",
		bags     : "{host}/bags",
		bag      : "{host}/bags/{name}",
		recipes  : "{host}/recipes",
		recipe   : "{host}/recipes/{name}",
		tiddlers : "{host}/{_type}s/{name}/tiddlers",
		tiddler  : "{host}/{_type}s/{name}/tiddlers/{title}",
		revisions: "{host}/{_type}s/{name}/tiddlers/{title}/revisions",
		revision : "{host}/{_type}s/{name}/tiddlers/{title}/revisions/{revision}",
		search   : "{host}/search?q={query}"
	}
};

var convertTimestamp, supplant;

// host (optional) is the URI of the originating TiddlyWeb instance
tw.Resource = function(type, host) {
	if(arguments.length) { // initialization
		this._type = type;
		if(host !== false) {
			this.host = host !== undefined ? host.replace(/\/$/, "") : null;
		}
	}
};
$.extend(tw.Resource.prototype, {
	// retrieves resource from server
	// callback is passed resource, status, XHR (cf. jQuery.ajax success)
	// errback is passed XHR, error, exception, resource (cf. jQuery.ajax error)
	// filters is an optional filter string (e.g. "select=tag:foo;limit=5")
	get: function(callback, errback, filters) {
		var uri = this.route();
		if(filters) {
			var separator = uri.indexOf("?") === -1 ? "?" : ";";
			uri += separator + filters;
		}
		var self = this;
		return $.ajax({
			url: uri,
			type: "GET",
			dataType: "json",
			success: function(data, status, xhr) {
				var resource = self.parse(data);
				resource.etag = xhr.getResponseHeader("Etag");
				callback(resource, status, xhr);
			},
			error: function(xhr, error, exc) {
				errback(xhr, error, exc, self);
			}
		});
	},
	// sends resource to server
	// callback is passed data, status, XHR (cf. jQuery.ajax success)
	// errback is passed XHR, error, exception, resource (cf. jQuery.ajax error)
	put: function(callback, errback) {
		var self = this;
		var options = {
			url: this.route(),
			type: "PUT",
			contentType: "application/json",
			data: JSON.stringify(this.baseData()),
			success: function(data, status, xhr) {
				callback(self, status, xhr);
			},
			error: function(xhr, error, exc) {
				errback(xhr, error, exc, self);
			}
		};
		if(this.ajaxSetup) {
			this.ajaxSetup(options);
		}
		return $.ajax(options);
	},
	// deletes resource on server
	// callback is passed data, status, XHR (cf. jQuery.ajax success)
	// errback is passed XHR, error, exception, resource (cf. jQuery.ajax error)
	"delete": function(callback, errback) {
		var self = this;
		var options = {
			url: this.route(),
			type: "DELETE",
			success: function(data, status, xhr) {
				callback(self, status, xhr);
			},
			error: function(xhr, error, exc) {
				errback(xhr, error, exc, self);
			}
		};
		if(this.ajaxSetup) {
			this.ajaxSetup(options);
		}
		return $.ajax(options);
	},
	// returns an object carrying only the essential information of the resource
	baseData: function() {
		var data = {},
			self = this;
		$.each(this.data, function(i, item) {
			var value = self[item];
			if(value !== undefined) {
				data[item] = value;
			}
		});
		return data;
	},
	// returns corresponding instance from a raw object (if applicable)
	parse: function(data) {
		return data;
	},
	// list of accepted keys in serialization
	data: [],
	// returns resource's URI
	route: function() {
		return supplant(tw.routes[this._type], this);
	}
});

var Container = function(type, name, host) {
	if(arguments.length) { // initialization
		tw.Resource.apply(this, [type, host]);
		this.name = name;
		this.desc = "";
		this.policy = new tw.Policy({});
	}
};
Container.prototype = new tw.Resource();
$.extend(Container.prototype, {
	tiddlers: function() {
		return new tw.TiddlerCollection(this);
	},
	parse: function(data) {
		var type = tw._capitalize(this._type),
			container = new tw[type](this.name, this.host);
		data.policy = new tw.Policy(data.policy);
		return $.extend(container, data);
	},
	data: ["desc", "policy"]
});

// attribs is an object whose members are merged into the instance (e.g. query)
tw.Collection = function(type, host, attribs) {
	if(arguments.length) { // initialization
		tw.Resource.apply(this, [type, host]);
		$.extend(this, attribs);
	}
};
tw.Collection.prototype = new tw.Resource();

tw.TiddlerCollection = function(container, tiddler) {
	if(arguments.length) { // initialization
		tw.Collection.apply(this, [tiddler ? "revisions" : "tiddlers"]);
		this.container = container || null;
		this.tiddler = tiddler || null;
	}
};
tw.TiddlerCollection.prototype = new tw.Collection();
$.extend(tw.TiddlerCollection.prototype, {
	parse: function(data) {
		var container = this.container;
		return $.map(data, function(item, i) {
			var tiddler = new tw.Tiddler(item.title, container),
				bag = item.bag;
			tiddler = tw.Tiddler.prototype.parse.apply(tiddler, [item]);
			if(!tiddler.bag && bag) { // XXX: bag always present!?
				tiddler.bag = new tw.Bag(bag, container.host);
			}
			if(!tiddler.recipe && item.recipe) {
				tiddler.recipe = new tw.Recipe(item.recipe, container.host);
			}
			delete item.recipe;
			return $.extend(tiddler, item);
		});
	},
	route: function() {
		var params = this.container;
		if(this.tiddler) {
			var container = this.tiddler.bag || this.tiddler.recipe;
			params = {
				_type: container._type,
				host: container.host,
				name: container.name,
				title: this.tiddler.title
			};
		}
		return supplant(tw.routes[this._type], params);
	}
});

tw.Search = function(query, host) {
	tw.Collection.apply(this, ["search", host]);
	this.query = query;
};
tw.Search.prototype = new tw.Collection();
$.extend(tw.Search.prototype, {
	parse: function(data) {
		this.container = { // XXX: hacky
			_type: "bag",
			host: this.host
		};
		var tiddlers = tw.TiddlerCollection.prototype.parse.apply(this, arguments);
		delete this.container;
		return tiddlers;
	}
});

// title is the name of the tiddler
// container (optional) is an instance of either Bag or Recipe
// optionally accepts a single object representing tiddler attributes
tw.Tiddler = function(title, container) {
	tw.Resource.apply(this, ["tiddler", false]);
	this.title = title;
	this.bag = container && container._type === "bag" ? container : null;
	this.recipe = container && container._type === "recipe" ? container : null;
	var self = this;
	$.each(this.data, function(i, item) {
		self[item] = undefined; // exposes list of standard attributes for inspectability
	});
	if(title && title.title) { // title is an object of tiddler attributes
		$.extend(this, title);
	}
};
tw.Tiddler.prototype = new tw.Resource();
$.extend(tw.Tiddler.prototype, {
	revisions: function() {
		return new tw.TiddlerCollection(this.bag || this.recipe, this);
	},
	route: function() {
		var container = this.bag || this.recipe;
		var params = $.extend({}, this, {
			host: container ? container.host : null,
			_type: this.bag ? "bag" : (this.recipe ? "recipe" : null),
			name: container ? container.name : null
		});
		return supplant(tw.routes[this._type], params);
	},
	parse: function(data) {
		var tiddler = new tw.Tiddler(this.title),
			container = this.bag || this.recipe;
		if(data.bag) {
			tiddler.bag = new tw.Bag(data.bag, container.host);
			delete data.bag;
		}
		delete data.recipe;
		tiddler.created = data.created ? convertTimestamp(data.created) : new Date();
		delete data.created;
		tiddler.modified = data.modified ? convertTimestamp(data.modified) : new Date();
		delete data.modified;
		if(this.recipe) {
			tiddler.recipe = this.recipe;
		}
		return $.extend(tiddler, data);
	},
	data: ["created", "creator", "modifier", "modified", "tags", "type", "text",
			"fields"],
	ajaxSetup: function(options) {
		var self = this;
		if(this.etag && (options.type === "PUT" || options.type === "DELETE")) {
			options.beforeSend = function(xhr) {
				xhr.setRequestHeader("If-Match", self.etag);
			};
		}
		if(options.type === "PUT") {
			var callback = options.success;
			options.success = function(data, status, xhr) {
				var loc = xhr.getResponseHeader("Location"),
					etag = xhr.getResponseHeader("Etag");
				if(loc && etag) {
					self.etag = etag;
					if(!self.bag) {
						var bag = loc.split("/bags/").pop().split("/")[0];
						self.bag = new tw.Bag(bag, self.recipe.host);
					}
					callback(self, status, xhr);
				} else { // IE
					self.get(callback, options.error);
				}
			};
		}
	}
});

tw.Revision = function(id, tiddler) {
	var container = tiddler.bag || tiddler.recipe;
	tw.Tiddler.apply(this, [tiddler.title, container]);
	this._type = "revision";
	this.revision = id;
};
tw.Revision.prototype = new tw.Tiddler();
$.extend(tw.Revision.prototype, {
	revisions: false,
	data: false,
	put: false,
	"delete": false
});

tw.Bag = function(name, host) {
	Container.apply(this, ["bag", name, host]);
};
tw.Bag.prototype = new Container();

tw.Recipe = function(name, host) {
	Container.apply(this, ["recipe", name, host]);
	this.recipe = [];
};
tw.Recipe.prototype = new Container();
$.extend(tw.Recipe.prototype, {
	data: ["recipe"].concat(Container.prototype.data)
});

tw.Policy = function(constraints) { // TODO: validation?
	var self = this;
	$.each(this.constraints, function(i, item) {
		self[item] = constraints[item];
	});
};
tw.Policy.prototype.constraints = ["read", "write", "create", "delete",
	"manage", "accept", "owner"];

/*
 * utilities
 */

tw._capitalize = function(str) {
	return str.charAt(0).toUpperCase() + str.slice(1);
};

// convert YYYYMMDDhhmmss timestamp to Date instance
convertTimestamp = function(t) {
	if (t.match(/^\d{12,17}$/)) {
		return new Date(Date.UTC(
			parseInt(t.substr(0, 4), 10),
			parseInt(t.substr(4, 2), 10) - 1,
			parseInt(t.substr(6, 2), 10),
			parseInt(t.substr(8, 2), 10),
			parseInt(t.substr(10, 2), 10),
			parseInt(t.substr(12, 2) || "0", 10),
			parseInt(t.substr(14, 3) || "0", 10)
		));
	} else {
		return new Date(Date.parse(t));
	}
};

// adapted from Crockford (http://javascript.crockford.com/remedial.html)
supplant = function(str, obj) {
	return str.replace(/{([^{}]*)}/g, function (a, b) {
		var r = obj[b];
		r = typeof r === "string" || typeof r === "number" ? r : a;
		return $.inArray(b, ["host", "query"]) !== -1 ? r : encodeURIComponent(r); // XXX: special-casing
	});
};

return tw;

}(jQuery));
//}}}
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   version="1.1"
   width="14pt"
   height="14pt"
   viewBox="918 510 14 14"
   id="svg3070">
  <metadata
     id="metadata3089">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title></dc:title>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <defs
     id="defs3072">
    <radialGradient
       cx="0"
       cy="0"
       r="1"
       id="Gradient"
       gradientUnits="userSpaceOnUse">
      <stop
         id="stop3075"
         style="stop-color:#ffffff;stop-opacity:1"
         offset="0" />
      <stop
         id="stop3077"
         style="stop-color:#2b2b2b;stop-opacity:1"
         offset="1" />
    </radialGradient>
    <radialGradient
       id="Obj_Gradient"
       xlink:href="#Gradient"
       gradientTransform="matrix(11.473944,0,0,11.473944,922.3752,513.7837)" />
  </defs>
  <g
     id="g3080"
     style="fill:none;stroke:none">
    <g
       id="g3082">
      <path
         d="m 929.6952,512.9018 c -2.5384,-2.53843 -6.654,-2.53843 -9.1924,0 -2.5384,2.5384 -2.5384,6.654 0,9.19238 2.5384,2.53839 6.654,2.53839 9.1924,0 2.5384,-2.53838 2.5384,-6.65398 0,-9.19238 m -4.5962,2.8407 2.07733,-2.07734 1.75547,1.75549 -2.0773,2.07735 2.0773,2.07732 -1.75547,1.75548 -2.07733,-2.07732 -2.07733,2.07732 -1.75547,-1.75548 2.0773,-2.07732 -2.0773,-2.07735 1.75547,-1.75549 z"
         id="path3084"
         style="fill:url(#Obj_Gradient)" />
      <path
         d="m 927.61447,515.38354 a 4.51205,4.2590378 0 1 1 -9.0241,0 4.51205,4.2590378 0 1 1 9.0241,0 z"
         transform="matrix(1.0218069,0,0,1.0462046,-18.063694,-21.648443)"
         id="path2394"
         style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
    </g>
  </g>
</svg>
!Description
The closeAll macro outputs a button to close all open tiddlers.
!Usage
{{{
<<closeAll>>
}}}
<<closeAll>>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="78 222 60 60" 
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 107.92718 244.14815 L 86.651474 222.89253 L 78.85206 230.69925 L 100.120415 251.9476 L 78.774 273.27396 
		L 86.57342 281.08075 L 107.927216 259.74707 L 129.39981 281.19946 L 137.19922 273.39267 L 115.73397 251.94763 
		L 137.121155 230.58054 L 129.32175 222.77374 Z" fill="black" class="glyph"/>
	</g>
</g>
</svg>
Unless you're delighted with the default theme you can make some quick changes by generating a new random color palette, hit this button to cycle through some alternatives.

<<RandomColorPaletteButton 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>>

You can also change the look and feel completely by installing a new theme. To do this, find one you like in the @themes space, note down the name, and include it in this space by going to the space menu. You can reach the space menu by clicking on the blue and pink circle at the top-right of the page and chooshing "THIS SPACE". Here are a few to check out:
* @pip
* @caspian-ii
* @basalt
* @simplicity
* @cheesecake
* @jelly-doughnut

(//Note that if you are using a custom TiddlySpace install, these themes may not be present.//)
The notification mechanism is provided by the TiddlyWiki store object
to enable interested parties to register callback functions to be
invoked when tiddlers are modified. Callbacks can be registered to be
called for modifications to particular named tiddlers, or to be called
for modifications to any tiddler.

To register new callback functions one should make use of the [[addNotification method|TiddlyWiki.prototype.addNotification]]

Out of the box, the notification table looks like this (see Refresh.js
in the TiddlyWiki source repository):
{{{
config.notifyTiddlers = [
{name: "StyleSheetLayout", notify: refreshStyles},
{name: "StyleSheetColors", notify: refreshStyles},
{name: "StyleSheet", notify: refreshStyles},
{name: "StyleSheetPrint", notify: refreshStyles},
{name: "PageTemplate", notify: refreshPageTemplate},
{name: "SiteTitle", notify: refreshPageTitle},
{name: "SiteSubtitle", notify: refreshPageTitle},
{name: "ColorPalette", notify: refreshColorPalette},
{name: null, notify: refreshDisplay}
];
}}}
Note that these notification handlers are called while TiddlyWiki is
starting up and the store is being loaded from the HTML payload in the
document. Quite a lot of care is taken in the core to make sure that
this doesn't trigger double initialisation (where the main() function
explicitly initialises something that is also re-initialised inside a
notification handler).

The notification table is a global variable. It would be more correct
for each instance of the TiddlyWiki store object to have it's own
notification handler table.

One of the problems with the naivety of the notification mechanism is
that it can be quite noisy; if a piece of code is modifying a bunch of
tiddlers the torrent of notifications triggered can slow things down.
To resolve this, the TiddlyWiki object provides methods to temporarily
[[suspendNotifications()|TiddlyWiki.prototype.suspendNotifications]] and [[resumeNotifications()|TiddlyWiki.prototype.resumeNotifications]]. The core uses this
to improve the performance of the importTiddlers macro by suppressing
notifications as individual tiddlers are imported and issuing a
blanket notification at the end of the import.
This is run during a refresh as a result of a call to [[refreshDisplay]]
For any dom elements with attribute refresh set to tiddler one of two things will happen:

For all tiddlers defined in changeList [[Story.prototype.refreshTiddler]] is run.
For all tiddlers that are not defined in changeList, [[refreshElements]] is run
!Summary
This <<tag global >> function renders a link to an external web page.
!Signature
{{{function createExternalLink(place,url,label){} }}}
!Returns
DOM reference: to the created [[External Link]]@tiddlywiki
!Arguments
;place
:the DOM element to render into
;url
:the target URL
;label
:the pretty label for the link
!Example
{{{
createExternalLink(place,'http://tiddlywiki.com','TiddlyWiki.com');
}}}
''returns:'' [[TiddlyWiki.com|http://tiddlywiki.com]] &laquo; a reference to this DOM element
!Summary
This <<tag global>> function renders renders a link that performs an action when clicked. It takes eight optional parameters.
!Signature
{{{createTiddlyButton(parent, text, tooltip, action, className, id, accessKey, attribs)}}}
!Returns
DOM reference: to the created [[External Link]]@tiddlywiki
!Arguments
;1. parent
: the DOM element where the button will be placed.
;2. text
: the text displayed as the button text.
;3. tooltip
: the tooltip displayed onmouseover.
;4. action
: the function executed when the button is clicked.
;5. className
: the css class(es) applied to the button.
;6. id
: the button's element id.
;7. accessKey
: a key that activates the button when typed.
;8. attribs
: an object with attributes applied to the button element.
!Example
{{{
createTiddlyButton(
    place,
    'click me!',
    'Please click!',
    config.macros.foo.buttonClick,
    'button theClickButton'
);
}}}
''returns:'' {{button theClickButton{Click me!}}} &laquo; a reference to this DOM element
!Summary
This <<tag global>> function creates a DOM check box input element.
!Signature
{{{function createTiddlyCheckbox(parent, caption, checked, onChange) {}}}}
!Returns
''DOM reference:'' to the created checkbox
!Arguments
;1. (dom element) parent
:the DOM element where the text node will be placed
;2. (string) caption
:text to be displayed after the check box element
;3. (boolean) checked
:the initial state of the check box
;4. (function) onChange
:the function triggered when the checkbox is clicked
!Example
{{{
store.createTiddlyCheckbox(place, 'turn on', true, config.macros.light.switch);
}}}
''returns:'' a reference to a checked checkbox element labeled "turn on" firing ''"""config.macros.light.switch"""'' when toggled
!Summary
This <<tag global>> function creates a DOM ''select'' element populated by a list of ''option'' elements.
!Signature
{{{createTiddlyDropDown(place, onchange, options, defaultValue)}}}
!Returns
DOM reerence: the created select element
!Arguments
;1. (DOM reference) place
:the DOM element where the ''select'' element will be placed
;2. (function) onchange
:a callback function to be called when a check box changed event occurs
;3. (array[string]) options
:an array containing the names of each ''option'' element, also serving as the element's value
;4. (string) defaultValue
:the ''name'' of the option that will be the select element's default value
!Example
{{{
store.createTiddlyDropDown(place,config.extensions.foo.update, ['foo','bar','baz'],'bar');
}}}
''returns:'' a reference to a created ''select'' element with three options, the default being bar firing {{{extensions.foo.update}}} on changes.
!Summary
This <<tag global>> function creates a DOM element.
!Signature
{{{function createTiddlyElement(parent,element,id,className,text,attribs) {} }}}
!Returns
DOM reference: to the created element
!Arguments
all optional
;1. parent
:the parent DOM element to add the new element to
;2. element
:the HTML type of the element to create in lowercase, e.g. {{{div}}}
;3. id
:the element id for the new DOM element
;4. className
:the CSS class for the new DOM element
;5. text
:text to put inside the element
;6. attribs
:a JavaScript object with attributes to set for the element
!Example
tbd
!Summary
This <<tag global>> function creates a [[button|createTiddlyButton()]] that presents an error to the user in the tiddler contents.
!Signature
{{{createTiddlyError(place, title, text){}}}}
!Returns
undefined
!Arguments
;1. (DOM reference) place
:the DOM element where the error button will be placed
;2. (string) title
:the error button label
;3. (string) text
:the text displayed when the error button is clicked
!Example
{{{
createTiddlyError(
    place,
    config.messages.macroError.format([macro]),
    config.messages.macroErrorDetails.format([macro, ex.toString() ])
);
}}}
''outputs:'' a popup button showing a macro error and exception details in a popup when clicked
!Summary
This <<tag global>> function renders an internal link to a tiddler.
!Signature
{{{createTiddlyLink(place, title, includeText, className, isStatic, linkedFromTiddler, noToggle) {} }}}
!Returns
DOM reference: to the created link
!Arguments
;1. (DOM reference) place
:where the link will be placed
;2. (string) title
:the tiddler title
;3. (string) includeText
:(optional) the pretty title to be show
;4. (string) className
:(optional) the css class name applied to the link
;5. (boolean) isStatic
:(optional) ?!?
;6. (string) linkedFromTiddler
:(optional) ?!?
;7. (boolean) noToggle
:(optional) ?!?
!Example
{{{
createTiddlyLink(place,'Foo');
}}}
''outputs:'' an internal link to tiddler 'Foo'
!Summary
This <<tag global>> function creates a DOM text node.
!Signature
{{{TiddlyWiki.prototype.createTiddlyText = function(parent, text) {} }}}
!Returns
DOM reference: to the created text node
!Arguments
;1. (DOM reference) parent
:the DOM element where the text node will be placed
;2. (string) text
:the text content to be added to ''parent''
!Example
{{{
createTiddlyText(foo,'bar');
}}}
''outputs:'' "bar" in ''foo''
<<list filter [server.content-type[text/html]]>>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="450 366 38 57"
width="30" height="30">
	<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
		<g>
			<path d="M 452.1094 421.2422 L 450 421.2422 L 450 423 L 487.9688 423 L 487.9688 421.2422 L 485.8595 421.2422 
			L 485.8595 377.29688 L 487.9688 377.29688 L 487.9688 375.53906 L 485.8595 375.53906 
			C 485.8595 375.53906 481.12463 371.59341 473.02023 370.52802 C 472.6824 368.9689 471.72098 366.75 468.9844 366.75 
			C 466.24783 366.75 465.28638 368.9689 464.94864 370.52802 
			C 456.84418 371.59341 452.1094 375.53906 452.1094 375.53906 L 450 375.53906 L 450 377.29688 L 452.1094 377.29688 
			Z M 467.12247 370.32086 L 467.12247 370.32086 C 467.3805 369.42395 467.90762 368.50781 468.9844 368.50781 
			C 470.0612 368.50781 470.5883 369.42395 470.84634 370.32086 
			C 470.24136 370.2848 469.62054 370.26562 468.9844 370.26562 
			C 468.34827 370.26562 467.72748 370.2848 467.12247 370.32086 Z M 454.21875 420.92804 L 454.21875 420.92804 
			C 455.46762 420.42087 456.32816 419.35281 456.32816 418.11716 L 456.32816 377.29688 L 458.4375 377.29688 
			L 458.4375 421.2422 L 454.21875 421.2422 Z M 460.5469 420.92804 L 460.5469 420.92804 
			C 461.79578 420.42087 462.65625 419.35281 462.65625 418.11716 L 462.65625 377.29688 L 464.76566 377.29688 
			L 464.76566 421.2422 L 460.5469 421.2422 Z M 466.87503 420.92804 L 466.87503 420.92804 
			C 468.1239 420.42087 468.9844 419.35281 468.9844 418.11716 L 468.9844 377.29688 L 471.09378 377.29688 
			L 471.09378 421.2422 L 466.87503 421.2422 Z M 473.2032 420.92804 L 473.2032 420.92804 
			C 474.45203 420.42087 475.31256 419.35281 475.31256 418.11716 L 475.31256 377.29688 L 477.4219 377.29688 
			L 477.4219 421.2422 L 473.2032 421.2422 Z M 479.5313 420.92804 L 479.5313 420.92804 
			C 480.78018 420.42087 481.64066 419.35281 481.64066 418.11716 L 481.64066 377.29688 L 483.75006 377.29688 
			L 483.75006 421.2422 L 479.5313 421.2422 Z" fill="black" class="glyph"/>
		</g>
	</g>
</svg>
If a dom element has a refresh attribute that matches a definition in config.refresher it will run the corresponding refresh functions

by default there are refreshers for "link", [[tiddler|config.refreshers.tiddler]], "content" and "macro"
iVBORw0KGgoAAAANSUhEUgAAAK8AAADuCAIAAADA9MDrAAAAA3NCSVQICAjb4U/gAAAgAElEQVR4nO2dd3wU1fr/nynbW3Y3m55NDyQhhNClhSJKB0UFxAv4VUDRq2LBzvUnYkFREUGwoaAgIl6Q61WKqHSpIZSE9J5sNslmd7N9yu+PhUyS3YQAkgy55/3ixWtz5sxzzsx+9pyZ3fOZB2NZFhAIAADAu7oDCB6B1IDgQGpAcCA1IDiQGhAcSA0IDqQGBAf5wrbCru4DolN5+97YtjaRr05rcxui+7FsR3sffjRTIDiQGhAcSA0IDqQGBAdSA4KDbH+zu/rghmVv/R70+pf/6i8FANZ64dvla3+rpEGgn/TCU3cnSDFgLYfeevXSrLen1X6z/IuDBprFg0c98ey8AfKyb558/Hu7Rk4AgDj5/95+eYgaa6tyAOYnckdabwFV9etLD2/SLP/8hT4SaHuTp/LPNW9+k2nGQNpz1iuP3xkpbKpVtuWphV9bAjVCjKXdTEDfeU8/MT60ZsuTCzcEPPvdG6M1GAAAVbn90UVfyJ/b+sFQxY2/BTyi3bHBef7LlX9qhiZIrpx0d8HmdUeTnlm38ZM1i3V73v+lnAIAR9Hh2tiBqux1684Nfunzbz9d/0LU4TU7ity0y4ylPPXhV5s//3rz5+tfGaLG2qnsJ3LHWm8GXfPbml/cAeJWEmm9iTUfW/111bg3Pt+0ftVD5PZVfxqZ5lWJkAmvfLb586+3bNj4wZ21X675rYYGIJW6qj1/1XkrUlXH/qhXKohrP9t8p101iBIeeOPlCfGyK5WompOn8dsy9CLApAnDe9lOXDAx4Ko4Vhw8OEad8vh7b9wVKQRMHKRXUlYnwzgtlFBKtnhv2qrs9hO5Q61z0DX7Pt8dMefuWO8HnTXvf+G+50/YfDdR5uJaRVqqlgRM1WtEZMXhPLv/wxcE9eqrri+o8wCQ2vQU856TRhoAqMqDRwVDEuV+RHer0+5MgYnkIrBxf1PWarssVUkAABCKEKmt2kpTzrM5ygH3yjARphYBAGs99/1/XCP+GSdmz1ltJd+/vfjL+kYiYtSCRTPTVUxNG5VJ616fyJju6q2D7rJWaOPBT38Oeejtno63L/ddcdtzH6XJpb6bSHViuPXbo+V36/XOi3/lmxrSbDTIfT/prKPk+FFzxN0hQgBWEDk8veDHY8axU7WVB49IR8/U/rTz+s74387K/5ZkV9h8y5PCZc9MiLqmUFe5bmhJi0+DdwUdY8rKxAc8pvRuok0nPl2+vmbiv15OFIMnfOLsOaqBGb3UzvObnl22PuGLZ6Lbqsxm+0TuSOtXYOoOfvKrbv6ryVLs1JUyXKINkfjbhCn6P/5I1jsrH98nDu+dEqMVEFjz0HT1L28+ckKEAcNK9COf+edQNV4JAILQjBGeDw8ZxvY9eFwx+nl1zk/XcuZuJr0j5X7V0DtSfq2hrkkNhCJUZqu0UKARAG2ttMuTlc5LRx0p87QkADCmIx8u/QZmLn91aDAJAIKwoePCAABAnjhsgHRVXp3Z1VZlyieyyqdnvq1fqcOYzv+R31Cz9tUngGksqTKVLP/qxVfn9RS1vWng/HcHzgdgTX++cLQmVN58viRCxr/0yROJIq7Ee3kiCB0xAnvrwKm6MwF3TFQTOddy4m4qY3ppj+WbS2qdzQujAsVjemmvNdQ13WGSQQMHsEf/KHUB23h+/0X10F6ikqPGmIERQgDasHvVV86Zy57ySgGArtn96gvrzlhZYF3lp87Yw+IlZW1W9o2s8pmW266DazNe27hu7Sfvr/7kzcf6h962+OV5PUWs02Q0uTA/m7CiTa8u+6WGBnfp3v8YUsYktL7/aOPoQwaNxPd8dSjg9nQVn27McQzuGRjcqvCegcH4tV/YtDc2eEq2vv76zkqLsc6W/c+5AQkPvrskY8ajI9784JE5FCaOm/7SWG3FxtLQgVEiAMpwcHtmeX3Z0//YAAAgTnz4vWeGzux/dOVTD1ICFjRDnnimV/2Pm9qs/NywlpFDyau3Htpe51nLkXce2z19wzsDZK03CSPHjpEsffGhLSSpG/L4K+mKDp42Qjf4jsCtR8f0VmFQ3bFdOomkcFnfaMXpYqv3z77RiqRwn8PuAFijG62g7w5UN7he215IMSyJY69Njw0JEPmttmxHYTu/aPNpyEPcACEBooxkNQBkJKvbksJVQWroPoxPC4zQiMenBV53BKSG7kOAlHxoZFiA9JruE1uA1NCtiNSKb2R3pAYEB1IDggOpAcGB1IDgQGpAcCA1IDjI9u0WnQCy9/AHsp1vrTsB5PvjFWimQHAgNSA4kBoQHEgNCI7r/73rZuOuL626tJ9ylGGEh3KDh8KE0ih96u0ijb6ru9Zt4akaqs7vcdQdUukniBUZYpkKAKymivryi6f3fBiWeEdU33Fd3cHuCR/VUHV+D8YURvR52OBQnMgxV9dXA4BKJk2JG5moi7pw4GuGxWL63dnV3eyG8E4NHlO5tfpAaNq88+WCGpM5LUEzUqkDAJOFPpZtlIuCk/pPzdy9JTQmWayJ7OrOdjd4dxVZkv27KHJYsd1TY3JNGxWtVbBbt2+jWSpYJ5KypQYrU4sna8M0Zw/u8ru7x1g9+eVTw1ZkjVmRNfLNs9O/ry3wXFsHbIVF0zZbGv+GQ7keurZ13o0NFneNRBpxrqRkePwgF8UKBILy0tK9+/88dzZzzJ3jdYGBh06VT+w5+MKBP9qKQKgD1z4Z1VsAQLm2fpWz9Izy64FC73GyLGBXWy4vi43Z0Vlfz/r2pzNb94V3arjgKYigoxtcDrmSdDGglEplcvm5s5kTp92V1Cu12uapqbepBke7Gs1Xj0UKByaQX1R6zPll9+8jkhi7eFTiW4nMb78UrS9lSYYW6MNWjJPsWJdvmp78YjgOHtvy1SWyIYKfsoN2zpEc2lW4vpwVs4wwKvzdSQHS3NxJx4J/nqeSM+4t63NLpiQ/K23413dVOSzOuiFlVNy/0oQkANDOdWtaBAyeHRd9ophrcaJaUVRw95X+LAuxvNYsyDOy0rsP6nxblxcW3LVPMFLrqTQ7i8nAD2YHxzTW+2n9xuCdGvJYwGzlFC6sdZqEQlmVuXHugn8C4wQAp83qosQeD8Mybpa5ug2EdTn2X6RihwlFGDSa2HufSh4qAVN2wSpr8NePBmhY949fXnq3JOmxNPyJLKcrXMoa6o6ItO+prT8B23Cp9N3awM2LAkNY18Z1lz4oVrzsE74sq/pcbOwPd0oIW+OPOR4bK1RhAITojpYB36otf7l5i4XK1/Gm/rBFf7YI4mAB/LX+Kga2BmbsvLgBAufnn+T/WBN4X76/1m8M3qkBACiKYiR1x/Izp/bTAy5e/fNzi8YtlyplNieUlTcoZbip4iwmatNLRJtqH19lkQAwgMenRS9LEWBFIApUJYkBgKkstJUWORasrcQAPA420ESHJWvE39YXjxV7zlpUfRPCCCsAW1XsVMbJtTgACNKjsB3lHk9Qq3awkERNwNf5DzcE3J6indRHeuXNwPQtAsZDsaFlixStbepP6yCiIvDbOhUOokBVghiAJUNEbBHVVus3BO/UEI4FAECARLX35GcqOT0uadqpslMPfTbuh6cPysRw4kzNyBSs5PSRQP2AtiIQ6sCPvdcNV7ABAI57nySB43jUgLjNYyVNz3MBWj1RmL+7OsCZT06dIyTrAAAAA2gafVjAMAyDJps4S7MAAJLQkK+f0ZzPM+89U3j3iZDNcwPDcAAAUtMioOBY6xZtBVx/WgX5bIj/1gEAMKz5NX9brd8IvLuniNT2KDQUAMDwfsN+z/73vatGhAdFBGtDJvy//l9+f0EvqQl0/FpVRvUdPeW6wuNhsRJzdkMxBcBQB/eW/9fEAiEc3Rv/46jhiDww4/JHDAuLFlsKGmsZANp9vASSIwVCAUE4KScLjMNxwsQAsMVnqrbVkr2SdU9NDYuqs1Y2PWqmRUB/LXL4BKH9t+7zqWXabP0G4N3YMKbXpJO7znh0HrvHER+VEB0ZAwA0wzjdzq0nZ34+4a7je46njXlYoYu/vviqBP3SvIKn15gkGCPUh61QYgAQnqTFfikLuEcfhIMDAABTJeqX5BY+utYoAUYWH/WOHpe6gydD0SNfNUSrhIFKnGIxXRB+YNvFzThO0FjMiJhe3GiDNQ+I+7ZYz9VsFSRVWO63dShqdRx4261fP1jX5rV6YVuh37VPr29/ShQkEovENMMwLE1TdNaF84V5hY9Je6WNmZE68p7O72r3oH1XLu/GBi+Lxz//wS/v7Lv4GwAE6YIBoDCv8O2B8/uOnnLdowLiqvBUDQpp6NLpH8J0AIChz/diKProyuyr7YS4UXh3FekLkkKncQuoAUmh07gF1IDoNJAaEBxIDQgOpAYEB1IDggOpAcGB1IDgQGpAcCA1IDiQGhAcSA0IDqQGBAdPf9EGgIOFP287tfVM/qkqowEAQnXB6fH97u03Y3jsxK7uWreFp2p4a8/z24/+oIvUxKbr0zW9AMBcb8mrzF686Ynptx148Y53urqD3RM+quHNX5fsy9uTOiRJGcClmwzQBgRoA0IirXtzdrMM+9K4FV3Yw+4K79TwR96uH45uSx6YKJaI3C736/1XRCviAKDYWrD05BKxRBQWG/zD0W1D4oaPTJjsu7vHWH33hxUmlUAEwOBkWnr48xmqdpPcXB1bfv7kg7qdD6quIRUq6/n3pzlnx6e8pm9K4OhY/3nuFkbz5mhqxWnt+oE1s6415s2Hd2rYenyzMlAuEgncThcAMFc8VQzDektEIoEyUL71+Ga/aoBmPkzKbtv8ff6DP8dum6LoaLaimwZjtx1oVL3/ZGRfAezoCbb8mi7ukD94p4bTBad10QFOp8v7Z9OSbpZlmwrlKunpgtNXDUVKZbPviti3purwGMU4ifuX5s7GOwTr1lUMeDhxgtS16ePzW1KSd46R2LPzZ2UFfdXP+EBLx6M3cR/QLSNMCgii7Ju2Ff/YgJEUrUyOfv92ucpj37ClcJuVDNeItXbgsqfRrh9/rj5nol7/pvz5Qc6X/9JtHn455r7mptCJ6pAuzcDLuztMY10NSZIuh8v7j2Eu58NlGKapkCRJY12HPluETNpP5s6yMKZLpe/WBq5blPTdovjby0o/qBSMCXYfrGEYu+0YqZCX2k0sU5TrikqRyryOx8lxHz8YN63R+GONtwOXvZFchGKatnuweP2GRUk/LIwKOltxoJE15ZR/w4Z/81jPTyerLI3NMvkSorsmhKRq1a8/ENGbMz6wDbllq6zB6x/tuWVRwrSa8ncL6b/vRF4PvBsbWACX00VRxPqpXycG9mwqT9D0+OX+A7m1OQt3zqUpusMmEJZmgcR9nY1MfLKwoMDVwJptcbqR5aZcuyy7ghyVQUBdK8fj5Ti+3kg2QqgwlD/xKSMgmQIrm+Jhq8rdqmiJEgNcJhuhxS9drW8+plCKAqIL3xLeqUGj0JhNVqlMPHfLjKP/PNtq69wtMwDAbnNqFJqORKOstuMO8UIl5utsDIgMEJ20ZlIufQ/5ba6aPaWNeZjqJQUGda0dj5dpHQFKjhd9ZAvbNj9AS9veWF0CwHIVoCMmcn+m0C6FdzNFamSqtaHROyP0XdGz+aa+K3p6y60NjamRqVcNRdkbv9peaU8PHSTFfZ2NYqWiv6vuu0JySLAgJp44ddzYEKUIa3Pa9vVGkh4rowgSKXAwldQdNrMUgwdHCOqL7GYWaGvj/lqmrVhczPYsml0A78aGmYNn/7Xpr0arnRQQAJD8eszFpUXeF94KlIemHMzMwbPbikCbahd9YBYB62LI3v2iPx0tkwJIfZ2NuGhokOvzSu2rEpCHKuncithhYjGAn4zUAP68kaRcGhSyKX9mvjAsWrcwqeGDnYahMyJmnSy4b1V1mEaWoMavNp9hSn+m0C6Ejz7MJZsX7jqzkxABQeAA0Cu8NwCcr8gCAJpmaBdMTp+64v71nd/bbsCt58Nccf96lmV/OrnTAQ6CxE4VnAQAhmFoiiVBOKU/ksLNgo9qAIB3Z386Mmn0N4c3ni87Z7aZAUAlVfWKTX1g6JyJfWd2de+6LTxVAwBM7DsTvfGdDO/uKRBdCFIDggOpAcGB1IDgQGpAcCA1IDiQGhAcSA0IDqQGBAdSA4IDqQHBgdSA4ODvr1bV9twDVftKG4saPVaaZSSkJEoeOyxkdJTi6queENcHH9UgJulv877IrD05IWJkb+0dFrvM7gaKdlJgWJu1MlGZvKD3EzQr7upudkN4N1OICWr1uXcw1vp8n0ei5GkiItDMSjFSbaGDba6eGer5QDHLDryMtbViDXED8E4N3+Z9oRbiw8L619NuD45RFO6ghHYQ1rtENU5JuVmglw8Mloo/OIiMuX8//FJDtSP3TN3J0RG3XaRtF5n6Uqa22k3aabLGxhRUW0qNDXZprVGaPSx6wImiE1nlh/0GoSyWNd9cGL4sc9gbmaPXFn1bTl918fKNY8vPH73BbPUpMbSb37L9Or4xbzb8um74o2LP2ND+NU6blaRwJkRDiw/VYgwFeQYrJjZJwwpN4uo62ikx0Pf2GrnjzI+9I4a2DuGxr9lQeLJ3/M775RqcrbpY+vCmQu1j8eO6aDmytAP5LTtSp3PglxpKG4sGBo3KtFcaxXgyEccAVVLjdjodqhDWotmTzzSAiw2gRHlG1+3RfX84ccg3gq2s+kc2+MsRcg0OAFhokn5TOK1QYL4uSllB/pQ95DANVWNxVcmDVk5XHvwit2xyylI9DpR95ZpixaykBUEYADTmtax5ny64oHVuzH8C0NaGlRurLtS5G3Uhq2cEhXr7k58/9aBu5xzJ4V2Fa4ppYPE+o2OXpokEzfucnz/1oG7z8No5fv2fwBrOFT18VPL23NAU0c09//yaKWyUTUrKSuyVxebcMqex2EaZTB6h3B6krnPRfSxOtcslsBrq6hsa5BKFydrgE4A1VTuJcEVok0kGwzQqUoBBax9mMY1hYDfDxLvi181PmGuv/LCYGD9IeOQvWyOAq6bugDhwQuCVlIatahb4d0s6LVTG9J7bnuw5x1r1UQtHJduQW7rSpPviiZQd/xdMnasv9JeRDGvD/2krq3z6T2LJ7JCbLQXgmxpYlsFYcLssrD2U9NC/HPNgYklVPllWqgxzSXpbh4deGiuqi/U4HcCyFOUvQzbWzNfNwXAuSkKQHoXllns8ACKdKlEMgJM9woiKakqdFBRbWnPSzhScteoGqkObnZuWNT1+U3OLg9VpUgCcTI3Ey6o97maHVVXklMfI1DgQKs1bD4T2aGNEvuz/xMkQEWuhAAA8DXUvfNtw2z2Rw2WdMdPxa6YQgdTitmiJAIU4raSCwUpy4qA2Ikibc6gqC3p6cCqNudBTH1dpEP91MFsCUp8AmDpEQh8zl1OKK2ecKS+wUZEy/xkmmwpYFsOAkCpnR1RszmvUFwrvGyHwa8Lz1vTNjQkAGNYUFbtcp6lbGLAduZT18X+6rZ7oRPbnI42z71Kqb74e+DU2hEsiiutL46WRFVUHKw7t7iuxLJj3j4yMjImjhvUmC3rSuXNn3JORkTFy+Ci3UaKt1/lGkEWE3EcYX9xrrqYAWKbiQtmj22suufxkmBQAOGsaLjoAGE9WGaMPFZAYkX6bsvjXkgO6oMEtldaqpk9uTAAAx+U61PlyJjpU0OzKAAuLkVjzrNU00Jb6p9eXnnFDB5FFhj49PW5yVckbFzyd4Obn19iQETH2vSPLnx0yz3z6V219+PAHRi9e/qGl6EJYaEhqampVVdWH76+srKpM6Rs35Y77Kqsq/YQQSBY+GIfvLLvnzUIgMKlO/di8mDsUGObrwywEsRzb/e/cdUZngy78o1gCAKRhgSOIhsYB8la3IK1qSqlWuTGBZUGmxvduv7S23m3VhX0UQ0Bx096YMiHyuZyC+asMJEakj469ptyVmEDy0D26BzeW/BwRNyXg5o4P/FJDTEBaiiZtz8U/FXUSlUIFAAGDx1dnn545c6ZarW5sbDQajWvXrSF6OAFAqVD6DUIqlI8+kPJoq1JCOG5qz3HNCmwAhFL93P0tnrzkqDWfFmuXRbYeMlvXJOWLF6YuvvxHJAAAxO9PaLlPfPz+eABQ7Y8HABg3LWkctEbWoo5qfxwAAGDkpPmpk7wxvdkeg0M2P+f3WP9m+KUGAHh88OLndz3dCFYwGgDAfmwnxjLvvPOOTCYDAJvNxjKQ81vNxP8Do9H4t7bMZP730pKL+LQZ8Qm8OyudBO+OmwHp25PeX1L7TGFO0R/7907IuE0wapjBYMjNzRWJRFFRUcHBwYBBZmam0+m8kYaufC6bwPtMSNozoSM1uy28UwMAsJh01UMfb4v9fsun3wUGBIqEIgywUmlJsCbInmPPycnxeDx2u/2ll17q6p52N/ioBgBwMsTkjFmTM2Z1dUf+t+DXHSaia0FqQHAgNSA4kBoQHEgNCA6kBgQHUgOCA6kBwYHUgOBAakBwIDUgOHj3O4XJUG4wGGja/0qfoKAgvV7voJGIbwq8U4PBYOjVqxdBEK2WLgIARVHHjx8HACSImwTv1EDTNEEQLperSQ0URTEM43a7tVptQkJCXl4eIEHcHPh1QqUkCwAYhhEEQZIkfgXsynpklUrVt2/fysrK0tLSru5sN4RfamgCx/Gm/wmC8AoCAIRCoVgsHjRoUE1NjVc6rfAYqye9fGpupufKgnW2+OCFlJdzdts7r/O3LvxVA0EQTSMEQRBCobChoaG+vr6m5irZ7gRSQelJ82WrEu3al+VRS7o6G+YtAu+uG7w096kQBNH02ntV0f6+AqWyv632T7N2hhrz1Jn2EQFpEheAT0LL8eJ/f5Jvmp78YjgOHtvy1SXBs+OiTxTzJztl58PTsaE5XkEQBLH0P5OW7BgN+FVcSywpHp/M/JTtpoAtOdcgTw/Q4QDgY8UsI+9Iww9nOV0ATkPdEZF2YG05r7JTdj63gBoAAMMwHMddtCciMGnR1uFuqv3V0nhUb43nbEO5y/nfS8TUeJIA8GfFpEKTNeJL9cUUk3/WouqrgmJbaVH5grUX7/0kf2MDazZR/tyz3RmezhRNPLN1FMtSboZyU1SYOj4pZJDVaZu2LuGVgVva2UuoUU+Awp9z3YflgbPlWKa31MeKKdCoJwrzd1cHOPPJqXOEgmP8yk7Z+fB9bKAY9+jkf4xNmTsudV6viKGV5rLUiKGxutRn/xxndZrb3I0QjkmDH/Y0BKYr1ZcP0U9KTJIQju6N/3HUcEQemKHC/WSnZOgSg6uRBT8vuiN8V4OTctMsU1KXV1SXW2C82OCoK6kv6BM5PDG0/8AVgW3vh4UmBYa4xNNiyaYjDEjULwmqfXRt9qxPCo7GRz2lxwGw8CQtltkQ0FcVhIMqQb801vz0mov3fpyzziZNU2Ksw/zyZyUnXeD7olvCr3yYUpI9ceJEv379mkrmbkidkraQYmiKoWmWqTKXauQhZ8qOHCv865sHf4sNSu+KXt/C3Hr5MJvjoFxfH33PzbidlDs2MHlw7B0nSg5lVWYtHfwJksLfDr/UYKcwHMebf6nw/fzcpq2D3lNhuCS7OmfjA3vsVR1+BgKiw/BLDQAQHByclZXFMH6+VGh00r/n/rF6zA/2KndQUFDn963bwzs1aEIiNSGRfjedSnd0cmf+1+D7PQWiM0FqQHAgNSA4kBoQHEgNCA6kBgQHUgOCA6kBwYHUgOBAakBwIDUgOHj3OwXyYXYhvFMD8mF2IbxTQ/s+zFhtTeORtYVZqbbaP/VDFgnjpnZtb7sZ/FJDcx8mjuPeVQ44jrMsi2GYo3oXYTgRkvqAKia9oahHwe/f9URq+FvhlxqaaPJhMgxDEATLsoxpv4e+pEkYWl+QLcTcCmWIWK7x3dFjrL77wwqTSiACYBmGkSkfuTd6RgiOrHcdgb9q8M4U3oVxjPmY0HNBFXunq+o7oRQrycxxU3j8lH/5XeBLqAPXPhnVWwAAbOnJvPu3G297JDjqf8xDd33wVA3NfZjuusNMw++q+CnOinW4kBLIo2RsuUU/R6IOs1/FDIWFxahC9tuNNESBe98vRc09loqigrta5p+MZ+2bthX/2ICRFK1Mjn7/drmgoGDaXnKUjiqstFujQ+5krWeMjgIicPU/guOw1gG7gWmT71fmhpxdtso9qvgpzopPcIHHbYk2HjqrHbMM5GFX35ll8i7UG3WqKBJMuWWtPZY++SdpuweL129YlPTDwqigsxUHGgEwcFixiVPi1s8JoU/WMENiVj8YN8lau7uO9RPw1oenY4MXw6X/WiqPJg6b5K7+nBCyTnNU7eHTQXetEWn1UH6qrb1oU+3jqywSYG0WjzA2ZPl0tQ5nLhTaSoscC9ZWYgAeBxtoomjtlfyTLBkiYosoIKRChaH8iU8ZAckUWNkUDwsAQo0iSggEI1DJxalKDDA8UMgWUkylT0AKCF6fzQ7A3/7nHd3KWC9QWFjVudXqIKGzPrLhVE7o9LWEIrT9HQl14MdPRvUWMDn7sp9qUKQoMAAWx1t7LG0FrfJPsiXHiz6yhW2bH6ClbW+sLrlc3FSnZbJK34DdAP7OFOeOfJk8bIGo7FDuzsOZu+tz92cGjX/rqlJoBt5jeFRGWcmHBTQD/jyWrWEdVkYRJFLgYCqpO2xmqfaeDIB1S9Mmf9WQV2h0X/hPTNpwmayH4VxBj3veEwXGeh8D1cEImEi+aLLi8I7ykw4/Hkuf6nhsv6CQzPyZ6y+9WiBfmER/tdOQ3/ZVarc0bfLXhznnzog0vXZAUoxCH5c4arFUE95UDcOwU6dODRgwwE6h7xGujVvVh7lxd3n7FZAU/nb4NVM0+TDbr9aRpz8hrgPejQ3t+DCbIAgC+TBvBrxTQzs+TMTNhl8zBaJrQWpAcCA1IDiQGhAcSA0IDqQGBAdSA4IDqQHBgdSA4EBqQHAgNSA4+PU7RV1VqcFgaLXkAswRgKoAAAdlSURBVHkvOw1+qcFgMPTp06f56ibkvexM+HV+WZbFcdzj8TgcDqvVWl9fT5Jk//79KyoqUMrDToBfavDSlMiqKevhoEGDDAaDhGCkJOs38SHib4FfM4UX77omgiBEItGFCxeqq6uVSmV2djZc8WC1fyVBWSzrfyr7rsjDYiDUqB6aop8VQdyQ6mn3HxeovqlSP0truxd8VENT1kMMw0wm06hRo3AcHzBggHfrVa4kPPY1GwpP9o7feb9cg7NVF0sf3lSofSx+3A28k3Sj5au/2MReSA1dRJMgvEvmPR4PRVEURXk8Ho1G079//9OnTwOALjy61Y62suof2eAvR8g1OABgoUn6TeG0QoG1ToY5KUBWkD9lDzlMQ9VYXFXyoJXTlQe/yC2bnLJUjwNlX7mmWDEraUEQBrRr+66KEyXYczuIlZPlZ35uESSYjzPt9cPfo/HmzvbeX/heSQwePNhf0lzWVO0kwhWhBBdFoyIFmE8yzGIaw8Buhol3xa+bnzDXXvlhMTF+kPDIX7ZGAFdN3QFx4IRADACAEE0ZpYkJD313mkaU1zpIp52NzoG/aoArgoArqbS9VxJms7m+vr7tfQD8WER8k2F6PAAinSpRDICTPcKIimpKnRQUW1pz0s4UnLXqBqpDW58bP0G6WcJMnqqBZVnve+pVQ9PYQJKkUCgUCARt7IepQyR0hbmce5eY8gJrsdtPMsxWzWEYEFLl7AjHtrzGXYXC+xIFfpbotxukG8BTNWDNaCohrtC2GkAWEXIfYXxxr7maAmCZigtlj26vueTCfJNhCgCcNQ0XHQCMJ6uM0YcKSIxIv01Z/GvJAV3QYGmzzgAAw1B+M2re+t7L5vDrKjIoKOjUKc6Kz7JsdnZ2092EVxx+HxfHIZAsfDAO31l2z5uFQGBSnfqxeTF3KDAsUb8kt/DRtUYJMLL4qHf0OBSCWI7t/nfuOqOzQRf+USwBANKwwBFEQ+MAefPbB0GAIslWtGATfDyzdRDWUf/yZ7UPP5uYQZtbvRgpvkkn6SbCLx8mXHkQmBeWZU+cONG/f//mJd4O4zh+6tSplPSB1920LT9/8kHdzgdVimaFjuqqeT8wyx4JT+TXx+Rv4xbzYTZ3V0pJbm5uUu1Nm62ZzP9eWnIRnzYjPoF3Z6WTuGWOu5UIbtyKKYuP3x/fvADvMyFpz4QbCXnLw2s12Cms1ZVEE8iKeTPgtRoAQBce7fuFI+ImwdM7TESXgNSA4EBqQHAgNSA4kBoQHEgNCA6kBgQHUgOCA6kBwYHUgOBAakBwIDUgOPj7q5UUozzV1Zajh+1nsxhgpCnJymEZotAwO8vfPt/q8PTMiu3mmq1bBW6bok8fZdLd4HR6DJXG95fTMbHh/5jv9pftDnHj8HGmENvN1SvflwaqA8ZPwB0NWOZhLOuoyGYJm3GPtKb60uvPCxrrurqP3RPejQ1SjDJ+t1WVnCDtnWzdsQEEYoz2iIQCzGZ1lOWphg52/7q3+MuP4598ycH6WTndPB8mg5Np6eHPZ6hC/R2l33WRAP9DrktfeDc2eKqrMWO5JDXZunOTaM5i0axHBXYL01DHzFwkmrPYefGMbtQox8H99vKStiIQ6sC1i3v/tqT33kVRfcuKH/zZar2WhcB0o+Wrv2y36BL4G4R3Y4P16GFZr55Mdqb3T7Eu2LnglcsvjAbcWEvhBaF9hlT/9p/QOU+1H4qUymbfFbFvTdXhMYpxEp98mN5KdMvycdIDzVyX53d3t4yX7cO7scF6LpOUSqG6FFwuy5PznUaDWBfslYLlyfmO0hp3foFYrzee+LMj0QiZtJ/MnWVh2khfyTa0Ki8hOddlfjfMeNk+vBsbWA/NWCyY1SyknX7Tg1EUQ7DAQAffG5ZmgcRZP+krNQDgp5y+7LLqnhkv24d3RydNTXWUFElkSrq0TrnqM++oAABiXTCs+syyeKEwMspcVBSYPrQj0Sir7bhDvFCJ+cmHmQ/gL62ls+Lyi26Z8bJ9eDdTqIYNrzt+nA2Lp0PDAMA7QXinDAAQpfcURMeXXvg9dOzUq4ai7I1fba+0p4cOkraVD9NPWkvOddkdM162D+/GBlFYBDFsRN0fv2tGjXRt/MCdeQkAaMBMjz8sHZhCBvUo+e1nab8hcn2co433gDbVLvrALALWxZC9+0V/OlomBYAE/dK8gqfXmCQYI9SHrVBiUAcAmNKnXCC84rqcpV8a22IT62httrylXZe+8M6HCQDCxrqc155TOjy6UWPdxQXuggLGzYh6xAsjYsp+22UQ2Aet2EgrkbXmemjfh8m7mQIA3HJtj9fedSbEZv/wmavRIUjrLxow0N7YeGr7GntiJJLCzYN3M4UXj1ybsPgVe9kDlft31Z05zHo86v639VnwrTwixgH/O1d1nQ1P1QAADlaARSSEz3k6fE6zwq7rz/8CfJwpEF0FUgOCA6kBwYHUgOBAakBwIDUgOLr+DnPZjsKu7gLiMl38zTSCV6CZAsGB1IDgQGpAcCA1IDiQGhAcSA0Ijv8PZE6NAfcmlsAAAAAASUVORK5CYII=
!Description
The [[edit]] macro is used __exclusively__ in the shadow tiddler called EditTemplate to render an input element for a tiddler field.
!Usage
;input field
:ยป {{{<div class='editor' macro='edit text'></div>}}}
:* creates a simple input field
;textarea
:ยป {{{<div class='editor' macro='edit text 10'></div>}}}
:* creates a textarea with 10 lines height
:* does not limit on the number of lines of text that can be entered
Also see section ''Basic Viewing & Editing'' in [[Custom Fields]]...
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="301 225 48 52"
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 333.00003 234 L 306 258.75003 L 301.5 270 L 312.75 265.50003 L 339.75 240.74998 Z M 337.5 229.50002 
		L 335.24988 231.75008 L 341.99997 238.50003 L 344.24997 236.24995 Z M 342 225.00003 L 339.74988 227.25009 
		L 346.5 234.00005 L 348.75 231.75003 Z M 301.5 273.9719 C 301.5 273.9719 309.59888 277.99927 317.70013 273.97183 
		C 325.80066 269.94437 341.99997 276.65686 341.99997 276.65686 L 341.99997 273.97195 
		C 341.99997 273.97195 325.80014 267.2594 317.70013 271.28687 C 309.6 275.31451 301.5 271.28683 301.5 271.28683 Z" 
		fill="#101010" class="glyph"/>
	</g>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="506 234 68 36" width="30" height="30"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2010-09-16 14:51Z</dc:date><!-- Produced by OmniGraffle Professional 5.2.3 --></metadata><defs></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><rect width="1118" height="783"/><g><path d="M 538.68195 244.31807 C 540.43927 246.07547 540.43927 248.9247 538.68195 250.68204 C 536.92456 252.4394 534.07532 252.4394 532.318 250.68204 C 530.5606 248.9247 530.5606 246.07547 532.318 244.31807 C 534.07532 242.56075 536.92456 242.56075 538.68195 244.31807 M 511.12607 257.99356 C 511.26108 258.13019 511.39728 258.26608 511.53473 258.40121 C 527.2556 273.86606 552.74414 273.86606 568.46515 258.40121 C 568.60248 258.26617 568.73853 258.13037 568.87354 257.9938 C 568.8736 257.99374 568.8736 257.99371 568.8736 257.99362 C 568.87366 257.99371 568.87366 257.9938 568.87372 257.9939 C 570.72504 256.12051 572.35046 254.11153 573.74994 252 C 573.74994 251.99997 573.74994 251.99994 573.74994 251.99992 C 572.35046 249.8884 570.72504 247.87938 568.87372 246.00606 C 568.87366 246.00613 568.87366 246.00621 568.8736 246.00627 C 568.73865 245.86966 568.60254 245.73383 568.46515 245.5987 C 552.74414 230.13387 527.2556 230.13387 511.53473 245.5987 C 511.39728 245.73383 511.26108 245.86974 511.12613 246.00635 C 511.126 246.00624 511.126 246.00616 511.12595 246.00606 C 509.2748 247.87938 507.64954 249.88837 506.24994 251.9998 L 506.24994 251.99983 C 506.24994 251.9999 506.25 251.99992 506.25 251.99997 C 506.25 252 506.24994 252.00005 506.24994 252.00009 L 506.24994 252.00012 C 507.64954 254.11157 509.2748 256.12051 511.12595 257.9939 C 511.126 257.99377 511.126 257.99365 511.12607 257.99359 Z M 515.44916 252 C 515.8548 251.55469 516.27502 251.11778 516.71014 250.68985 C 522.16632 245.32257 529.06055 242.23206 536.17273 241.41824 C 534.6662 241.96199 533.2525 242.83762 532.04498 244.04512 C 527.65155 248.43852 527.65155 255.56163 532.04498 259.95502 C 533.2522 261.16226 534.6656 262.03778 536.17175 262.58154 C 529.05988 261.76761 522.16608 258.6771 516.71014 253.31009 C 516.2751 252.88219 515.85486 252.44528 515.44922 252 Z M 564.55054 251.99995 C 564.14502 252.44525 563.7248 252.88217 563.28973 253.31009 C 557.83368 258.67712 550.93988 261.76764 543.828 262.58157 C 545.33423 262.03781 546.74756 261.1623 547.9549 259.95502 C 552.34833 255.56163 552.34833 248.43852 547.9549 244.04512 C 546.74744 242.83765 545.33374 241.96202 543.82715 241.41824 C 550.9394 242.23206 557.83356 245.3226 563.28973 250.68985 C 563.7248 251.11775 564.14502 251.55467 564.55054 251.99995 Z M 568.8736 257.99362 C 570.7249 256.12033 572.35028 254.11139 573.74988 252.00002" fill="black" class="glyph"/></g></g></svg>
Tiddlers hidden from default lists:

{{fancyTimeline{
<<timeline
server.bag
10000000
[[YYYY.0MM.0DD]]
filter:"[tag[excludeLists]] [sort[title]]"
template:"TEMPLATES##EXCLUDE+LIST"
groupTemplate:"TEMPLATES##EXCLUDE+LIST+GROUP"
>>
}}}
Tiddlers that are hidden from search:

{{fancyTimeline{
<<timeline
server.bag
10000000
[[YYYY.0MM.0DD]]
filter:"[tag[excludeSearch]] [sort[title]]"
template:"TEMPLATES##EXCLUDE+LIST"
groupTemplate:"TEMPLATES##EXCLUDE+LIST+GROUP"
>>
}}}
All functions that are extensions to primitive types in JavaScript tag here...
{{functions{<<list filter [tag[extension]][sort[title]] template:Templates##Function>>}}}<<listfiltr>>
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AP8zZgAAAGYA//8zAADMMwD/mTMAAGYzAP8zMwAAADMAzP8AAADMAADMmQAAAGYAAMwzAAAAAADuzAAA3QAAALvMAACqAAAAiMwAAHcAAABVmQAARAAAACKZAAARAADuAJkA3QAAALsAmQCqAAAAiACZAHcAAABVAJkARAAAACIAZgARAADuAABm3QAAALsAAGaqAAAAiAAAZncAAABVAABmRAAAACIAAGYRAAAA7u7uM93d3QC7u7szqqqqAIiIiDN3d3cAVVVVM0RERAAiIiIzERERAAAAADMBAQEBAQEBAQEBpXl5eXl5eXl5eXmlAQEBAQEBAQEBAQEBAQEBAQEBgHl5eXl5eXl5eXl5eXl5gAEBAQEBAQEBAQEBAQEB/Xp5eXlVT04qKioqTk9VeXl5ev0BAQEBAQEBAQEBAaV5eXlPKioqKioqKioqKioqT3l5eaUBAQEBAQEBAQGAeXlVTioqKioqKioqKioqKioqTlV5eYABAQEBAQEBgHl5VSoqKioqKioqKioqKioqKioqKlV5eYABAQEBAaV5eVUqKioqKioqKioqKioqKioqKioqKlV5eaUBAQEBeXlVKioqKioqKioqKioqKioqKioqKioqKlV5eQEBAXl5eU4qKioqKioqKjExMTExMSoqKioqKioqTnl5eQEBeXlPKioqKioqKjEyMjIyMjIyMjEqKioqKioqT3l5AXp5eSoqKioqKioxMjIxBwcHBzEyMjEqKioqKioqeXl6eXlVKioqKioqMTIxBwcHBwcHBwcxMjEqKioqKipVeXl5eU8qKioqKioyMgcHBwcHBwcHBwcyMioqKioqKk95eXl5TioqKioqMTIxBwcHBwcHBwcHBzEyMSoqKioqTnl5eXkqKioqKioxMgcHBwcHBwcHBwcHBzIxKioqKioqeXl5eSoqKioqKjEyBwcHBwcHBwcHBwcHMjEqKioqKip5eXl5KioqKioqMTIHBwcHBwcHBwcHBwcyMSoqKioqKnl5eXkqKioqKioxMgcHBwcHBwcHBwcHBzIxKioqKioqeXl5eU4qKioqKjEyMQcHBwcHBwcHBwcxMjEqKioqKk55eXl5TyoqKioqKjIyBwcHBwcHBwcHBzIyKioqKioqT3l5eXlVKioqKioqMTIxBwcHBwcHBwcxMjEqKioqKipVeXl6eXkqKioqKioqMTIyMQcHBwcxMjIxKioqKioqKnl5egF5eU8qKioqKioqMTIyMjIyMjIyMSoqKioqKipPeXkBAXl5eU4qKioqKioqKjExMTExMSoqKioqKioqTnl5eQEBAXl5VSoqKioqKioqKioqKioqKioqKioqKipVeXkBAQEB+nl5VSoqKioqKioqKioqKioqKioqKioqVXl5+gEBAQEBenl5VSoqKioqKioqKioqKioqKioqKlV5eXoBAQEBAQEBeXl5VU4qKioqKioqKioqKioqKk5VeXl5AQEBAQEBAQEBenl5eU8qKioqKioqKioqKipPeXl5egEBAQEBAQEBAQEB+nl5eXlVT04qKioqTk9VeXl5efoBAQEBAQEBAQEBAQEBAXl5eXl5eXl5eXl5eXl5eXkBAQEBAQEBAQEBAQEBAQEBAQF6eXl5eXl5eXl5eXoBAQEBAQEBAQEB/+AH//+AAf/+AAB//AAAP/gAAB/wAAAP4AAAB8AAAAPAAAADgAAAAYAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAHAAAADwAAAA+AAAAfwAAAP+AAAH/wAAD/+AAB//4AB///gB/8oAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAACAAAAAwAAAAMAAAADAAAABG1bSA61m3JXuqB4mbuhd8m9o3jqvaF4+b2hePm9o3jqu6F3ybqgeJm1m3JXbVtIDgAAAAQAAAADAAAAAwAAAAMAAAACAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAwAAAAUAAAAGAAAACI98Wye0nXWavKF4876kev++pHr/vqR6/76kev++pHr/vqR6/76kev++pHr/vqR6/76kev+8oXjztJ11mo98WycAAAAIAAAABgAAAAUAAAADAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAQAAAAHAAAAChwcHBKulnGJvaN5+L6kev++pHr/y7GJ/9/Fnv/s1K7/9t25//rivv/64r7/9t25/+zUrv/fxZ7/y7GJ/76kev++pHr/vaN5+K6WcYkcHBwSAAAACgAAAAcAAAAEAAAAAgAAAAEAAAAAAAAAAAAAAAEAAAADAAAABwAAAAtuYkUst552z76kev++pHr+1LuS//Latf/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD/8tq1/9S7kv++pHr+vqR6/7eeds9uYkUsAAAACwAAAAcAAAADAAAAAQAAAAAAAAABAAAAAgAAAAQAAAAIi3hbNbqgd+a+pHr/xayD/+3Vr//85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+3Vr//FrIP/vqR6/7qgd+aJdVg0AAAACAAAAAQAAAACAAAAAQAAAAEAAAACAAAABIl8WSW8oXjlvqR6/8yyiv/54Lz//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//ngvP/Msor/vqR6/7yheOWJfFklAAAABAAAAAIAAAABAAAAAAAAAAFfXz8Iu6F4zL6kev/Msor/+uK+//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//rivv/Msor/vqR6/7uheMxfXz8IAAAAAQAAAAAAAAAAAAAAAbqid4K+pHr/xayD//ngvP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//fgvP/FrIP/vqR6/7qid4IAAAABAAAAAAAAAAC3l28gvaN5+L6kev7t1a///OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+/Twv/Qq8f/u5HK/7OGzP+zhsz/u5HK/9Crx//v08L//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+3Vr/++pHr+vaN5+LeXbyAAAAAAAAAAALuheJa+pHr/1LuS//zlwP/85cD//OXA//zlwP/85cD//OXA//riwP/Pq8f/r4HM/6+Bzf+vgc3/r4HN/6+Bzf+vgc3/r4HN/6+BzP/Pq8f/+uLA//zlwP/85cD//OXA//zlwP/85cD//OXA/9S5kv++pHr/u6F4lgAAAACii3MLvKF4876kev/y2rX//OXA//zlwP/85cD//OXA//zlwP/64sD/w5vJ/6+Bzf+vg83/w5vc/9W06v/dwPD/3cDw/9W06v/Dm9z/r4PN/6+Bzf/Dm8n/+uLA//zlwP/85cD//OXA//zlwP/85cD/8tq1/76kev+8oXjzootzC72feFW+pHr/y7GJ//zlwP/85cD//OXA//zlwP/85cD//OXA/8+rx/+vgc3/tIfQ/9a16//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//Wtev/tIfQ/6+Bzf/Pq8f//OXA//zlwP/85cD//OXA//zlwP/85cD/y7GJ/76kev+9n3hVvaF4mL6kev/fxZ7//OXA//zlwP/85cD//OXA//zlwP/v08L/r4HM/6+Dzf/Wtev/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//Wtev/r4PN/6+BzP/v08L//OXA//zlwP/85cD//OXA//zlwP/fxZ7/vqR6/72heJi8oXfIvqR6/+zUrv/85cD//OXA//zlwP/85cD//OXA/9Crx/+vgc3/w5vc/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//Dm9z/r4HN/9Crx//85cD//OXA//zlwP/85cD//OXA/+zUrv++pHr/vKF3yL2jeOq+pHr/9t25//zlwP/85cD//OXA//zlwP/85cD/u5HK/6+Bzf/VtOr/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/9W06v+vgc3/u5HK//zlwP/85cD//OXA//zlwP/85cD/9t25/76kev+9o3jqvaF4+b6kev/64r7//OXA//zlwP/85cD//OXA//zlwP+zhsz/r4HN/93A8P/hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/3cDw/6+Bzf+zhsz//OXA//zlwP/85cD//OXA//zlwP/64r7/vqR6/72hePm9oXj5vqR6//rivv/85cD//OXA//zlwP/85cD//OXA/7OGzP+vgc3/3cDw/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//dwPD/r4HN/7OGzP/85cD//OXA//zlwP/85cD//OXA//rivv++pHr/vaF4+b2jeOq+pHr/9t25//zlwP/85cD//OXA//zlwP/85cD/u5HK/6+Bzf/VtOr/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/9W06v+vgc3/u5HK//zlwP/85cD//OXA//zlwP/85cD/9t25/76kev+9o3jqvKF3yL6kev/s1K7//OXA//zlwP/85cD//OXA//zlwP/Qq8f/r4HN/8Ob3P/hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/w5vc/6+Bzf/Qq8f//OXA//zlwP/85cD//OXA//zlwP/s1K7/vqR6/7yhd8i9oXiYvqR6/9/Fnv/85cD//OXA//zlwP/85cD//OXA/+/Twv+vgcz/r4PN/9a16//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/9a16/+vg83/r4HM/+/Twv/85cD//OXA//zlwP/85cD//OXA/9/Fnv++pHr/vaF4mL2feFW+pHr/y7GJ//zlwP/85cD//OXA//zlwP/85cD//OXA/8+rx/+vgc3/tIfQ/9a16//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//Wtev/tIfQ/6+Bzf/Pq8f//OXA//zlwP/85cD//OXA//zlwP/85cD/y7GJ/76kev+9n3hVootzC7yhePO+pHr/8tq1//zlwP/85cD//OXA//zlwP/85cD/+uLA/8Obyf+vgc3/r4PN/8Ob3P/VtOr/3cDw/93A8P/VtOr/w5vc/6+Dzf+vgc3/w5vJ//riwP/85cD//OXA//zlwP/85cD//OXA//Latf++pHr/vKF486KLcwsAAAAAu6N3l76kev/Uu5L//OXA//zlwP/85cD//OXA//zlwP/85cD/+uLA/8+rx/+vgcz/r4HN/6+Bzf+vgc3/r4HN/6+Bzf+vgc3/r4HM/8+rx//64sD//OXA//zlwP/85cD//OXA//zlwP/85cD/1LmS/76kev+7oXiWAAAAAAAAAAC3l28gvaN5+L6kev7t1a///OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+/Twv/Qq8f/u5HK/7OGzP+zhsz/u5HK/9Crx//v08L//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+3Vr/++pHr+vaN5+LeXbyAAAAAAAAAAAAAAAAC6oneCvqR6/8Wsg//54Lz//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/34Lz/xayD/76kev+6oneCAAAAAAAAAAAAAAAAAAAAAH9/VQa8oHjLvqR6/8yyiv/64r7//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD/+uK+/8yyiv++pHr/vKB4y39/VQYAAAAAAAAAAAAAAAAAAAAAAAAAALKhbh67o3nkvqR6/8yyiv/54Lz//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//ngvP/Msor/vqR6/7ujeeSyoW4eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALqbdim7o3nkvqR6/8Wsg//t1a///OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/t1a//xayD/76kev+7o3nkupt2KQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALKhbh68oHjLvqR6/76kev7Uu5L/8tq1//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/y2rX/1LmS/76kev6+pHr/vKB4y7Khbh4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/VQa6oneCvaN5+L6kev++pHr/y7GJ/9/Fnv/s1K7/9t25//rivv/64r7/9t25/+zUrv/fxZ7/y7GJ/76kev++pHr/vaN5+Lqid4J/f1UGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC3l28gu6F4lryhePO+pHr/vqR6/76kev++pHr/vqR6/76kev++pHr/vqR6/76kev++pHr/vKF487uheJa3l28gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAootzC72feFW9oXiYvKF3yL2jeOq9oXj5vaF4+b2jeOq8oXfIvaF4mL2feFWii3MLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gB///gAH//gAAf/wAAD/4AAAf8AAAD+AAAAfAAAADwAAAA4AAAAGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAABwAAAA8AAAAPgAAAH8AAAD/gAAB/8AAA//gAAf/+AAf//4Af/
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
Filters used by [[store.filterTiddlers()]] follow a grammar that can be described using http://en.wikipedia.org/wiki/EBNF:
{{{
filter := filterStep {'|' filterStep }
filterStep := '[' filterElements ']', {'[' filterElements ']'}
filterElements := filterElement, {filterElement}
filterElement := '['TiddlerName']' | tag'['TagName']' | sort'['SortField']' | limit'['NoOfResults']'
}}}
Another way of expressing this, without the (in this case) slightly confusing EBNF syntax, might be:

A filter string is of the form:
{{{
// only one filterStep is required
filterStep | filterStep ...
}}}
where filterStep is of the form:
{{{
// only one filterElements is required
[filterElements] [filterElements] ...
}}}
where filterElements is one or more of the following:
{{{
    [TiddlerName]
    tag[TagName]
    sort[SortField]
    limit[NoOfResults]
}}}
!Example
{{{
    store.filterTiddlers("[tag[blog post]][sort[-modified]][limit[10]]")
}}}
''returns:'' any tiddler tagged "blog post", limited to the 10 most recently edited tiddlers.
!Allowed types of filterElement
|filter|meaning|
|[text]|refers to a single tiddler with title "text"|
|{{{[text text]}}}|refers to a single tiddler with title "text text"|
|tag[tag]|refers to any tiddler tagged with "tag"|
|tag[a tag]|refers to any tiddler tagged with "{{{[[a tag]]}}}"|
|sort[+field] or [sort[field]]|sorts any results already collected in ascending order by "field"|
|sort[-field]|sorts and results already collected in descending order by "field"|
|limit[integer]|limits the results array to contain no more than "integer" tiddlers|
!Multiple filterElements and filterSteps
#Multiple ''filterElements'' are combined by concatenating the results from each ''filterElements''.
#Multiple ''filterStep'', on the other hand, are evaluated in succession, with the results of each ''filterStep'' used as the tiddler set for the next ''filterStep''.
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
!Summary
This <<tag global>> function returns the first value of a given parameter or a default value when {{{null}}}.
!Signature
{{{function getParam(params, name, defaultValue) {} }}}
!Returns
string: the value of a named parameter
!Arguments
;1. params
:the parameters to be searched
;2. name
:the name of the parameter you want the first value of
;3. defaultValue
:the default value to return if no parameter of the given name can be found
!Example
Assume we had a macro to be called like this...
{{{
<<foo tag:"Some Tag">>
}}}
You can retrieve the value of the named parameter {{{tag}}} using...
{{{
px = paramString.parseParams("anon", null, false, false, false);
getParam(px,"tag"," ");
}}}
''returns:'' {{{'Some Tag'}}}

Also see [[String.prototype.parseParams()]]...
!Summary
This <<tag global>> function returns the text inside a DOM element using the [[jQuery .text()|api.jquery.com/text]] function.
!Signature
{{{function getPlainText(e) {}}}}
!Returns
string: the text representation of a DOM element
!Arguments
;1. e
:the DOM element
!Example
{{{
getPlainText(place.lastChild);
}}}
A ''getWeek'' method has been added to the Date object.  Any date object can return it's week number (between 1 and 52).
The function can be use like this:
//{{{
var date = new Date();	// Mon Feb 07 2011 23:35:42 GMT+0100 (CET) {}
date.getWeek();		// 6
//}}}
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
!Description
The gradient macro renders a vertical or horizontal gradient as a background to content.
!Usage
{{{
<<gradient direction start-color mid-color end-color>>
INNER CONTENT
>>
}}}
{{annotation{
''Note'': Notice how the INNER CONTENT directly follows the gradient macro and is closed with another pair of greater-than characters {{{>>}}}.
}}}
Use the following parameters...
| !Parameter | !Description |
|''direction''|either {{{vert}}} (vertical) or {{{horiz}}} (horizontal)|
|''start-color''|the color at which the gradient starts|
|''mid-color''|the color at the middle of the gradient, not required|
|''end-color''|the color at which the gradient ends|
|''INNER CONTENT''|the wiki text rendered inside the gradient|
{{annotation{
''Note'': Using a mid-color is not required. It is enough to define a start- and an end-color for the gradient.
}}}
!Example
{{{
<<gradient horiz #abc #fff>>
@@color:white;font-size:5em;padding:10px;display:block;A GRADIENT@@
>>
}}}
<<gradient horiz #abc #fff>>
@@color:white;font-size:5em;padding:10px;display:block;A GRADIENT@@
>>
highlightHack is defined in main.js
{{{
var highlightHack = null; // Embarrassing hack department...
}}}
It is used to highlight text
[[Story.js|Story]] and Macros.js (the view macro) make use of this
Tiddlers used for the display in the html representation of TiddlyWiki.org, e.g. used for Transclusions via [[tiddler (macro)]].
Want to embed an iFrame into TiddlyWiki? See [[HTML Formatting]]...
!Description
The [[importTiddlers macro|importTiddlers]] outputs the same import wizard that is provided in the [[Backstage Area]]...
!Usage
{{{
<<importTiddlers>>
}}}
<<importTiddlers>>
/***
|''Name''|jQueryOutline|
|''Documentation''|http://listfiltr.tiddlyspace.com|
|''Author''|[[Tobias Beer|http://tobibeer.tiddlyspace.com]]|
|''Idea''|http://stackoverflow.com/questions/1852816/nested-ordered-lists|
|''Version''|0.4.0 (2013.09.24)|
|''CoreVersion''|2.5.3|
|''Readable Source''|https://raw.github.com/tobibeer/TiddlyWikiPlugins/master/resources/ListFiltrPlugin/jQueryOutline.js|
/%***/
/*{{{*/
(function(e){e.fn.outline=function(t,n){function r(e){if(!+e)return false;var t=String(+e).split(""),n="",r=3,i=["","C","CC","CCC","CD","D","DC","DCC","DCCC","CM","","X","XX","XXX","XL","L","LX","LXX","LXXX","XC","","I","II","III","IV","V","VI","VII","VIII","IX"];while(r--)n=(i[+t.pop()+r*10]||"")+n;return Array(+t.join("")+1).join("M")+n}function i(e){var n,i,s="",o,u=t.counterTemplates,a=t.plain,f=a?e.length-1:0;for(n=f;n<e.length;n++){i=e[n];o=n%u.length;switch(u[o].substr(0,1)){case"a":i=String.fromCharCode(96+i);break;case"A":i=String.fromCharCode(64+i);break;case"i":i=r(i).toLowerCase();break;case"I":i=r(i);break}s+=i+u[o].substr(1)}return s+" "}var t=e.extend({},e.fn.outline.defaults,t),n=n||[];this.each(function(){e(this).children("li").each(function(r){var s=n.concat([r+1]);e("<span></span>").addClass(t.liClass).text(i(s)).prependTo(this);e(this).children("ol").outline(t,s)})});if(!n.length)this.addClass(t.olClass)};e.fn.outline.defaults={liClass:"pseudo-ol-li",olClass:"pseudo-ol",counterTemplates:["1.","a.","i."],plain:true};var t=config.macros.outline={handler:function(t){var n=e(t).children().last();while(n.is("br")){n=n.prev()}if(n.is("span, div")){n=n.children("ol").first()}n.outline()}}})(jQuery);config.shadowTiddlers["StyleSheetjQueryOutline"]="/*{{{*/\n"+"ol .pseudo-ol-li { display: none }\n"+"ol.pseudo-ol, ol.pseudo-ol ol { list-style: none; margin-left: 1.5em; padding-left: 0.5em;}\n"+"ol.pseudo-ol {margin-left: 0.5em;padding-left:0em;}\n"+"ol.pseudo-ol .pseudo-ol-li { display: inline; font-weight: bold; padding-right:3px; }\n"+"/*}}}*/";store.addNotification("StyleSheetjQueryOutline",refreshStyles)
//%/
/*
 * jQuery Autocomplete plugin 1.1
 *
 * Copyright (c) 2009 Jรถrn Zaefferer
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 * Revision: $Id: jquery.autocomplete.js 15 2009-08-22 10:30:27Z joern.zaefferer $
*/
//{{{
(function($){$.fn.extend({autocomplete:function(urlOrData,options){var isUrl=typeof urlOrData=="string";options=$.extend({},$.Autocompleter.defaults,{url:isUrl?urlOrData:null,data:isUrl?null:urlOrData,delay:isUrl?$.Autocompleter.defaults.delay:10,max:options&&!options.scroll?10:150},options);options.highlight=options.highlight||function(value){return value;};options.formatMatch=options.formatMatch||options.formatItem;return this.each(function(){new $.Autocompleter(this,options);});},result:function(handler){return this.bind("result",handler);},search:function(handler){return this.trigger("search",[handler]);},flushCache:function(){return this.trigger("flushCache");},setOptions:function(options){return this.trigger("setOptions",[options]);},unautocomplete:function(){return this.trigger("unautocomplete");}});$.Autocompleter=function(input,options){var KEY={UP:38,DOWN:40,DEL:46,TAB:9,RETURN:13,ESC:27,COMMA:188,PAGEUP:33,PAGEDOWN:34,BACKSPACE:8};var $input=$(input).attr("autocomplete","off").addClass(options.inputClass);var timeout;var previousValue="";var cache=$.Autocompleter.Cache(options);var hasFocus=0;var lastKeyPressCode;var config={mouseDownOnSelect:false};var select=$.Autocompleter.Select(options,input,selectCurrent,config);var blockSubmit;$.browser.opera&&$(input.form).bind("submit.autocomplete",function(){if(blockSubmit){blockSubmit=false;return false;}});$input.bind(($.browser.opera?"keypress":"keydown")+".autocomplete",function(event){hasFocus=1;lastKeyPressCode=event.keyCode;switch(event.keyCode){case KEY.UP:event.preventDefault();if(select.visible()){select.prev();}else{onChange(0,true);}break;case KEY.DOWN:event.preventDefault();if(select.visible()){select.next();}else{onChange(0,true);}break;case KEY.PAGEUP:event.preventDefault();if(select.visible()){select.pageUp();}else{onChange(0,true);}break;case KEY.PAGEDOWN:event.preventDefault();if(select.visible()){select.pageDown();}else{onChange(0,true);}break;case options.multiple&&$.trim(options.multipleSeparator)==","&&KEY.COMMA:case KEY.TAB:case KEY.RETURN:if(selectCurrent()){event.preventDefault();blockSubmit=true;return false;}break;case KEY.ESC:select.hide();break;default:clearTimeout(timeout);timeout=setTimeout(onChange,options.delay);break;}}).focus(function(){hasFocus++;}).blur(function(){hasFocus=0;if(!config.mouseDownOnSelect){hideResults();}}).click(function(){if(hasFocus++>1&&!select.visible()){onChange(0,true);}}).bind("search",function(){var fn=(arguments.length>1)?arguments[1]:null;function findValueCallback(q,data){var result;if(data&&data.length){for(var i=0;i<data.length;i++){if(data[i].result.toLowerCase()==q.toLowerCase()){result=data[i];break;}}}if(typeof fn=="function")fn(result);else $input.trigger("result",result&&[result.data,result.value]);}$.each(trimWords($input.val()),function(i,value){request(value,findValueCallback,findValueCallback);});}).bind("flushCache",function(){cache.flush();}).bind("setOptions",function(){$.extend(options,arguments[1]);if("data"in arguments[1])cache.populate();}).bind("unautocomplete",function(){select.unbind();$input.unbind();$(input.form).unbind(".autocomplete");});function selectCurrent(){var selected=select.selected();if(!selected)return false;var v=selected.result;previousValue=v;if(options.multiple){var words=trimWords($input.val());if(words.length>1){var seperator=options.multipleSeparator.length;var cursorAt=$(input).selection().start;var wordAt,progress=0;$.each(words,function(i,word){progress+=word.length;if(cursorAt<=progress){wordAt=i;return false;}progress+=seperator;});words[wordAt]=v;v=words.join(options.multipleSeparator);}v+=options.multipleSeparator;}$input.val(v);hideResultsNow();$input.trigger("result",[selected.data,selected.value]);return true;}function onChange(crap,skipPrevCheck){if(lastKeyPressCode==KEY.DEL){select.hide();return;}var currentValue=$input.val();if(!skipPrevCheck&&currentValue==previousValue)return;previousValue=currentValue;currentValue=lastWord(currentValue);if(currentValue.length>=options.minChars){$input.addClass(options.loadingClass);if(!options.matchCase)currentValue=currentValue.toLowerCase();request(currentValue,receiveData,hideResultsNow);}else{stopLoading();select.hide();}};function trimWords(value){if(!value)return[""];if(!options.multiple)return[$.trim(value)];return $.map(value.split(options.multipleSeparator),function(word){return $.trim(value).length?$.trim(word):null;});}function lastWord(value){if(!options.multiple)return value;var words=trimWords(value);if(words.length==1)return words[0];var cursorAt=$(input).selection().start;if(cursorAt==value.length){words=trimWords(value)}else{words=trimWords(value.replace(value.substring(cursorAt),""));}return words[words.length-1];}function autoFill(q,sValue){if(options.autoFill&&(lastWord($input.val()).toLowerCase()==q.toLowerCase())&&lastKeyPressCode!=KEY.BACKSPACE){$input.val($input.val()+sValue.substring(lastWord(previousValue).length));$(input).selection(previousValue.length,previousValue.length+sValue.length);}};function hideResults(){clearTimeout(timeout);timeout=setTimeout(hideResultsNow,200);};function hideResultsNow(){var wasVisible=select.visible();select.hide();clearTimeout(timeout);stopLoading();if(options.mustMatch){$input.search(function(result){if(!result){if(options.multiple){var words=trimWords($input.val()).slice(0,-1);$input.val(words.join(options.multipleSeparator)+(words.length?options.multipleSeparator:""));}else{$input.val("");$input.trigger("result",null);}}});}};function receiveData(q,data){if(data&&data.length&&hasFocus){stopLoading();select.display(data,q);autoFill(q,data[0].value);select.show();}else{hideResultsNow();}};function request(term,success,failure){if(!options.matchCase)term=term.toLowerCase();var data=cache.load(term);if(data&&data.length){success(term,data);}else if((typeof options.url=="string")&&(options.url.length>0)){var extraParams={timestamp:+new Date()};$.each(options.extraParams,function(key,param){extraParams[key]=typeof param=="function"?param():param;});$.ajax({mode:"abort",port:"autocomplete"+input.name,dataType:options.dataType,url:options.url,data:$.extend({q:lastWord(term),limit:options.max},extraParams),success:function(data){var parsed=options.parse&&options.parse(data)||parse(data);cache.add(term,parsed);success(term,parsed);}});}else{select.emptyList();failure(term);}};function parse(data){var parsed=[];var rows=data.split("\n");for(var i=0;i<rows.length;i++){var row=$.trim(rows[i]);if(row){row=row.split("|");parsed[parsed.length]={data:row,value:row[0],result:options.formatResult&&options.formatResult(row,row[0])||row[0]};}}return parsed;};function stopLoading(){$input.removeClass(options.loadingClass);};};$.Autocompleter.defaults={inputClass:"ac_input",resultsClass:"ac_results",loadingClass:"ac_loading",minChars:1,delay:400,matchCase:false,matchSubset:true,matchContains:false,cacheLength:10,max:100,mustMatch:false,extraParams:{},selectFirst:true,formatItem:function(row){return row[0];},formatMatch:null,autoFill:false,width:0,multiple:false,multipleSeparator:", ",highlight:function(value,term){return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)("+term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi,"\\$1")+")(?![^<>]*>)(?![^&;]+;)","gi"),"<strong>$1</strong>");},scroll:true,scrollHeight:180};$.Autocompleter.Cache=function(options){var data={};var length=0;function matchSubset(s,sub){if(!options.matchCase)s=s.toLowerCase();var i=s.indexOf(sub);if(options.matchContains=="word"){i=s.toLowerCase().search("\\b"+sub.toLowerCase());}if(i==-1)return false;return i==0||options.matchContains;};function add(q,value){if(length>options.cacheLength){flush();}if(!data[q]){length++;}data[q]=value;}function populate(){if(!options.data)return false;var stMatchSets={},nullData=0;if(!options.url)options.cacheLength=1;stMatchSets[""]=[];for(var i=0,ol=options.data.length;i<ol;i++){var rawValue=options.data[i];rawValue=(typeof rawValue=="string")?[rawValue]:rawValue;var value=options.formatMatch(rawValue,i+1,options.data.length);if(value===false)continue;var firstChar=value.charAt(0).toLowerCase();if(!stMatchSets[firstChar])stMatchSets[firstChar]=[];var row={value:value,data:rawValue,result:options.formatResult&&options.formatResult(rawValue)||value};stMatchSets[firstChar].push(row);if(nullData++<options.max){stMatchSets[""].push(row);}};$.each(stMatchSets,function(i,value){options.cacheLength++;add(i,value);});}setTimeout(populate,25);function flush(){data={};length=0;}return{flush:flush,add:add,populate:populate,load:function(q){if(!options.cacheLength||!length)return null;if(!options.url&&options.matchContains){var csub=[];for(var k in data){if(k.length>0){var c=data[k];$.each(c,function(i,x){if(matchSubset(x.value,q)){csub.push(x);}});}}return csub;}else
if(data[q]){return data[q];}else
if(options.matchSubset){for(var i=q.length-1;i>=options.minChars;i--){var c=data[q.substr(0,i)];if(c){var csub=[];$.each(c,function(i,x){if(matchSubset(x.value,q)){csub[csub.length]=x;}});return csub;}}}return null;}};};$.Autocompleter.Select=function(options,input,select,config){var CLASSES={ACTIVE:"ac_over"};var listItems,active=-1,data,term="",needsInit=true,element,list;function init(){if(!needsInit)return;element=$("<div/>").hide().addClass(options.resultsClass).css("position","absolute").appendTo(document.body);list=$("<ul/>").appendTo(element).mouseover(function(event){if(target(event).nodeName&&target(event).nodeName.toUpperCase()=='LI'){active=$("li",list).removeClass(CLASSES.ACTIVE).index(target(event));$(target(event)).addClass(CLASSES.ACTIVE);}}).click(function(event){$(target(event)).addClass(CLASSES.ACTIVE);select();input.focus();return false;}).mousedown(function(){config.mouseDownOnSelect=true;}).mouseup(function(){config.mouseDownOnSelect=false;});if(options.width>0)element.css("width",options.width);needsInit=false;}function target(event){var element=event.target;while(element&&element.tagName!="LI")element=element.parentNode;if(!element)return[];return element;}function moveSelect(step){listItems.slice(active,active+1).removeClass(CLASSES.ACTIVE);movePosition(step);var activeItem=listItems.slice(active,active+1).addClass(CLASSES.ACTIVE);if(options.scroll){var offset=0;listItems.slice(0,active).each(function(){offset+=this.offsetHeight;});if((offset+activeItem[0].offsetHeight-list.scrollTop())>list[0].clientHeight){list.scrollTop(offset+activeItem[0].offsetHeight-list.innerHeight());}else if(offset<list.scrollTop()){list.scrollTop(offset);}}};function movePosition(step){active+=step;if(active<0){active=listItems.size()-1;}else if(active>=listItems.size()){active=0;}}function limitNumberOfItems(available){return options.max&&options.max<available?options.max:available;}function fillList(){list.empty();var max=limitNumberOfItems(data.length);for(var i=0;i<max;i++){if(!data[i])continue;var formatted=options.formatItem(data[i].data,i+1,max,data[i].value,term);if(formatted===false)continue;var li=$("<li/>").html(options.highlight(formatted,term)).addClass(i%2==0?"ac_even":"ac_odd").appendTo(list)[0];$.data(li,"ac_data",data[i]);}listItems=list.find("li");if(options.selectFirst){listItems.slice(0,1).addClass(CLASSES.ACTIVE);active=0;}if($.fn.bgiframe)list.bgiframe();}return{display:function(d,q){init();data=d;term=q;fillList();},next:function(){moveSelect(1);},prev:function(){moveSelect(-1);},pageUp:function(){if(active!=0&&active-8<0){moveSelect(-active);}else{moveSelect(-8);}},pageDown:function(){if(active!=listItems.size()-1&&active+8>listItems.size()){moveSelect(listItems.size()-1-active);}else{moveSelect(8);}},hide:function(){element&&element.hide();listItems&&listItems.removeClass(CLASSES.ACTIVE);active=-1;},visible:function(){return element&&element.is(":visible");},current:function(){return this.visible()&&(listItems.filter("."+CLASSES.ACTIVE)[0]||options.selectFirst&&listItems[0]);},show:function(){var offset=$(input).offset();element.css({width:typeof options.width=="string"||options.width>0?options.width:$(input).width(),top:offset.top+input.offsetHeight,left:offset.left}).show();if(options.scroll){list.scrollTop(0);list.css({maxHeight:options.scrollHeight,overflow:'auto'});if($.browser.msie&&typeof document.body.style.maxHeight==="undefined"){var listHeight=0;listItems.each(function(){listHeight+=this.offsetHeight;});var scrollbarsVisible=listHeight>options.scrollHeight;list.css('height',scrollbarsVisible?options.scrollHeight:listHeight);if(!scrollbarsVisible){listItems.width(list.width()-parseInt(listItems.css("padding-left"))-parseInt(listItems.css("padding-right")));}}}},selected:function(){var selected=listItems&&listItems.filter("."+CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);return selected&&selected.length&&$.data(selected[0],"ac_data");},emptyList:function(){list&&list.empty();},unbind:function(){element&&element.remove();}};};$.fn.selection=function(start,end){if(start!==undefined){return this.each(function(){if(this.createTextRange){var selRange=this.createTextRange();if(end===undefined||start==end){selRange.move("character",start);selRange.select();}else{selRange.collapse(true);selRange.moveStart("character",start);selRange.moveEnd("character",end);selRange.select();}}else if(this.setSelectionRange){this.setSelectionRange(start,end);}else if(this.selectionStart){this.selectionStart=start;this.selectionEnd=end;}});}var field=this[0];if(field.createTextRange){var range=document.selection.createRange(),orig=field.value,teststring="<->",textLength=range.text.length;range.text=teststring;var caretAt=field.value.indexOf(teststring);field.value=orig;this.selection(caretAt,caretAt+textLength);return{start:caretAt,end:caretAt+textLength}}else if(field.selectionStart!==undefined){return{start:field.selectionStart,end:field.selectionEnd}}};})(jQuery);

//}}}
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
!Description
The [[list macro|list]] outputs a list of tiddlers for a certain list-type.
!Usage
{{{
<<list
	<list-type>
	template: [[My List Template Tiddler]]
	emptyMessage: "No matching tiddler found..."]
>>
}}}
The following parameters can be defined...
| !Parameter | !Description |width:200px; !Default |h
|<list-type> |always the __first__ parameter, the list-type defines what kind of list is generated which, e.g.:<br><<tiddler "list##TYPES">>|{{{<none>}}}<br>interpreted as {{{all}}}|
|''template''|a reference to a tiddler or """tiddler section""" defining how each item in the resulting list is displayed<br><br>''Example:''<br>To also display the author for each list item create a template tiddler with the following text:<br>{{{<<view title link>> by <<view modified link>>}}}<br>Then reference to this tiddler using the {{{template}}} parameter.|{{{<<view title link>>}}}<br>See [[view macro|view]]|
|''emptyMessage''|defines the wiki text displayed when the resulting list is empty||
!Example
The last five modified plugins:
{{{<<list filter "[tag[systemConfig]] [sort[-modified]] [limit[5]]">>}}}
<<list filter "[tag[systemConfig]] [sort[-modified]] [limit[5]]">>{{annotation{
''Note'': The sequence for filter parameters does matter, i.e. use {{{sort}}} before {{{limit}}} and everything else before either, otherwise you would fetch a defined number of arbitrary tiddlers which are only then matched or sorted.
}}}/%
!TYPES
;"""all"""
:list all tiddlers:
:{{{<<list all>>}}}
;"""filter"""
:list tiddlers matching a given [[filter criteria|Filters]], e.g. all [[Plugins]]:
:{{{<<list filter [tag[systemConfig]]>>}}}
;"""missing"""
:list tiddlers that have links to them but are not defined:
:{{{<<list missing>>}}}
;"""orphans"""
:list tiddlers that are not linked to from any other tiddlers:
:{{{<<list orphans>>}}}
;"""shadowed"""
:list [[Shadow Tiddlers]] that come with TiddlyWiki:
:{{{<<list shadowed>>}}}
;"""touched"""
:list tiddlers that have been modified locally since the wiki has loaded:
:{{{<<list touched>>}}}
!END%/
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
See [[Member]]...
!Description
The [[message]] macro is used in shadow tiddlers like the EditTemplate to recursively lookup and output a context related string from the core JavaScript.
!Usage
{{{
<span macro='message views.editor.tagPrompt'></span>
}}}
Enclosed in {{{<html>..</html>}}} the above renders as:
<<<
<html><span macro='message views.editor.tagPrompt'></span></html>
<<<
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
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="434 218 68 68"
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 478.39694 232.53705 L 478.39694 232.53705 
		C 477.1145 231.85132 475.77875 231.30147 474.41058 230.88734 L 474.41058 218.24994 L 461.58942 218.24994 
		L 461.58942 230.88734 C 460.22125 231.30147 458.8855 231.85132 457.60306 232.53705 L 448.66824 223.60214 
		L 439.6022 232.66814 L 448.53717 241.60304 C 447.8515 242.8854 447.30157 244.22116 446.88745 245.58936 
		L 434.25 245.58936 L 434.25 258.41052 L 446.88745 258.41052 
		C 447.30157 259.77869 447.8515 261.11447 448.53717 262.39688 L 439.6022 271.33173 L 448.66824 280.3978 
		L 457.60306 271.46283 C 458.8855 272.14862 460.22125 272.69846 461.58942 273.11252 L 461.58942 285.74988 
		L 474.41058 285.74988 L 474.41058 273.11252 C 475.77875 272.69846 477.1145 272.14862 478.39694 271.46283 
		L 487.33176 280.3978 L 496.39767 271.33173 L 487.46286 262.39688 
		C 488.14853 261.11447 488.69836 259.77869 489.11255 258.41052 L 501.74988 258.41052 L 501.74988 245.58936 
		L 489.11255 245.58936 C 488.69836 244.22116 488.14853 242.8854 487.46286 241.60304 L 496.39767 232.66814 
		L 487.33176 223.60214 Z M 475.3328 244.66714 C 479.3825 248.71698 479.3825 255.2829 475.3328 259.33273 
		C 471.28296 263.3826 464.71704 263.3826 460.66724 259.33273 
		C 456.61737 255.2829 456.61737 248.71698 460.66724 244.66714 
		C 464.71704 240.61734 471.28296 240.61734 475.3328 244.66714" fill="#111"
		class="glyph"/>
	</g>
</g>
</svg>
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
!Description
The newJournal macro generates a {{button{New Journal}}} button that allows you to to create a journal tiddler with...
*the current time and date as the title
*the tag <<tag journal>> by default

In all other respects the newJournal macro is identical to the [[newTiddler]] macro.
!Usage
{{{
<<newJournal [date format] [default tag]>>
}}}
Use the optional first parameter to specify a custom [[date format|DateFormats]].
The optional second parameter allows to override the <<tag journal>> tag.

''Note:'' In addition, all parameters available for the [[newTiddler]] macro can be used as well.
The [[newTiddler]] macro generates a button to create a new tiddler from, e.g.<<newTiddler>>. See [[Tiddler Templates]] on how to create a new tiddler from a template tiddler.

It can be used with the following named parameters, all of which are optional:
|!"""Parameter"""|!Description|!Default|h
| ''label''|button label |{{{config.macros.newTiddler.label}}}|
| ''prompt''|button tooltip |{{{config.macros.newTiddler.prompt}}}|
| ''"""title"""''|title for the new tiddler (defaults to "New Tiddler") |{{{config.macros.newTiddler.title}}}|
| ''text''|contents for the new tiddler |{{{config.views.editor.defaultText}}}<br/>{{{%0}}} being the new tiddler title |
| ''tag''|tag to be applied to the new tiddler; can be used repeatedly to specify multiple tags ||
| ''accessKey''|single letter to use as access key to trigger the button |{{{config.macros.newTiddler.accessKey}}}|
| ''focus''|the editable field that will be given focus when the new tiddler is opened, e.g. {{{title}}}, {{{text}}}, {{{tags}}} |title|
| ''template''|name of the HTML template used to display the new tiddler (defaults to EditTemplate) ||
| ''"""fields"""''|custom fields to be assigned to the new tiddler (space-separated list of key:value pairs; e.g. fields:"k1:v1 k2:v2") ||
!Usage
;<<newTiddler label:WikiWord text:"text" tag:tag tag:tag accessKey:key focus:field>>
:{{{
<<newTiddler label:WikiWord text:"text" tag:tag tag:tag accessKey:key focus:field>>
}}}
;to create a new tiddler with a [[custom field|Custom Fields]]@glossary {{{server.content-type}}} set to {{{text/javascript}}}, e.g.
:{{{
<<newTiddler label:"new javascript file" fields:"server.content-type:text/javascript">>
}}}
<<<
Only fields contained as input fields in the specified template can be primed with an initial value.
<<<
!Examples
{{{
<<newTiddler
	label:"New Tiddler"
	text:"Hello world."
	tag:"test"
	tag:"an example"
	accessKey:"1"
	focus:"tags"
>>
}}}
Using evaluated parameters, the content of {{{AnnotherTiddler}}} can be inserted as template text:
{{{
<<newTiddler text:{{store.getTiddlerText("AnnotherTiddler")}}>>
}}}
!Also see...
* [[newJournal]] macro

!Summary
This tiddler explains how node.js is involved in the new build process.
!Details
tbd
Functions involving notifications tag here, e.g. success messages after saving a tiddler...
<<tiddler "Suppressing Formatting">>
!Description
The [[option]] macro renders inputs for editing option cookies, e.g.
*checkboxes for boolean cookies
*input fields for text cookies
!Usage
{{{
UserName: <<option txtUserName>>
}}}
UserName: <<option txtUserName>>
{{{
<<option chkAutoSave>> Auto save changes?
}}}
<<option chkAutoSave>> Auto save changes?
!Description
The [[options]] macro outputs the same AdvancedOptions as you find in the [[Backstage Area]]...
!Usage
{{{
<<options>>
}}}
<<options>>
//{{{

(function($){
	
	var macro = config.macros.originalSource = {
		handler: function(place, macroName, params, wikifier, paramString, tiddler){
			
			if(tiddler.fields['info_source']) {
				wikify("Original Source: %0".format(tiddler.fields['info_source']), place);
			}
			
		}
		
	};
	
})(jQuery);
	
//}}}
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
!Description
The [[permaview]] macro provides a button which outputs a URL to all open tiddlers in the browsers' address bar.
!Usage
{{{
<<permaview>>
}}}
<<permaview>>
See [[Plugin]]
!Description
The [[plugins]] macro outputs the plugins manager...
!Usage
{{{
<<plugins>>
}}}
<<plugins>>
<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7" lang="en"> <![endif]-->
<!--[if IE 7]>    <html class="no-js lt-ie9 lt-ie8" lang="en"> <![endif]-->
<!--[if IE 8]>    <html class="no-js lt-ie9" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
<head>
	<meta charset="utf-8"/>
	<title>Policy Maker App</title>
	
	<link rel="stylesheet" href="http://tiddlyspace.com/bags/common/tiddlers/reset">
	<link rel="stylesheet" href="policymaker.css">

	<script src="js/modernizr-2.5.3.min.js"></script>
</head>
<body>
	<div id="wrapper">
		<div class="beta">Beta</div>

		<section class="guest-view">
			<h2>You are not a member of this space.</h2>
			<p class="big">That means you can not edit the policy of this spaces. If you want to edit the policy of your space please include the <a href="http://policymaker.tiddlyspace.com">policymaker</a> space.</p>
		</section>

		<section class="policy-view public" data-privacy="public">
			<section>
				<h3>Current space: <strong></strong></h3>
				<div class="porp">
					<button class="public">Use public bag</button>
					<button class="private">Use private bag</button>
				</div>
			</section>
			<section>
				<form action="">
					<label for="readinput">Read</label>
					<input type="text" id="readinput" name="read" />
					<label for="writeinput">Write</label>
					<input type="text" id="writeinput" name="write" />
					<label for="createinput">Create</label>
					<input type="text" id="createinput" name="create" />
					<label for="deleteinput">Delete</label>
					<input type="text" id="deleteinput" name="delete" />
					<label for="acceptinput">Accept</label>
					<input type="text" id="acceptinput" name="accept" />
					<label for="manageinput">Manage</label>
					<input type="text" id="manageinput" name="manage" />
					<div class="form-ctrls">
						<button type="submit" class="submit btn">Save</button>
						<button class="reset btn">Cancel</button>
					</div>
				</form>
			</section>
			<section class="help">
				<h4>How To:</h4>
				<p>A string representing one of these built in meanings:
					<ul>
						<li>GUEST: The default unauthenticated user.</li>
						<li>NONE: No user, whether GUEST or authenticated, may pass this constraint. Web access is completely restricted for this constraint.</li>
						<li>ANY: Any authenticated (not GUEST) user.</li>
					</ul>
					For more info visit <a href="http://tiddlyweb.tiddlyspace.com/bags/tiddlyweb_public/tiddlers/policy">here</a>.
				</p>
			</section>
		</section>
	</div>

</body>
<script src="http://tiddlyspace.com/bags/common/tiddlers/jquery.js"></script>
<script src="http://tiddlyspace.com/bags/tiddlyspace/tiddlers/chrjs"></script>
<script src="http://tiddlyspace.com/bags/common/tiddlers/backstage.js"></script>
<script src="policymaker.js"></script>
</html>
/* line 13, sass/policymaker.scss */
html {
  background: #f2f2f2;
}

/* line 17, sass/policymaker.scss */
body {
  font-family: "Helvetica Neue", Helvetica, Arial, Sans-serif;
  letter-spacing: 0.02em;
  color: #4d4d4d;
  font-size: 62.5%;
  background-position: 0px 0px;
}

/* line 25, sass/policymaker.scss */
#wrapper {
  margin: 0 auto 2em;
  max-width: 960px;
  position: relative;
}
/* line 30, sass/policymaker.scss */
#wrapper > section {
  padding: 1em;
  box-shadow: 0px 0px 4px rgba(50, 50, 50, 0.2);
  margin: 2em 0 0;
}

/* line 37, sass/policymaker.scss */
.beta {
  font-size: 1.6em;
  background: #EB4715;
  color: white;
  padding: 0.6em;
  display: inline;
  position: absolute;
  top: -3em;
  right: 0;
}

/* line 47, sass/policymaker.scss */
.guest-view {
  background: #db3138;
  font-size: 2.4em;
  color: white;
  display: none;
}
/* line 53, sass/policymaker.scss */
.guest-view a {
  color: white;
}

/* line 58, sass/policymaker.scss */
.policy-view {
  font-size: 2.4em;
  background: #fff;
  padding-top: 0;
  position: relative;
}
/* line 64, sass/policymaker.scss */
.policy-view h3 {
  font-size: 1.5em;
}

/* line 69, sass/policymaker.scss */
.public {
  border-top: 4px solid #0082af;
}

/* line 73, sass/policymaker.scss */
.private {
  border-top: 4px solid #bc4378;
}

/* line 77, sass/policymaker.scss */
.disabled {
  border-top: 4px solid #ccc;
  color: #ccc;
}
/* line 81, sass/policymaker.scss */
.disabled label {
  color: #ccc;
}

/* line 86, sass/policymaker.scss */
.porp {
  margin-bottom: 1.5em;
}

/* line 90, sass/policymaker.scss */
div.porp button {
  background: #fff;
  color: #ccc;
  border: 2px solid #fff;
}

/* line 96, sass/policymaker.scss */
.public .public {
  border: 2px solid #0082af;
  color: #0082af;
}

/* line 101, sass/policymaker.scss */
.private .private {
  border: 2px solid #bc4378;
  color: #bc4378;
}

/* line 106, sass/policymaker.scss */
.private button.public:hover {
  color: #ADD1DD;
  border: 2px solid #ADD1DD;
}

/* line 111, sass/policymaker.scss */
.public button.private:hover {
  color: #DCA2BB;
  border: 2px solid #dca2bb;
}

/* line 118, sass/policymaker.scss */
.disabled .public, .disabled .private {
  color: #ccc;
  border: 2px solid #ccc;
}

/* line 124, sass/policymaker.scss */
form {
  max-width: 600px;
}

/* line 128, sass/policymaker.scss */
label {
  width: 29%;
  display: inline-block;
  padding-left: 1%;
}

/* line 134, sass/policymaker.scss */
input {
  font-size: inherit;
  width: 65%;
  margin-bottom: 0.5em;
  border: 1px solid #BDBDBD;
  padding: 0.2em;
}

/* line 142, sass/policymaker.scss */
.public input {
  color: #ADD1DD;
}
/* line 145, sass/policymaker.scss */
.public input:focus {
  outline: 0;
  border-color: rgba(0, 130, 175, 0.8);
  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(0, 130, 175, 0.6);
  -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(0, 130, 175, 0.6);
  -ms-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(0, 130, 175, 0.6);
  -o-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(0, 130, 175, 0.6);
  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(0, 130, 175, 0.6);
}

/* line 152, sass/policymaker.scss */
.lt-ie9 .public input:focus {
  border-color: #0082af;
}

/* line 156, sass/policymaker.scss */
.private input {
  color: #DCA2BB;
}
/* line 159, sass/policymaker.scss */
.private input:focus {
  outline: 0;
  border-color: rgba(188, 67, 122, 0.8);
  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(0, 130, 175, 0.6);
  -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(0, 130, 175, 0.6);
  -ms-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(0, 130, 175, 0.6);
  -o-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(0, 130, 175, 0.6);
  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(0, 130, 175, 0.6);
}

/* line 166, sass/policymaker.scss */
.lt-ie9 .private input:focus {
  border-color: #bc4378;
}

/* line 170, sass/policymaker.scss */
.public input.editing, .public input.changed {
  color: #0082af;
}

/* line 174, sass/policymaker.scss */
.private input.editing, .private input.changed {
  color: #bc4378;
}

/* line 178, sass/policymaker.scss */
.form-ctrls {
  margin-top: 1em;
}
/* line 181, sass/policymaker.scss */
.form-ctrls button {
  padding: 0.65em 1em;
}

/* line 186, sass/policymaker.scss */
button {
  cursor: pointer;
  padding: 0.65em 0.5em;
  font-size: inherit;
  border: none;
  color: #fff;
}

/* line 194, sass/policymaker.scss */
.public button {
  background: #0082af;
}

/* line 198, sass/policymaker.scss */
.private button {
  background: #bc4378;
}

/* line 202, sass/policymaker.scss */
.disabled button {
  background: #ccc;
}

/* line 206, sass/policymaker.scss */
form button.reset {
  background: none;
  color: #0082af;
}

/* line 211, sass/policymaker.scss */
.disabled form button.reset {
  color: #ccc;
}

/* line 215, sass/policymaker.scss */
.private .reset {
  color: #bc4378;
}

/* line 219, sass/policymaker.scss */
.help {
  font-size: 0.67em;
  width: 32%;
  background: #F0F4F8;
  box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25), -1px 0px 3px 0px rgba(0, 0, 0, 0.25);
  position: absolute;
  right: -3em;
  top: 3em;
  border-radius: 2px;
  padding: 1em;
}

/* line 230, sass/policymaker.scss */
.help, .help a {
  color: #8C9DA7;
}

/* line 234, sass/policymaker.scss */
.disabled .help {
  background: #fff;
  color: #ccc;
}
(function($, tw) {

	var bag,
		form,
		space,
		owner,
		publicPolicy,
		privatePolicy;

	function guestView() {
		$(".policy-view")
			.addClass("disabled")
			.find("input, button")
				.attr("disabled", "disabled");

		$(".guest-view").show();

	}

	function policyView() {
		var $pview = $(".policy-view");
		$pview.find("section h3 strong").text(space);
		form = $pview.find("form");

		function selectPolicy(newType) {
			var oldType = (newType === "public") ? "private" : "public";
			if($pview.hasClass( oldType )) {
				$pview
					.removeClass( oldType )
					.addClass( newType )
					.data("privacy", newType);
				fetchPolicy( newType );
			}
		}

		$("button.public", $pview).click(function() {
			selectPolicy( "public" );
			return false;
		});
		$("button.private", $pview).click(function() {
			selectPolicy( "private" );
			return false;
		});

		fetchPolicy( $pview.data("privacy") );
		setFormHandlers(form);
	}

	function fetchPolicy(type, callback) {
		bag = new tw.Bag(space + "_" + type, "/");
		bag.get(function(resource, status, xhr) {
			// on success
			owner = resource.policy.owner;
			populateForm(resource.policy);
			if(callback) {
				callback();
			}
		}, function(xhr, error, exc) {
			// error occurred
			console.log("error fetching");
			console.log(xhr, error, exc);
		});
	}

	function savePolicy(policy, successCB, errorCB) {
		console.log(policy);
		bag.policy = $.extend(bag.policy, policy);
		console.log(bag.policy);
		bag.put(function(resource, status, xhr) {
			// success
			if(successCB) {
				successCB(resource, status, xhr);
			}
		}, function(xhr, error, exc) {
			// error
			if(errorCB) {
				errorCB(xhr, error, exc);
			}
		});
	}
	
	function populateForm(policy) {
		form.find("#readinput")
			.val( policy.read.join(",") )
			.attr( "data-original", policy.read.join(",") );
		form.find("#writeinput")
			.val( policy.write.join(",") )
			.attr( "data-original", policy.write.join(",") );
		form.find("#deleteinput")
			.val( policy["delete"].join(",") )
			.attr( "data-original", policy["delete"].join(",") );
		form.find("#manageinput")
			.val( policy.manage.join(",") )
			.attr( "data-original", policy.manage.join(",") );
		form.find("#acceptinput")
			.val( policy["accept"].join(",") )
			.attr( "data-original", policy["accept"].join(",") );;
		form.find("#createinput")
			.val( policy.create.join(",") )
			.attr( "data-original", policy.create.join(",") );
	}
	
	function setFormHandlers(form) {
		
		form.find(".reset").click(function(e) {
			e.preventDefault();
			// reset the field values to their original
			form.find("input").each(function(i,el) {
				var $el = $(el);
				$el.val( $el.attr("data-original") );
			});
		});

		form.find(".submit").click(function(e) {
			e.preventDefault();
			var newpolicy = {
				owner: owner
			};
			form.find("input").each(function(i, el) {
				var $el = $(el),
					name = $el.attr("name"),
					val = $el.val();
				
				newpolicy[name] = (val === "") ? [] : val.replace(/ /g,'').split(",");
			})
			savePolicy(newpolicy, function(r,s,x){
				console.log(s);
			}, function(x,er,ex) {
				console.log(er);
			});
		});

		// input focusing
		form.find("input").focus(function(e){
			$(e.target).addClass("editing");
		}).blur(function(e){
			var $me = $(e.target);
			$me.removeClass("editing");
			if($me.val() !== $me.attr("data-original")) {
				$me.addClass("changed");
			}
		});
	}

	/*
	 * Start up, establishing if the current user has the power to edit.
	 */
	function init() {

		$.ajaxSetup({
			beforeSend: function(xhr) {
				xhr.setRequestHeader("X-ControlView", "false");
			}
		});

		$.ajax({
			dataType: 'json',
			url: '/status',
			success: function(data) {
				//space = data.space.name || "policymaker";
				space = (data.space) ? data.space.name : "policymaker";
				if (data.username === 'GUEST') {
					guestView();
				} else {
					$.ajax({
						url: '/spaces/' + space + '/members',
						success: policyView,
						error: guestView,
					});
				}
			}
		});
	}

	init();

})(jQuery, tiddlyweb);
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
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
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
When TiddlyWiki is displayed in readOnly mode, different toolbar commands are displayed and you won't be able to edit tiddlers.

This state is stored in the global JavaScript variable called {{{readOnly}}}. You can define how TiddlyWiki starts and whether or not readOnly mode should apply when viewed over the web.
!Summary
This topic describes how TiddlyWiki refreshes tiddler contents -- for now it's just a collection if tidbits.
!Tidbits
[[ยป from a discussion on macro refreshes ยป |https://groups.google.com/d/msg/tiddlywikidev/Pgbis-94ajg/kCN4THzT8WwJ]]
<<<

For a macro that renders tiddler contents, it can be considered best practice to always add a refresh handler to it.

The mechanism from the core list macro is a good example on implementing a refresh handler for a macro, see https://github.com/TiddlyWiki/tiddlywiki/blob/master/js/Macros.js#L50

Using this method, the actual output rendering is deferred to a refresh method that is first invoked when the macro is called. What (mechanism) exactly triggers a refresh in this case?

* on wikification, the ''handler'' is called
* ''handler'' calls ''refresh'' and ''refresh'' is called by config.refreshers.macro (usual refreshing mechanism)
* ''handler'' creates the list element and ''refresh'' refreshes its content
* ''config.refreshers'' is used by the ''refreshElements'' function which, in turn, is used by ''refreshPageTemplate'' and ''refreshDisplay'' (and ''config.refreshers.tiddler''), which, in turn, are called by ''refreshAll'' and are present in ''config.notifyTiddlers''
* all functions of ''config.notifyTiddlers'' are added to store via ''store.addNotification'' on startup, those and others ''store.namedNotifications'' are called by ''store.notify'' and ''store.nofityAll'' which, in turn, is called by
** [[store.removeTiddler()]]
** [[store.resetTiddler()]]
** [[store.setTiddlerTag()]]
** [[store.addTiddlerFields]]
** [[store.saveTiddler()]]
** [[store.setValue()]]
...which means that the ''refresh'' methods of macros are called at least each time one of these 6 methods is used which should be enough.

So, to make any macro refreshable, just use ''refresh'' method. Likewise, tiddler are refreshed on those store methods' calls as ''config.notifyTiddlers'' contain ''refreshDisplay'' as well.

To investigate this further, take a look at...
* https://github.com/TiddlyWiki/tiddlywiki/blob/master/js/Refresh.js
* https://github.com/TiddlyWiki/tiddlywiki/blob/master/js/TiddlyWiki.js

The DOM attributes added to the list macro wrapper can be interpreted as...
> "Dear TiddlyWiki, whenever you refresh (anything), please rerun the macro referenced via these attributes, i.e. these params."
This fires the refresh hander. There are some issues, if the tiddler is outside the story view, e.g. in the right sidebar in some special cases.

<<<
Runs various <<tag refresh>> functions
It refreshes the PageTemplate,  the display and the default stylesheets StyleSheetLayout, StyleSheetColors, StyleSheetPrint and the active stylesheet (usually StyleSheet but defined in the javascript variable config.refresherData.styleSheet)
!Description
The [[refreshDisplay]] helper macro outputs a button to redraw TiddlyWiki as currently displayed.
!Usage
{{{
<<refreshDisplay>>
}}}
<<refreshDisplay>>
!Summary
This <<tag global>> function refreshes the backstage if open and calls the [[refreshElements()]] function for all elements in the dom element with id "contentWrapper".
!Signature
{{{function refreshDisplay(hint) {} }}}
!Returns
undefined
!Arguments
;1. hint
:the element to refresh /% NOT SURE WHAT THIS IS %/
!Example
{{{
refreshDisplay();
}}}
''result:'' refreshes everything in the {{{contentWrapper}}}
!Summary
This <<tag global>> function loops over all ancestors of a given root while running the refresh handler for those that have a [[refresh attribute defined|dom element refresh attribute]].
!Signature
{{{function refreshElements(root, changeList) {} }}}
!Returns
undefined
!Arguments
;1. root
:the DOM node of which all ancestors are inspected
;2. changeList
:a list of tiddler names that have changed<br>{{annotation{
''Warning:'' If changeList is not provided then all tiddlers will be refreshed which could trigger lots of unnecessary refreshes.
}}}
!Example
~tbd~
!Summary
This <<tag global >> function applies a PageTemplate to TiddlyWiki -- default is the [[shadow tiddler|Shadow Tiddlers]]@tiddlywiki called PageTemplate
!Signature
{{{function refreshPageTemplate(title){} }}}
!Returns
undefined
!Arguments
;1. title
:the name of the PageTemplate tiddler
!Example
{{{
refreshPageTemplate('MyPageTemplate');
}}}
''result:'' applies ''"""MyPageTemplate"""'' as a PageTemplate to TiddlyWiki
{{annotation{
''Note:'' If applying {{{MyPageTemplate}}} screwed up the layout, run {{{refreshPageTemplate()}}} from your browser console and you should get the default back.
}}}
!Summary
This <<tag global>> function applies CSS rules contained in a StyleSheet tiddler to the document -- the  StyleSheet tiddler title serving as a unique identifier for the {{{<style>}}} element
!Signature
{{{function refreshStyles(title, doc){} }}}
!Returns
undefined
!Arguments
;1. title
:the tiddler title
;2. doc
:the document object -- defaults to the current document
!Example
{{{
refreshStyles('StyleSheet'){}
}}}
Now the styles in StyleSheet 4are reapplied to the document.
User-agent: *
Disallow: /bags
Disallow: /recipes
!Description
The saveChanges macro generates a button to save all changes to disk -- in a standard TiddlyWiki it is displayed in the SideBarOptions tiddler in the right sidebar.
!Parameters
{{{<<saveChanges [label] [tooltip]>>}}}
Introduced with TiddlyWiki v2.4, the optional parameters define the button's label and tooltip.
!Usage
{{{
<<saveChanges 'Save Now!' 'Click here to save this TiddlyWiki now!'>>
}}}
<<saveChanges 'Save Now!' 'Click here to save this TiddlyWiki now!'>>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="364 157 64 51" width="30" height="30"><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><g><path class="glyph" d="M 364.50006 184.50061 L 386.99985 207.00037 L 396 198.00002 L 373.50003 175.50066 Z M 403.02295 181.97704 C 400.38693 179.34099 396.11307 179.34099 393.47702 181.97704 C 390.841 184.61307 390.841 188.88695 393.47702 191.52298 C 396.11307 194.15903 400.38693 194.15903 403.02295 191.52298 C 405.65906 188.88695 405.65906 184.61307 403.02295 181.97704 M 414.27298 170.72704 C 411.63693 168.091 407.36307 168.091 404.72702 170.72704 C 402.091 173.36308 402.091 177.63693 404.72702 180.27296 C 407.36307 182.90901 411.63693 182.90901 414.27298 180.27296 C 416.90903 177.63693 416.90903 173.36308 414.27298 170.72704 M 425.523 159.47705 C 422.88696 156.841 418.6131 156.841 415.97705 159.47705 C 413.341 162.11308 413.341 166.38695 415.97705 169.02295 C 418.6131 171.65903 422.88696 171.65903 425.523 169.02295 C 428.15906 166.38695 428.15906 162.11308 425.523 159.47705" fill="#020202"/></g></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="2 724 68 55" 
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 2.25 756 L 11.25 747 L 24.75 760.4994 L 60.750004 724.4994 L 69.75 733.49902 
		L 24.749977 778.49976 Z" fill="#101010" class="glyph"/>
	</g>
</g>
</svg>
(function($, tw) {

	var bag,
		host,
		form,
		space,
		owner,
		publicPolicy,
		privatePolicy;

	function guestView() {
		$(".policy-view")
			.addClass("disabled")
			.find("input, button")
				.attr("disabled", "disabled");

		$(".guest-view").show();

	}

	function policyView() {
		var $pview = $(".policy-view");
		$(".policy-view section h3 strong").text(space);
		form = $(".policy-view form");
		var porp = $(".policy-view").attr("data-privacy");

		$("button.public", $pview).click(function() {
			if($pview.hasClass("private")) {
				$pview
					.removeClass("private")
					.addClass("public")
					.attr("data-privacy", "public");
				fetchPolicy("public");
			}
		});
		$("button.private", $pview).click(function() {
			if($pview.hasClass("public")) {
				$pview
					.removeClass("public")
					.addClass("private")
					.attr("data-privacy", "private");
				fetchPolicy("private");
			}
		});

		fetchPolicy(porp);
		setFormHandlers(form);
	}

	function fetchPolicy(type, callback) {
		bag = new tw.Bag(space + "_" + type, host);
		bag.get(function(resource, status, xhr) {
			// on success
			owner = resource.policy.owner;
			populateForm(resource.policy);
			if(callback) {
				callback();
			}
		}, function(xhr, error, exc) {
			// error occurred
			console.log("error fetching");
			console.log(xhr, error, exc);
		});
	}

	function savePolicy(policy, successCB, errorCB) {
		console.log(policy);
		bag.policy = $.extend(bag.policy, policy);
		console.log(bag.policy);
		bag.put(function(resource, status, xhr) {
			// success
			if(successCB) {
				successCB(resource, status, xhr);
			}
		}, function(xhr, error, exc) {
			// error
			if(errorCB) {
				errorCB(xhr, error, exc);
			}
		});
	}
	
	function populateForm(policy) {
		form.find("#readinput")
			.val( policy.read.join(",") )
			.attr( "data-original", policy.read.join(",") );
		form.find("#writeinput")
			.val( policy.write.join(",") )
			.attr( "data-original", policy.write.join(",") );
		form.find("#deleteinput")
			.val( policy["delete"].join(",") )
			.attr( "data-original", policy["delete"].join(",") );
		form.find("#manageinput")
			.val( policy.manage.join(",") )
			.attr( "data-original", policy.manage.join(",") );
		form.find("#acceptinput")
			.val( policy["accept"].join(",") )
			.attr( "data-original", policy["accept"].join(",") );;
		form.find("#createinput")
			.val( policy.create.join(",") )
			.attr( "data-original", policy.create.join(",") );
	}
	
	function setFormHandlers(form) {
		
		form.find(".reset").click(function(e) {
			e.preventDefault();
			// reset the field values to their original
			form.find("input").each(function(i,el) {
				var $el = $(el);
				$el.val( $el.attr("data-original") );
			});
		});

		form.find(".submit").click(function(e) {
			e.preventDefault();
			var newpolicy = {
				owner: owner
			};
			form.find("input").each(function(i, el) {
				var $el = $(el),
					name = $el.attr("name"),
					val = $el.val();
				
				newpolicy[name] = (val === "") ? [] : val.replace(/ /g,'').split(",");
			})
			savePolicy(newpolicy, function(r,s,x){
				console.log(s);
			}, function(x,er,ex) {
				console.log(er);
			});
		});

		// input focusing
		form.find("input").focus(function(e){
			$(e.target).addClass("editing");
		}).blur(function(e){
			var $me = $(e.target);
			$me.removeClass("editing");
			if($me.val() !== $me.attr("data-original")) {
				$me.addClass("changed");
			}
		});
	}

	/*
	 * Start up, establishing if the current user has the power to edit.
	 */
	function init() {

		$.ajaxSetup({
			beforeSend: function(xhr) {
				xhr.setRequestHeader("X-ControlView", "false");
			}
		});

		var url = '/status',
			devHost = false;

		if (window.location.href.match(/^file:/)) {
			// for dev
			url = '/status';
			devHost = true;
		}

		$.ajax({
			dataType: 'json',
			url: url,
			success: function(data) {
				//space = data.space.name || "policymaker";
				space = (data.space) ? data.space.name : "policymaker";
				host = '/';
				if (devHost) {
					host = data.server_host.scheme + '://'
					+ space + '.' + data.server_host.host + '/';
				}
				if (data.username === 'GUEST') {
					guestView();
				} else {
					$.ajax({
						url: host + 'spaces/' + space + '/members',
						success: policyView,
						error: guestView,
					});
				}
			}
		});
	}

	init();

})(jQuery, tiddlyweb);
!Description
Renders an input field for searching TiddlyWiki and abutton to start searching.
!Usage
{{{
<<search [search-term]>>
}}}
A default search term can be added using a {{{[search-term]}}} as the first parameter.
!Example
{{{
<<search TiddlyWiki>>
}}}
<<search TiddlyWiki>>
Once you have some content then you may choose to determine a tiddler, or set of tiddlers to display each time you load ~TiddlySpace. This is determined by the [[DefaultTiddlers]].
!Summary
This <<tag global>> function applies the CSS of a StyleSheet tiddler by adding a {{{<style>}}} element to the DOM, replacing any {{{<style>}}} element previously created for this StyleSheet tiddler -- its title serving as the unique element id.
!Signature
{{{function setStylesheet(s, id, doc) {} }}}
!Returns
undefined
!Arguments
;1. s
:a string containing the CSS to be applied
;2. id
:the id for the created <style> DOM element
;3. doc
:the document to which to apply all of this -- defaults to the current document
!Example
{{{
setStylesheet('.alert{color:red;}','MakeItRedAlready');
}}}
''result:'' appends a {{{<style>}}} element to the DOM on-the-fuly turning any...<br>{{{<span class="alert">Oh no!</span>}}} into...<br>@@color:red;Oh No!@@
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
!Description
The [[slider]] macro provides button that allows to toggle the visibility of [[transclusion|transcluded]] content of some tiddler in another tiddler.
!Usage
{{{
<<slider chkUniqueCookieName tiddler label tooltip>>
}}}
The following macro parameters are required...
| !Parameter | !Description |h
|''chkUniqueCookieName''|use the first parameter to define a unique cookie name starting with {{{chk}}} in which the toggle state is saved for this slider; the state is reapplied when the tiddler is reopened |
|''"""tiddler"""''|a reference to a tiddler-title, -section or slice to be content of the slider|
|''label''|the title for the slider button|
|''tooltip''|the tooltip for the slider button|
!Example:
{{{
<<slider
	chkSliderGettingStarted
	[[GettingStarted]]
	"Getting Started"
	"Show getting started info...">>
}}}
<<slider chkSliderGettingStarted [[GettingStarted]] "Getting Started" "Show getting started info...">>
!Using Hidden Sections In The Same Tiddler
If you want to have both the slider and the target content in the same tiddler, you can use [[hidden sections|http://tiddlywiki.org/#%5B%5BHidden%20Text%5D%5D]], e.g.
<<slider
    chkHiddenStuff
    "slider##HIDDEN"
    Hidden!
    "Click to show hidden stuff..."
>>
{{{
<<slider
    chkHiddenStuff
    "slider##HIDDEN"
    "Hidden Stuff"
    "Click to show hidden stuff..."
>>/%
!HIDDEN
hidden slider content
!END%/
}}}
A [[SiteIcon|SiteIcon tiddler]]@glossary helps provide some identity to your space.  Ideally it'd be a square and a minimum of 48*48 pixels size.  You can upload your site icon using the uploader below.

<<binaryUploadPublic title:SiteIcon>>
The title and subtitle of your space are visible to visitors and are also displayed in your browser's tabs. Click on the SiteTitle and SiteSubtitle tiddler links below to make changes.
* [[SiteTitle]]
* [[SiteSubtitle]]
The store is an instantiance of the [[TiddlyWiki.class]] and used to access, manipulate and create tiddlers.
!Summary
This prototype function of the [[TiddlyWiki.class]] ties an external function, refered to as a ''callback'' to a tiddler. Whenever that tiddler is changed, the callback function is invoked. TiddlyWiki passes the title of the changed tiddler to the callback function.
!Signature
{{{TiddlyWiki.prototype.addNotification = function(title, fn) {} }}}
!Returns
''object:'' store
!Arguments
;1. (string) title
:the title of the tiddler being watched
:when null (not empty string) the callback function is invoked for every tiddler, but only if either:
:* notifications are running via [[store.notifyAll()]]
:* the notify() is called with the second parameter set to true
;2. (function) fn
:the callback function called on any changes
!Example
{{{
store.addNotification('MyConfig','config.extensions.foo.watchConfigChanges);
}}}
''returns:'' the store object
!Summary
This prototype function of the [[TiddlyWiki.class]] removes all tiddlers from a store and clears its dirty flag.
{{annotation{
This function may be deprecated / unused.
}}}
!Signature
{{{TiddlyWiki.prototype.clear = function() {} }}}
!Returns
undefined
!Arguments
none
!Example
{{{
store.clear();
}}}
does as instructed
!Summary
This prototype function of the [[TiddlyWiki.class]] instantiates a [[tiddler object|Tiddler.class]]. It does __not__ save the tiddler in any way within the TiddlyWiki, see [[store.saveTiddler()]].
!Signature
{{{TiddlyWiki.prototype.foo = function(title) {} }}}
!Returns
object[tiddler]: the created tiddler object
!Arguments
;1. (string) (title)
: the title for the new tiddler โ€” if one by that name is already instanciated, it will be returned
!Example
{{{
store.createTiddler('Foo');
}}}
''returns:'' a tiddler object with the title field set to 'Foo'.
!Summary
This prototype function of the [[TiddlyWiki.class]] is a primitive function used by many other functions and returns a [[tiddler object|Tiddler.class]] having a given title.
!Signature
{{{TiddlyWiki.prototype.fetchTiddler = function(title) {} }}}
!Returns
object[tiddler]: if existing, the tiddler by that title, otherwise undefined (not null)
!Arguments
;1. (string) title
:the tiddler title
!Example
{{{
store.fetchTiddler('Foo');
}}}
''returns:'' the tiddler object titled ''Foo'', if existing
!Summary
This prototype function of the [[TiddlyWiki.class]] retrieves a filtered array of [[tiddler objects|Tiddler.class]] in the store matching a filter expression.
!Signature
{{{TiddlyWiki.prototype.filterTiddlers = (filter) {} }}}
!Returns
array[tiddlers]: tiddlers matching the filter
!Arguments
;1. (string) filter
:a [[filter expression|filters]]
!Example
{{{
// two filter elements
store.filterTiddlers("[tag[mish]] [tag[mash]]")
}}}
''returns:'' tiddlers tagged with "mish" or "mash".
{{{
// two filter steps
store.filterTiddlers("[tag[mish]] | [tag[mash]]")
}}}
''returns:'' any tiddler tagged with "mish" and of these, any tagged with "mash"
!Summary
Iterates over all tiddlers and applies a given callback function.
!Signature
{{{TiddlyWiki.prototype.forEachTiddler = function(callback) {} }}}
!Returns
undefined
!Arguments
;1. (function) callback
: the function to be invoked on each tiddler
: passes two parameters to the callback function {{sub{
<<<
;1. t
:the tiddler title
;2. tiddler
:the tiddler object
<<<
}}}
!Example
{{{
store.forEachTiddler(foo);
}}}
''result:'' runs function foo at every tiddler passing the title and tiddler object to it
!Summary
This prototype function of the [[TiddlyWiki.class]] returns an sorted array of strings, each being the name of an orphaned tiddler with no links to it using [[store.forEachTiddler()]].
!Signature
{{{TiddlyWiki.prototype.getOrphans = function() {} }}}
!Returns
array[string]: array of the titles of orhpaned tiddlers
!Arguments
none
!Example
{{{
store.getOrphans();
}}}
''result:'' you can see in in TabMoreOrphans used by the list macro
!Summary
This prototype function ot the [[TiddlyWiki.class]] fetches tiddlers with a given tag, sorted The same results can be obtained using [[store.getValueTiddlers()]] or [[store.reverseLookup()]].
!Signature
{{{TiddlyWiki.prototype.getTaggedTiddlers = function(tag, sortField) {} }}}
!Returns
array[tiddlers]: a sorted array of tiddler objects
!Arguments
;1. (string) tag
:the tag name to be matched
;2. (string) sortField
:the standard or custom tiddler field by which to sort, see [[store.sortTiddlers()]]
!Example
{{{
store.getTaggedTiddlers('systemConfig','-modified');
}}}
''returns:'' all plugin tiddlers, the last modified first
!Summary
Retrieves the full text, a section or slice of a tiddler. Also fetches shadow tiddler contents. Also see [[Section Transclusion]].
!Signature
{{{TiddlyWiki.prototype.getTiddlerText = (title, defaultText) {} }}}
!Returns
text: the content, if existing, otherwise __null__
!Arguments
;1. (string) title
:the ''tiddler title'', or reference to a ''tiddler##section'' or ''tiddler::slice''
;2. (string) defaultText
:what to return, when nothing found
!Example
{{{
store.getTiddlerText('store.getTiddlerText()##Signature','Not there?');
}}}
''returns:'' <html><pre>"{{{TiddlyWiki.prototype.getTiddlerText = (title, defaultText) {} }}}"</pre></html>
!Summary
This prototype function of the [[TiddlyWiki.class]] removes a tiddler from the TiddlyWiki. It wil notify the functions set as listeners via [[store.addNotification()]] and set the dirty flag. If a tiddler by that title does not exist it returns silently.
!Signature
{{{TiddlyWiki.prototype.removeTiddler = function(title) {} }}}
!Returns
undefined
!Arguments
;1. (string) title
:the title of the tiddler to be deleted
!Example
{{{
store.removeTiddler('Foo');
}}}
''result:'' removes the tiddler called ''Foo''
!Summary
This prototype function of the [[TiddlyWiki.class]] loops through all tiddlers in the store to find those with ''lookupField'' set to ''lookupValue''; ''lookupField'' can be a standard or custom field of a tiddler.
!Signature
{{{
TiddlyWiki.prototype.reverseLookup =
function(lookupField, lookupValue, lookupMatch, sortField) {}
}}}
!Returns
array[tiddlers]: an array of matching tiddler objects
!Arguments
;1. (string) lookupField
:the field being accessed
;2. (dynamic) lookupValue
:the value being matched
;3. (boolean) lookupMatch
:when set to true, returns all the tiddlers where ''lookupField'' matches ''lookupValue''
:when set to false, returns all the tiddlers where ''lookupField'' does not match ''lookupValue''
;4. (string) sortField
:the field b which to sort, if given (defaults to "title")
!Example
{{{
store.reverseLookup("tags","excludeLists",false,"title");
}}}
''returns:'' all tiddlers not tagged excludeLists sorted by title
The ''saveTiddler'' method of a [[store object|TiddlyWiki.class]] is typically called in response to the author clicking the '''done''' link after editing a tiddler. 
This method takes six parameters: 
* the old title of the tiddler
* the new title of the tiddler
* the tiddler's source code
* the name of the author
* the modification date
* the tags (as an array of strings). 
This feeds directly into [[Tiddler]]'s [[set]] method, and does not save changes to the document on disk.
!Summary
This prototype function of the [[TiddlyWiki.class]] sorts an array of tiddlers by a given field.
!Signature
{{{TiddlyWiki.prototype.sortTiddlers = function (tiddlers, field) }}}
!Returns
type: array[tiddlers] โ€” sorted accordingly
!Arguments
;1. (array) tiddlers
:an array of tiddler objects
;2. (string) field
:the name of a standard or custom field, e.g. modified or created
:can be prepended with a '+' or a '-' so as to sort in ascending or descending order
!Example
{{{
store.sortTiddlers(tids,'-modified');
}}}
''returns:'' the array tids sorted by the modified date descendingly
{{{
store.sortTiddlers(tids, "-changecount"); 
}}}
''returns:'' tids sorted by ''changecount'' in descending order
!Summary
This prototype function of the [[Story.class]] closes a single tiddler in the story column.
!Signature
{{{TiddlyWiki.prototype.foo = function(arg1, arg2) {} }}}
!Returns
undefined
!Arguments
;1. (string) title
:(mandatory) the title of the tiddler to be closed
;2. (boolean) animate
:whether or not to animate closing the tiddler
;3. (boolean) unused
:''deprecated:'' whether to animate slowly, e.g. when holding the Shift, Option, or Alt key while clicking the ''close'' button
!Example
{{{
story.closeTiddler('Foo', true, false);
}}}
''result:'' If open, the tiddler ''Foo'' will be closed in an animated fashion when global animations are turned on.
!Summary
This prototype function of the [[Story.class]] displays all tiddlers listed in the [[DefaultTiddlers]] shadow tiddler in the story column calling [[story.displayTiddlers()]] on each one of them.
{{annotation{
''Note:'' Any tiddlers already displayed in the story will persist.
}}}
!Signature
{{{Story.prototype.displayDefaultTiddlers = function()}}}
!Returns
nothing
!Arguments
none
!Example
none needed
!Summary
Opens a tiddler in the story column with a given template, similar to [[story.createTiddler()]] except that the newly-displayed tiddler is animated opening, and the browser window scrolls to display it. 
!Signature
{{{
Story.prototype.displayTiddler =
function(srcElement, tiddler, template, animate, unused, customFields, toggle, animationSrc)
}}}
!Returns
DOM reference: the opened tiddler
!Arguments
;1. (DOM reference) srcElement
:(mandatory) reference to element from which this one is being opened
:required but may be //null// if the tiddler already exists
:may be the strings "bottom" and "top" to place the newly created tiddler at the bottom or top of the story
;2. (string) tiddler
:(mandatory) the title of the tiddler to be displayed
;3. (string) template
:(optional) the template to be used for display, either the constant [[DEFAULT_VIEW_TEMPLATE|ViewTemplate]]  or [[DEFAULT_EDIT_TEMPLATE|EditTemplate]]
:* when null or undefined the current template is used โ€” if there is none, defaults to to [[DEFAULT_VIEW_TEMPLATE|ViewTemplate]]
:if the tiddler is already displayed but with a different, it is switched to the specified template
:if the tiddler does not exist, and if server hosting custom fields were provided, then an attempt is made to retrieve the tiddler from the server
;4. (boolean) animate
:whether or not to animate displaying the tiddler
;5. (boolean) slowly
: ''REMOVED!:'' whether to animate slowly when holding the Shift, Option, or Alt key when clicking a tiddler link
;6. (object) customFields
:an optional object of ''key:value'' pairs to be assigned as tiddler fields (for edit templates)
:passed down to [[story.refreshTiddlers()]] when already open
;7. (boolean) toggle
:when {{{true}}} toggles the display of the tiddler โ€” opens when closed, closes when open
;8. (DOM reference) animationSrc
:(optional) specifies the element which is to act as the start of the animation, otherwise the ''srcElement'' is used to trigger [[anim.startAnimating()]]
!Example
{{{
story.displayTiddler(null, 'AdvancedOptions');
}}}
''result:'' opens the AdvancedOptions shadow tiddler
{{{
story.displayTiddler("bottom", "Foo", DEFAULT_EDIT_TEMPLATE);
}}}
''result:'' opens the tiddler ''Foo'' with the default edit template at the bottom
!Summary
This prototype function of the [[Story.class]] is a helper function returning the DOM element which corresponding to an entire tiddler in the story column containing a DOM element passed to the function. If the element is not inside a tiddler, returns null.
!Signature
{{{Story.prototype.findContainingTiddler = function(element) {} }}}
!Returns
DOM reference: to the containing tiddler in the story column โ€” null if none
!Arguments
;1. (DOM reference) element
:ยป the DOM element for which to find the __outer__ tiddler in which it is contained
!Example
{{{
store.findContainingTiddler(el);
}}}
''returns:'' the tiddler DOM element in the story column containing el
!Summary
Returns the DOM element that contains all the displayed tiddlers.
!Signature
{{{Story.prototype.getContainer = function()}}}
!Returns
a reference to the container DOM element
!Arguments
none
!Example
{{{
story.getContainer();
}}}
''returns:'' {{{<div id="tiddlerDisplay"/>}}} โ€” being the default
!Summary
This prototype function the [[Story.class]] changes the location in the browsers' address bar to a permalink for all open tiddlers. Implemented by the permaview macro.
!Signature
{{{Story.prototype.permaView = function() {} }}}
!Returns
undefined
!Arguments
none
!Example
If you run...
{{{
permaview();
}}}
...with just this tiddler being open, then the address bar will change to...
{{{
http://tiddlywikidev.tiddlyspace.com/#Story.prototype.permaview()
}}}
!Summary
This prototype function of the [[Story]] class returns the DOM element id of the tiddler element.
!Signature
{{{Story.prototype.tiddlerId = function(title) {} }}}
!Returns
''string:'' the DOM element ID of the tiddler in the story column
!Arguments
;1. title
:the tiddler name
!Example
{{{
story.tiddlerId('getOrphans()');
}}}
''returns:'' 'tiddlergetOrphans()'
html {
	background: #F2F2F2;
}

body {
	font-family: "Helvetica Neue", Helvetica, Arial, Sans-serif;
	letter-spacing: 0.02em;
	color: #4D4D4D;
	font-size: 62.5%;
	background-position: 0px 0px;
}

#wrapper {
	margin: 0 auto 2em;
	max-width: 960px;
	position: relative;
}

#wrapper > section {
	padding: 1em;
	box-shadow: 0px 0px 4px rgba(50,50,50,0.2);
	margin: 2em 0 0;
}

.beta {
	font-size: 1.6em;
	background: #EB4715;
	color: #fff;
	padding: 0.6em;
	display: inline;
	position: absolute;
	top: -3em; right: 0;
}

.guest-view {
	background: #db3138;
	font-size: 2.4em;
	color: #fff;
	display: none;
}

.guest-view a {
	color: #fff;
}

.policy-view {
	font-size: 2.4em;
	background: #fff;
	padding-top: 0;
	position: relative;
}

.policy-view h3 {
	font-size: 1.5em;
}

.public {
	border-top: 4px solid #0082AF;
}

.private {
	border-top: 4px solid #BC4378;
}

.disabled {
	border-top: 4px solid #ccc;
	color: #ccc;
}

.disabled label {
	color: #ccc;
}

.porp {
	margin-bottom: 1.5em;
}

div.porp button {
	background: #fff;
	color: #ccc;
	border: 2px solid #fff;
}

.public .public {
	border: 2px solid #0082AF;
	color: #0082AF;
}

.private .private {
	border: 2px solid #BC4378;
	color: #BC4378;
}

.private button.public:hover {
	color: #ADD1DD;
	border: 2px solid #ADD1DD;
}

.public button.private:hover {
	color: #DCA2BB;
	border: 2px solid #dca2bb;
}

.disabled .private,
.disabled .public {
	color: #ccc;
	border: 2px solid #ccc;
}

form {
	max-width: 600px;
}

label {
	width: 29%;
	display: inline-block;
	padding-left: 1%;
}

input {
	font-size: inherit;
	width: 65%;
	margin-bottom: 0.5em;
	border: 1px solid #BDBDBD;
	padding: 0.2em;
}

.public input {
	color: #ADD1DD;
}

.public input:focus {
	outline: 0;
	border-color: rgba(0, 130, 175, 0.8);
	-webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(0, 130, 175, 0.6);
	-moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(0, 130, 175, 0.6);
	-ms-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(0, 130, 175, 0.6);
	-o-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(0, 130, 175, 0.6);
	box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(0, 130, 175, 0.6);
}

.lt-ie9 .public input:focus {
	border-color: #0082AF;
}

.private input {
	color: #DCA2BB;
}

.private input:focus {
	outline: 0;
	border-color: rgba(188, 67, 122, 0.8);
	-webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(188, 67, 122, 0.6);
	-moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(188, 67, 122, 0.6);
	-ms-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(188, 67, 122, 0.6);
	-o-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(188, 67, 122, 0.6);
	box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(188, 67, 122, 0.6);
}

.lt-ie9 .private input:focus {
	border-color: #BC4378;
}

.public input.editing, .public input.changed {
	color: #0082AF;
}

.private input.editing, .private input.changed {
	color: #BC4378;
}

.form-ctrls {
	margin-top: 1em;
}

button {
	cursor: pointer;
	padding: 0.65em 0.5em;
	font-size: inherit;
	border: none;
	color: #fff;
}

.form-ctrls button {
	padding: 0.65em 1em;
}

.public button {
	background: #0082AF;
}

.private button {
	background: #BC4378;
}

.disabled button {
	background: #ccc;
}

form button.reset {
	background: none;
	color: #0082AF;
}

.disabled form button.reset {
	color: #ccc;
}

.private .reset {
	color: #BC4378;
}

.help {
	font-size: 0.67em;
	width: 32%;
	background: #F0F4F8;
	box-shadow: 1px 2px 3px 0px rgba(0,0,0,0.25), -1px 0px 3px 0px rgba(0,0,0,0.25);
	position: absolute;
	right: -3em; top: 3em;
	border-radius: 2px;
	padding: 1em;
}

.help, .help a {
	color: #8C9DA7;
}

.disabled .help {
	background: #fff;
	color: #ccc;
}
''Deprecated'': Did output the same SynchronizationWizard as in the [[Backstage Area]].
!Description
The tabs macro lets you create tab interfaces such as the one used for the timeline in the sidebar.
!Usage
{{{
<<tabs
	txtUniqueCookieName
	title
	tooltip
	reference
	title
	tooltip
	reference
	...
>>
}}}
The parameters for the tabs macro are used in a dedicated sequence...
{{annotation{
''Important:'' If any of these parameter values require blanks, enclose them in """'single quotes', "double quotes", or [[double square brackets]]""".
}}}
| !Parameter | !Description |
|''txtUniqueCookieName''|use the first parameter to define a unique cookie name starting with {{{txt}}} in which the name of the currently opened tab is stored; this tab is reopened when the tiddler is reopened|
|tab params|for each desired tab, provide the following three paramaters in this order...<<tiddler tabs##PARAMETERS>>|
!Example
{{{
<<tabs
	txtFavouriteMacros
	tag
	"Information on the tag macro..."
	tag
	tags
	"Information on the tags macro..."
	tags
	allTags
	"Information on the allTags> macro..."
	allTags
>>
}}}
<<tabs
	txtFavouriteMacros
	tag
	"Information on the tag macro..."
	tag
	tags
	"Information on the tags macro..."
	tags
	allTags
	"Information on the allTags> macro..."
	allTags
>>/%
!PARAMETERS
;title
:the title for the tab
;tooltip
:the tooltip for the tab
;reference
:a reference to a tiddler-title, -section or -slice the content of which are displayed in the tab
!END%/
!Description
The [[tag]] macro generates a button with the name of a specified [[tag|Tags]] which -- when clicked -- opens a popup containing a list of all [[Tiddlers|Tiddler]] tagged with the given tag along with options to:
* open all listed tiddlers at once
* open the tag tiddler itself
!Usage
{{{
<<tag tagName [label] [tooltip]>>
}}}
!Example
{{{
<<tag Macros>>
}}}
<<tag Macros>>
!Description
The [[tagChooser]] macro is a helper macro that is used __exclusively__ in the shadow tiddler called EditTemplate to render a button that displays a popup listing all available tags. Click a tag in the tagChooser popup to add it to or remove it from the tag input box.
!Usage
{{{
<span macro='tagChooser excludeLists'></span>
}}}
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
!Description
The [[tagging]] macro lists all the tiddlers for a specified tag.
!Usage
{{{
<<tagging [[TagName]]>>
}}}
!Parameters
Pass the name of the tag for which you want the tagging list as the first parameter to the macro.

Optionally you can use a second, named parameter called {{{sep}}} to define a minimalistic separator displayed between each list item.
!Example
{{{
<<tagging [[Core Macros]]>>
}}}
<<tagging [[Core Macros]]>>
!CSS Separator
Instead of using the {{{sep}}} parameter, you are better advised to wrap the {{{<<tagging>>}}} macro in a custom class along with desired css rules for it in your StyleSheet, e.g.:
{{{
.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;
}
}}}
Then use the custom class, here {{{.listWrapper}}}, around your macro like this...
{{{
{{listWrapper{<<tagging [[Core Macros]]>>}}}
}}}
{{listWrapper{
<<tagging [[Core Macros]]>>
}}}
!Description
The [[tags macro|tags]] outputs a list of [[Tags]] assigned to a tiddler.
!Usage
{{{
<<tags [TiddlerName]>>
}}}
!Parameters
Without parameters, the tags macro displays the tags for the current tiddler. Using some {{{Tiddler Name}}} as the optional first parameter, tags are listed for that tiddler instead.
{{annotation{
''Note'': Tags which themselves are tagged <<tag excludeLists>> are not displayed, e.g. if we have a tiddler called ''Foo'' which is tagged <<tag excludeLists>> and the tags macro is run on some other tiddler that has <<tag Foo>> as a tag, the tag <<tag Foo>> will not be displayed in the list.
}}}
!Example
{{{
<<tags "tag (macro)">>
}}}
<<tags "tag (macro)">>
!Description
The [[tiddler macro|tiddler]] allows you to embed (or [[transclude|Transclusion]]) the entire text, a section or a slice of some tiddler into the current tiddler.
!Usage
{{{
<<tiddler [TextReference]>>
}}}
The {{{TextReference}}} can be any of...
| !Reference | !Example |h
|a tiddler title |{{{<<tiddler SomeTiddler>>}}}|
|a tiddler section|{{{<<tiddler [[Some Tiddler##Some Section]]>>}}}|
|a tiddler slice|{{{<<tiddler "Some Tiddler::SliceName">>}}}|
{{annotation{
''Note:'' Notice the different ways for wrapping a macro parameter in quotes or double square-brackets.
}}}
!"""Parameterised Transclusion"""
You can create tiddlers as templates by using the placeholders {{{$1}}} to {{{$9}}} for the content that you want replaced during transclusion.
{{annotation{
''Note:'' Transclusion parameters start with a dollar sign ({{{$}}}) not with percent ({{{%}}}) as commonly used in JavaScript string functions.
}}}
Appending the {{{with:}}} parameter followed by the desired parameter values will replace the placeholders {{{$1}}} to {{{$9}}} with these values in the transcluded tiddler content.

!!!"""An Example For Parameterized Transclusion"""
Create a tiddler called MyTemplates containing this text:
<<<
{{{!What I like}}}
{{{I like //$1// in [[$2|https://www.google.com/search?q=$2]]!}}}
<<<
Use transclusion while passing down parameters {{{$1='pineapple'}}} and {{{$2='Piรฑa Colada'}}} as follows:
{{{
<<tiddler [[MyTemplates##What I like]] with: "pineapple" "Piรฑa Colada">> 
}}}
''The Output:''
<<<
I like //pineapple// in [[Piรฑa Colada|https://www.google.com/search?q=Piรฑa Colada]]!
<<<
!Description
The [[timeline]] macro allows to create a chronological list of recently edited tiddlers.
!Usage
{{{
<<timeline field maxlength dateformat template:title groupTemplate:title filter:filter>>
}}}
All macro parameters are optional:
| !Parameter | !Description |width:200px; !Default |h
|''"""field"""''|determines the field used as the basis for the list, usually {{{modified}}} or {{{created}}}|{{{modified}}}|
|''maxlength''|an integer that limits the maximum number of tiddlers in the list||
|''dateformat''|a [[date format string|DateFormats]] for the format of dates||
|''template''|a reference to a tiddler or tiddler section used as the template for list entries|{{{<<view title link>>}}}|
|''groupTemplate''|a reference to a tiddler or tiddler section used as the template for grouping entries in the list with {{{%0}}} being the name of the field that is displayed and {{{%1}}} being a rendered date based on the [[date format|DateFormats]], see parameter ''dateformat'' above|{{{<<view %0 date '%1'>>}}}|
|''filter''|a [[filter|Filters]] used to filter the tiddlers relevant for the list||
!Examples
{{{<<timeline created 5>>>}}}
:{{annotation{
<<timeline created 5>>
}}}
{{{<<timeline modified 5>>}}}
:{{annotation{
<<timeline modified 5>>
}}}
!Description
This macro displays the current date and time. 
!Usage 
{{{
<<today "[date-format]">>
}}}
See [[DateFormats]]...
!Descriptions
The [[toolbar macro|toolbar]] is used in the shadow tiddlers called ViewTemplate and EditTemplate to render the corresponding toolbar for view mode and edit mode.
!Usage
in EditTemplate:
{{{
<div class='toolbar'
	macro='toolbar [[ToolbarCommands::EditToolbar]]'>
</div>
}}}
in ViewTemplate:
{{{
<div class='toolbar'
	macro='toolbar [[ToolbarCommands::ViewToolbar]]'>
</div>
}}}
Use the shadow tiddler called ToolbarCommands to define the commands to be displayed in a corresponding toolbar.
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
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
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
!Description
The [[upgrade]] macro outputs the same UpgradeWizard as in the Backstage Area...
!Usage
{{{
<<upgrade>>
}}}
<<upgrade>>
!Description
The [[version]] macro displays the version of a TiddlyWiki.
{{annotation{
''Note:'' Old TiddlyWiki versions can be found in the [[Archive]].
}}}
!Usage 
{{{<<version>>}}}
<<version>>
See [[version macro|version]]...
!Description
The [[view macro|view]] is a powerful macro that allows you to output the value of a tiddler field and format them.
!Usage
In general, the [[view macro|view]] is used in the shadow tiddler called ViewTemplate, e.g.:
{{{
<div class='viewer' macro='view text wikified'></div>
}}}
To use it in wiki text, use...
{{{
<<view field mode>>
}}}
The first parameter is the field which you want to output, e.g.:
* title
* text
* created
* modified
* ##sectionName
* ::sliceName
''Note:''
* The field {{{tags}}} cannot be used.
* If you use {{{##sectionName}}} or {{{::sliceName}}} with the wikified parameter, it's possible to produce endless loops. So ''be carefull''!

The second parameter defines the output mode in which the value of the field is rendered.
|!Mode|!Description|width:300px;!Example|
|link|renders the value as a link|{{{<<view title link>>}}}<br/>- <<view title link>>|
|text|renders the value exactly as stored|{{{<<view modified text>>}}}<br/>{{{<<view modified text>>}}}|
|date|outputs the field value as a date with an optional third parameter being the [[date format|DateFormats]], e.g. for the fields {{{created}}} or {{{modified}}}.|{{{<<view created date>>}}}<br /><<view created date>><br/>{{{<<view modified date "YYYY">>}}}<br><<view modified date "YYYY">>|
|wikified|outputs the field value as wikitext with an optional third parameter that can be used for formatting; {{{%0}}} corresponds to the field value. <br/><br/>''Note:'' the placeholder starts with {{{%}}} in contrast to a placeholder used by the [[tiddler macro|tiddler]] which start with {{{$}}} |{{{<<view "server.bag" wikified "//%0//">>}}}<br/><<view "server.bag" wikified "//%0//">>|
!Summary
This <<tag global>> function renders TiddlyWiki source code into an element.
!Signature
{{{function wikify(source, output, highlightRegExp, tiddler){} }}}
!Returns
undefined
!Arguments
;1. source
:the source code to render
;2. output
:the DOM element to render into
;3. highlightRegExp
:a regular expression to highlight
;4. tiddler
:the tiddler that the source belongs to
!Example
Its most common use in macros is...
{{{
wikify("__underlined__", place);
}}}
''renders:'' __underlined__
!Also see
* [[wikifyPlainText()]]
* [[wikifyStatic()]]
!Summary
This <<tag global>> function returns the plain text of some [[TiddlyWiki Markup]]@tiddlywiki using the [[wikifyPlain()|Wikifier.prototype.wikifyPlain()]] function of the [[Wikifier.class]].
!Signature
{{{function wikifyPlainText(text, limit, tiddler) {} }}}
!Returns
string: rendered wiki markup as plain text
!Arguments
;text
:text to wikify
;limit
:if > 0 this will strip the text to a certain length
;tiddler
:the tiddler in the context of which the wikification occurs
!Example
{{{
var markup = 'I like //italics//.'
wikifyPlainText(markup,0,tid);
}}}
''returns:'' {{{'I like italics.'}}}

However...
{{{
var markup = 'I like //italics//.'
wikifyPlainText(markup,10,tid);
}}}
''returns:'' {{{'I like //i'}}} !
!Summary
This <<tag global>> function returns the {{{<html>}}} source for the wiki markup to be wikified as a string. Also see [[wikify()]] & [[wikifyPlainText()]]!
!Signature
{{{function wikifyStatic(source, highlightRegExp, tiddler, format){} }}}
!Returns
string: the html for rendered wiki text 
!Arguments
;source
:the source code to render
;highlightRegExp
:a regular expression for highlighting
;tiddler
:the tiddler to use as a reference point for rendering
;format
:the formatter to be used
!Example
{{{
var markup = "I like //italian food//!";
wikifyStatic(markup);
}}}
''returns:'' {{{I like <em>italian food</em>!}}}
/***
<<tiddler zzConfig...>>
***/
//{{{
//uncomment to enable evaluated parameters
//config.evaluateMacroParameters = "full";
//}}}
A ''zzConfig'' or ''zzTweaks'', etc. is in fact a small plugin tiddler tagged <<tag systemConfig>> that you create to override ~TiddlyWiki defaults. It owes its name to the fact that plugins are loaded in alphabetical order, so zzSomething takes care of having it load last.

For details see [[Changing Default Options]].