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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

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

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
#displayArea {margin: 1em 1em 0em;}
noscript {display:none;} /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
}
/*}}}*/
<!--{{{-->
<div class='toolbar' role='navigation' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
!Summary
Resources on how to use Git for core development...
!Details
tbd
<<list filter [startsWith[title,TiddlyWiki.]][sort[title]]>>

<<list filter "[tag[Function AND TiddlyWiki.class]][sort[title]]">>
See [[Startup Parameters]]...
/***
|''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"
//}}}
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 a classic TiddlyWiki
:» [[build instructions at GitHub repo|https://github.com/TiddlyWiki/tiddlywiki.com/blob/master/README.md]]
:» [[build instructions by Eric Shulman|http://tiddlywiki.com/dev]]
;instructions for building TW5
:» see [[http://five.tiddlywiki.com|http://five.tiddlywiki.com/static/Building%20classic%20TiddlyWiki%20with%20TiddlyWiki5.html]]

!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
>>
{{right title{[[Core Macros]]}}}From the [[Glossary|Macro]]...
<<<
<<tiddler [[Macro]]>>
<<<
!"""Macro Parameters"""
<<tiddler "Macro Parameters">>
Proposed:

* Freedombits
* Data tiddlers
* Forum software
* Video plugin
* Authentication
* Tiddler state for reveal widget etc.
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.
!Description
The closeAll macro outputs a button to close all open tiddlers.
!Usage
{{{
<<closeAll>>
}}}
<<closeAll>>
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
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...
* 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

[[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]]...
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.
!Introduction to TiddlyWiki
<html>
<iframe width="420" height="345" src="http://www.youtube.com/embed/ezNScBd7_h4" frameborder="0" allowfullscreen></iframe>
</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
/***
|''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;
	});
};

})();
//}}}
#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>
}}}
}}}
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
:{{{[[]]}}}
/***
|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);
//}}}
<<list filter [tag[common]]>>
See [[Plugins]]...
See [[store.reverseLookup()]]...
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]]
{{annotation{
''Note:'' To be able to do this in TiddlySpace you will need to enable [[Evaluated Parameters]].
}}}
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.
|''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!
!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]]>>
}}}
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">>
!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''
!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|http://trac.tiddlywiki.org/wiki/RecipeFiles]]
!!See Also
* [[Cook]]
* [[Ginsu]]
* [[Chef]]
/***
|''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);
//}}}
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.
!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}}}|
* 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


<<tiddler "Suppressing Formatting">>
See...
* [[How can I display my UserName somewhere?]]
* [[How can I edit my UserName?]]
See TiddlyLink...
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.
----
/***
|''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));
//}}}
!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; }
}}}
A reference of all [[TiddlyWiki Core|Dev.Core]] functions...
{{functions{<<list filter [tag[Function]][tag[function]][sort[title]]>>}}}<<listfiltr>>
[[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|http://trac.tiddlywiki.org/browser/Trunk/core/test/recipes/tests.html.recipe]] [[Dev:Recipe|recipe]] provides a simple way to get started.

Individual tests are located in the [[tests directory|http://trac.tiddlywiki.org/browser/Trunk/core/test/tests/]].

These tests can also be see in action in the @test space
!Description
The [[version]] macro displays the version of a TiddlyWiki.
{{annotation{
''Note:'' Old TiddlyWiki versions can be found in the [[Archive]].
}}}
!Usage 
{{{<<version>>}}}
<<version>>
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.//)
[[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.
<?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>
!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>
<!--}}}-->
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
!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
!Description
The [[plugins]] macro outputs the plugins manager...
!Usage
{{{
<<plugins>>
}}}
<<plugins>>
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.
<<<
!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
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
[[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]].
!Description
The [[permaview]] macro provides a button which outputs a URL to all open tiddlers in the browsers' address bar.
!Usage
{{{
<<permaview>>
}}}
<<permaview>>
/*{{{*/
body {
	font-size: 1em;
	font-family: helvetica, arial, sans-serif;
	background-color: #fff;
	color: [[ColorPalette::Foreground]];
}

body ul { margin: 0; }

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

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

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

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

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

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

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

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

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

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

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

#popup .followTiddlersList a{
	display: inline;
}

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

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

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

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

.clearFloat {
	clear: both;
}

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

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

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

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

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

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

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

#sidebarSearch .searchButton {
	display: none;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

.tagInfo ul li {
	display: inline;
}

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

.tagInfo ul li a {
	border: none;
}

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

.tagInfo .tagging {
	padding: 0;
}

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

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

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

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

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

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

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

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

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

	#mainMenu {
		margin-left: 16px;
	}

	.headerForeground {
		margin-left: 16px;
	}

	#sidebarSearch {
		right: 16px;
	}

	#sidebarOptions {
		margin-right: 16px;
	}

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

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

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

	#sidebarTabs .tabContents li a {
		font-size: 0.9em;
	}
}
/*}}}*/
[[StyleSheetTiddler]]
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?]]...
!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).
/***
|''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)
// %/
Serializations are explained at [[tiddlyweb.peermore.com|http://tiddlyweb.peermore.com/wiki/bags/docs/tiddlers/serialization]]

Read more about the [[TiddlySpace API]]...
Tiddlers with information for developers tag here...
{{noTitle{<<tagging Developer>>}}}
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.
[[Jeremy|http://jermolene.tiddlyspace.com]] is the original creator of TiddlyWiki who worked as Head of Open Source Innovation for [[BT]], leading [[Osmosoft]].
!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}}}
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]]
(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);
!"""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>>
!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
//{{{
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);
  }
};
//}}}
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
!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.
!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}}}
!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>>
!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
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]]
* 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 ]]
!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,
(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);
See...
* [[PermaLink]]
* [[permaview (macro)]]
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]].
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
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
!Description
Set the SiteUrl shadow tiddler to the full target URL when using TiddlyWiki for publication on the web.
!Default Contents
''none''
!Description
The [[options]] macro outputs the same AdvancedOptions as you find in the [[Backstage Area]]...
!Usage
{{{
<<options>>
}}}
<<options>>
<<tiddler WikiText>>
<!--{{{-->
<div class='toolbar'
	macro='toolbar [[ToolbarCommands::ViewToolbar]] icons:yes height:16 width:16 more:popup'>
</div>
<div class='heading'>
	<span class='spaceSiteIcon'
		macro='tiddlerOrigin label:no spaceLink:yes height:32 width:32 preserveAspectRatio:yes'>
	</span>
	<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>
	<span class='followPlaceHolder' macro='followTiddlers'></span>
	<span class='modifierIcon'
		macro='view modifier SiteIcon label:no spaceLink:yes height:48 width:48 preserveAspectRatio:yes'>
	</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>
<hr/>
<div macro="view title replyLink"></div>
<!--}}}-->
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.
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.
!Summary
Ginsu splits the tiddlers in a TiddlyWiki HTML out into separate files ready for checking in to Subversion.
!External Resouces
* [[Ginsu|http://trac.tiddlywiki.org/wiki/Ginsu]]
!!See Also
* [[Cook]]
* [[Recipes|Recipe]]
* [[Chef]]
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|
[[Welcome]] [[TiddlyWiki Core|Dev.Core]] [[Plugin Development|Dev.Plugins]] [[Contribute]]
!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
A [[space|Space]] may have one or more members who together form a [[Small Trusted Group]] collectively owning the space.
[[TiddlyTools|http://www.tiddlytools.com]] is a treasure trove of high quality, well maintained TiddlyWiki plugins created by [[Eric Shulman]] of ELSDesign.
'' 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]]
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...]]|
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
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)
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>>
!"""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]
!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
}}}
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]].
/***
|''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);
//}}}
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]]
!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>
}}}
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
<<tiddler DateFormats>>
!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.
<<<
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 question marks 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]]
* ''[[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.
<<upgrade>>
@TiddlyWikiDev
''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]]).
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]]
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''|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);
    }
};
//}}}
!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
See [[Blockquotes]]...
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

The content of these tiddlers which have a prefix of {{DEV.}}} are prepended to tiddlers that originate from @TiddlyWiki.
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
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]]...
/***
|''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);
//}}}
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.
/***
|''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)
//%/
Type the text for 'New Tiddler'

TiddlyWiki Resources
Contents
[show]
Official

    tiddlywiki.com is the primary TiddlyWiki web site.
    wiki.tiddlywiki.org is this documentation wiki.
    trac.tiddlywiki.org Trac site for submitting/viewing bug reports and seeing the core development progress.
    Getting Started on TiddlyWiki.com 

Books

    TiddlyWiki維基寫作-知識管理最佳工具 ("TiddlyWiki - An excellent tool for knowledge management."; Traditional Chinese) 

Guides and Tutorials

    TW Help a TiddlyWiki help file for beginners maintained by Morris Gray
    TiddlyWiki for the rest of us by Dave G (Also available in Spanish)
    Intro: TiddlyWiki is a very versatile program, but has an initial learning curve to it. Much of the documentation is written by and for people immersed day after day in computer code, so, um, how do I put this delicately, it is not always written in helpful everyday language. Not being a computer genius myself, I found the TiddlyWiki learning curve daunting, but well worth it. For those of you like me, newcomers to TiddlyWiki who don't know "Tiddly Squat", I would like you to discover this great program without having to commit as much time and energy to it as I did. Enjoy!
    Tiddler Toddler A guide for absolute beginners by Julie Starr, an absolute beginner
    TiddlyWikiTutorial a tutorial in the form of a TiddlyWiki
    TiddlyWiki Basics by Denise Olson
    Writing Macros and Core Code Overview now contain what had been at The Macrocodex a guide to writing TiddlyWiki macros by Gimcrack'd. (That link now produces 301.)
    Tid-Help a primer for tiddlywiki by Jim Ventola
    TiddlyWiki Getting Started Guide by Daniel Baird
    A Getting Started Guide in development that might still be the first in a series of standalone guides to TiddlyWiki. See the latest sample for a preview.
    TiddlyWiki quick reference card by Dmitri Popov (CheatSheet PDF) (Broken)
    TiddlyWiki Format Reference One page reference for TiddlyWiki markup (without resorting to view tiddler source)
    Start here: The making of a presentation manager part 1 to part 3 - A step by step HowTo get this: a-pm presentation manager by Mario Pietsch 

Other Useful Sites

    TiddlySpot (free TiddlyWiki hosting)
    TiddlySnip a firefox extension that allows you to use TiddlyWiki as a scrapbook! (this wouldn't work in Firefox 3.5.12 because of an invalid security certificate)
    TiddlyThemes a gallery of themes for TiddlyWiki 

Community Support

    Users' mailing list at Google Groups (Newcomers welcome!)
    Developers' mailing list at Google Groups
    IRC chat (#tiddlywiki on Freenode)
    Facebook Groups 

Benefactors

    UnaMesa
    Osmosoft 

More

Some of these might be past their use-by date.

    Tid-Help 2 a screencast also by Jim Ventola
    TiddlyWikiTutorial by Blog Jones
    Intro: Welcome to TiddlyWikiTutorial, an introduction to one of the most efficient ways of communicating information ever devised.
    Getting Started Guide by Russ Lipton 404
    Contents About Getting Started, What Is TiddlyWiki? What You Can Do With TiddlyWiki, Getting Around TiddlyWiki...
    TiddlyWikiFAQ by Simon Baird. Has some stuff that should be migrated over here.
    Some useful reference stuff by Julian Knight (Jules) including lists of built-in macros, formatting rules and useful JavaScript methods for developers.
    TiddlyWikiTips by Jim Barr
    A screencast by Leon Kilat. Unfortunately he choose an old version of GTD-TiddlyWiki. (Full screen version here).
    An old but good introduction to/description of TiddlyWiki from euicho.com
    Some older stuff at zrenard.com.
    TiddlyWikiPlugin on delicious a list of plugins maintained by BidiX
    Guida a TiddlyWiki an italian TiddlyWiki tutorial 

Searches

    Search for code at GitHub.
    Search for code at SourceForge.
    Search for shareable adaptations and user creations at LimeBits.
    Search for anything "TiddlyWiki" at Delicious. 
[[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;
}

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

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

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

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

.tiddler .titleBar{
	margin-left:40px;
}
.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: '» ';
}
/*}}}*/
/***
|''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);
	}
};
})();
//}}}
/***
@@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);
    }
  }
};
//%/

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()]]...
Looking for a [[old version|Archive]] of TiddlyWiki? Check out the [[Archive|http://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://tiddlywiki.com/archive"/>
</div>
</html>
'' 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]]
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.
''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>>
}}}
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
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.
/***
|''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);
//}}}
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>>
'' 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)
See [[Finding A Tiddler]]...
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;''.
Want to embed an iFrame into TiddlyWiki? See [[HTML Formatting]]...
! 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>>
!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.
}}}
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.
}}}
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]]
<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>
/***
|''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.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);
};
//}}}
!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]]

}}}
See [[Hijacking]]...
!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>>
}}}
[[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%/
!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>>
Plugins enhancing search...
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">>
!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}}}
/*
 * 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);

//}}}
!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
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'}}}
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
}}}
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>>
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 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
<<allTags excludeLists>><<listfiltr>>
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.
/***
|''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);
//}}}
!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>>
}}}
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''.
<<tiddler "Best Practices">>
!Summary
By default, the shadow tiddler PluginManager contains nothing but the command to display the plugin manager.
!Default Contents
{{{
<<plugins>>
}}}
<!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>
!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
<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>
!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''
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
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"
[[five.tiddlywiki.com|http://five.tiddlywiki.com]] -- the next generation TiddlyWiki, currently under heavy development, leveraging [[HTML5]]
<<tiddler Images>>
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]]
//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?]]
Tiddlers that have been redirected tag to <<tag REDIRECTED>>.
/***
|''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);
//}}}
!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.
ColorPalette
StyleSheet
SiteSubtitle
GettingStarted
SiteTitle
MainMenu
SiteIcon
DefaultTiddlers
ViewTemplate
PageTemplate
SideBarOptions
EditTemplate
SiteInfo
SideBarTabs
ToolbarCommands
[[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]].
/***
|''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
/*{{{*/

/*}}}*/
<<tiddler Toolbar>>
<<<
;[[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>>
<<<
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.
}}}
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]]
To register as a new user in TiddlySpace visit [[TiddlySpace.com|http://tiddlyspace.com/register]].
A DOM reference points to an element in the DOM.
[[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]].
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]].
[[Welcome]]
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"
>>
}}}
{{annotation{

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

}}}
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">>
[[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]]
<<tiddler Links>>
!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]]...
/***
|''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));
//}}}
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?]]...
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
<<tiddler Blockquotes>>
See [[TiddlyWiki Core]]...
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
Someone has tagged a tiddler tagging here for review...
Check tiddlers with the tag <<tag DELETE>> for deletion...
/***
|''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);
//}}}
/***
|''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;
};
//}}}
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
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}}}
/*{{{*/
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])
/*}}}*/
<<tiddler "Persistent Options">>
!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%/
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
%/
See [[version macro|version]]...
See http://www.mediawiki.org...
!References
<<references>>
{{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.
;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.
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]].
}}}
''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]]
See [[Primitive Types]]...
!Summary
The shadow tiddler ImportTiddlers provides access to importing tiddlers.
!Default Contents
{{{
<<importTiddlers>>
}}}
<<importTiddlers>>
!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@@
>>
@@color:darkred;display:block;padding:5px;background:#eee;Are you developing TiddlyWiki / TiddlySpace Plugins? Please help improve this documentation.

[[Learn more on how to contribute...|Contribute]].@@
This space provides developer documentation...
:about [[how TiddlyWiki works internally|Dev.Core]]
:about [[custom plugin development|Dev.Plugins]]
For an annotated reference to the source code, have a look at the [[Extracted Source Code]]...
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
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.
{{{
|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
}}}
!Summary
Cook is the build tool for [[TiddlyWiki]]. It utilizes [[recipes|Recipe]] to stitch together TiddlyWiki HTML files from their constituent chunks.
!External Resources
* [[Cook|http://trac.tiddlywiki.org/wiki/Cook]]
!See Also
* [[Ginsu]]
* [[Recipes|Recipe]]
* [[Chef]]
(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);
Toplevel classes provided by the TiddlyWiki core...
<<tiddler SiteTitle>> <<tiddler SiteSubtitle>>
!Description
The [[refreshDisplay]] helper macro outputs a button to redraw TiddlyWiki as currently displayed.
!Usage
{{{
<<refreshDisplay>>
}}}
<<refreshDisplay>>
See [[Finding A Tiddler]]...
!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>>
}}}
!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
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){
     }
}
}}}
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.
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.
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
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
<<tiddler Tables>>
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!
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.
See [[TiddlyLink]]...
See [[Plugin StyleSheets]]...
!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 [[Wikifier.class]]...
!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//">>|
The [[space|Space]] created for a [[user|User]] when [[registering|Register]] with [[TiddlySpace]] is called the users' [[Home Space]]. 

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

''Note:'' It is possible for a [[user|User]] to [[add another user as a member|Add Member]] to their [[Home Space]] which eventually also allows for a [[user|User]] to remove themselves or be removed from their own [[Home Space]].
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?]]
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
!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
/***
<<tiddler zzConfig...>>
***/
//{{{
//uncomment to enable evaluated parameters
//config.evaluateMacroParameters = "full";
//}}}
See [[TiddlyFox]]...
[[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.
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>>
Extensions to the primitive {{{String}}} type in JavaScript...
<<list filter [startsWith[title,String.]][sort[title]]>>
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]].
/*!
|''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
//}}}
<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>
!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>
<<<
/***
|''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
        );
    }
}
//}}}
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.
//{{{

(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);
	
//}}}
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
See ShadowTiddler...
<<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%/
!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>>
}}}
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]]
}}}
!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
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>>
}}}
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]]
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.
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]]>>
/***
|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(/^#/,'')); } }
//}}}
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.
!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!'>>
The store is an instantiance of the [[TiddlyWiki.class]] and used to access, manipulate and create tiddlers.
> 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.
See [[Finding A Tiddler]]...
!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?
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.
!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()'
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.
!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"]}}}
''Deprecated'': Did output the same SynchronizationWizard as in the [[Backstage Area]].
!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%/
}}}
|~ViewToolbar|+editTiddler +cloneTiddler > fields refreshTiddler changeToPublic changeToPrivate revisions permalink references jump closeOthers < closeTiddler|
|~EditToolbar|+saveTiddler saveDraft -cancelTiddler deleteTiddler|
|~RevisionToolbar|> fields revert|
TiddlyWiki currently does not extend this primitive type of JavaScript.
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]]...
!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.
!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]]
!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.
<<<
|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
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?]]...
/***
|''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...
//}}}
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]]
<<tiddler Markup>>
!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
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 <<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!@@
!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%/
Something broke in your TiddlyWiki or TiddlySpace?

Use the {{{#start:safe}}} paramifier to start TiddlyWiki with all plugins disabled. 
The following functions are implemented in the ''global'' namespace...
{{functions{<<list filter [tag[global]][sort[title]] template:Templates##Function>>}}}<<listfiltr>>
|''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|
!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
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
!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
{{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
(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);
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/]].
}}}
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]].
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.
<<tiddler Code>>
/***
|''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);
//}}}
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]].
(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);
<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>
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%/
{{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]].
See [[Deleting A Tiddler]]...
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|
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]].
<<tiddler [[Comment Formatting]]>>
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.
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
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|
!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.
''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.
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%/
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]]
Some macros render a button or link which performs a dedicated action when clicked...
<<get ##Description filter:[tag[Button]] format:'!!![[%1]]
<<<
%0
<<<'>>
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>}}}
This behaviour requires a plugin to be installed. Install SinglePageModePlugin from http://tiddlytools.com. See [[How do I install a plugin?]] for more info.
/***
|''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);
//}}}
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
<<<
/***
|''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);
//}}}
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.
<<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, [[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]]...
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";
}}}
!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
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]]
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}}}.
/***
|''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);
//}}}
See [[Transclusion]]...
!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()]]...
/***
|''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);
//}}}
/***
|''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));
//}}}
!Summary
[[Chef|http://chef.tiddlywiki.org]] provides a simple way to [[cook|Cook]] TiddlyWiki [[recipes|Recipe]].
!See Also...
* [[Cook]]
* [[Ginsu]]
* [[Recipes|Recipe]]
/***
|''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);
//}}}
TiddlyWiki currently does not extend this primitive type of JavaScript.
/***
|''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";

})();
//}}}
!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
/***
|''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);
//}}}
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.
Extensions to the primitive {{{Array}}} type in JavaScript...
<<list filter [startsWith[title,Array.]][sort[title]]>>
!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'
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"""''.
Jeremy is the [[creator of TiddlyWiki|https://plus.google.com/u/1/109308865556494599029]].

http://tiddlywiki.com/#JeremyRuston
See [[Tiddler Templates]]...
/***
|''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''|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));
//}}}
<<tiddler FAQ>>
!Summary
This tiddler explains how node.js is involved in the new build process.
!Details
tbd
/***
|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);
}
})();
//}}}
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
<<<
/***
|''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);
//}}}
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]].
}}}
/***
|''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|
!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 [[upgrade]] macro outputs the same UpgradeWizard as in the Backstage Area...
!Usage
{{{
<<upgrade>>
}}}
<<upgrade>>
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]]
Here we are -- on TiddlySpace -- more precisely, the @TiddlyWikiDev space.
!"""What is TiddlySpace?"""
=> http://tiddlyspace.com
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.


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''.
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
!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}}}
/***
|''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);
//}}}
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
Type the text for 'Configuration_Options'
<<tiddler Lists>>
{{{
!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
}}}
See http://trac.tiddlywiki.org/wiki/Translations for a current list of translations, and information on how to do new translations.

See http://trac.tiddlywiki.org/browser/Trunk/association/locales/core to view the source code of existing translations.

See http://translations.tiddlyspace.com/ to view and get information on how to include translations on TiddlySpace.
See [[UTF-8]]...
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]].
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.
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>
}}}
[[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]]>>
Discussion around TiddlyWiki's core functions from a developers perspective.
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''.
!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]]
/*}}}*/
}}}
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.
Edit your PageTemplate tiddler. Also see http://tiddlythemes.com/

(to be expanded)
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
Type the text for 'Read-Only_Mode'
deprecated as of 2.7.0
<<sync>>
There are numerous ways to get TiddlyWiki to display the way you want it to.
!"""Themes Repository"""
A few themes have been listed over time in the themes repository which provide empty [[TiddlyWikis|TiddlyWiki]] for you to start with...
http://themes.tiddlywiki.com
!"""How Themes Work"""
A TiddlyWiki theme basically is a set of [[shadow tiddlers|ShadowTiddler]] and [[style sheets|StyleSheets]], predefined tiddlers which may be bundled to a theme tiddler.
!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>>
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.
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.
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
|''ViewTemplate''|##TWDocViewTemplate|
|''EditTemplate''|##EditTemplate|
|''StyleSheet''|##StyleSheet|

!ViewTemplate
[[TWDocViewTemplate]]

!EditTemplate
[[EditTemplate]]

!StyleSheet
[[StyleSheet]]
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.
In TiddlyWiki you can implement scripts in JavaScript -- most of these are based on...
:» [[InlineJavascriptPlugin|Scripts]]
:» transclusion with evaluated parameters
<<list all>><<listfiltr>>
!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]]
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...
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]]...
<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>
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/]]
Edit the ViewTemplate tiddler.
Reply to this tiddler if you have a particular request for missing content or have content you wish to contribute but it doesn't as of yet have a tiddler covering it in this space.

All suggestions are greatly appreciated and will be displayed below.
{{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.
!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
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
/***
|''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);
//}}}
!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)">>
|Name|HideWhenPlugin|
|Author|[[SimonBaird]]|
|URL|http://mptw.tiddlyspot.com/|
|Description|Allows conditional inclusion/exclusion in templates.|
See [[Alternative Tiddler Layouts]]...
''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]]
<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>
[[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]].
!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()
}}}
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
----
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.
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]]
/***
|''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)
//%/
!Description
The [[importTiddlers macro|importTiddlers]] outputs the same import wizard that is provided in the [[Backstage Area]]...
!Usage
{{{
<<importTiddlers>>
}}}
<<importTiddlers>>
!Summary
The shadow tiddler SideBarTabs is used as the contents of the tabs panel in the right-hand [[Sidebar]].
!Default Contents
{{{
<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>
}}}
<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>
!TiddlySpace
In a default TiddlySpace the tabs are reduced to one level...
{{{
<<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
>>
}}}
<<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
>>
See [[Alternative Tiddler Layouts]]...
See [[Plugin]]
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]]
To leave acomment use the ''reply'' button at the bottom of a tiddler. {{right{
Rather interested in
[[Core Development]]?

}}}
However, the tiddler will actually reside in your home space.

@TiddlyWikiDev will search TiddlySpace and pull in all the responses and show them as comments. This way, you can suggest changes and those suggestions can be discussed (if required) before making it into the actual documentation.

In order to be able to reply, you will need to be a member of tiddlyspace.

Please refer to the [[FUNCTION TEMPLATE]] when documenting a core function.
''TODO:'' Especially all functions that lack brackets at the end would probably profit from a rewrite.

Have suggestions for missing content? Reply to [[TiddlyWiki Dev Missing Stuff]].

<<tiddler "Developer Space">>
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.
<<closeAll>><<permaview>><<newTiddler>>
See [[Alternative Tiddler Layouts]]...
See [[store.getTaggedTiddlers()]]...
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]]
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
!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.
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
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]]
Use the StyleSheet tiddler.

Check out http://tiddlythemes.com for a list of themes.
Plugins enhancing tagging...
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.
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
!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}}}
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.
# 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.


/***
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));
//}}}
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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/
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");
}}}
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]].
From the [[Glossary|Tag]]...
<<<
<<tiddler Tag>>
<<<
![[System Tags]]
<<tiddler "System Tags">>
!Also see...
* [[tags macro|tags]]
* [[Enhanced Tagging]]
!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.
!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
/* 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;
}
/***
|''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);
//}}}
Here is a refernce of all properties of TiddlyWiki class objects...
~tbd~
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";}}}
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()]]
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.
<<timeline "modified" "17" "YYYY-0MM-0DD">><<listfiltr>>
*[[Complete Timeline...|Timeline]]
!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 <<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.
}}}
!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
core documentation | resources for plugin development
!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);
}}}
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.
See [[store.getTiddlerText()]]...
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
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
!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>
}}}
See [[AutoSave]]...
!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.
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]].
!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 */
}
/*}}}*/
See [[About the old and the new wikis]]...
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);
}}}
[[TiddlyWiki Developer Space|GettingStarted]]
!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}}}
[[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.
* 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.
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?]]
!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 fetchT