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>
<!--}}}-->
ParamParser is a new plugin I have created to better understand how TiddlyWiki actually parses parameters. Just see below how it works...

<<tiddler ParamParserMacro##Usage>>
@MattLucht

@@Please do not modify this tiddler; it was created automatically upon space creation.@@
;Jeremy on Google Plus
:https://plus.google.com/u/1/109308865556494599029
<<binaryUploadPublic title:SiteIcon>>
!Summary
@ListFiltr allows to filter any list or list-like block by a search term. It works with (nested) ordered, unordered and definition lists as well as with spans, divs or simply plain text lines.
!Details
To use it in TiddlySpace, simply include the @ListFiltrPlugin space.

@ListFiltr automatically detects any lists that precede the macro. Alternatively you can detect a number of different "list elements" by wrapping everything with a class. Simply have either followed by the {{{<<listfiltr>>}}} macro.

For more information and examples, go to the @ListFiltr info space.
!Example
Here are some capabilities of ListFiltrPlugin:

{{maxw{
*matches filter strings that are 2 or more characters long
*highlights the line item where a match is found
*highlights any word that matches the filter string
*highlights tiddlyLinks and externalLinks whose target matches the filter string
*displays the whole tree above and all child items below a matching list item but only highlights matching list items
*displays the corresponding list definition or list term when either matches
*turns plain text lines into paragraphs
*hides linebreaks upon filtering
*allows to match list contents nested via class wrappers
*reoutlines ordered lists to preserve ordering when filtering via [[_jQueryOutline]]
*allows to preserve certain selectors from collapsing (see [[@Customize|http://customize.tiddlywiki.com#Plugins]])
*finds the list in a given selector (for use in ViewTemplate)
<<listfiltr>>
TiddlyWiki Enthusiast
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
URL: https://plus.google.com/u/1/109308865556494599029/posts/h4w6QrLpEKf
Video: https://www.youtube.com/watch?v=_ojnouO8-PA
!Grids
!!Dynamic Grids
For me, dynamic grids are magnitudes more important than static grids.

So what enables people were to...
# first define a grid filter
#* e.g. what tiddlers to display in the grid rows
# custom, "smart" columns defining what content to pull, e.g.
#* sections
#* fields
#* slices
# column sort
#* both dynamic and a default column + sort order
!!Static Grids
Static grids do have their use cases. However, requiring thusly named tiddlers may actually result in just ending up using a table. After all, TW is about __content reuse__, e.g. dynamic binding, and not so much about __tieing content__ to specific use-cases like grids.

So, instead of a grid widget, it may rather be useful if one could define in the table markup (!) a context-tiddler for any of...
* the entire table
* (the column)
* the row
* the cell
...with each lower level overriding the above, so cell first, then row, then column, then table context.

Declaring context tiddlers could ba achieved using a syntax like...

; table
:» a pseudo-class
: {{{|[[context tiddler]] myTable|k}}}
; column
:» What usecase?
: {{{?!?}}}
; row
:» a pseudo-row-modifier
: {{{|one |two| three|[[context tiddler]]}}}
; cell
:» pseudo-css
: {{{|[[context tiddler]];one |two| three|}}}

Using any macro in the appropriate context would then allow shortcuts to pull information from that "context tiddler" rather than the outermost tiddler:
* {{{<<tiddler ##SectionTitle>>}}}
* {{{<<tiddler ::SliceName>>}}}
* {{{<<tiddler ??FieldName>>}}}

Also, the corresponding cells, rows, columns, tables should perhaps be given a css class corresponding to the context tiddler name.
If you want to {{{clean archived tiddlers}}} you can tag tiddlers tags <<tag archive>> and then use a little script with InlineJavascriptPlugin to clean all tiddlers tagging to such an archive category...

<<code run>>

''Note'': You will be asked to confirm tiddlers to be deleted.

!Code
{{{
<script label="Click here to clean all archived tiddlers!" title="click here to clean archived tiddlers.">
var t,tgt,ca,ar,clean=[];
ar=store.getTaggedTiddlers('archive');
for(ca=0;ca<ar.length;ca++){
	tgt=store.getTaggedTiddlers(ar[ca].title);
	for(t=0;t<tgt.length;t++)clean.pushUnique(tgt[t].title);
}
if(clean.length>0){
	if(!confirm('Do you really want to delete '+clean.length+' archived items?\n'+clean))return;
	for(t=0;t<clean.length;t++){
		store.removeTiddler(clean[t]);
		story.closeTiddler(clean[t],true);
	}
}else alert('Nothing to be deleted.');
</script>
}}}
/***
|''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);
//}}}
/***
|''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);
//}}}
@TiddlyWikiDev
/***
|''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
RandomTiddlersMacro@randomtiddlers...
*fetches a maximum number of tiddlers  (maybe 10)
*out of a predefined sample size (maybe 50)
*from all tiddlers available (maybe 200)
**sorted by modified or creation date, latest first
*which (optionally) have a certain tag
*outputs the contents of a specific section, slice or field
*allows you to save the output to a tiddler, i.e. a [[story|http://tiddlytools.com/#StorySaverPlugin]]
!Details
''A Realworld Example:'' Give me a list with a ''Summary'' for each of 10 random tiddlers out of the 50 last modified ones tagged ''article''.

''Another Example:'' Save 10 random questions out of all my tiddlers tagged ''Question'' and save them to a tiddler called ''Test Questions'' which is to be tagged ''Test''. Allow me to also save it as ''Test Questions for Tobias''.
!Configuration
RandomTiddlersMacro@randomtiddlers is configured via a configuration tiddler called RandomTiddlersConfig:
@@display:block;background-color:#ddd;margin-top:7px;padding:0 10px;
<<tiddler RandomTiddlersConfig>>
@@
You can specify a custom configuration tiddler as the first macro parameter like so...
{{{
<<randomTiddlers ConfigTiddler>>
}}}
Any custom config tiddler must, of course, provide the same parameters as does RandomTiddlersConfig which are...
!Required Parameter Slices
|''sample''|the sample size out of all tiddlers|
|''max''|the maximum number of random tiddlers taken from the sample|
|''tagged''|only tiddlers with these tags are considered<br>- as a bracketedList: tagA "tag B" [[tag C]]<br>-> if empty, all tiddlers are taken into account|
|''exclude''|exclude any tiddlers with these tags (optional)|
|''content''|the content to be fetched from the tiddler<br>-> either a section-, slice- or field-name|
|''type''|the query type<br>-> one of ''section'', ''slice'' or ''field''<br>-> an unidentified type or //none// defaults to ''section''|
|''required''|''yes'' or ''no'' (defaults to ''no'')<br>-> whether or not only tiddlers providing the desired content are displayed|
|''sort''|by ''modified'' or ''created''|
|''dateformat''|how to format the date if used in the template|
|''saveTo''|default: <blank><br>-> the title of a tiddler to which you want the list to be saved<br />-> you are prompted to confirm or change this title<br />-> if you leave the title unchanged, overwrites the tiddler if it exists<br />-> if you change the entered title and that tiddler exists, you are asked to confirm overwriting it by answering "YES"|
|''saveWithTags''|a bracketed list of tiddler tags for the saved tiddler<br />-> default: no tags<br />-> e.g. use the tag <<tag story>> in combination with [[StorySaverPlugin|http://www.tiddlytools.com/#StorySaverPlugin]]|
|''Template''|the output template for each item<br>-> must start with a heading called {{{Template}}}<br>-> any wiki markup that follows this section will be taken as the template<br>-> this way, the template itself can contain further headings|

''Note:'' Any parameters you leave out will default to ''null''.
!Template
The template works via the following placeholders...
|%0|tiddler title|
|%1|the query ...being either a section-, slice- or field-name|
|%2|the query results|
|%3|the tiddler's modified (or created) date|
|%4|the tiddler's modifier|
|%5|the tiddler tags as comma separated string|
|%6|the count|

If your version of TiddlyWiki does not like you to define a link as {{{[[%0]]}}} you can suppress that nagging {{{URIError: malformed URI sequence}}} message by wrapping your whole template as a code block like the one you see in the Template section of RandomTiddlersConfig...
<html><pre>
{{{
[[%0]]
}}}</pre></html>
!Inclusion
On TiddlySpace you can simply include the @RandomTiddlers space which contains...
*[[RandomTiddlersMacro]]
*[[RandomTiddlersConfig]]
!The Commented Source
https://github.com/tobibeer/TiddlyWikiPlugins/blob/master/plugins/RandomTiddlersMacro.js
!Version History
|!Version|!Summary|
|1.04|changed param ''save'' to ''saveTo'' so you now specify the title of the tiddler under which you want to save by default|
|1.0.3|added ability to overwrite to an existing tiddler when saving the list|
|1.0.2|added the ability to save the generated list as a tiddler with certain tags|
|1.0.1|fixed bug in handling retrieved tiddler data|
|1.0.0|initial release|
!A live example
{{{
<<randomTiddlers>>
}}}
The ''Source'' slice of 10 random out of the last 50 modified tiddlers tagged <<tag systemConfig>>:
<<randomTiddlers>>
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.//)
/***
|''Name''|SlidrPlugin|
|''Description''|shows a tiddler timeline using sliders|
|''Documentation''|http://slidr.tiddlyspace.com|
|''Author''|Tobias Beer|
|''Version''|1.1.0 2013-09-27|
|''CoreVersion''|2.6.5|
|''Source''|https://raw.github.com/tobibeer/TiddlyWikiPlugins/master/plugins/SlidrPlugin.min.js|
|''License''|[[Creative Commons Attribution-Share Alike 3.0|http://creativecommons.org/licenses/by-sa/3.0/]]|
{{{
<<slidr>>
}}}
<<slidr>>
***/
// /%
(function(e){config.macros.slidr={defaults:{txtSliderTooltip:"Click to show tiddlers in '%0'. CTRL+Click to expand / collapse all.",errDate:"%0 is not a valid start or end date!",lblTiddler1:"tiddler",lblTiddler2:"tiddlers",minGroup:7,openOnLoad:false,level:"month",field:"-modified",exclude:"excludeLists",noDblClick:true,fmtYear:"YYYY",fmtMonth:"MMM, YYYY",fmtDay:"0DD. mmm, YYYY",fmtDate:"0hh:0mm",fmtDateFull:"0DD. mmm, YYYY",fmtSlider:"{{slidr_title{%0}}}{{slidr_count{%1}}}",fmtTiddler:"\n{{slidr_entry{ {{slidr_date{%1}}}"+"{{slidr_tid{[[%0]]}}}"+"{{slidr_tags{%2}}} }}}",fmtTag:"<<tag [[%0]]>>",fmtTagTitle:"<<tag [[%0]]>>",fmtCount:"(%0 %1)"},handler:function(t,n,r,i,s,o){var u,a,l,c,h,p,d,v,m,g,y=[],b,w=[],E=config.messages,S,x,T,N,C,k,L,A,O,M,_,D,P,H,B=this.defaults,j=s.parseParams("anon",null,true),F=store.getTiddlerText(getParam(j,"config","")),I=F?F.parseParams("anon",null,true):j,q=I[0]["anon"]&&I[0]["anon"].contains("tags")?[]:undefined;year=parseInt(getParam(I,"year")),month=parseInt(getParam(I,"month")),day=parseInt(getParam(I,"day")),d=getParam(I,"start"),a=getParam(I,"end"),p=getParam(I,"level",q?"":B.level),ex=getParam(I,"exclude",B.exclude).readBracketedList(),f=getParam(I,"field",B.field),keep=getParam(I,"keep","").readBracketedList(),filter=getParam(I,"filter",""),format=getParam(I,"format",B.fmtTiddler),template=getParam(I,"template",""),px={open:getParam(I,"open",B.openOnLoad),year:year,month:month,day:day,fmtDate:B.fmtDate,fmtDateUser:getParam(I,"dateformat"),fmtDateFull:getParam(I,"dateformat.full",B.fmtDateFull),fmtYear:getParam(I,"format.year",B.fmtYear),fmtMonth:getParam(I,"format.month",B.fmtMonth),fmtDay:getParam(I,"format.day",B.fmtDay),min:getParam(I,"min",B.minGroup),ex:ex,hideTags:getParam(I,"hideTags","").readBracketedList()},desc=f.substr(0,1)=="-",last=function(e,t){var n=e[e.length-1],r=[t,[]];if(!n||t!=n[0]){e.push(r);n=e[e.length-1]}return n[1]};if(template){template=store.getTiddlerText(template);if(template)format=template}px.fmtTiddler=format;c=a?!this.isValidDate(a):false;if(c||(d?!this.isValidDate(d):false)){createTiddlyError(t,E.macroError.format(["slidr"]),E.macroErrorDetails.format(["slidr",B.errDate.format([c?a:d])]));return}d=d?Date.convertFromYYYYMMDDHHMM(d):d;a=a?Date.convertFromYYYYMMDDHHMM(a):a;p=p.toLowerCase();p=p.substr(p.length-1)=="s"?p.substr(0,p.length-1):p;px.level=p;h=desc||f.substr(0,1)=="+"?f.substr(1):f;if(filter){y=store.sortTiddlers(store.filterTiddlers(filter),f)}else{y=store.getTiddlers(h);if(desc)y.reverse()}for(v=0;v<y.length;v++){g=y[v];b=g.tags?g.tags:[];if(!(keep.contains(g.title)||b.containsAny(keep))&&(ex.contains(g.title)||b.containsAny(ex)))continue;ti=g.title;u=g[h]||g.fields[h];if(!u.getMonth)u=Date.convertFromYYYYMMDDHHMM(u);S=u.getYear()+1900;x=u.getMonth()+1;T=u.getDate()+1;N=S==year;C=x==month;k=T==day;L=!year&&!month&&!day;M=year&&!month&&!day;P=year&&month&&!day;H=year&&month&&day;A=!year&&month&&!day;O=!year&&!month&&day;D=year&&!month&&day;_=!year&&month&&day;if((!d||d&&u>=d)&&(!a||a&&u<=a)&&(L||M&&N||A&&C||O&&k||P&&N&&C||_&&C&&k||D&&N&&k||H&&N&&C&&k)){m=last(last(last(w,S),x),T);m.push({title:ti,date:u,tags:g.tags})}if(q){e.each(b,function(e,t){if(keep.contains(t)||!ex.contains(t)&&!px.hideTags.contains(t))q.pushUnique(t)})}}px["yrs"]=w;t=createTiddlyElement(t,"div",null,"slidr");e('<div class="slidr_clear"/>').insertAfter(e(t));e(t).data("params",px);if(B.noDblClick)e(t).dblclick(function(){return false});what=day?"day":month?"month":year?"year":"";if(q)q.sort(function(e,t){return e.toLowerCase().localeCompare(t.toLowerCase())});this.renderSliders(t,what,year,month,day,q)},renderSliders:function(t,n,r,i,s,o){var u,a,f=[],l,c=config.macros.slidr,h=[],p=[],d=[],v=e(t).closest(".slidr").data("params"),m=v.yrs,g=function(e,t,n,r,i){f.push({title:e,year:t,month:n,day:r,tids:i})};if(o){e.each(o,function(e,t){l=c.getTids(v,m,v.level?true:false,t);u=typeof l=="object";if(u&&l.length||l>0)g(t,null,null,null,l)})}else{e.each(m,function(t,o){yK=o[0];yV=o[1];if(!n||n=="year"){if(!n||!r||yK==r)g(c.formatDate(yK,"11","11",v.fmtYear),yK,isNaN(i)?null:i,isNaN(s)?null:s,c.getTids(v,yV,v.level=="year"?false:true))}else{e.each(yV,function(t,o){mK=o[0];mV=o[1];if(n=="month"){if((!i||mK==i)&&(!r||yK==r)){g(c.formatDate(yK,mK,"11",v.fmtMonth),yK,mK,isNaN(s)?null:s,c.getTids(v,mV,v.level=="month"?false:true))}}else{e.each(mV,function(e,t){dK=t[0];dV=t[1];if((!s||mK==s)&&(!r||yK==r)&&(!i||mK==i)){g(c.formatDate(yK,mK,dK,v.fmtDay),yK,mK,dK,c.getTids(v,dV))}})}})}})}for(a=0;a<f.length;a++){this.createSlider(t,f[a],n,v.open)}},createSlider:function(t,n,r,i){var s=!n.year;def=config.macros.slidr.defaults,count=parseInt(n.tids)?n.tids:n.tids.length,$s=e(createTiddlyElement(t,"a",null,"button slidr_button",null,{title:def.txtSliderTooltip.format([n.title]),year:n.year,month:n.month,day:n.day})).data("tiddlers",n.tids).click(this.click);if(s)$s.attr("tag",n.title);wikify(def.fmtSlider.format([(s?def.fmtTagTitle:"%0").format([n.title]),def.fmtCount.format([count,count>1?def.lblTiddler2:def.lblTiddler1])]),$s[0]);if(i)$s.click()},click:function(t){var n="",r,i,s,o=config.macros.slidr,u=t||window.event,a=e(resolveTarget(u)).closest(".slidr_button"),f=a.attr("tag"),l=a.closest(".slidr"),c=l.data("params"),h=a.next(),p=parseInt(a.attr("year")),d=parseInt(a.attr("month")),v=parseInt(a.attr("day")),m=v?"tids":d?"day":p?"month":"",g=a.data("tiddlers"),y=typeof g=="object",b=a.text(),w=u.ctrlKey,E=w&&(!a.is(".slidr_open")||!a.parent().is(".slidr")&&e(".slidr_button",l).not(".slidr_open").length>0);if(h.hasClass("slidr_list")){if(h.is(":hidden")){h.slideDown();a.addClass("slidr_open")}else if(!E){h.find(".slidr_list").slideUp().prev().removeClass("slidr_open");h.slideUp();a.removeClass("slidr_open")}}else{s=e('<div class="slidr_list'+(y?" slidr_tids":"")+'"/>').insertAfter(a)[0];if(y){e.each(g,function(e,t){var r=new Date(t.date),i="";t.tags.map(function(e){if(f!=e&&!c.ex.contains(e)&&!c.hideTags.contains(e))i+=o.defaults.fmtTag.format([e])});n+=c.fmtTiddler.format([t.title,r.formatString(c.fmtDateUser?c.fmtDateUser:v&&c.level=="day"?c.fmtDate:c.fmtDateFull),i])});wikify(n.substr(0,1)=="\n"?n.substr(1):n,s)}else{o.renderSliders(s,m,p,d,v)}e(s).slideDown();a.addClass("slidr_open")}if(w){i=c.open=="true";c.open=E;e((!E?" > ":"")+".slidr_button",l).each(function(t){var n=e(this),r=n.hasClass("slidr_open");if(E&&!r||!E&&r){n.click()}});c.open=i?"true":"false"}},getTids:function(t,n,r,i){var s=0,o=[],u=function(t,n){if(typeof n[0]=="number"){e.each(n[1],function(e,t){u(e,t)})}else{if(!i||n.tags.contains(i)){s++;o.push(n)}}};e.each(n,function(e,t){u(e,t)});return!r||s<t.min?o:s},formatDate:function(e,t,n,r){return Date.convertFromYYYYMMDDHHMM(String.zeroPad(e,4)+String.zeroPad(t,2)+String.zeroPad(n,2)+"1111").formatString(r)},isValidDate:function(e){var t=/(\d{4})(\d{2})(\d{2})$/.exec(e),n=function(e,t,n){return t>0&&t<13&&e>0&&e<32768&&n>0&&n<=(new Date(e,t,0)).getDate()};return t&&n(t[1],t[2],t[3])}};config.shadowTiddlers["StyleSheetSlidr"]="/*{{{*/\n%0\n/*}}}*/".format([store.getTiddlerText("SlidrPlugin##CSS")]);store.addNotification("StyleSheetSlidr",refreshStyles)})(jQuery)
/*
!CSS
.slidr{
    clear:left;
    width:90%;
}
.slidr_button,
.viewer .slidr_button{
    width:100%;
    display:block;
    cursor:pointer;
    margin:0;
    padding:0;
    clear:left;
}
.viewer .slidr_button .button{
    border-color:transparent;
    background:transparent;
}
.viewer .slidr_button:hover .button{
    color:[[ColorPalette::SecondaryPale]];
    background:[[ColorPalette::SecondaryDark]];
}
.viewer .slidr_button .button:hover{
    color:[[ColorPalette::Background]];
    background:[[ColorPalette::SecondaryDark]];
}
.viewer .slidr_title{
    padding-left:7px;
}
.viewer .slidr_list .slidr_title{
    padding-left:14px;
}
.viewer .slidr_list .slidr_list .slidr_title{
    padding-left:21px;
}
.slidr_entry:hover,
.slidr_list .slidr_list .slidr_open{
    background:[[ColorPalette::TertiaryPale]];
}
.slidr_open{
    background:[[ColorPalette::SecondaryLight]];
}
.slidr_list .slidr_open{
    background:[[ColorPalette::SecondaryPale]];
}
.slidr_list{
    width:100%;
    display:block;
    display:none;
}
.slidr_list ul,
.slidr_list li{
    margin:0;
    padding:0;
    list-style-type:none;
}
.slidr_clear{
    height:1px;
    clear:both;
}
.slidr_tid,
.slidr_tags,
.slidr_date,
.slidr_entry{
    float:left;
    display:block;
}
.slidr_entry{
    width:100%;
    padding:1px;
}
.slidr_tid{
    margin-left:7px;
}
.slidr_tags{
    float:right;
    text-align:right;
    min-width:300px;
    max-width:50%;
    margin-left:7px;
}
.viewer .slidr_tags .button {
    margin-right:0;
    display:inline-block;
}
.slidr_count{
    float:right;
    margin:0 7px 0 2em;
}
.slidr_tids {
    padding:1px 0;
}
!END
*/
// %/
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
<?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>
''in reply to @pmario''

Thanks for the hint! See [[Talks]]@tobibeer in the [[MainMenu]]@tobibeer on how I implemented the idea (even on a theme level) to display a kind of ''discussion thread''... or rather flat list redundantly containing my own post.
<script>
var v='$1';
if(v=='$'+'1')return;else v=v.split(':');
if(!v[1]){v[1]=v[0];v[0]='y';}
var defs={
	y:'<object width="400" height="326"><param name="movie" value="http://www.youtube.com/v/%0?iv_load_policy=3&amp;fs=1&amp;hl=de_DE&ap=%2526fmt%3D18"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><param name="wmode" value="transparent"></param><param name="iv_load_policy" value="3"></param><embed src="http://www.youtube.com/v/%0?iv_load_policy=3&amp;fs=1&amp;hl=de_DE&ap=%2526fmt%3D18" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="transparent" rel="1" hd="1" iv_load_policy="3" width="400" height="326"></embed></object>',
	g:'<embed src=http://video.google.com/googleplayer.swf?docid=%0&hl=de&fs=true style="width:400px;height:326px;" allowFullScreen="true" allowScriptAccess="always" wmode="transparent" type="application/x-shockwave-flash"></embed>'
};
src=defs[v[0]]?defs[v[0]].format([v[1]]):defs['y'].format([v[0]]);
return '<html><span class="video">'+src+'</span></html>';
</script>
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
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

In order to circumvent [[newly imposed security restrictions on evaled parameters in the tiddler macro|http://groups.google.de/group/tiddlywiki/browse_frm/thread/01065797f87c2937/0a3b1673f10ebc15]] I created my own macro providing something just like that. @Evalify can be found at its dedicated [[space|Evalify]]@evalify and it's documentation [[here...|Evalify]].
/***
|''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)
// %/
!The transclusion
*[[ShowReferences]]
!Example
{{{<<tiddler ShowReferences with: "* [[%0]]\n" RandomLink>>}}}

<<tiddler ShowReferences with: "* [[%0]]\n" RandomLink>>
/***
|''Name:''|BulletGraphMacro|
|''Description:''|provides an inline bullet graph|
|''Author:''|[[Tobias Beer]]|
|''Version:''|1.0.0 (2010-09-23)|
|''Source:''|http://bulletgraph.tiddlyspace.com/#BulletGraphMacro|
|''Documentation:''|http://tobibeer.tiddlyspace.com/#BulletGraph|
|''~TiddlyWiki:''|Version 2.5 or better|
!Example
{{{<<bulletgraph 75 85 scales:50,70,90,100>>}}}
<<bulletgraph 75 85 scales:50,70,90,100>>
!Code
***/
//{{{
config.macros.bulletgraph = {

	//CONFIGURATION OPTIONS
	defaultLabels:true,
	fmtTitle:'current = %0 / target = %1',
	fmtScales:' / scales=%0',
	widthGraph:200,
	widthTarget:3,

	handler:function (place, macroName, params, wikifier, paramString, tiddler) {
		var el,p=paramString.parseParams(null,null,true),
			val=parseInt(params[0]),
			tgt=parseInt(params[1]),
			scales=getParam(p,'scales',''),
			lbl=getParam(p,'labels',this.defaultLabels.toString())=='true';
		scales=scales?scales.split(','):null;
		if(lbl)wikify('0',place);
		var	end=scales?parseInt(scales[scales.length-1]):tgt,
			lvl=scales?scales.length:0,
			g=createTiddlyElement(place,"div",null,"hBullet");
		g.style.width=this.widthGraph+'px';
		end=tgt>end?tgt:end;
		var pct=val/end;
		while(lvl>0){
			lvl--;
			createTiddlyElement(g,"div",null,'hBulletScale hBulletLevel'+lvl).style.width=parseInt(scales[lvl])/end*100 + '%';
		}
		createTiddlyElement(g,"div",null,'hBulletVal').style.width=pct*100 + '%';
		if(scales){
			el=createTiddlyElement(g,"div",null,'hBulletTgt');
			el.style.left=tgt/end*100-this.widthTarget/2/this.widthGraph + '%';
			el.style.width=this.widthTarget+'px';
		}
		g.setAttribute('title',this.fmtTitle.format([val,tgt])+(scales?this.fmtScales.format([scales.toString()]):''));
		if(lbl)wikify(end.toString(),place);
	}
},

//STYLESHEET DEFINITIONS
config.shadowTiddlers.StyleSheetBulletGraph =
	'.hBullet {display:block;display:inline-block;position:relative;clear:none;background:#DDD;'+
		'border:1px solid #999;margin:0 0.3em -0.3em 0.3em;height:1.2em;}\n'+
	'.hBullet div {position:absolute;}\n'+
	'.hBulletScale {float:left;height:100%;top:0;}\n'+
	'.hBulletLevel0 {background:#777;}\n'+
	'.hBulletLevel1 {background:#999;}\n'+
	'.hBulletLevel2 {background:#BBB;}\n'+
	'.hBulletLevel3 {background:#DDD;}\n'+
	'.hBulletVal {border-bottom: 0.3em solid #006;height: 0.5em;}\n'+
	'.hBulletTgt {background: #006;height: 0.8em;top: 0.25em;-moz-border-radius:2px;border-radius:2px;}';
store.addNotification("StyleSheetBulletGraph", refreshStyles);
//}}}
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
Today I created SimpleRolesPlugin. It allows you to assign roles to users and to use this information in your templates to conditionally show or hide elements.

<<more SimpleRoles>>
@@color:#C33;* required fields...@@
<html>
<form id='formContact' name='formContact' class='contact' 
method='post' target='responseContact' action='http://goto.bplaced.net/tiddlyspace/sendmail.php' onsubmit='return this.check(this)'>
<input name='noSpamNum' type='hidden' value='' />
<input name='space' type='hidden' value='' />
<input name='token' type='hidden' value='' />
<input name='referrer' type='hidden' value='' />
<input name='formName' type='hidden' value='' />
<input name='formmore' class='formmore' title='Please enter more information.' type='text' size='10'/>

<label>Your name*</label>
<input name='name' type='text' title='Please enter your name!' onfocus="
	var f=document.formContact;if(!f)return;
	if(!f.check){
		f.check=function(){
			var c,i,el,mail,msg,notNum,req,spam;
			if (f.name.value==f.name.defaultValue)
				{alert('Please enter your name!'); f.name.focus();return false;}

			mail=f.mail.value;
			i = mail.length;
			if ((mail.indexOf('@')<0)||mail.indexOf(' ')>0||(mail[i-3]!='.' && mail[i-4]!='.'))mail='';
			if (mail.length < 7){
				alert('Please enter a valid email address!');
				f.mail.focus();
				return false;
			}
			
			msg=f.msg.value;
			req=f.msg.getAttribute('rel')=='required';
			if (req&&msg==f.msg.defaultValue){
				alert('Please write a message!');
				f.msg.focus();
				return false;
			}else{
				if(f.msg.value==f.msg.defaultValue)f.msg.value='';
			}

			spam=f.noSpam.value;
			notNum=!spam||spam.length!=4;
			if (!notNum){
				for(i=0; i<spam.length; i++){
					c=spam[i];
					if(c<'0'||c>'9'){
						notNum=true;
						break;
					}
				}
			}
			if(notNum){
				alert('Put on your goggles and answer the security question correctly!');
				f.noSpam.focus();
				el=f.noSpam.nextSibling;
				while(el&&el.nodeName&&el.nodeName!='IMG'){
					el=el.nextSibling;
				}
				f.noSpam.style.width='100%';
				el.style.width='95%';
				return false;
			}
			
			var target=f.nextSibling;
			target.style.display='block';
			window.scrollTo(0,0);
			return true;
		}

		r=Math.floor(Math.random()*10);
		f.noSpamNum.value=r;
		f.token.value=(new Date()).formatString('YYYYMMDDhhmmss')+Math.random();
		f.noSpamImg.src= 'http://goto.bplaced.net/tiddlyspace/nospam/'+r+'.jpg';
		f.referrer.value=document.referrer;
		f.formName.value='formContact';
	}
	return false;
"/>

<label>Your email address*</label>
<input name='mail' type='text' title='Please enter your email address!'/>

<label>Your message*</label>
<textarea name=msg cols=50 rows=7 title="Please enter your Message here. Dont try to send me any code, it won't get through. Use pastebin instead." rel='required' onclick='this.select()'></textarea>

<label>Security question*</label>
<input name='noSpam' class='spam' size='25' title='Please enter the numbers from the image to the right!'/>

<img name='noSpamImg' class='noSpamImg' src='http://goto.bplaced.net/tiddlyspace/nospam/x.jpg' alt='Your contribution to spam prevention!' title='Spam prevention! Please enter these numbers into the textfield to the left.'/>

<input type='submit' name='submit' class='submit' title='All filled out correctly? Then click to send message.' value='Send Message'>
</form><div id='formContactResponse' class='response' style='display:none'>
<div class="title">Server response...</div>
<iframe src='' name='responseContact' marginheight='0' allowtransparency='true' frameBorder='0'></></iframe>
</div></html>
{{clearBlock{}}}
{{x{<<timeline modified 50 filter:[tag[Journal]]>>}}}<<listfiltr>>
!Summary
With [[LinkifyPlugin|http://linkify.tiddlyspot.com]] hosted on [[TiddlySpot|http://linkify.tiddlyspot.com]] you can automagically turn any text into tiddlyLinks.
!Details
For example, plugins is actually written as {{{plugins}}} in your wiki text and not as {{{[[plugins|Plugins]]}}}.

LinkifyPlugin comes in especially handy for...
* autoweaving or autolinking tiddlers
* managing a dictionary of abbreviations, contacts, proper names, even smileys...

For example, all of...
*link
*links
*linked
*linking
...actually points to this tiddler when addin the following line to LinkifyConfig...
{{{
Linkify|link*
}}}

Also, by dafault, names of all existing tiddlers are automatically linkified.

For more details on LinkifyPlugin's capabilities, have a look at its [[documentation on TiddlySpot|http://linkify.tiddlyspot.com]].
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
/***
|''Name''|TiddlySpaceFollowingSuggestions|
|''Version''|0.2.5dev|
|''Description''|Provides a following macro|
|''Author''|Jon Robson|
|''Requires''|TiddlySpaceFollowingPlugin|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage

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

var tweb = config.extensions.tiddlyweb;
var tiddlyspace = config.extensions.tiddlyspace;
var followMacro = config.macros.followTiddlers;

var followSuggestions = config.macros.followSuggestions = {
	cache: {},
	handler: function(place, macroName, params) {
		// to do - limit results
		place = $('<div class="suggestions" />').appendTo(place)[0];
		var currentSpace = tiddlyspace.currentSpace.name;
		var user = params[0] || currentSpace;
		var pleaseWait = $("<div class='loading' />").text("please wait..").appendTo(place);
		tweb.getUserInfo(function(activeUser) {
			if(activeUser.name != tiddlyspace.currentSpace.name) {
				pleaseWait.hide();
				return;
			}
			followMacro.getFollowers(function(users) {
				// suggestions are followers of people that you follow that you don't follow
				var bags = followMacro._getFollowerBags(users);
				var _bags = [];
				for(var i = 0; i < bags.length; i++) {
					_bags.push("bag:%0".format([bags[i]]));
				}
				var bagString = _bags.join(" OR ");
				ajaxReq({
					beforeSend: followMacro.beforeSend,
					url: "/search?q=(%0)&select=title:!%1&select=title:!@%1".format([bagString, activeUser.name]),
					dataType: "json",
					success: function(tiddlers) {
						pleaseWait.hide();
						var suggestions = [];
						for(var i = 0; i < tiddlers.length; i++) {
							var tiddler = tiddlers[i];
							if(tiddler.tags.contains("follow")) {
								var title = tiddler.title;
								if(title.indexOf("@") === 0) {
									title = title.substr(1);
								}
								if(!users.contains(title)) {
									suggestions.pushUnique(title);
								}
							}
						}
						$(place).append("<div>suggestions:</div>");
						var suggestionArea = $("<div class='suggestionArea' />").appendTo(place)[0];
						var id = "more_%0".format([Math.random()]);
						var more = $("<div class='moreButton' />").text("more...").appendTo(place).attr("id", id);
						followSuggestions.cache[id] = suggestions;
						var limit = suggestions.length;
						more.click(function(ev) {
							var suggestions = config.macros.followSuggestions.cache[id];
							var newSuggestions = followSuggestions.suggest(place, suggestions, limit);
							config.macros.followSuggestions.cache[id] = newSuggestions;
						});
						followSuggestions.suggest(place, suggestions, limit);
					
					}
				});
			
			}, user);
		});
	},
	randomize: function(a, b) {
		if(Math.random() < Math.random()) {
			return -1;
		} else {
			return 1;
		}
	},
	suggest: function(place, suggestions, limit) {
		var currentSpace = tiddlyspace.currentSpace.name;
		suggestions = suggestions.sort(followSuggestions.randomize);
		var suggestionsArea = $(".suggestionArea", place)[0];
		if(suggestions.length === 0) {
			$("<span />").text("no suggestions..").appendTo(suggestionsArea);
			return;
		}
		limit = limit < suggestions.length ? limit : suggestions.length;
		for(var j = 0; j < limit; j++) {
			var link = $("<span />").appendTo(suggestionsArea)[0];
			var title = suggestions[j];
			var newTiddler = '@%0 <<newTiddler title:"@%0" fields:"server.workspace:bags/%1_public" tag:follow label:"follow">>\n'.format([title, currentSpace]);
			wikify(newTiddler, link);
		}
		var newSuggestions = suggestions.slice(limit, suggestions.length);
		var more = $(".moreButton", place);
		if(newSuggestions.length == 0) {
			more.remove();
		}
		return newSuggestions;
	}
};
})(jQuery);
//}}}
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
Here's the all new [[Slidr]]. Well, it's been in the pipe for a while but I just couldn't be bothered to smash that bug or failed for too long so I put it aside — but now it's done and it's awesome!

<<slidr>>

There's a whole lot you can customize around it. Interested? [[Read here|Slidr]] for more details or go to the @Slidr space. To use it on TiddlySpace, simply include the @SlidrPlugin space.
<!--{{{-->
<div class='tagInfo infoTags'>
    <div class='tidTags' macro='tags'></div>
</div>
<div class='toolbar'
    macro='toolbar [[ToolbarCommands::ViewToolbar]] icons:yes height:16 width:16 more:popup'>
</div>
<div class='heading'>
    <span class="titleBar">
        <div class='title' macro='view title text'></div>
        <div class="subtitle">
            <span class='spaceSiteIcon' macro='tiddlerOrigin label:no spaceLink:yes height:16 width:16 preserveAspectRatio:yes'></span>
            last modified on
            <span macro='viewRevisions page:5'>
                <span macro="view modified date"></span>
            </span>
            by
            <span class='hideIcon' macro='view modifier SiteIcon spaceLink:yes label:yes height:16 width:16'></span>
            //
            <span macro="view title replyLink"></span>
        </div>
    </span>
    <span class='followPlaceHolder' macro='followTiddlers'></span>
    <span class='modifierIcon'
        macro='view modifier SiteIcon label:no spaceLink:yes height:32 width:32 preserveAspectRatio:yes'>
    </span>
    <div class='tagClear'></div>
</div>
<div class='content'>
    <div class='viewer' macro='view text wikified'></div>
</div>
<div class='tagInfo infoTagging'>
    <div class='tagging' macro='tagging'></div>
</div>
<div macro="discuss url:'http://tobibeer-discuss.tiddlyspace.com'"></div>
<span class="openTiddler" macro='tiddler OnLoad'/>
<!--}}}-->
/***
|Name|GotoPlugin|
|Source|http://www.TiddlyTools.com/#GotoPlugin|
|Documentation|http://www.TiddlyTools.com/#GotoPluginInfo|
|Version|1.9.2|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|view any tiddler by entering it's title - displays list of possible matches|
''View a tiddler by typing its title and pressing //enter//.''  As you type, a list of possible matches is displayed.  You can scroll-and-click (or use arrows+enter) to select/view a tiddler, or press escape to close the listbox to resume typing.  When the listbox is not displayed, pressing //escape// clears the current input.
!!!Documentation
>see [[GotoPluginInfo]]
!!!Configuration
<<<
*Match titles only after {{twochar{<<option txtIncrementalSearchMin>>}}} or more characters are entered.<br>Use down-arrow to start matching with shorter input.  //Note: This option value is also set/used by [[SearchOptionsPlugin]]//.
*To set the maximum height of the listbox, you can create a tiddler tagged with <<tag systemConfig>>, containing:
//{{{
config.macros.gotoTiddler.listMaxSize=10;  // change this number
//}}}
<<<
!!!Revisions
<<<
2009.05.22 [1.9.2] use reverseLookup() for IncludePlugin
|please see [[GotoPluginInfo]] for additional revision details|
2006.05.05 [0.0.0] started
<<<
!!!Code
***/
//{{{
version.extensions.GotoPlugin= {major: 1, minor: 9, revision: 2, date: new Date(2009,5,22)};

// automatically tweak shadow SideBarOptions to add <<gotoTiddler>> macro above <<search>>
config.shadowTiddlers.SideBarOptions=config.shadowTiddlers.SideBarOptions.replace(/<<search>>/,"{{button{goto}}}\n<<gotoTiddler>><<search>>");

if (config.options.txtIncrementalSearchMin===undefined) config.options.txtIncrementalSearchMin=3;

config.macros.gotoTiddler= { 
	listMaxSize: 10,
	listHeading: 'Found %0 matching title%1...',
	searchItem: "Search for '%0'...",
	handler:
	function(place,macroName,params,wikifier,paramString,tiddler) {
		var quiet	=params.contains("quiet");
		var showlist	=params.contains("showlist");
		var search	=params.contains("search");
		params = paramString.parseParams("anon",null,true,false,false);
		var instyle	=getParam(params,"inputstyle","");
		var liststyle	=getParam(params,"liststyle","");
		var filter	=getParam(params,"filter","");
		var html=this.html;
		var keyevent=window.event?"onkeydown":"onkeypress"; // IE event fixup for ESC handling
		html=html.replace(/%keyevent%/g,keyevent);
		html=html.replace(/%search%/g,search);
		html=html.replace(/%quiet%/g,quiet);
		html=html.replace(/%showlist%/g,showlist);
		html=html.replace(/%display%/g,showlist?'block':'none');
		html=html.replace(/%position%/g,showlist?'static':'absolute');
		html=html.replace(/%instyle%/g,instyle);
		html=html.replace(/%liststyle%/g,liststyle);
		html=html.replace(/%filter%/g,filter);
		if (config.browser.isIE) html=this.IEtableFixup.format([html]);
		var span=createTiddlyElement(place,'span');
		span.innerHTML=html; var form=span.getElementsByTagName("form")[0];
		if (showlist) this.fillList(form.list,'',filter,search,0);
	},
	html:
	'<form onsubmit="return false" style="display:inline;margin:0;padding:0">\
		<input name=gotoTiddler type=text autocomplete="off" accesskey="G" style="%instyle%"\
			title="Enter title text... ENTER=goto, SHIFT-ENTER=search for text, DOWN=select from list"\
			onfocus="this.select(); this.setAttribute(\'accesskey\',\'G\');"\
			%keyevent%="return config.macros.gotoTiddler.inputEscKeyHandler(event,this,this.form.list,%search%,%showlist%);"\
			onkeyup="return config.macros.gotoTiddler.inputKeyHandler(event,this,%quiet%,%search%,%showlist%);">\
		<select name=list style="display:%display%;position:%position%;%liststyle%"\
			onchange="if (!this.selectedIndex) this.selectedIndex=1;"\
			onblur="this.style.display=%showlist%?\'block\':\'none\';"\
			%keyevent%="return config.macros.gotoTiddler.selectKeyHandler(event,this,this.form.gotoTiddler,%showlist%);"\
			onclick="return config.macros.gotoTiddler.processItem(this.value,this.form.gotoTiddler,this,%showlist%);">\
		</select><input name="filter" type="hidden" value="%filter%">\
	</form>',
	IEtableFixup:
	"<table style='width:100%;display:inline;padding:0;margin:0;border:0;'>\
		<tr style='padding:0;margin:0;border:0;'><td style='padding:0;margin:0;border:0;'>\
		%0</td></tr></table>",
	getItems:
	function(list,val,filter) {
		if (!list.cache || !list.cache.length || val.length<=config.options.txtIncrementalSearchMin) {
			// starting new search, fetch and cache list of tiddlers/shadows/tags
			list.cache=new Array();
			if (filter.length) {
				var fn=store.getMatchingTiddlers||store.getTaggedTiddlers;
				var tiddlers=store.sortTiddlers(fn.apply(store,[filter]),'title');
			} else 
				var tiddlers=store.reverseLookup('tags','excludeLists');
			for(var t=0; t<tiddlers.length; t++) list.cache.push(tiddlers[t].title);
			if (!filter.length) {
				for (var t in config.shadowTiddlers) list.cache.pushUnique(t);
				var tags=store.getTags();
				for(var t=0; t<tags.length; t++) list.cache.pushUnique(tags[t][0]);
			}
		}
		var found = [];
		var match=val.toLowerCase();
		for(var i=0; i<list.cache.length; i++)
			if (list.cache[i].toLowerCase().indexOf(match)!=-1) found.push(list.cache[i]);
		return found;
	},
	getItemSuffix:
	function(t) {
		if (store.tiddlerExists(t)) return "";  // tiddler
		if (store.isShadowTiddler(t)) return " (shadow)"; // shadow
		return " (tag)"; // tag 
	},
	fillList:
	function(list,val,filter,search,key) {
		if (list.style.display=="none") return; // not visible... do nothing!
		var indent='\xa0\xa0\xa0';
		var found = this.getItems(list,val,filter); // find matching items...
		found.sort(); // alpha by title
		while (list.length > 0) list.options[0]=null; // clear list
		var hdr=this.listHeading.format([found.length,found.length==1?"":"s"]);
		list.options[0]=new Option(hdr,"",false,false);
		for (var t=0; t<found.length; t++) list.options[list.length]=
			new Option(indent+found[t]+this.getItemSuffix(found[t]),found[t],false,false);
		if (search)
			list.options[list.length]=new Option(this.searchItem.format([val]),"*",false,false);
		list.size=(list.length<this.listMaxSize?list.length:this.listMaxSize); // resize list...
		list.selectedIndex=key==38?list.length-1:key==40?1:0;
	},
	keyProcessed:
	function(ev) { // utility function
		ev.cancelBubble=true; // IE4+
		try{event.keyCode=0;}catch(e){}; // IE5
		if (window.event) ev.returnValue=false; // IE6
		if (ev.preventDefault) ev.preventDefault(); // moz/opera/konqueror
		if (ev.stopPropagation) ev.stopPropagation(); // all
		return false;
	},
	inputEscKeyHandler:
	function(event,here,list,search,showlist) {
		if (event.keyCode==27) {
			if (showlist) { // clear input, reset list
				here.value=here.defaultValue;
				this.fillList(list,'',here.form.filter.value,search,0);
			}
			else if (list.style.display=="none") // clear input
				here.value=here.defaultValue;
			else list.style.display="none"; // hide list
			return this.keyProcessed(event);
		}
		return true; // key bubbles up
	},
	inputKeyHandler:
	function(event,here,quiet,search,showlist) {
		var key=event.keyCode;
		var list=here.form.list;
		var filter=here.form.filter;
		// non-printing chars bubble up, except for a few:
		if (key<48) switch(key) {
			// backspace=8, enter=13, space=32, up=38, down=40, delete=46
			case 8: case 13: case 32: case 38: case 40: case 46: break; default: return true;
		}
		// blank input... if down/enter... fall through (list all)... else, and hide or reset list
		if (!here.value.length && !(key==40 || key==13)) {
			if (showlist) this.fillList(here.form.list,'',here.form.filter.value,search,0);
			else list.style.display="none";
			return this.keyProcessed(event);
		}
		// hide list if quiet, or below input minimum (and not showlist)
		list.style.display=(!showlist&&(quiet||here.value.length<config.options.txtIncrementalSearchMin))?'none':'block';
		// non-blank input... enter=show/create tiddler, SHIFT-enter=search for text
		if (key==13 && here.value.length) return this.processItem(event.shiftKey?'*':here.value,here,list,showlist);
		// up or down key, or enter with blank input... shows and moves to list...
		if (key==38 || key==40 || key==13) { list.style.display="block"; list.focus(); }
		this.fillList(list,here.value,filter.value,search,key);
		return true; // key bubbles up
	},
	selectKeyHandler:
	function(event,list,editfield,showlist) {
		if (event.keyCode==27) // escape... hide list, move to edit field
			{ editfield.focus(); list.style.display=showlist?'block':'none'; return this.keyProcessed(event); }
		if (event.keyCode==13 && list.value.length) // enter... view selected item
			{ this.processItem(list.value,editfield,list,showlist); return this.keyProcessed(event); }
		return true; // key bubbles up
	},
	processItem:
	function(title,here,list,showlist) {
		if (!title.length) return;
		list.style.display=showlist?'block':'none';
		if (title=="*")	{ story.search(here.value); return false; } // do full-text search
		if (!showlist) here.value=title;
		story.displayTiddler(null,title); // show selected tiddler
		return false;
	}
}
//}}}
[[MarkDown|http://daringfireball.net/projects/markdown/syntax]] is an efficient markup format for writing text which tries to be as readable as possible when the markup is not being rendered. You can use MarkDown in tiddlers by including the @ShowDown space which contains a TiddlyWiki plugin that hooks a library called ShowDown -- a javascript MarkDown implementation -- into the TiddlyWiki formatter.
[[LinksPlugin|http://links.tiddlyspace.com]] outputs indexes of all or a selection of...
* external links
* internal links
...used in your TiddlyWiki.
!Features
* constrain using filters
* constrain by titles or targets having to match a search term
* define whether to output internal or external links or both
* apply custom formats to define the presentation of the index
* leverages ListFiltr
* sort links by a defined standard or custom iield

For details, have a look at the @Links space.
!Example
{{{
<<links
    filter:[tag[Plugins]]
    internal:false
    fmtExternalItem:'\n:%2'
    fmtExternalItem:'\n:%2'
>>
}}}
<<links filter:[tag[Plugins]] internal:false fmtExternalItem:'\n:%2' fmtExternalItem:'\n:%2'>>
[[Home|Welcome]] """///"""
<<popup Projects [[<<tiddler MainMenu##PROJECTS>+>]]>> """///"""
<<popup Plugins "{{title{[[Plugin Overview|Plugins]]}}}
----
{{noTitle{<<tagging Plugins>+>">> """///"""
<<popup Blog [[<<tiddler MainMenu##BLOG>+>]]>> """///"""
[[Links]] """///"""
[[Contact]]
<<toggleSideBarTB right show>>/%
!PROJECTS
*[[Projects|The Big Ones]]
*[[Enhancements]]
*[[Themes]]
*[[Plugins]]

[[Latest Plugin Updates...|Plugins]]
{{popList{
----
<<tiddler Latest with: Plugins modified>>
}}}
!BLOG
{{popList{
[[Latest Journal Entires...|Journal]]
<<tiddler Latest with: Journal created>>
----
[[Latest Talks...|Talks]]
<<tiddler Latest with: Talks created>>
----
[[Latest Tips...|Tips]]
<<tiddler Latest with: Tips created>>
}}}
!END%/
''Eric Shulman'''s vast plugin trove in the ~TiddlyWorld...
* http://tiddlytools.com
/***
|''Name''|ListrPlugin|
|''Description''|(Check-)list management made simple|
|''Author''|Tobias Beer|
|''Version''|0.9.0|
|''Status''|pre alpha|
|''Source''|http://tobibeer.tiddlyspace.com/#ListrPlugin|
|''Documentation''|http://tobibeer.tiddlyspace.com/#Listr|
|''License''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|''~CoreVersion''|2.5.3|
|''Type''|plugin|
!Code
***/
//{{{

(function($){

config.macros.listr={

//OPTIONS
itemTag:'listr',
doneTag:'done',
refTag:'reference',
askAdd:false,
askDelete1:true,
askDeleteAll:true,
openClick:false,
autoSave:false,
tagToList:true,
timeStamp:true,
focusInput:true,
hideTagInList:true,
lockedOnReadOnly:true,
fmtTimeStamp:'YYYY.0MM.0DD-0hh.0mm.0ss',
height:'2.5em', //make '' to expand fully or '0' to only show title
fmtTag:'<<tag [[%0]]>>',
fmtTitle:'[[%0]]',
newListText:'<<listr>>',
gotoOptions:'quiet',

//LOCALISATION
errListr:"@@color:red;''Error Listr:'' %0@@",
errTid:"Could not find tiddler '%0'!",
errTitle:"Please enter an item title!",
errNum:"Numbers please!",

msgOpen:"Item already exists! Open?",
msgNoneDone:"Nothing to be deleted.",
msgAdd:"This will add '%0' to the list. Proceed?",
msgDelete1:"Really delete item '%0'?",
msgDeleteAll:"Really delete all these %0 done items?\n\n%1",
msgDeleteList:"There are still %0 items associated with this listr list.\n\n"+
	"Type OK if you want to delete them as well.\n"+
	"Type REF if you want to keep them as references.\n\n"+
	"Otherwise leave the prompt unchanged.",
msgDeleteTid:"Just delete this tiddler...",
msgOpenTid:"Open the tiddler...",
msgExists:"A tiddler by that name already exists!\n\n"+
	"Type OK if you want to overwrite it.\n"+
	"Leave the prompt unchanged to open the tiddler.\n\n"+
	"Otherwise just cancel.",

lblNoTags:"@@padding-right:10px;@@",
lblRefresh:"Click to refresh, when changed outside...",
lblDone:"mark done (CTRL+CLICK to delete)",
lblUndone:"put back into the list",
lblOpen:" (click to open)",
lblDoneItem:"CTRL+CLICK to mark item done",
lblUnDoneItem:"CTRL+CLICK to put item back into the list",
lblClick:"click to ",
lblShowDone:"show done items »",
lblHideDone:"hide done items «",
lblDelete1:"permanently delete this done item / CTRL+CLICK to keep as reference",
lblDeleteAll:"permanently delete all done items",
lblOrder:"Enter a new number to reorder this item",
lblTimeStamp:"item title (if blank, a timestamp will be used ...like this: '%0')",
lblEdit:"Click to edit / %0",
lblEditOut:"When done, click OK or (CTRL-) ENTER to save changes or hit ESCAPE to leave edit mode)",
lblEditTITLE:"Edit item title. ",
lblEditTAGS:"Edit item tags. ",
lblEditTEXT:"Edit item text. ",
btnAdd:"add new items »",
lblAdd:"Click to add new items",
btnOk:"Click to save changes",
lblOk:"ok",
lblEditOk:"Click '%0' to save changes or use ENTER in title or tags or CTRL+Enter in textbox",
lbltitle:'title',
lbltext:'text',
lbltags:'tags',
lblselect:'select',

handler:function (place, macroName, params, wikifier, paramString, tiddler)
{
	var add,btn,el,f,ins,out,
		tid=tiddler.title,
		lr=config.macros.listr,
		id='lr'+(new Date).convertToYYYYMMDDHHMMSSMMM(),
		p=paramString.parseParams(null,null,true),
		h=getParam(p,'height',lr.height),
		ttl=getParam(p,'tagToList',lr.tagToList.toString())=='true',
		ts=getParam(p,'timeStamp',lr.timeStamp.toString())=='true',
		focus=getParam(p,'focus',lr.focusInput.toString()),
		gtops=getParam(p,'gotoOptions',lr.gotoOptions),
		stid=getParam(p,'tiddler',''),
		one=stid!='',
		orph=params.contains('orphans'),
		lst=getParam(p,'list',tid),
		addtgs=getParam(p,'addTags',''),
		notags=params.contains('notags'),
		edit=params.contains('edit'),
		lock=one||params.contains('locked')||params.contains('lockedOnReadOnly')&&readOnly;

	out=createTiddlyElement(place,'div',id,'lr_list');
	$(out).attr({
		tiddler:tid,
		tagtolist:ttl,
		lr_list:lst,
		height:h,
		addtgs:addtgs,
		lock:lock,
		edit:edit,
		focus:focus,
		orph:orph.toString(),
		one:stid,
		ts:ts
	});

	//Single tid not found
	if(one&&!store.getTiddler(stid)){
		lr.error(lr,lr.errTid.format([stid]),out);
		return;
	}

//UNLOCK HEADER
	if(!lock)
	{
	wikify(
	store.getTiddlerText('ListrPlugin##HEADER').format([
		id,
		store.getTiddlerText('ListrPlugin##NEWLIST').format([lr.itemTag])
	]),
	out
	);
//alert(store.getTiddlerText('ListrPlugin##HEADER'));

	el=$('.lr_head:last',out)[0];
	btn=createTiddlyButton(
		el,
		this.btnAdd,
		this.lblAdd,
		function(){
			var el=$(this),
				app=el.closest('.lr_list');
				sl=el.next(),
				show=sl.css('display')=='none';
			if(show){
				sl.fadeIn();
				$('.lr_add .lr_input',sl).val('').first().focus();
				$('.lr_add input[name|=addtags]',sl).val(app.attr('addtgs'));
			}else sl.fadeOut();
		},
		'lr_addbtn button'
	);
	wikify(
		store.getTiddlerText('ListrPlugin##ADDFORM'),
		createTiddlyElement(el,'div',null,'sliderPanel')
	);

	add=$('.lr_add:last',out);
	//GoTo Plugin Integration
	if(config.macros.gotoTiddler){
		el=createTiddlyElement(place,"form");
		$(el).css({display:'inline'}).attr({name:'gototitle'});
		$($('.lr_input',add)[0]).before($(el)).remove();
		wikify('<<gotoTiddler '+gtops+' >>',el);
		el=$('input',el
		).addClass('lr_input'
		).attr({
			notify:'config.macros.listr.gotoTitle'
		});
	}
	$('.lr_refresh',out).click(lr.update).attr({title:lr.lblRefresh,mode:'refresh'});
	$('.lr_submit',add).click(lr.update).attr({mode:'add'});
	f=function(ev){
		var e=ev||window.event,
			txt=$(this).attr('name')=='addtext';

		if(e.keyCode==27){
			$(this).closest('.sliderPanel').fadeOut();
			return true;
		}
		if(txt&&e.keyCode==9&&e.shiftKey){
			$(this).closest('.lr_head').find('input[name|=tags]').focus();
			lr.noBubble(e);
		}
		if(e.keyCode==13&&(!txt||e.ctrlKey)){
			lr.update(this);
			lr.noBubble(e);
		}
	}
	ins=$('.lr_input',out).attr({mode:'add'});
	window.event?ins.keydown(f):ins.keypress(f);
	}
//END UNLOCK HEADER

	createTiddlyElement(out,'div',null,'lr_items');

//UNLOCK FOOTER
	if(!lock)
	{
	wikify(store.getTiddlerText('ListrPlugin##DONE').format([id]),out);
	$('.lr_deleteall',out).click(lr.update).attr({
		title:lr.lblDeleteAll,
		mode:'deleteall'
	});
	$('.lr_donebtn',out
		).click(lr.update
		).attr({title:lr.lblClick+lr.lblShowDone,mode:'donebtn',show:'true'}
		).html(lr.lblShowDone);
	};
//END UNLOCK FOOTER

	wikify('{{lr_clr{}}}',out);
	this.update(out);
},

update:function(el)
{
	var all=dirty=true,bin,dn,dsc,item,ls,mode,mv,num,s,show,tit,tr,x=[],
		lr=config.macros.listr,
		ev=el||window.event,
		tgt=ev.nodeName?null:resolveTarget(ev),
		btn=$(el).attr('mode')?$(el):$(this),
		item=btn.attr('item'),
		lr_item=btn.closest('.lr_item'),
		tmp=lr_item.attr('tmpMode'),
		mode=tmp?tmp:btn.attr('mode'),
		t=store.getTiddler(item),
		app=$(mode?btn:el).closest('.lr_list'),
		lock=app.attr('lock')=='true',
		lr_st=$('.lr_items',app),
		add=lock?null:$('.lr_add',app)[0],
		inp=add.gototitle?add.gototitle.gotoTiddler:add.addtitle,
		bin=$('.lr_done',app),
		onlyBin=false,
		show=$('.lr_donebtn',app).attr('show')=='true',
		lst=app.attr('lr_list'),
		dt=app.attr('ts')=='true'?lr.stamp(lr):null;

	switch (mode) {
  case "add":
		tit=inp.value;
		if($(add).attr('update')!='true'&&store.getTiddler(tit)){
			if(confirm(lr.msgOpen))story.displayTiddler(null,tit);
			return false;
		}
		if(!tit){
			if(dt)tit=dt;
			else{alert(lr.errTitle);return false;}
		}
		store.saveTiddler(
			tit,
			tit,
			add.addtext.value,
			config.options.txtUserName,
			new Date(),
			((app.attr('tagtolist')=='true'?'[['+app.attr('tiddler')+']]':'')+'[['+lr.itemTag+']] '+add.addtags.value).readBracketedList(),
			merge({'lr_list':lst},config.defaultCustomFields)
		);
		inp.value='';
		add.addtext.value='';
		$(add).attr('update','');
		break;
	case 'doneitem':
		if(!ev.ctrlKey){
			return lr.itemClick(lr,lr_item,tgt);
		}
	case 'done':
		all=false;
		if(mode=='done'&&ev.ctrlKey){
			lr_item.attr('tmpMode','delete');
			btn.click();
			return false;
		}
		lr_item.fadeOut(400);
		store.setTiddlerTag(item,false,lr.itemTag);
		store.setTiddlerTag(item,true,lr.doneTag);
		if(!show)lr.renderItem(app,bin[0],t,true);
		break;
	case 'undoneitem':
		if(!ev.ctrlKey){
			return lr.itemClick(lr,lr_item,tgt);
		}
	case 'undone':
		all=false;
		lr_item.fadeOut(400);
		store.setTiddlerTag(item,false,lr.doneTag);
		store.setTiddlerTag(item,true,lr.itemTag);
		lr.renderItem(app,lr_st[0],t,false);
		break;
	case "donebtn":
		show=!show;
		if(show)$('.lr_done',app).empty();
		s=show?lr.lblShowDone:lr.lblHideDone;
		btn.attr({'show':show,'title':lr.lblClick+s}).html(s);
		onlyBin=true;
		dirty=false;
		break;
	case "delete":
		if(btn.hasClass('lr_altdel')||!ev.ctrlKey){
			if(lr.askDelete1&&!confirm(lr.msgDelete1.format([item]))){
				lr_item.attr('tmpMode','');
				return false;
			}
			story.closeTiddler(item,true);
			store.removeTiddler(item);
		} else lr.keep(lr,t,lst);
		lr_item.fadeOut(400,function(){$(this).remove();});
		return false;
		break;
	case "deleteall":
		tr=store.getTaggedTiddlers(lr.doneTag);
		tr.map(function(t){
			if(t.fields['lr_list']==lst)x.push(t.title);
		});
		if(x[0]){
			if(lr.askDeleteAll&&!confirm(lr.msgDeleteAll.format([x.length,x.join(', ')])))return false;
			x.map(function(t){
				story.closeTiddler(t,true);
				store.removeTiddler(t);
			});
			$('lr_done',app).empty();
		}else alert(lr.msgNoneDone);
		return false;
	case "order":
		if(ev.keyCode!=13)return true;
		num=parseInt(btn.val());
		if(isNaN(num)){alert(lr.errNum);return false;}
		lr.setOrder(lr,lst,item,num);
		break;
	case "edit":
		break;
	case "refresh": //must be last
		all=true;
	default: dirty=false;
	}

	if(all){
		if(!onlyBin)lr.render(lr.itemTag,app);
		if(!show&&!lock)lr.render(lr.doneTag,app);
		lr.addStyle(app);
	}

	if(!lock&&inp)inp.setAttribute('title',lr.lblTimeStamp.format([dt]));
	if(dirty)store.setDirty(true);
	return false;
},

render:function(tag,app,order)
{
	var b,el,h,hfix,item,inner,num=0,tgs='',
		lock=app.attr('lock')=='true',
		lr=config.macros.listr,
		d=lock?null:tag==lr.doneTag,
		list=$(d?'.lr_done':'.lr_items',app),
		tid=app.attr('one'),
		orph=app.attr('orph')=='true',
		ls=tid!=''?[store.getTiddler(tid)]:store.getTaggedTiddlers(tag),
		lst=app.attr('lr_list'),
		o=order?order:lr.getOrder(lr,lst),
		h=app.height();

	if(h>200)app.css('height',h);//prevents jumping
	list.empty().html('&nbsp;');

	//wikify('<<listr tiddler:%NEW%>>',list[0]);

	ls.map(function(t){
		if(t.fields['lr_list']==lst||tid!=''||(orph&&t.title!=lst)){
			num++;
			lr.renderItem(app,list[0],t,d,num);
		}
	});
	app.css('height',null);
},

renderItem:function(app,where,t,d,num) //if dis null then LOCKED, num may not be null
{
	var lr=config.macros.listr,
		edit=app.attr('edit')=='true',
		lst=app.attr('lr_list'),
		lock=d==null,
		h=app.attr('height'),
		hfix=h.indexOf('!')==0;
		h=hfix?h.substr(1):h;

	if(!hasClass(where,'lr_item')||!num&&num!=null){
		where=createTiddlyElement(where,'div',null,'lr_item');
		$(where).click(lr.update).attr(
			{
				title:lock?'':(lr[d?'lblUnDoneItem':'lblDoneItem']+(lr.openClick?lr.lblOpen:'')),
				item:t.title,
				mode:(d?'undoneitem':'doneitem'),
				height:h,
				num:num
			}
		);
	}
	else {
		$(where).empty().attr('item',t.title);
	}

	//UNLOCK ITEM
	if(!lock){
	$(createTiddlyElement(
		where,'div',null,'lr_tick lr_check button',d?'X':'\u00A0')
	).click(lr.update).attr({
		title:(lr[d?'lblUndone':'lblDone']),
		item:t.title,
		mode:(d?'undone':'done')
	}).bind('mouseover mousemove',function(e){
		var e=e?e:window.event;
		if(e.ctrlKey){
			if(!hasClass(this,'lr_altdel'))addClass(this,'lr_altdel');
		}
		else removeClass(this,'lr_altdel');
	}
	).mouseout(function(){removeClass(this,'lr_altdel');});;
	
	$(where
		).mouseover(function(){$('.lr_tick',this).html(d?'\u00A0':'X');}
		).mouseout(function(){$('.lr_tick',this).html(d?'X':'\u00A0');});

	el=$(createTiddlyElement(
		where,d?'div':'input',null,'lr_check button','X')
	)
	el.addClass(d?'lr_delete':'lr_order');
	if (d) {
		el.click(lr.update);
		el.html('X');
	}else {
		el.val(num);
		if (window.event) el.keydown(lr.update);
		else el.keypress(lr.update);
		el.focus(function(){
			this.select();
		});
	}
	el.attr({
		title:lr[d?'lblDelete1':'lblOrder'],
		item:t.title,
		mode:(d?'delete':'order')
	});

	el=$(createTiddlyElement(where,'div',null,'lr_ok button',lr.lblOk))
	el.click(lr.saveItem);
	el.attr({
		title:lr.btnOk,
		where:t.title,
	});
	}
	//END UNLOCK ITEM

	inner=createTiddlyElement(where,'div',null,'lr_inner'+(lock?' lr_lock':''));

	//UNLOCK INLINE EDIT
	if(!d&&(edit||!lock))$(inner).click(lr.editItem);

	lr.newEditor(inner,'title',lr.fmtTitle.format([t.title]),t,'input',d);
	tgs=lr.formatTags(lr,lst,t,lr.fmtTag);
	lr.newEditor(inner,'tags',tgs?tgs:lr.lblNoTags,t,'input',d);
	lr.newEditor(inner,'text',t.text,t,'textarea',d);
	wikify('{{lr_clr{}}}',inner);

	$('.lr_text',where).css({'overflow':'hidden','max-height':h});
	if(!hfix){
		$(where
		).mouseover(function(){$('.lr_text',this).css({'overflow':'auto','max-height':''});}
		).mouseout(function(){$('.lr_text',this).css({'overflow':'hidden','max-height':h});});
	}

	$('.lr_editable',where).attr('title',lock?'':lr.lblEdit.format([lr[d?'lblUnDoneItem':'lblDoneItem']]));
},

getOrder:function(lr,lst)
{
	var l=lr.getList(lr,lst),
		o=l.fields['lr_order'];

	//analyse string, return array

	return o;
},

itemClick:function(lr,item,tgt){
	var ex=['INPUT','TEXTAREA','A'],
		t=$('.lr_text',item),
		s=t.css('overflow')=='hidden'?{'overflow':'auto','max-height':''}:{'overflow':'hidden','max-height':item.attr('height')};
	if (tgt.getAttribute('href')||tgt.onclick&&!hasClass(tgt,'lr_inner')||ex.contains(n))return true;
	if(lr.openClick)story.displayTiddler(null,item.attr('item'));
	else t.css(s);
	return false;
},

setOrder:function(lr,lst,item,num,pos)
{
	var its,ls0,ls1=[];
	o=lr.getOrder(lr.lst);
	its=store.getTaggedTiddlers(lr.itemTag);
	its.map(function(t){
		if(t.fields['lr_list']==lst){
			ls1.push(t.title);
		}
	});
},

getList:function(lr,lst,tag)
{
	var l=store.getTiddler(lst);
	if(!l)l=store.saveTiddler(
		lst,
		lst,
		lr.newListText,
		config.options.txtUserName,
		new Date(),
		lr.itemTag,
		merge({lr_order:''},config.defaultCustomFields)
	);
	return l;
},

formatTags:function(lr,lst,tid,fmt)
{
	var t,
		f=fmt?fmt.split('%0'):null,
		bracket=function(t){
			return t.indexOf(' ')>0?'[['+t+']]':t;
		};
	if(tid.tags.length==0)return '';
	t=fmt?(f[0]+tid.tags.join(tid.tags.length?f[1]+f[0]:'')+f[1]):store.getValue(tid.title,'tags');
	t=t.replace(fmt?lr.fmtTag.format([lr.itemTag]):bracket(lr.itemTag),'');
	if(lr.tagToList&&!lr.showTagInList)
		t=t.replace(fmt?lr.fmtTag.format([lst]):bracket(lst),'');
	return t.trim();
},

newEditor:function(where,what,txt,tid,how,del)
{
	var lr=config.macros.listr,
		app=$(where).closest('.lr_list'),
		f=app.attr('focus');
		el=createTiddlyElement(where,'div',null,'lr_'+what+(del?'':' lr_editable'));
	if(txt!='')wikify(txt,el);
	else $(el).hide();
	if(!del){
		el=$(createTiddlyElement(where,how,null,'lr_'+what+' lr_edit')
		).attr({
			item:tid.title,
			edit:what,
			title:lr['lblEdit'+what.toUpperCase()]+lr.lblEditOut
		});
		if(f=='true'||f.indexOf(what)>=0)
			el.focus(function(){this.select();});
		window.event?el.keydown(lr.saveItem):el.keypress(lr.saveItem);
	}
},

editItem:function(ev)
{
	var n,
		ev=ev?ev:window.event,
		lr=config.macros.listr,
		el=$(this),
		item=el.closest('.lr_item'),
		app=item.closest('.lr_list'),
		lst=app.attr('lr_list'),
		ex=['INPUT','TEXTAREA','A'];
	if(ev.ctrlKey)return true;
	tgt=resolveTarget(ev);
	n=tgt.nodeName;
	n=n?n.toUpperCase():'';
	if (tgt.getAttribute('href')||tgt.onclick&&!hasClass(tgt,'lr_inner')||ex.contains(n))return true;
	$(this).attr('title',lr.lblEditOk.format([lr.lblOk]));
	$('.lr_editable',this).each(function(){
		var out,
			e=$(this),
			f=e.next(),
			t=store.getTiddler(f.attr('item')),
			edit=f.attr('edit');
		e.hide();
		f.css('display','block');
		if(edit=='tags')out=lr.formatTags(lr,lst,t);
		else out=t[edit];
		f.val(out);
		if(edit=='text')f[0].rows=out.split('\n').length;
		if(edit=='title')f.focus();
	});
	$('.lr_ok',item).show();
	$('.lr_order',item).hide();
	return false;
},

saveItem:function(ev)
{
	var abort,p,ti,txt,tags,
		ev=ev?ev:window.event,
		lr=config.macros.listr,
		item=$(this).closest('.lr_item'),
		app=item.closest('.lr_list'),
		lock=app.attr('lock')=='lock',
		d=app.attr('lock')=='true'?null:false,
		num=lock?0:$('.lr_order',item).val(),
		ti0=item[0].getAttribute('item'),
		tid=store.getTiddler(ti0),
		txt=$(this).attr('edit')=='text',
		dt=app.attr('ts')=='true'?lr.stamp(lr):null;

	//on ECAPE rerender item
	if(ev.keyCode==27){
		lr.renderItem(app,item[0],tid,d,item.attr('num'));
		return;
	}

	//on SHIFT-TAB in editor
	if(txt&&ev.keyCode==9&&ev.shiftKey){
		$('input.lr_tags',item).focus();
		lr.noBubble(ev);
	}

	//Abort if input field and npt ENTER (title or tags) or text (CTRL+ENTER)
	if(!this.innerHTML&&(ev.keyCode!=13||txt&&!ev.ctrlKey))return;

	//prevent editor
	lr.noBubble(ev);

	$('.lr_edit',item).each(function(){
		var el=$(this),
			v=el.val();
			what=el.attr('edit');
		if(what=='title'){
			ti=v;
			//alert(tid+' = old <> new = '+ti);
			if((ti0!=ti)&&store.getTiddler(ti)){
				p=prompt(lr.msgExists,lr.msgOpenTid);
				p=p?p.trim().toUpperCase():null;
				switch (p) {
					case 'OK':
						break;
					case lr.msgOpenTid.trim().toUpperCase():
						story.displayTiddler(null,ti);
					default:
						el.focus();
						abort=true;
				}
			}
		}
		else if(what=='tags')tags=v;
		else txt=v;
	});
	if(abort)return;

	//Abort if no title or take timestamp
	if(!ti&&dt)ti=dt;
	if(!ti){
		alert(lr.errTitle);
		$('input.lr_title',item).focus();
		return;
	}

	store.saveTiddler(
		ti0,
		ti,
		txt,
		config.options.txtUserName,
		new Date(),
		((app.attr('tagtolist')=='true'?'[['+app.attr('tiddler')+']]':'')+'[['+lr.itemTag+']] '+tags).readBracketedList(),
		tid.fields
	);
	lr.renderItem(app,item[0],tid,d,num);
	return false;
},

noBubble:function(e){
	e.cancelBubble=true;
	try{event.keyCode=0;}catch(e){};
	if (window.event) e.returnValue=false;
	if (e.preventDefault) e.preventDefault();
	if (e.stopPropagation) e.stopPropagation();
	return false;
},

addStyle:function(el){
	var b=false;
	$('.lr_item',el).each(function(){
		b=!b;
		addClass(this,b?'lr_item1':'lr_item2');
	});
},

keep:function(lr,tid,lst){
	var ti=tid.title,
		ref=lr.refTag.format([lst]);
	if(ref)store.setTiddlerTag(ti,true,ref);
	store.setTiddlerTag(ti,false,lr.itemTag);
	store.setTiddlerTag(ti,false,lr.doneTag);
	delete tid.fields['lr_list'];
},

error:function(lr,msg,el){
	wikify(lr.errListr.format([msg]),el);
},

gotoTitle:function(t,el){
	var tid,
		add=$(el).closest('.lr_add'),
		lst=add.closest('.lr_list').attr('lr_list'),
		lr=config.macros.listr;
	tid=store.getTiddler(t);
	if(lr.askAdd&&(tid.fields['lr_list']==lst||!confirm(lr.msgAdd.format([t])))){
		el.value='';
		add.attr('update','');
		return false;
	}else el.value=t;
	el.focus();
	add.attr('update','true');
	$('.addtext',add).val(tid.text);
	$('.addtags',add).val(lr.formatTags(lr,lst,tid));
},

stamp:function(lr){
	return (new Date()).formatString(lr.fmtTimeStamp);
}
}

var gt=config.macros.gotoTiddler;
if(gt){
gt.processItem=function(title,here,list,showlist) {
	if (!title.length) return;
	list.style.display=showlist?'block':'none';
	if (title=="*"){story.search(here.value);return false;}
	if (!showlist) here.value=title;
	var n=here.getAttribute('notify');
	if(n)eval(n+'("'+title+'",here)'); //notify of selection, otherwise...
	else story.displayTiddler(null,title); // show selected tiddler (default behaviour)
	return false;
}
gt.IEtableFixup="%0";
}

var ccd=config.commands.deleteTiddler;
if(!ccd.handlerLISTR)ccd.handlerLISTR=ccd.handler;

ccd.handler = function(event,src,title)
{
	var chk,p,tids=[],
		co=config.options,
		lr=config.macros.listr,
		its=store.getTaggedTiddlers(lr.itemTag);
	its.map(function(t){
		var f=t.fields['lr_list']
		if(f==title||!f&&title==lr.itemTag){
			tids.push(t);
		}
	});
	if(tids[0]){
		p=prompt(lr.msgDeleteList.format([tids.length]),lr.msgDeleteTid);
		p=p?p.trim().toUpperCase():null;
		switch (p) {
			case null:return;
			case 'OK':
			case 'REF':
				tids.map(function(t){
					if(p=='OK'){
						story.closeTiddler(t.title,true);
						store.removeTiddler(t.title);
					}else lr.keep(lr,t,t.title);
				});
		}
	}
	chk=co.chkConfirmDelete;
	if(p)co.chkConfirmDelete=false;
	ccd.handlerLISTR.apply(this,arguments);
	co.chkConfirmDelete=chk;
}

config.shadowTiddlers.StyleSheetListr = '/*{{{*/'+
	'.lr_list {width:100%;}\n'+
	'.lr_items,.lr_done, .lr_head, .lr_foot,.lr_head .sliderPanel'+
	'{display:block;padding:0;float:left;width:100%;}\n'+
	'.lr_items,.lr_done {margin-top:-10px;}\n'+

	'.lr_head .sliderPanel {display:none;padding:3px 0 0 0;}\n'+
	'.lr_check, .lr_btn, .lr_head .button {cursor:pointer;text-align:center;}\n'+
	'.lr_head .lr_btn, .lr_head .button, .lr_foot .lr_btn{display:block;float:left;margin:3px !important;padding:3px 10px !important;}\n'+
	'.lr_head .lr_refresh {float:right;position:relative;}\n'+
	'.lr_head .lr_submit {display:block;width:100%;margin:-1px 0 0 !important;padding:3px 0 !important;text-align:center;}\n'+

	'.lr_add {display:block;}\n'+
	'.lr_add div {float:left;}\n'+
	'.lr_add label {display:block;margin-top:3px;}\n'+
	'.lr_add input {display:block;width:100%;padding:2px;}\n'+
	'.lr_add textarea {display:block;width:100%;}\n'+

	'.lr_item {width:99%;padding:3px 0.5%;border:1px solid #ddd;margin-bottom:2px;z-index:0;cursor:pointer;}\n'+
	'.lr_item:hover {background:#ddf;border-width:1px 5px;margin-left:-4px}}\n'+
	'.lr_item1 {background:#f6f6f6;}\n'+
	'.lr_tick {float:left;font-size:1.2em;line-height:1em;font-weight:bold;'+
	'margin:2px 10px 0 2px !important;padding:0 !important;'+
	'width:1em;color:'+store.getTiddlerText('ColorPalette::SecondaryMid')+'}\n'+
	'.lr_tick:hover {color:'+store.getTiddlerText('ColorPalette::SecondaryDark')+'}\n'+
	'.lr_inner {margin:0 50px 0 28px;}'+
	'.lr_lock {margin:0;border:0;}'+
	'.lr_title {min-width:48%;padding:0 3px;float:left;}\n'+
	'.lr_tags {min-width:48%;padding:0 3px;float:right;text-align:right;}\n'+
	'input.lr_tags {text-align:left;}\n'+
	'.lr_order,.lr_delete,.lr_ok {display:block;float:right;width:30px;z-index:1;padding:3px !important;}\n'+
	'.lr_delete {width:15px;color:#F66;font-weight:bold;}\n'+
	'.lr_delete:hover, .lr_altdel:hover {color:#F66;}\n'+
	'.lr_text {float:left;padding:0 0.5%;width:99%;padding:3px 0 0 3px;width:99.5%;}\n'+
	'textarea.lr_text {min-height:100px;width:99%;}\n'+
	'.lr_edit {display:none}\n'+
	'.lr_ok {display:none;text-align:center;}\n'+
	'.lr_clr {display:block;clear:both;height:1px;width:100%;}\n'+
	 '/*}}}*/';
store.addNotification("StyleSheetListr", refreshStyles);

})(jQuery);
//}}}

/***
/%
!TEMPLATES
!!HEADER
{{lr_head{{{lr_refresh lr_btn button{refresh}}}%1}}}
!!DONE
{{lr_foot{{{lr_donebtn lr_btn button{}}}{{lr_deleteall lr_btn button{delete all done items}}} }}}{{lr_done{}}}
!!NEWLIST
<<newTiddler label:"new list" label:"Create a new listr" title:"New list"  text:{{store.getTiddlerText('ListrPlugin##MACRO')}} tag:"%0" focus:"title" fields:"lr_order:'' ">>
!!MACRO
<<listr>>
!!ADDFORM
<html>
<form class="lr_add" action="javascript:;">
<div style='width:30%;'><label>Title:</label><input class="lr_input addtitle" type="text" name="addtitle" title="item title" mode="add"></div>
<div style='width:46%;padding:0 2%;'><label>Tags:</label/><input class="lr_input addtags" type="text" name="addtags" title="item tags" mode="add"></div>
<div style='width:20%;'><label>&nbsp;</label/><div class="lr_submit lr_btn button">add item</div></div>
<div style='width:100%;'><label>Text:</label/><textarea  class="lr_input addtext" name="addtext" class="lr_input" title="item text" mode="add" rows=5></textarea></div>
</form>
</html>
!END
%/
***/
To avoid possible confusion and to shorten the name I have renamed the plugin to [[Filtr]].
URL: https://plus.google.com/109308865556494599029/posts/AnGc8G3qETA
Video: https://www.youtube.com/watch?v=aLJH2F9zyqk
With a simple CSS trick you can hide the toolbar for non-members of your space.
Add the following to your StyleSheet tiddler.

{{{
.toolbarReadOnly .button{
    display:none !important;
}
}}}

If you want to only hide certain commands, use...

{{{
.command_editTiddler,
.command_revisions,
.command_syncing {
    display:none  !important;
}
}}}

Here's a list of all standard toolbar button classes listed individually...
{{{
.moreCommand,
.command_closeOthers,
.command_closeTiddler,
.command_editTiddler,
.command_fields,
.command_jump,
.command_revisions,
.command_permalink,
.command_references,
.command_refreshTiddler,
.command_syncing{
    display:none  !important;
}
}}}
Please fill in your details and hit send, thanks...
<html>
<div id='crmWebToEntityForm' align=center><META HTTP-EQUIV ='content-type' CONTENT='text/html;charset = UTF-8'>  <form action='https://crm.zoho.com/crm/WebToLeadForm' name=WebToLeads306129000000053188 method='POST' onSubmit='javascript:document.charset="UTF-8"; return checkMandatery()' accept-charset='UTF-8'><table border=0 cellspacing=0 cellpadding=5 width=480 style='border-top:2px solid #999999;border-bottom:1px solid #999999;background-color:#ffffff;'>  <input type='hidden' name='xnQsjsdp' value=8Ff*hgzTbpk$/>  <input type='hidden' name='xmIwtLD' value=tK3onBWdOkuQo4sb2GmHbATJ5M7iThGZ/>  <input type='hidden' name='actionType' value=TGVhZHM=/> <input type='hidden' name='returnURL' value=''http://goo.gl/ZxvRs' /> <br><tr><td colspan='2' align='left' style='background-color:#f5f5f5;border-bottom:2px dotted #dadada; color:#000000;font-family:sans-serif;font-size:14px;'><strong>Web Form</strong></td></tr><tr><td nowrap style='font-family:sans-serif;font-size:12px;font-weight:bold' align='right' width='25%'>Company &nbsp;&nbsp;:</td><td width='75%'><input type='text' maxlength='100' name='Company' /> </td></tr><tr><td nowrap style='font-family:sans-serif;font-size:12px;font-weight:bold' align='right' width='25%'>Salutation &nbsp;&nbsp;:</td><td width='75%'><select name='Salutation'>  <option value='-None-'>-None-</option>  <option value='Mr.'>Mr.</option>  <option value='Mrs.'>Mrs.</option>  <option value='Ms.'>Ms.</option>  <option value='Dr.'>Dr.</option>  <option value='Prof.'>Prof.</option>  </select></td></tr><tr><td nowrap style='font-family:sans-serif;font-size:12px;font-weight:bold' align='right' width='25%'>First Name &nbsp;&nbsp;:</td><td width='75%'><input type='text' maxlength='40' name='First Name' /> </td></tr><tr><td nowrap style='font-family:sans-serif;font-size:12px;font-weight:bold' align='right' width='25%'>Last Name &nbsp;&nbsp;:</td><td width='75%'><input type='text' maxlength='80' name='Last Name' /> </td></tr><tr><td nowrap style='font-family:sans-serif;font-size:12px;font-weight:bold' align='right' width='25%'>Email &nbsp;&nbsp;:</td><td width='75%'><input type='text' maxlength='100' name='Email' /> </td></tr><tr><td nowrap style='font-family:sans-serif;font-size:12px;font-weight:bold' align='right' width='25%'>Phone &nbsp;&nbsp;:</td><td width='75%'><input type='text' maxlength='30' name='Phone' /> </td></tr><tr><td nowrap style='font-family:sans-serif;font-size:12px;font-weight:bold' align='right' width='25%'>Mobile &nbsp;&nbsp;:</td><td width='75%'><input type='text' maxlength='30' name='Mobile' /> </td></tr><tr><td nowrap style='font-family:sans-serif;font-size:12px;font-weight:bold' align='right' width='25%'>Website &nbsp;&nbsp;:</td><td width='75%'><input type='text' maxlength='120' name='Website' /> </td></tr><tr><td nowrap style='font-family:sans-serif;font-size:12px;font-weight:bold' align='right' width='25%'>Description &nbsp;&nbsp;:</td><td width='75%'> <textarea name='Description' maxlength='1000' width='250' height='250'></textarea></td></tr><tr><td colspan=2 align=center style='background-color:#eaeaea'> <input type='submit' name='save' value=Save /> &nbsp; &nbsp; <input type='reset' name='reset' value=Reset /> </td></tr></table><script> var mndFileds=new Array('Company','Last Name');var fldLangVal=new Array('Company','Last Name');function checkMandatery(){for(i=0;i<mndFileds.length;i++){ var fieldObj=document.forms['WebToLeads306129000000053188'][mndFileds[i]];if((fieldObj) && ((fieldObj.value).replace(/^\s+|\s+$/g, '')).length==0){alert(fldLangVal[i] +' cannot be empty'); fieldObj.focus(); return false;}else if(fieldObj && (fieldObj.nodeName=='SELECT') && (fieldObj.options[fieldObj.selectedIndex].value=='-None-')){alert(fldLangVal[i] +' cannot be none'); fieldObj.focus(); return false;}}}</script>  </form></div>
</html>
@maans
/***
|''Name''|IconTabsPlugin|
|''Description''|extends the tabs macro to replace tabnames with icons|
|''Documentation''|http://icontabs.tiddlyspace.com|
|''Author''|Tobias Beer|
|''Version''|1.0.3|
|''CoreVersion''|2.6.1|
|''Source''|https://raw.github.com/tobibeer/TiddlyWikiPlugins/master/plugins/IconTabsPlugin.min.js|
|''License''|[[Creative Commons Attribution-Share Alike 3.0|http://creativecommons.org/licenses/by-sa/3.0/]]|
/%***/
(function(e){config.macros.tabs.handler_IconTabsPlugin=config.macros.tabs.handler;config.macros.tabs.IconTabsConfig={defaultPath:"%0.gif",defaultWrapperClass:"iconTabs",defaultIconClass:"tabIcon",hSpace:"20px",vSpace:"20px"};config.macros.tabs.handler=function(t,n,r,i,s,o){var u=[],a,f,l,c,h=0,p,d,v,m=this.IconTabsConfig;while(h<r.length){p=r[h];if(p.indexOf("--")==0){if(readOnly){d=p.substr(2).toLowerCase();r.splice(h,d=="hspace"||d=="vspace"?1:3);continue}else{r[h]=p=p.substr(2)}}d=p.toLowerCase();if(d=="hspace"||d=="vspace"){a=d=="hspace";r.splice(h,1);c=r[h];if(c)u.push(c.replace(/^\-{2}/,""));continue}h++}f=r.indexOf("icons:");if(f>0){l=r.splice(f);l.shift();s="[["+r.join("]] [[")+"]]"}config.macros.tabs.handler_IconTabsPlugin.apply(this,arguments);if(f>0){var v=l[0],g=l[1],y=l[2],b=e(t.lastChild);if(!v)v=m.defaultPath;b.addClass(m.defaultWrapperClass+(g?" "+g:""))}e(".tab",b).each(function(){var t,n=e(this),r=n.text().trim(),i=n.attr("content").replace(/\#\#/,"__").replace(/\:\:/,"__");if(f>0){t=store.getTiddlerText(v.format([i])+"##data");t=t?t:store.getTiddlerText(v.format([i])+"##file");t=t?t:store.getTiddlerText(v.format([i])+"##url");n.html('<img src="'+(t?t:v.format([i]))+'" class="'+m.defaultIconClass+(r?" icon"+r.trim().replace(/(\s|\W)/mg,"_"):"")+'"/>')}if(u.contains(r)){n.css("margin-"+(a?"left":"top"),y?y:a?m.hSpace:m.vSpace)}})};config.shadowTiddlers["StyleSheetIconTabs"]="/*{{{*/\n"+".tabIcon {\n"+"   width:28px;\n"+"   height:28px;\n"+"   margin:3px 3px 0 3px;\n"+"}\n"+".iconTabs {\n"+"   margin-top:10px;\n"+"}\n"+".iconTabs .iconTabs {\n"+"   margin:3px;\n"+"}\n"+".iconTabs .tabset{\n"+"   padding:0;\n"+"}\n"+".iconTabs .tab {\n"+"   outline: 0;\n"+"   margin: 0;\n"+"   padding: 22px 0 1px 0;\n"+"   border: 1px solid transparent;\n"+"}\n"+".iconTabs .tabUnselected {\n"+"   background: transparent;\n"+"}\n"+".iconTabs .tabSelected,\n"+".iconTabs .tabSelected:hover,\n"+".iconTabs .tabUnselected:hover {\n"+"   background: [[ColorPalette::TertiaryPale]];\n"+"   border: 1px solid [[ColorPalette::TertiaryLight]];\n"+"   border-bottom-color: transparent;\n"+"}\n"+".iconTabs .spacer {\n"+"   margin-left: 20px;\n"+"}\n"+"/*}}}*/";store.addNotification("StyleSheetIconTabs",refreshStyles)})(jQuery)
//%/
Testing GroupByPlugin, part of the TiddlySpace core...
<<tabs
	txtGroupBy

	tags
	'by tags'
	GroupBy##TAGS

	bags
	'by bags'
	GroupBy##BAGS

	date
	'by date'
	GroupBy##DATE

	exclude
	'with exclusion'
	GroupBy##EXCLUDE

	filter
	'using filters'
	GroupBy##FILTER
>>/%
!TAGS
{{{
<<groupBy tags>>
}}}
<<groupBy tags>>
!BAGS
{{{
<<groupBy server.bag>>
}}}
<<groupBy server.bag>>
!DATE
{{{
<<groupBy modified dateFormat:"YYYY">>
}}}
<<groupBy modified dateFormat:"YYYY">>
!EXCLUDE
{{{
<<groupBy tags exclude:excludeLists exclude:systemConfig>>
}}}
<<groupBy tags exclude:excludeLists exclude:systemConfig>>
!FILTER
{{{
<<groupBy modifier filter:[tag[systemConfig]]>>
}}}
<<groupBy modifier filter:[tag[systemConfig]]>>
!END%/
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
The scripted programming language that gives you TiddlyWiki, executed during runtime mostly but browsers by thanks to things like [[node.js|http://nodejs.org]] nowadays by servers, too.
!Summary
@SlidrPlugin is a plugin that provides you with the {{{<<slidr>>}}} macro which gathers tiddlers and by default displays them in date groups, optionally grouped by tags.
!Example
<<slidr>>
{{annotation{
''Tip:'' Try to CTRL+Click on a slider and see what happens.
}}}
You are can specify the depth you want to go and also have it all grouped by tag, e.g.
{{{
<<slidr tags filter:[tag[Plugins]] level:day>>
}}}
<<slidr tags filter:[tag[Plugins]] level:day>>
{{annotation{
''Tip:'' Clicking on a tag name gives you the tag popup.
}}}
There is an abundance of further options, e.g. you can constrain the date range or even say "give me only January throughout each year or even only New Years Day.

Feel free to check it out in the @Slidr space and include @SlidrPlugin if you want to use it in your TiddlySpace.

Finally, here are all tags used in this space for you to @slidr away...
<<slidr tags level:year exclude:excludeLists>>
Vertical tabs allows you to align your tabs in a vertical tabset instead of horizontal tabs. It does not ship with a plugin but rather provides you with css conventions to achieve said effect.
!Originally published at...
http://verticaltabs.tiddlyspot.com <<tiddler iframe with: verticaltabs.tiddlyspot.com/>>
A TiddlyWiki powered website for a crafty philosopher who creates the post beautiful porcelain sculptures. The site is driven by an custom catalogue manager and viewer and leverages loads of custom features like...
*a sitemap
*a blog
*contextual contact forms
*lightboxes
*breadcrumb navigation
...and pulls all images from an image store on [[photobucket.com|http://photobucket.com]]...

[img[http://img.tiddlyspace.com/LichtOrganik.de][http://lichtorganik.de]]
; url
: https://github.com/penrosestudio/TiddlySpace-backup
; discussion
: https://groups.google.com/d/msg/tiddlyspace/hoAsiSiKQ58/UyeKNXHSk2MJ
; author
: Jonathan Lister
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
!Summary
[[ParamParser|ParamParserMacro]] provides the {{{<<params>>}}} macro -- a utility macro especially handy for developers which shows detailed information on how TiddlyWiki actually parses parameters for a given macro.
!Details
Other than previewing the parsed parameters it also provides some code examples on how to parse parameters in your own plugins.

If you want, you can include it on TiddlySpace from the @ParamParser space.
!How It Works
<<tiddler ParamParserMacro##Usage>>
!Summary
Finding a desired tab may just have become easier using pictrograms -- with [[IconTabsPlugin|http://icontabs.tiddlyspace.com]] you can now use <<tag Icon icons>> as tabs. For use in ~TiddlySpace include the @IconTabsPlugin space and also the @IconTabs-Picto space if you like to use the pictograms you see here.
!Details
IconTabsPlugin extends the core {{{<<tabs>>}}} macro with parameters that allow you to define a set of <<tag Icon "tab icons">> to be used.
!Example
{{{
<<tabs
txtMainTabs
	Star "show starred tiddlers" TabStarred
	Journal "journal entries" TabJournal
--hspace
	Timeline "show timeline" TabTimeline
	Tags "all tags" TabTags
	All "all tiddlers" TabAll
--hspace
	--TiddlySpace "tiddlySpace lists" TabTiddlySpace
	Following "following lists" IconTabs##Follow
	--More "more tiddlers" IconTabs##MoreIcons
icons:
>>
}}}
<<tabs
txtMainTabs
	Star "show starred tiddlers" TabStarred
	Journal "journal entries" TabJournal
--hspace
	Timeline "show timeline" TabTimeline
	Tags "all tags" TabTags
	All "all tiddlers" TabAll
--hspace
	--TiddlySpace "TiddlySpace lists" TabTiddlySpace
	Following "following lists" IconTabs##Follow
	--More "more tiddlers" IconTabs##MoreIcons
icons:
>>/%
!MoreIcons
<<tabs txtTabMoreIcons
    "Missing" "Missing tiddlers" TabMoreMissing
    "Orphans" "Orphaned tiddlers" TabMoreOrphans
    "Shadowed" "Shadowed tiddlers" TabMoreShadowed
icons:
>>
!Follow
<<tabs txtTabFollowIcons
    Activity "What people you are following are up to" TabFollowing##Activity
    Following "People you are following" TabFollowing##Following
    Followers "People who are following you" TabFollowing##Followers
icons:
>>
!End%/
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
!Suimmary
[[TypeWithMePlugin|http://typewithme.tiddlyspace.com]] gives you a simple mechanism to associate individual tiddlers with collaborative documents hosted on etherpad-like services. Originally, [[typewith.me|http://typewith.me]] was the service being used -- hence the name.
!Details
To implement it in your space or TiddlyWiki, simply include the [[typeWithMe|http://typewithme.tiddlyspace.com/#TypeWithMe]] space and add a button called {{{typeWithMe}}} (case sensitive) to your ToolbarCommands or the corresponding section of your theme tiddler.
!Example
For a working example and maybe some useful rules as to how to use it, have a look at [[semantic space|http://semantic.tiddlyspace.com/#TypeWithMe]] ...check out the toolbar.
!Services
Since ''typewith.me'' as well as ''willyou.typewith.me'' are down, the following services can be used alternatively by adding the following to your [[zzConfig|http://tiddlywiki.org/#%5B%5BChanging%20Default%20Options%5D%5D]]:
{{{
config.commands.typeWithMe.serviceURL = 'http://your.service.net/%0';
}}}
Whereas {{{%0}}} is where the generated pad name is inserted.
|!Service|!URL|!Details|h
|[[Sync.in|http://sync.in]]|[[http://sync.in/%0|http://sync.in/Test]]|multi user capable, has free and paid version|
|[[PiratePad|http://piratepad.net]]|[[http://piratepad.net/%0|http://piratepad.net/Test]]|multi user capable|
|[[PrimaryPad|http://primarypad.com]]|[[http://free.primarypad.com/p/%0|http://free.primarypad.com/p/Test]]|pad life in free version is 30 days (see pricing)|
|[[PiratenPad|http://piratenpad.de]]|[[http://piratenpad.de/p/%0|http://piratenpad.de/p/Test]]|old version, single user and team|
|[[Etherpad.Mozilla.org|https://etherpad.mozilla.org]]|[[https://etherpad.mozilla.org/%0|https://etherpad.mozilla.org/Test]]|single user, team pads, intended for mozilla projects!|
|[[Beta.Etherpad.org|http://beta.etherpad.org]]|[[http://beta.etherpad.org/p/%0|http://beta.etherpad.org/p/Test]]|single user, beta site|
!How to use
Just click the toolbar button to open or close the document in an inline iframe. If you use {{{CTRL+CLICK}}} the document will be openend in a new browser tab.

Note that you must be a member of a space with write priviledges in order to actually save the tiddler and permanently associate the typeWithMe pad.
!Styles
In order to style the typeWithMe box, please use the CSS class from the following example, which you must place in any of your StyleSheet tiddlers:
{{{.frmTypeWithMe {margin-left:1%;width:85%;} }}}
!Parameters
By default documents are currently named like this:
*{{{SpaceName-YYYY-0MM-0DD-Tiddler-Name}}}

You can override certain parameters using your [[zzConfig]] tiddler tagged {{{systemConfg}}}...
{{{
config.commands.typeWithMe.inline=false;
}}}
| !Parameter | !Description | !Default value |h
|{{{serviceURL}}} |the url of the etherpad service that hosts the pad<br>- {{{%0}}} is replaced with the generated pad title |{{{http://willyou.typewith.me/p/%0}}}|
|{{{target}}} |where to render the document when not rendered {{{inline}}} |{{{_blank}}}|
|{{{inline}}} |whether or not you want to render the document into an inline iframe|{{{true}}}|
|{{{iframe}}} |the markup used for generating the iframe<br>- {{{%0}}} will be replaced with the url|{{{<html><a href="%0" target="_blank" class="externalLink" style="margin-left:1em;">open pad in new window</a><iframe src="%0" class="frmTypeWithMe"/></html>}}}|
|{{{fmtPrefix}}} |the prefix used in front of the tiddler name<br>- {{{%date}}} will be replaced with a datestring<br>- if you are not using this on TiddlySpace, prepend some unique identifier |{{{%date}}} |
|{{{fmtDate}}} |the format used for the date in {{{fmtPrefix}}}|{{{YYYY-0MM-0DD}}}|
|{{{text}}} |the text for the toolbar button, in case you are not using icons|{{{discuss}}}|
|{{{tooltip}}} |the tooltip used for the toolbar button|{{{show typewith.me discussion}}}|
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
<<tiddlerList tags:"$1" top:"7" dateFormat:"0DD.mmm 'YY:" itemTemplate:"*[[%$2 %title|%title]] \n" order:"-$2">>
Created BulletGraphMacro to render [[bullet graphs|http://en.wikipedia.org/wiki/Bullet_graph]] in tiddlywiki.
!Example Graph
| ''Revenue YTD 2005 (in 1000$)''<br><<bulletgraph 280 270 scales:200,250,300>> |

<<more BulletGraph>>
/***
|''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)
//%/
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
 /* @@color:red; ''Important'': @@
To get future updates, keep this tiddler as is. Add custom CSS to...
;StyleSheetSpace
:as a user including @White
;StyleSheetApp
:as an app developer using @White */
/*{{{*/

/* DEFAULTS */

.clearFloat {
    clear: both;
}

body {
    font-size: 1em;
    font-family: helvetica, arial, sans-serif;
    background-color: [[ColorPalette::PageBackground]];
    color: [[ColorPalette::Foreground]];
}

body ul {
    margin: 0;
}

.right{
    float:right;
}

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

.viewer img {
    max-width:100%;
}

.viewer blockquote {
    border-left: 2px solid [[ColorPalette::TertiaryPale]];
}

.viewer table, table.twtable {
    border-collapse: collapse;
    margin: 5px 0;
    border: 1px solid [[ColorPalette::TertiaryMid]]  !important;
    max-width: 100%;
    word-break: normal;
    word-wrap: break-word;
}

.viewer tr, .viewer td,
.twtable tr, .twtable td {
    vertical-align:top;
    border: 1px solid [[ColorPalette::TertiaryMid]] !important;
}

.viewer th a:hover,
.viewer thead td a:hover,
.twtable th a:hover,
.twtable thead td :hover{
    color:[[ColorPalette::Background]] !important;
}

,viewer .listTitle{
    margin-left:0;
}

a,
.popup .button {
    color:[[ColorPalette::SecondaryDark]];
}

a:hover {
    text-decoration:underline;
    color:[[ColorPalette::SecondaryMid]];
    background:transparent;
}

a.tiddlyLink {
    font-weight:normal;
}

body .linkified .tiddlyLink.shadow,
a.tiddlyLink.shadow{
    color:[[ColorPalette::TertiaryMid]];
}

a.tiddlyLink.tiddlyLinkNonExisting {
    font-style:italic;
    font-weight:normal;
}

a.tiddlyLink:hover,
.popup .button:hover {
    background:none;
    color:[[ColorPalette::SecondaryMid]];
}

body .linkified .tiddlyLink{
    color:[[ColorPalette::SecondaryDark]];
}

body .linkified .tiddlyLink:hover{
    color:[[ColorPalette::SecondaryMid]];
}

.button,
.tagInfo ul li .button {
    color:[[ColorPalette::TertiaryMid]];
    background:[[ColorPalette::TertiaryPale]];
}

.button:hover,
.tagInfo ul li .button:hover {
    text-decoration:none;
    color:[[ColorPalette::Background]];
    background:[[ColorPalette::TertiaryMid]];
    border-color:[[ColorPalette::TertiaryLight]];
}

a.image:hover {
    background: transparent;
}

.tab{
    border: 1px solid [[ColorPalette::TertiaryLight]];
    border-bottom-color: [[ColorPalette::TertiaryPale]];
    background: [[ColorPalette::TertiaryLight]];
}

a.tabSelected,
.tabset .tab:hover {
    color:[[ColorPalette::TertiaryMid]];
    background: [[ColorPalette::PageBackground]];
    text-decoration: none;
}

.tabContents{
    background: [[ColorPalette::PageBackground]];
}

dd {
    margin-left: 20px;
}

dd:before {
    content: '» ';
}

iframe{
    width:98%;
    height:600px;
    border:2px solid [[ColorPalette::TertiaryPale]];
    z-index:0;
    position:relative;
}

object{
    z-index:0;
    position:relative;
}

.noTitle .listTitle{
    display:none !important;
}

.annotation{
    margin:0;
}

/* PAGE LAYOUT */

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

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

#tiddlerDisplay,
#searchResults {
    margin: 8px 390px 0 42px;
    _position: relative; /* ie 6*/
}

* html #tiddlerDisplay {
    margin-top: 0px;
}


/* SEARCH */

#sidebarSearch {
    width: 200px;
}

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

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

#sidebarSearch .searchButton {
    display: none;
}

/* SIMPLESEARCH */
#searchResults {
     margin-top:0;
}

#displayArea #searchResults .button{
    padding:2px 6px;
    margin-right:3px;
    float:right;
}

/* FINDR */

#sidebarTabs #searchResults {
    margin: 0 1em 0 0;
}

#searchResults #findr-buttons{
    margin:0.5em 0 0 5px;
}

#displayArea #searchResults #findr-buttons {
    margin: 2.5em 0 0em 5px;
    float: right;
}

#searchResults .search_list .button{
    float:none !important;
    background:transparent;
    padding:2px;
    margin: 0;
}

#searchResults .search_list .button:hover{
    color:[[ColorPalette::SecondaryMid]];
}

.search_details strong{
   font-weight:normal;
   color:[[ColorPalette::TertiaryMid]];
}

.findr > strong{
    display: block;
    clear: both;
    padding-top: 0.5em;
}


/* TOPMENU */

#topMenu {
    left: 0;
    margin: 0.5em 32px 0 42px;
    clear:left;
    position: relative;
    padding: 0.5em 0 ;
    min-height: 1em;
    overflow: hidden;
    _width: 100%; /* for ie 6 */
}

/* MAIN MENU */

#mainMenu {
    color:[[ColorPalette::TertiaryLight]];
    position: static;
    text-align: left;
    margin: 0;
    float: left;
    width: auto;
    padding: 0;
    margin-left:4px;
    font-size: 1em;
    line-height: normal;
}

#mainMenu br{
   display:none;
}

#topMenu #sideBarOptions {
    margin-right:16px;
}

#mainMenu a,
#mainMenu .tiddlyLink,
#mainMenu .button,
#sidebarOptions a,
#sidebarOptions .button {
    margin: 0;
    background:none;
    color: [[ColorPalette::TertiaryMid]];
    font-size: 0.9em;
    padding: 4px 6px;
}

#sidebarOptions a,
#sidebarOptions .button {
    display:inline-block;
}

#mainMenu a:hover,
#mainMenu .tiddlyLink:hover,
#mainMenu .button:hover,
#sidebarOptions a:hover,
#sidebarOptions .button:hover {
    background:none !important;
    color:[[ColorPalette::TertiaryDark]];
}

#mainMenu .button,
#sidebarOptions .button {
    border: 1px solid transparent;
}

.topMenu #sidebarOptions {
    float: right;
    padding: 0;
    margin: 0 0 0 1em;
}


/* SIDEBAR */

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

#sidebarTabs .lf-search {
    background:transparent;
    padding:0 0 5px 0;
}
#sidebarTabs .lf-label{
    display:none;
}

#sidebarTabs .sidebarHeader{
    padding: 1em 0 0 10px;
}

#sidebarTabs .siteTitle,
#sidebarTabs .siteTitle a {
    display: block;
    font-size: 32px;
    line-height: 32px;
    font-weight:normal;
    color: [[ColorPalette::SecondaryDark]];
    background: transparent;
}

#sidebarTabs .siteTitle a:hover {
    color: [[ColorPalette::TertiaryDark]];
}

#sidebarTabs .siteSubtitle {
    display: block;
    float: none;
    font-size: 14px;
    margin: 1em 0 0 1em;
    color: [[ColorPalette::TertiaryMid]];
    clear: both;
    margin: 0;
}

#sidebarTabs #sidebarOptions {
    margin-top: 1em;
    padding:0;
}

#sidebarTabs #sidebarOptions .button:hover,
#sidebarTabs #sidebarOptions .button:active {
    color:[[ColorPalette::PrimaryMid]];
    text-decoration:none;
    background:transparent;
}

.sidebarTabs{
    clear:both;
    margin-top:1em;
}

#sidebarTabs .tabsetWrapper .tabset {
    width: 87px;
    text-align:right;
    border: 0;
    height: auto;
    float: left;
    word-wrap: break-word;
    top: 0;
    padding: 0 5px 0 0;
}

#sidebarTabs .tabContents li a:hover {
    color: [[ColorPalette::SecondaryMid]];
}

#sidebarTabs .tabsetWrapper .tabset .tab {
    font-size: 0.9em;
    padding: 2px 5px 2px 2px;
    color: [[ColorPalette::TertiaryMid]];
    background: transparent;
    border: 0;
    border-right: 1px solid [[ColorPalette::TertiaryLight]];
    line-height: 16px;
    position: relative;
    display: block;
    margin: 2px 0 0 0;
    background-color: #f9f9f9;
    background-image: linear-gradient(left, rgb(249,249,249) 0%, rgb(236,236,236) 100%);
    background-image: -o-linear-gradient(left, rgb(249,249,249) 0%, rgb(236,236,236) 100%);
    background-image: -moz-linear-gradient(left, rgb(249,249,249) 0%, rgb(236,236,236) 100%);
    background-image: -webkit-linear-gradient(left, rgb(249,249,249) 0%, rgb(236,236,236) 100%);
    background-image: -ms-linear-gradient(left, rgb(249,249,249) 0%, rgb(236,236,236) 100%);
}

#sidebarTabs .tabsetWrapper .tabset a:hover,
#sidebarTabs .tabsetWrapper .tabset .tabSelected {
    border:0;
    border-right: 1px solid [[ColorPalette::TertiaryLight]];
    z-index: 10;
    color: [[ColorPalette::TertiaryMid]];
    background:transparent;
    text-decoration:none;
}

#sidebarTabs .tabsetWrapper .tabset a:hover{
    color: [[ColorPalette::SecondaryMid]];
}


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

#sidebarTabs .tiddlyLinkExisting{
    font-weight:normal;
}

.tabContents li.listTitle{
    font-size: 1em;
    border: 0;
    padding: 0.3em  0.11em;
    color: [[ColorPalette::TertiaryLight]];
}

#sidebarTabs .tabContents .list-missing a {
    font-style:italic;
}

.tabContents .timeline {
    background: transparent;
    margin-bottom: 8px;
}

#sidebarTabs .timeline li.listTitle {
    color: [[ColorPalette::TertiaryLight]];
    margin-left: 8px 0;
    padding: 0.3em 0.11em;
}

#sidebarTabs .tabContents div > ul > li.listTitle {
    padding-top:0;
}

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

#sidebarTabs .tabsetWrapper .tabContents {
    position: relative;
    background-color: transparent;
    border: 0;
    width:16em;
    min-height: 200px;
    padding: 0 0 0 5px;;
    font-size: 0.9em;
}

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

/*SUPPORT FOR SECONDARY TABS*/
#sidebarTabs > div > .tabsetWrapper > .tabset{
    padding-left:10px;
    width:90%;
    float:none;
    text-align:left;
}

#sidebarTabs > div > .tabsetWrapper > .tabset > .tab {
    display: inline-block;
    background: transparent;
    margin: 0 3px -1px 0;
    padding:2px 4px;
    color: [[ColorPalette::TertiaryMid]];
    background: [[ColorPalette::TertiaryPale]];
    border: 0;
    border-top: 2px solid [[ColorPalette::TertiaryPale]];
    border-bottom: 2px solid [[ColorPalette::TertiaryPale]];
}

#sidebarTabs > div > .tabsetWrapper > .tabset > .tab:hover,
#sidebarTabs > div > .tabsetWrapper > .tabset > .tabSelected {
    background: transparent;
    border-top-color: transparent;
    color: [[ColorPalette::SecondaryDark]];
}

#sidebarTabs > div > .tabsetWrapper > .tabContents{
    margin-top:5px;
}

#sidebarTabs > div > .tabsetWrapper .tabsetWrapper {
    margin-top:5px;
}

#sidebarTabs > div > .tabsetWrapper .tabsetWrapper > .tabset{
    width:70px;
}

#sidebarTabs > div > .tabsetWrapper .tabsetWrapper,
#sidebarTabs > div > .tabsetWrapper .tabsetWrapper > .tabContents{
    width:auto;
}


/* TIDDLER */

.tiddler {
    position: relative;
    padding:0;
    width: 100%;
    margin-bottom: 2em;
    border-top: 1px solid [[ColorPalette::TertiaryPale]];
    background: [[ColorPalette::Background]];
    -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1);
    -moz-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1);
    box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1);
}

.heading {
    top: 22px;
    left: 0;
    width: 95%;
    padding: 1em 2.5% 5px 2.5%;
    border-bottom:3px solid [[ColorPalette::Dim]];
}

.tiddler .heading .title {
    position: relative;
    display: block;
    font-weight:normal;
    word-wrap: break-word;
    font-size:24px;
    line-height:24px;
    margin-right: 120px;
}

.tiddler .subtitle {
    display:block;
    float:left;
    font-style: normal;
    font-size: 0.9em;
    color: [[ColorPalette::TertiaryMid]];
    margin: 5px 0 0 0;
}

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

.tiddler .subtitle a {
    color: [[ColorPalette::SecondaryMid]];
}

.tiddler .subtitle a:hover {
    color: [[ColorPalette::SecondaryDark]];
    background: [[ColorPalette::Background]];
}

.tiddler .headingClear {
    clear: both;
}

.tiddler .viewer {
    padding: 5px 2.5% 16px 2.5%;
    width: 95%;
    margin: 0;
    line-height: 1.4em;
    overflow:hidden;
}

.viewer pre {
    margin-left: 0;
}


/* TOOLBAR */

/* ie hacks */
.toolbar .svgIconText {
    *display: inline;
}

* html .toolbar {
    right: 8px;
}

.tiddler .originButton div {
    display: inline-block;
}

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

.tiddler .originButton {
    display: block;
}

.originButton.highlight{
    background:transparent;
}

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

/* TOOLBAR */ 


div.toolbar {
    visibility:hidden;
    right: -6px;
    position: absolute;
    padding: 0;
    top: 10px;
    z-index: 1;
}

.selected div.toolbar {
    visibility: visible;
}

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

div.tiddler .toolbar a.command_deleteTiddler{
    margin-right: 34px !important;
}

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

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

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

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

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

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

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


/*! EDITMODE */

.heading.editorHeading {
    margin: 2em 0 0 0;
    width: 100%;
    padding: 0;
}

.tiddler .editor {
    padding: 0px;
    margin: 0 2.5%;
}

.heading .editor input {
    width: 99%;
    padding: 2px 0.5%;
    font-size: 0.8em;
    margin-top:1em;
}

.tiddler .heading .editor.title {
    font-size: 1.7em;
    line-height: normal;
}

.editor input, .editor textarea {
    width: 99%;
    padding: 2px 0.5%;
    border: 2px solid [[ColorPalette::TertiaryPale]];
}

.tagTitle {
    position: absolute;
    text-align: right;
    padding-right: 10px;
    top: 0px;
    margin-left: -95px;
    width: 100px;
}

.tagAnnotation {
    margin: 8px 0 0 20px;
    padding-bottom: 8px;
}

.annotationsBox {
    padding: 0;
    margin: 0 2.2% 0 2.5%;
}

.annotationsBox  .annotation {
    margin: 0;
    padding: 3px 5px;
}

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

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


/* TAGGING */
.selected .tagging,
.selected .tagging:hover {
    border: none;
    background: none;
}
.tagging {
    float: none;
    background: none;
    border: none;
}

.tagInfo {
    color: [[ColorPalette::TertiaryMid]];
    background: [[ColorPalette::Dim]];
    margin: 0;
    padding: 0;
    font-size:0.9em;
}

.tagInfo .tidTags,
.tagInfo .tagging{
    font-size:1em;
    padding: 0 0 2px 0;
}

.tagInfo ul {
    list-style: none;
    padding-left: 10px;
}

.tagInfo ul li {
    display:inline-block;
    margin-top:3px;
}

.tagInfo ul li.listTitle,
.tagInfo .tagging ul li.listTitle {
    display:inline-block;
    width:60px;
    text-align: right;
    padding: 5px 5px 3px 0;
    text-align:right;
    color: [[ColorPalette::TertiaryLight]];
    margin:0;
}

.tagInfo .tagging ul li.listTitle + li {
   margin-top: -20px;
}

.tagInfo .tagging ul li {
    float: none;
    display: block;
    clear:left;
    margin-left: 65px;
}

.tagInfo .tagging ul li a {
    display:block;
}

.infoTags {
    padding: 3px 5px;
}

.infoTags .tidTags{
    max-width:75%;
}

.infoTags ul {
    padding-left:0;
}

/* POPUPS (/ SIDEBAR) */

.popup {
    padding:3px;
    border-color:transparent;
    background-color: [[ColorPalette::Background]];
    -webkit-border-radius: 4px;
    -moz-border-radius: 4px;
    border-radius: 4px;
    -webkit-box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5);
    -moz-box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5);
    box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5);
}

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

.popup.block a{
    display:block;
}

.popup.block br{
    display:none;
}

.popup a,
.popup li a,
.popup a.button {
    padding:3px;
    color: [[ColorPalette::SecondaryDark]];
    border:0;
}

.popup a :hover,
.popup li a:hover,
.popup a.button:hover,
a.popupbutton.highlight {
    color: [[ColorPalette::SecondaryMid]];
    background: transparent;
}

.popup li a.tiddlyLink {
    font-weight: bold;
}

.taggedTiddlerList li:last-child a.tiddlyLink{
    font-weight:normal;
}

.popup li.disabled,
.popup li.listTitle {
    border-bottom: 1px solid [[ColorPalette::TertiaryPale]];
    color: [[ColorPalette::TertiaryMid]];
    font-weight:normal;
    padding:7px 5px;
    margin: 0;
}

.popup .button{
    background:transparent;
}

.popup.confirmationPopup,
.followList {
    font-size: 0.8em;
    padding: 1em;
    border: 0;
}

.popup.confirmationPopup .button {
    border: 0;
    margin: 4px 4px 0 4px;
    display: inline-block;
}

.popup.confirmationPopup .button:hover {
    background:transparent;
    color:[[ColorPalette::SecondaryDark]];
}

.popup hr{
    color: transparent;
    background: transparent;
    border: 0;
    border-bottom: 1px solid #ccc;
}

.listBreak{
   border-bottom: 1px solid  [[ColorPalette::TertiaryPale]];;
}

.listBreak div{
   display:none;
}


/* REVISIONS */

.revButton {
    float: right;
}

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

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

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

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


/* ACTIVITY */

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


/* FOLLOWING */

.tiddler .followPlaceHolder {
    display: block;
    position: absolute;
    top: 58px;
    right: 60px;
    _right: 126px; // add width of modifierIcon
}

.followButton a {
    position: absolute;
    top: 0px;
    right: 0;
    display: block;
    margin: 0;
    padding: 6px 20px;
    background: transparent;
    text-align: center;
    color: [[ColorPalette::TertiaryMid]];
    display: block;
    margin-top: 0px;
}

.followButton a:hover {
    color: [[ColorPalette::TertiaryMid]];
    text-decoration: none;
}

.followButton.hasReplies a {
    font-weight:bold;
    color: [[ColorPalette::SecondaryMid]];
}

.followButton.hasReplies a:hover {
    color: [[ColorPalette::SecondaryDark]];
}


* html .followButton a {
    margin: 0px 8px 0 0;
}

.tiddler .followButton {
    width: 36px;
    position: relative;
    height: 22px;
    text-align: left;
    color:  [[ColorPalette::SecondaryDark]];
    background: [[ColorPalette::TertiaryPale]];
    padding: 10px 0px 0px 10px;
    margin: -16px -8px 0 0;
}

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

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

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

#popup.followList {
    margin: 10px 0 0 -335px;
    max-width: 400px;
}

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

#popup .followTiddlersList ul{
   margin:0;
   padding:0;
}

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

#popup .followTiddlersList .siteIcon{
    height: auto;
    width: auto;
    margin-right:5px;
}


/* ICONS */

.titleBar .hideIcon .image {
    display: none;
}

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

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

.tiddler .spaceSiteIcon {
    float: left;
    margin: 0 5px 0 0;
    position: relative;
    display: block;
}

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

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

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

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

.modifierIcon {
    position: absolute;
    width: 42px;
    top: 42px;
    right: 0;
    text-align: right;
}

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

.editSpaceSiteIcon .originButton {
    cursor: auto;
}

.editSpaceSiteIcon .originButton img,
.editSpaceSiteIcon .originButton svg {
    margin:  0 5px 5px 3px;
    width: 16px;
    height: 16px;
}

.editSpaceSiteIcon, .privacyEdit {
    float: left;
}

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

.tiddler .privacySettings {
    text-align: center;
}
.tiddler .privacySettings .originButton {
    display: inline;
}


/* BACKSTAGE */

#app-picker:hover{
    background-color:transparent;
}

#backstageToolbar {
    padding-left: 50px;
}

#backstageToolbar .backstageTask {
    background: transparent;
    color: [[ColorPalette::TertiaryPale]] !important;
}

#backstageArea a.backstageSelTab,
#backstageToolbar .backstageTask:hover {
    text-decoration:none;
    background: transparent;
    color: [[ColorPalette::Background]] !important;
}

/* MESSAGE AREA */

#messageArea {
    position: fixed;
    top: 0 !important;
    right: 0;
    width:350px;
    margin:0;
    padding:7px 1%;
    font-size:0.9em;
    border:1px solid [[ColorPalette::SecondaryMid]];
    background:[[ColorPalette::SecondaryPale]];
    -moz-border-radius:5px;
    -webkit-border-radius:5px;
    border-radius:3px;
}

#messageArea .messageToolbar {
    display:block;
    float:right;
    padding:0.1em;
    text-align:right;
    width:60px;
}

#messageArea a,
#messageArea .button {
    background:transparent;
    text-decoration:none;
    color:[[ColorPalette::TertiaryDark]];
    border:0;
}

#messageArea a:hover{
    color:black;
    border-bottom:1px solid [[ColorPalette::TertiaryDark]];
}

#backstageToolbar {
    text-align:center;
}

/* RESPONSIVE */

@media all and (max-device-width: 480px) {
    div.toolbar {
        visibility:visible;
    }
}

@media only screen and (device-width: 768px) {
    div.toolbar {
        visibility:visible;
    }
}

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

    #mainMenu {
        margin-left: 16px;
    }

    #sidebarSearch,
    #sidebarOptions,
    #sidebarTabs {
        right: 16px;
        width: 326px;
    }

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

    #sidebarTabs .tabsetWrapper .tabContents {
        width:auto;
        padding:0 0 0 5px;
    }

    #sidebarTabs .tabContents li a {
        font-size: 0.9em;
    }


     /* TIDDLER */

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

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

    br {
        line-height: 0.5em;
    }
}


/* PRINT */

@media print {
    #mainMenu,
    #sidebar,
    #messageArea,
    .toolbar,
    .followPlaceHolder,
    #backstageButton,
    #backstageArea,
    #sidebarTabs,
    #sidebarSearch .txtOptionInput,
    #sidebarOptions {
        display: none !important;
    }
    #displayArea {
        margin: 1em 1em 0em;
    }

    #tiddlerDisplay {
        margin: 16px 16px;
    }

    /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
    noscript {
        display:none;
    }
}

[[StyleSheetApp]]
[[StyleSheetSpace]]
/*}}}*/

[[LinksPlugin|http://links.tiddlyspace.com]] allows you to output indexes for the...
* external links
* internal links
...used in your TiddlyWiki.
You can using filters, apply search terms, render internal or external links or both, use custom formats, and quickly search using ListFiltr.

For details, see [[@Links]].
!Example
{{{
<<links external:false filter:[tag[Journal]]>>
}}}
<<links external:false filter:[tag[Journal]]>>
<html><iframe src="http://$1" style="$2"/></html>
/***
|''Name''|TagFiltrPlugin|
|''Description''|tag-based faceted tiddler navigation based on FND's tagsplorer|
|''Author''|Tobias Beer|
|''Documentation''|http://tagfiltr.tiddlyspace.com|
|''Version''|1.4.8 (2013-09-30)|
|''CoreVersion''|2.6.0|
|''License''|Creative Commons 3.0|
|''Source''|https://raw.github.com/tobibeer/TiddlyWikiPlugins/master/plugins/TagFiltrPlugin.min.js|
<<tagfiltr>>
***/
// /%
(function(e){var t=config.macros.tagfiltr={};config.macros.tagfiltr=e.extend(t,{exclude:"excludeLists",filter:"",listfiltr:true,tags:"",hide:"",fix:false,groups:"TagFiltrConfig##Groups",onlyGroups:false,format:"[[%0]]",lblTags:"tags:",lblAdd:"+",tipAdd:"select tag to filter by",tipPrefix:"select tag from group",tipRemove:"click remove tag from filter",tipFix:"this tag cannot be removed",handler:function(n,r,i,s,o,u){var a={},f,l,c={},h=o.parseParams("anon",null,true),p=getParam(h,"template",""),d=e(n).closest("#tiddlerDisplay").length;(store.getTiddlerText(p)||"").split("\n").map(function(e){var t=e.split(":");c[t[0]]=undefined!=t[1]?t[1]:true});["exclude|ex","filter","listfiltr|lf","tags","fix","hide","groups","onlyGroups|bG","lblTags","format|fmt"].map(function(e){e=e.split("|");var n=e[0],r=e[1]||e[0];a[r]=getParam(h,n,p&&c[n]?c[n]:t[n]!=undefined?t[n]:"");if(i.contains(n)){a[r]=true}});["bG","lf"].map(function(e){a[e]="true"==a[e].toString()});l=e('<div class="tagfiltr" />').append('<b class="tp_tags_label" />').children(":last").text(a.lblTags).end().append('<div class="tf-tags" />').append('<div class="tf-listfiltr" />').attr({refresh:"macro",macroName:"tagfiltr",params:o});a.ex=a.ex.readBracketedList();a.hide=a.hide.readBracketedList();a.tags=a.tags.readBracketedList();if(a.fix)a.fix=typeof a.fix==="string"?a.fix.readBracketedList():a.tags.slice();else a.fix=[];if(a.fix.length&&!a.tags.length)a.tags=a.fix.slice();if(a.fmt.toLowerCase().indexOf("tiddler=")==0){f=t.getRef(a.fmt.substr(8),p);a.fmt=store.getTiddlerText(f)}a.fmt=a.fmt||t.format;e.extend(a,{g_def:{},g_all:{},g_tags:{},g_match:{}});(store.getTiddlerText(t.getRef(a.groups,p))||"").split("\n").map(function(t){t=e.trim(t).split("|");var n=e.trim(t[0]),r=e.trim(t[1]),i=n&&!t[2]?n+r:e.trim(t[2]?t[2]:r),s=n?n:r;if(t.length>1){a.g_def[s]={title:i,group:r,prefix:n}}});l.appendTo(n).dblclick(function(e){return false});l.data(a);t.refresh(l,true)},refresh:function(n,r){if(!n.html)n=e(n);t.getGroupTags(n);var i,s,o,u,a=n.data(),f=n.find(".tf-tags"),l=n.find(".tf-listfiltr"),c=n.find(".tf-groups");e(".tf-tag, .tf-add",f).remove();if(0==c.length){c=e('<span class="tf-groups"/>').appendTo(f);e.each(a.g_def,function(e,n){var r=n.prefix||"",i=n.title,s=i?i:r?r+n.group:e;t.newTagButton(c,s,t.tipPrefix,t.clickTag,"button").data({group:s,tags:[]}).attr({group:r?r:e})})}a.tags.map(function(e){var r=a.fix.contains(e);if(0==n.find('.tf-groups [tag="'+e+'"]').length&&!a.hide.contains(e)){t.newTagButton(f,e,r?t.tipFix:t.tipRemove,t.removeTag,"button tf-tag"+(r?" tf-fix":"")).attr("tag",e)}});l.empty();u=e('<ul class="tf-tids"/>').appendTo(l);if(a.fmt==t.format)l.addClass("tf-default");o=t.getTiddlers(n);o.map(function(t){i=e("<li/>").appendTo(u);wikify(a.fmt.format([t.title]),i[0],null,t)});if(r){e(".tf-group",n).each(function(){var t=e(this);if(a.hide.contains(t.attr("tag"))){t.hide()}})}a.hide.map(function(t){e('a.button[tag="'+t+'"]',l).hide()});if(a.lf&&config.macros.listfiltr)wikify("<<listfiltr>>",l[0]);s=t.getTagSelection(n,o);if(s.length){t.newTagButton(f,t.lblAdd,t.tipAdd,null,"button tf-add").data("tags",s).click(t.clickTag)}},clickTag:function(n){var r,i,s,o=e(this),u=o.closest(".tagfiltr"),a=u.data(),f=o.data("group");if(o.hasClass("tf-fix"))return false;if(o.hasClass("tf-selected")){i=e(".tf-selected",u).text();t.removeTag(0,o);t.setGroupButton(o);t.refresh(u);if(i==e(".tf-selected",u).text()){s=e(".tf-tag",u);if(s.length){s.click()}else if(a.last&&a.last.is(".tf-selected")){a.last.click()}else{a.tags=a.fix.slice();t.refresh(u)}}return true}else{t.openPopup(u,this);n.stopPropagation();return false}},openPopup:function(n,r){var i=e(r),s=Popup.create(r,"ul");e(s).data({tagfiltr:n,button:i});i.data("tags").map(function(e){t.newTagButton(s,e,t.tipAdd,t.popClick)});Popup.show()},popClick:function(n){var r=e(this),i=r.text(),s=r.closest(".popup");d=s.data(),$t=d.tagfiltr,$btn=d.button,g=$btn.attr("group");d=$t.data();if(g)t.setGroupButton($btn,i);d.tags.pushUnique(i);t.refresh($t);if(g)d.last=$btn;if(config.options.chkAnimate&&anim&&typeof Scroller=="function")anim.startAnimating(new Scroller($t[0]));else window.scrollTo(0,ensureVisible($t[0]));if(n.ctrlKey&&$btn.hasClass("tf-add")){s.remove();e(".tf-add",$t).first().click()}return!n.ctrlKey},removeTag:function(n,r){var i=r?e(r):e(this),s=i.closest(".tagfiltr"),o=s.data();if(i.is(".tf-fix")){e(".tf-tag",s).not(".tf-fix").each(function(){o.tags.remove(e(this).text())})}else o.tags.remove(i.text());if(!r)t.refresh(s);return false},getTiddlers:function(n){var r,i,s,o=[],u=n.data();u.g_all={};gm=u.g_match={};(u.filter?store.filterTiddlers(u.filter):store.getTiddlers("title")).map(function(e){if(!(e.tags&&e.tags.containsAny(u.ex))&&(1>u.tags.length||e.tags.containsAll(u.tags))&&(!u.bG||t.inGroup(n,e,true)))o.push(e)});if(!e.isEmptyObject(gm)){e.each(u.g_def,function(s,a){var f=[];if(gm[s])e.each(gm[s],function(e){f.push(e)});r=n.find('.tf-tags [group="'+s+'"]');if(f.length){f.sort();f.map(function(e){u.g_all[e]=s});if(1==f.length&&o.length==gm[s][f[0]].length&&!t.hasFixedDuplicate(n,f[0],s)){t.setGroupButton(r,f[0])}else{t.setGroupButton(r)}r.addClass("tf-group").data("tags",f);i=e('.tf-tag[tag="'+f[0]+'"]',n);if(i.length){i.remove();u.last=r}}else{r.removeClass("tf-group").data("tags",undefined)}})}return o},getTagSelection:function(e,t){var n=[],r=e.data();t.map(function(e){e.tags.map(function(e){if(!(r.ex.contains(e)||r.g_all[e]||r.g_tags[e]||r.tags.contains(e)||r.hide.contains(e))){n.pushUnique(e)}})});return n.sort()},newTagButton:function(t,n,r,i,s){if(e(t).hasClass("popup"))t=e("<li/>").appendTo(t);return e('<a href="javascript:;" />').addClass(s||"").attr("title",r||"").text(n).click(i||null).appendTo(t)},getGroupTags:function(t){var n=t.data();n.g_tags={};e.each(n.g_def,function(e,t){if(!t.prefix){store.getTaggedTiddlers(e).map(function(t){n.g_tags[t.title]=e})}})},inGroup:function(n,r,i){var s,o=0,u=n.data();if(r.tags){r.tags.map(function(a){e.each(u.g_def,function(e,f){var l=f.prefix,c=u.g_match;if(l&&a.indexOf(e)==0||!l&&u.g_tags[a]==e){o=1;s=n.find('.tf-tags [group="'+e+'"]');if(!l&&t.hasFixedDuplicate(n,a,e)){s.hide()}else if(u.fix.contains(a)){t.setGroupButton(s.data("fixed",true).addClass("tf-fix").attr("title",t.tipFix),a)}if(i){if(!c[e])c[e]={};if(!c[e][a])c[e][a]=[];c[e][a].push(r.title)}}return i||!o});return i||!o})}return o},setGroupButton:function(e,t,n){if(t){e.text(t).attr("tag",t).addClass("tf-selected")}else if(!e.data("fixed")||n){e.text(e.data("group")).attr("tag",undefined).removeClass("tf-selected")}},hasFixedDuplicate:function(t,n,r){var i,s=t.find(".tf-tags .tf-selected");s.each(function(){var t=e(this);if(r!=t.attr("group")&&t.data("fixed")&&n==t.attr("tag")){i=true}return!i});return i},getRef:function(t,n){t=e.trim(t);return 0==t.indexOf("##")?n+t:t}});Array.prototype.containsAll=function(e){for(var t=0;t<e.length;t++){if(!this.contains(e[t])){return false}}return true};config.shadowTiddlers.TagFiltrConfig="!Groups\n"+" -|realm\n"+" &|area\n"+" $|project"+" +|opportunity\n"+" §|stage\n"+" ?|who\n"+" /|where\n"+" !|resolution\n"+" #|status\n"+" ^|prio\n"+" @|context\n"+" =|type\n";config.shadowTiddlers.StyleSheetTagFiltr="/*{{{*/\n"+".filtr {display:block;}\n"+".tagfiltr ul {margin: 0;padding: 0;}\n"+".tagfiltr > b,\n"+".tf-tags,\n"+".tf-tags .button {float: left;margin: 0 0.25em 0 0;padding: 0 0.25em;}\n"+".tf-tags .tf-fix {border-color:[[ColorPalette::TertiaryPale]];pointer:default;}\n"+".tf-tags {padding-bottom: 0.5em;}\n"+".tf-tag {\nborder-top-right-radius:7px;\n-webkit-border-top-right-radius: 7px;\n-moz-border-radius-topright: 7px;\nborder-bottom-right-radius: 7px;\n-webkit-border-bottom-right-radius: 7px;\n-moz-border-radius-bottomright: 7px;}\n"+".tf-groups {padding-right:7px;float:left;}\n"+".tf-groups .button {display:none;}\n"+".tf-groups .tf-group {display:block;}\n"+".tf-groups .tf-selected {color:[[ColorPalette::SecondaryMid]];}\n"+".tagfiltr .tf-tids {clear:left;}\n"+".tf-default li {list-style-type:none;}\n"+".tf-default .tiddlyLink{display:block; padding: 1px 1px 1px 7px;}\n"+".tf-listfiltr{clear:left;}\n"+"/*}}}*/";store.addNotification("StyleSheetTagFiltr",refreshStyles)})(jQuery)
// %/
@PSD
!Summary
@ShowDown is a plugin space which, when included, allows you to use [[MarkDown|http://daringfireball.net/projects/markdown/syntax#html]] syntax in a tiddler. See @MarkDownTutor for an introduction to MarkDown and @ShowDown in use.
!StyleSheet
All ShowDown blocks will be rendered in a {{{div}}} of the class {{{showdown}}}, so you can easily assign a custom color, background or border using your StyleSheet.
!Formatter
If you need ShowDown to use a different formatter other than {{{§§§}}}, you can either change the plugin code or put something like this into your [[zzConfig]] tiddler tagged ''systemConfig'':
{{{
var f=config.formatters[config.formatters.findByField("name","showdown")];
if(f){
	f.match= "<md>";
	f.lookaheadRegExp= /\s?<md>((?:.|\n)*?)<\/md>\s?/img;
}
}}}
The example above will allow you to use...
{{{
<md>
`some markdown code block`
</md>
}}}
Thanks @psd and @pmario for [[your tips|http://bit.ly/atzHny]]! Of course, you could just as well substitute {{{md}}} with {{{markdown}}} or {{{showdown}}} in the example above.
!!~SideNote - Pagr
@MarkDownTutor also contains a small new plugin called [[PagrPlugin]]@MarkDownTutor that allows you to navigate document pages based on a ~ToC tiddler or section which contains (possibly nested) lists of content tiddlers. Look for ''pagr'' in the ViewTemplate@MarkDownTutor of @MarkDownTutor which uses the tiddler [[MarkDown]]@MarkDownTutor as the main ~ToC for paging.
R0lGODlhAQEBAYIAMQAAACQkJEhISG1tbZGRkba2ttra2v///ywAAAAAAQEBAQID/ii63P4wykmrvTjrzbtvRCiOZGmeaKqubOu+cCzPdB0qdq7vfO//wBUuSCwaj8gkaqhsOp/Q6IgprVqvWBg1y+16pduveEzuhcvotFp1Xrvf6DZ8TsfK6/i88q7v+318f4KDMoGEh4hLAomMjUKLjpGSN5CTlomGl5pwmZueaZ2fomKho6ZZpaeqYJWrrqStr7KosbO2rLe5Vam6vTm8vsGFtcLFZsTGyTbAys0lzM7RBNDSzdTVydfYxdrbwd3eveDhuePktubnsumTBe7v8PHk7ILvBvcH+fr7/P369wbeZUPmyR0+fwgTKux3r4AvemsMLpxIsWK+hg7XEWRU/uCgxY8gFwZ0BdGLxJAoUypsaKoklo4qY8pc6c6TyygnZ+rcyW/kpZtNOhrgSbToPp+RgB4RarSp0wNIMW1UA/OpVadRByn9UfWqV6wZtU790vWr2adZ82zNUfasW7B+1s5o+7YuXLVjq9C1yxcrHrku9vYd3DQtqLxOhhJebNYwGcAoBDOeXDhsHMRGJFPebNRxF8gjNHNmCLC0x9E0y4AmIHoyRssyDCpG7dkK5NZ9WSKRvbl2FLm43+rWe3qwbydbgzeuKYYp4eNJgCr3Cp3L9MpXXF5HCxvOdqLVg5Scbbx7nu87wwPCDIM8X/Vz0M+EryNdgefmGbk/S7/G/jj5OvXnB4AqCRhDNwTGZOAgCaK0YAva7MdffqI0GNKDbLCHgoTUUagKh1dheEKEwhUDolUikqDNfWZ5mMuJfq23A4wBVkMjTwYA0c2NBYbDo0wuzoBgjORYiFCOOmqYwo8VIalOCEYeRQQ4TIoU5DZVUnSlkEpGttOWPuJYxDhZ9vQkCwk6KV6XGxYI5pll7vPmMD2wCFKKWKak5po+XHhmDXZ+hIQ5P+KpDpNzculDoCv9wduRASVqBW57TslmChMZCgV6w6VB4x6XtplQpW8YqWkQkkmq6KJHqvrSXWhISKqlQPgzK1VxWnQqEO4hF6qo+rg6aa4XCpuEnbfy/snVP3VEqasa9zxBTz7GSsFoXdUiQk+ysTLGrU2/HkJsUd9qshpZ43b2yrldXOtatnGFOyBqzKrCbhbphmivvHrkS90p91rh71flNhKwtfQmBG8dB2+asEKjNPzEwG4VrC2/8T280MKcYAwHxSWCW5DGE3HshsRKgFyXxWJt4i7J/ZisBspIwEwRy3/QnJnNWprrMbQ8Z+qzJkEL/dPPaLxctJxHX6IyYTKrhnQZSxs9ic6oVj1R0+1ovbElWPPqtUJRjxH2D08vVjYslqT9HNhTjzF2o1fHLcbco8JtCd4J6T0J3wj5LQng/ggeCeH9GO4I4vwo3gjj9Upydp+Q/kPluH6V44xX25Wv/cXkPbg9mOdegM6D0mOT/pndZFXO9d+Ma74554irvvolqFdtOxem94C47LPTzjfwf7HeHOG782783cNv0nudfCevvCeiEyyyy3NLPz31XhOvx/Osaq399twv7f33y5ORO70Rp69+0ePfPkr14LXkfhn012j/hxqfn/P9ZVifcVYBviII0C7+E0QBDZi/jyRQgQAEmms0MosGiqRUg4pgRKD2hqGoboHHsqCU3FCVB6YAhEpwVmpI2DgjKCV+O1BhT2BIg/2QDihDMeGmnrYrBtrKhcsLFA11YKohzuBEQDyCe3qYwuI0iYk+JNuYjMchHerF/jm2ilQebmRFFRnva3863Y+mWAQaQREbVVobRA5ouTDOJUtdFAFEmHTGZOSKVmLzkxvRBCRlhU9Pe4xMuuI4jamNq44V5IkfeeAvQtqCjRWJmjkgeTM3qjCOhCrMk2SYjyRBD1Z5sorMxtEhNFpPRjNajjMoKZMfDKliRvwYtlCZAxH+I5ae4ovJEGTLW96ilxfxpBjfg8sscDJTZbMPMIM5imNaiYxAcOYzcbdMZkITVdVE5BWkecEMLqWaUCnmosAZTlCFED8DImc5myAXdWpznN6KH2TUuc4AcvNZv9GgCOh5Eea8xIlv24U+R8DPW47vUZxx5AsCVtCeaHFR/jmhl0K1MFATsPI9kYqHQEQAD4AEbaIHqugJLlq5gJZOpIIsKclASoOw3VOldxLniFC6gpfCdJqXwdVNiXkymr6ApDt1kExZsECbQu6dtPROQ2GGVFf6FFBLHU1TF4kHo/Jsqnh0VFQRONT6PLVOVn0XI1CIJoAetatOjQQWf4dWqjYiolp76OuoudVRYZV8n1hrb/y5v1UglKtttc1XyaJX8GT0IYOlimzM6lC5KoOsgTxpZLcB2cnSwrLVqCxmBbvZaGi2s/kErTUSK9qZkba0OUUtN06rWrOxtrWfey1s5TdbXXy2ttfELTpkq1vO9na3vwVucCk43HXxtri+SEIuSY6r3Ogwt7lHuC10/fPc6WbVutfDbna1OzTuOq+63uWBdMMLIfCS9xfmPS911Vs39kouve4N6QfmS9/62ve++M2vfiuQAAA7
/***
|''Name''|LoadExternalScripts.js|
|''Description''|Loads external plugins on startup|
|''Author''|Tobias Beer|
|''Version''|0.1.2 (2010-10-05)|
|''Status''|beta|
|''Source''|http://tobibeer.tiddlyspace.com/#LoadExternalScripts.js|
|''Documentation''|http://tobibeer.tiddlyspace.com/#LoadExternal|
|''License''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|''Contributions''|Codebase and original idea [[Saq Imtiaz|http://groups.google.com/group/TiddlyWikiDev/browse_thread/thread/7417b8332ad23a10/4ff4fa43141a20e6]]  as documented [[here|http://tiddlywiki.org/wiki/Dev:Developing_and_Testing_a_Plugin#The_Comprehensive_Method]] |
|''~CoreVersion''|2.5.3|
|''Type''|external script|
!Code
***/
//{{{
TiddlyWiki.prototype.isTiddler= function (title)
{
	return store.tiddlerExists(title) || store.isShadowTiddler(title);
}

function loadExternal()
{
	var fail='',slash=true,
		t="ExternalScripts",
		loc=getLocalPath(document.location.toString()),
		dir=loc.lastIndexOf("\\"),
		code,name,path,j,js;

	if (!store.isTiddler(t))return;

	if(dir==-1){
		dir=loc.lastIndexOf("/");
		slash=false;
	}
	path=loc.substr(0,dir)+(slash?"\\":"/");
	js=store.getTiddlerText(t).readBracketedList();
	for (j=0;j<js.length;j++){
		name=js[j];
		code=loadFile(path+name);
		if(!code){fail+=path+name+'\n';continue;}
		try{eval(code);}catch(e){fail=name+': '+e;break;}
		dir=name.lastIndexOf("\\");
		name=(dir>=0?name.substr(dir+1):name);
		dir=name.lastIndexOf("\/");
		name=(dir>=0?name.substr(dir+1):name);
		if(name.substr(name.length-3)=='.js')
		name=name.substr(0,name.length-3);
		config.shadowTiddlers[name]=code;
	}
	if(fail)confirm(
		'Failed to load the following external plugins as defined in your '+t+'...\n'+
		fail
	);
}

loadPluginsEXT = window.loadPlugins;
window.loadPlugins=function()
{
	loadPluginsEXT.apply(this,arguments);
	loadExternal.apply(this,arguments);
}

//FIX: to handle shadows
TiddlyWiki.prototype.getTiddlerText = function(title,defaultText)
{
	if(!title)
		return defaultText;
	var pos = title.indexOf(config.textPrimitives.sectionSeparator);
	var section = null;
	if(pos != -1) {
		section = title.substr(pos + config.textPrimitives.sectionSeparator.length);
		title = title.substr(0,pos);
	}
	pos = title.indexOf(config.textPrimitives.sliceSeparator);
	if(pos != -1) {
		var slice = this.getTiddlerSlice(title.substr(0,pos),title.substr(pos + config.textPrimitives.sliceSeparator.length));
		if(slice)
			return slice;
	}

	var tiddler = this.fetchTiddler(title);

	//FIX: new variable 'text' for tiddler.text
	var text=tiddler?tiddler.text:(this.isShadowTiddler(title)?this.getShadowTiddlerText(title):null);

	//check for text to get sections of shadows as well
	if(text){
		if(!section)return text;
		var re = new RegExp("(^!{1,6}[ \t]*" + section.escapeRegExp() + "[ \t]*\n)","mg");
		re.lastIndex = 0;
		var match = re.exec(text);
		if(match) {
			var t = text.substr(match.index+match[1].length);
			var re2 = /^!/mg;
			re2.lastIndex = 0;
			match = re2.exec(t); //# search for the next heading
			if(match)
				t = t.substr(0,match.index-1);//# don't include final \n
			return t;
		}
		return defaultText;
	}
	if(defaultText != undefined)
		return defaultText;
	return null;
};

//}}}
As [[recently noticed|https://groups.google.com/forum/?fromgroups=#!searchin/tiddlyspace/white/tiddlyspace/MbRqLvo_M28/dbzs7nX4PIUJ]] by @GJRobert, I have created a new theme for TiddlySpace. It's called White-Theme which mimicks the tw5 design and comes in three variants as [[listed here|White]].

As you may have noticed, my space and some of my plugin spaces now run on it, too. For example, here's my new enhanced version of [[Tagsplorer|http://tagsplorer.tiddlyspace.com/]] called @TagFiltr being presented with it...
» http://tagfiltr.tiddlyspace.com
!Preview
[img[http://img.tiddlyspace.com/White-Theme]]
R0lGODlhAQEBAYIAMQAAACQkJEhISG1tbZGRkba2ttra2v///ywAAAAAAQEBAQID/ii63P4wykmrvTjrzbtvRCiOZGmeaKqubOu+cCzPdB0qdq7vfO//wBUuSCwaj8gkaqhsOp/Q6IgprVqvWBg1y+16pduveEzuhcvotFp1Xrvf6DZ8TsfK6/i88q7v+318f4KDMoGEh4hLAomMjUKLjpGSN5CTlomGl5pwmZueaZ2fomKho6ZZpaeqYJWrrqStr7KosbO2rLe5Vam6vTm8vsGFtcLFZsTGyTbAys0lzM7RBNDSzdTVydfYxdrbwd3eveDhuePktubnsunqruztqu/wpvLzovX2nvj5mvv8lv7+SQoo0BHBgowOIkSkcCGhhg4FQYzoZyJFPRYv4smo/pEOx46ckIFEJ3LkupIm3aFMGW8lS3ouX96LKVMfzZr9buIEqHPnwJ4+DQINmnAoUYZGjz5MqlQi06YVn0LFKHXqxqpWPWLNGpKrTa+bPoJ1Inbsnq1m46BNS6YsWyNu3xKJKxcI3bqA1uLlcnfvjr5+f+kNbAUwYRqGDw9T7JTxn8SOXUCOzGIyZTaDLyexrPkE587PMoMu8nm0iNKmp4lO/QO1adejYYNuaOCA7du4c+vezbu379/AgwsfTrw48QJPaBtfzry58+fQnSMnu9pE7ejYs2vfzv329CbKu4sfT7689+TVS1w3z769++Lfzz5Z/76+/fvxN6cnQf++/v//4+WHRHgAFmggdgIeQeCBDDZ4HHrzOSjhhL4lCNd+I/RH4YYSWkgahiJoyOGIBno4F4ghiEjiivhB6ISKLMbYnolBLCjjjTO62ASMOPa4HY12oUgAjz4WCR2QrQlJpJFMLodkXhE2KWV0Tx4T5ZRYMlclDzZm6WVwW/6l5JdkChemDl2WqSZuZwp25Zpwnkfdm3HC2eYyY9ZZ5501pKnnl3wiluefawY6g5+EYmnoYi8mWqiOSizpaJGLxoDopExWqsWgmGap6QuXdurjp5JxKqqUpLYQ6qk3plqZqawa6eojrLkhW2e3apbrZbtS1mtkvzoWLGPDKlbsYccS/pZsYMv61exez+IVbV3TylXtW9eylW1a25rV7VjfghWuV+NyVW5W51qV7lTrQtVuU+8qFe9R8xJVb1D3+pTvTvvi1G9N/8oU8EsDs1RwSgeblPBIC4PUcEcPaxTxRRNTVHFEFzuU8UIbI9RxQR8LFPI/I/NTcj4n25PyPCvD03I7L6sT8zkzk1NzODd7k/M2O2PTczU/SxN0NEM7U7Q1QtZ6aNJKW8p006A+DbWqUk9Nq9VjHK2M1tlUjbUiX8MS9hdcG1M2N16PTcLZwrD9TdpqnwZ33KrRTYvddswdt9u+8C2O3mr7rYvg5QA+NuG3IE4S3lcoPovjJzFemOFhEUP+ygeYZ6755px37vnnFyQAADs=
Thanks to [[Eric Shulman|http://tiddlytools.com]], a [[long unresolved mystery|https://groups.google.com/d/msg/tiddlywiki/n8erl4aiZdc/-pKH_jjshxkJ]] is now in parts out of the dark. There are conditions on startup when the tiddler macro simply fails. To demonstrate this I have created [[a testwiki|http://startuptransclusions.tiddlyspot.com]] quite a while back.

As a plugin developer, even writing scripts and transclusions, this can be considerably nasty behavior as you may end up having your desired output rendered either twice, wrong, even not at all.
!The Solution
At least when it comes to plugins and macros with custom refresh handlers, this behavior can be prevented.

''How?''

The startup, i.e. the core startup, plugin initialisation, paramifier evaluation, theme loading all the way up until display of default tiddlers a global flag is set by the name of {{{startingUp}}}.

This gives you the ability to distinguish in your code whether or not to call your refresh handler from your macro handler. Something you would do when the macro renders but you don't want to do when TiddlyWiki loads as it will fire all those refresh handlers itself.

So, what you do is conditionalise your refresh handler using...
{{{
if(!startingUp) me.refresh(foo);
}}}
!Tiddler Macro Startup Problems
Inserting this at the beginning of...
{{{
config.refreshers.tiddler: function(e,changeList) {
    if (startingUp) return true;
    //the actual code
}
}}}
...seems to thus fix the problems that have long been documented [[here|http://startuptransclusions.tiddlyspot.com]]. For a fixed version with the above core modifications, see [[here|https://dl.dropboxusercontent.com/u/2040050/tw2/2013.09.11_StartupTransclusion.html]].
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="450 366 38 57"
width="30" height="30">
	<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
		<g>
			<path d="M 452.1094 421.2422 L 450 421.2422 L 450 423 L 487.9688 423 L 487.9688 421.2422 L 485.8595 421.2422 
			L 485.8595 377.29688 L 487.9688 377.29688 L 487.9688 375.53906 L 485.8595 375.53906 
			C 485.8595 375.53906 481.12463 371.59341 473.02023 370.52802 C 472.6824 368.9689 471.72098 366.75 468.9844 366.75 
			C 466.24783 366.75 465.28638 368.9689 464.94864 370.52802 
			C 456.84418 371.59341 452.1094 375.53906 452.1094 375.53906 L 450 375.53906 L 450 377.29688 L 452.1094 377.29688 
			Z M 467.12247 370.32086 L 467.12247 370.32086 C 467.3805 369.42395 467.90762 368.50781 468.9844 368.50781 
			C 470.0612 368.50781 470.5883 369.42395 470.84634 370.32086 
			C 470.24136 370.2848 469.62054 370.26562 468.9844 370.26562 
			C 468.34827 370.26562 467.72748 370.2848 467.12247 370.32086 Z M 454.21875 420.92804 L 454.21875 420.92804 
			C 455.46762 420.42087 456.32816 419.35281 456.32816 418.11716 L 456.32816 377.29688 L 458.4375 377.29688 
			L 458.4375 421.2422 L 454.21875 421.2422 Z M 460.5469 420.92804 L 460.5469 420.92804 
			C 461.79578 420.42087 462.65625 419.35281 462.65625 418.11716 L 462.65625 377.29688 L 464.76566 377.29688 
			L 464.76566 421.2422 L 460.5469 421.2422 Z M 466.87503 420.92804 L 466.87503 420.92804 
			C 468.1239 420.42087 468.9844 419.35281 468.9844 418.11716 L 468.9844 377.29688 L 471.09378 377.29688 
			L 471.09378 421.2422 L 466.87503 421.2422 Z M 473.2032 420.92804 L 473.2032 420.92804 
			C 474.45203 420.42087 475.31256 419.35281 475.31256 418.11716 L 475.31256 377.29688 L 477.4219 377.29688 
			L 477.4219 421.2422 L 473.2032 421.2422 Z M 479.5313 420.92804 L 479.5313 420.92804 
			C 480.78018 420.42087 481.64066 419.35281 481.64066 418.11716 L 481.64066 377.29688 L 483.75006 377.29688 
			L 483.75006 421.2422 L 479.5313 421.2422 Z" fill="black" class="glyph"/>
		</g>
	</g>
</svg>
Here's a list of my blog entries in this space...
{{readOnly{<<newJournal "YYYY-0MM-0DD " label:"Write a new journal entry..." focus:title prompt:"Click to create a new journal entry!" tag:Journal>>}}}<<tiddlerList tags:"Journal" dateFormat:"mmm. 0DD" itemTemplate:"*%created - %0 \n" group:"tiddler.created.formatString('YYYY, MMM')" groupTemplate:"!!!%group \n" order:"-created">>
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
!Summary
@Evalify is a simple macro that allows you to eval a statement and have its return string wikified into either place or a DOM element of a certain id.
!Details
{{annotation{
I now recommend [[transclusion with evaluated parameters enabled|http://tiddlywiki.org/#%5B%5BEvaluated%20Parameters%5D%5D]] if needed over using EvalifyPlugin.
}}}
''Syntax''
{{{<<evalify [[readOnly?'':'<<tiddler ConditionalContent>\>']]>>}}}
...wikifies the tiddler ''~ConditionalContent'' into place when in read-only mode.

{{{<<evalify [[readOnly?'':'<<tiddler ConditionalContent>\>']] MySpecialSidebarContainer>>}}}
...wikifies the tiddler ''~ConditionalContent'' into the DOM element with the id ''~MySpecialSidebarContainer'' when in read-only mode.
!Example
{{{
<<evalify {{
if(readOnly) "We're on readOnly!"
else "We're having write access!";
}}>>
}}}
Output: <<evalify [[readOnly?"We're on readOnly!":"We're having write access!";]]>>
!!Advanced example
Using transclusion you can initialize it with parameters:
{{{<<tiddler Evalify##TRANSCLUSION with: user>>}}}

Output: ''<<tiddler Evalify##TRANSCLUSION with: user>>''/%
!!!TRANSCLUSION
<<evalify [[
var out=readOnly?'You are on readOnly%0!':'You have write access%0!';
out.format(['$1'=='user'?', '+config.options.txtUserName:'']);
]]>>
!END%/

Note how this tiddler contains a hidden section called TRANSCLUSION containing the following code...
{{{
<<evalify {{
var out=readOnly?'You are on readOnly%0!':'You have write access%0!';
out.format(['$1'=='user'?', '+config.options.txtUserName:'']);
}}>>
}}}
!The code
<<tiddler EvalifyPlugin>>
/***
|''Name''|RandomTiddlersMacro|
|''Description''|returns a list of x out of y random tiddlers, optionally...<br>-> having a certain tag<br>-> returning a tiddler section, slice or field value|
|''Author''|Tobias Beer|
|''Version''|1.0.4 (2012-07-14)|
|''Source''|http://randomtiddlers.tiddlyspace.com/#RandomTiddlersMacro|
|''Documentation''|http://tobibeer.tiddlyspace.com/#RandomTiddlers|
|''License''|[[Creative Commons Attribution-Share Alike 3.0|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion''|2.2|
!Usage
{{{<<randomTiddlers config>>}}}
!Example
<<randomTiddlers RandomTiddlersConfig>>
!Code
***/
/*{{{*/
config.macros.randomTiddlers={config:"RandomTiddlersConfig",txtConfirm1:"Please provide a name for the output tiddler:",txtConfirm2:'The tiddler "%0" already exists! Please provide another name for the output tiddler or enter "YES" to overwrite the tiddler "%0":',txtSavedTo:"The following list was saved to tiddler [[%0]]%1...\n",txtOpenStory:" (<<openStory [[%0]]>>)",txtAbortAt:"YES",txtNoConfig:'@@color:red;The configuration tiddler called "%0" could not be found!@@',handler:function(a,b,c,d,e,f){var g=c[0]||this.config;if(!store.getTiddler(g)){wikify(this.txtNoConfig.format([g]),a);return}var h=[],i,j=0,k=0,l="",m,n,o,p,q,r,s=[],t,u=parseInt(store.getTiddlerText(g+"::max"))||10,v=parseInt(store.getTiddlerText(g+"::sample"))||50,w=store.getTiddlerText(g+"::tagged"),x=store.getTiddlerText(g+"::exclude"),y=store.getTiddlerText(g+"::content"),z=store.getTiddlerText(g+"::type"),A=store.getTiddlerText(g+"::required")=="yes",B=store.getTiddlerText(g+"::saveTo"),C=store.getTiddlerText(g+"::saveWithTags")||"",D=store.getTiddlerText(g+"::sort"),E=store.getTiddlerText(g+"::dateformat"),F=store.getTiddlerText(g),G=store.getTiddlers(D);if(w)w=w.readBracketedList();if(x)x=x.readBracketedList();m=F.indexOf("!Template\n");F=F.substr(m+10)+"\n";if(F.substr(0,4)=="{{{\n"&&F.substr(F.length-5,4)=="\n}}}"){F=F.substr(3,F.length-8)}z=z?z.toLowerCase():"";z=z=="field"?"f":z=="slice"?"::":"##";if(!w)h=G;else{n=G.length;while(n>0){n--;p=G[n];q=p.tags;if(q&&q.containsAny(w)&&(!x||!q.containsAny(x))){if(z=="f")r=store.getValue(p,y);else r=store.getTiddlerText(p.title+z+y);if(!A||A&&r){h.push(G[n]);s[p.title]=r;j++}}if(j>=v)break}}while(h.length>0&&k<u){k++;j=Math.floor(Math.random()*h.length);i=h[j][D].formatString(E);l+=F.format([h[j].title,y,s[h[j].title],i,h[j].modifier,h[j].tags],k);h.splice(j,1)}l=l.substr(1);if(B){o=prompt(this.txtConfirm1,B);if(o&&o!=B){while(store.getTiddler(o)&&o!=this.txtAbortAt){t=o;o=prompt(this.txtConfirm2.format([o]))}}if(o==this.txtAbortAt)o=t;if(o){store.saveTiddler(o,o,l,config.options.txtUserName,new Date,C.readBracketedList(),merge({},config.defaultCustomFields));wikify(this.txtSavedTo.format([o,config.macros.openStory?this.txtOpenStory.format([o]):""]),a);if(config.options.chkAutoSave)autoSaveChanges(null,[o]);}}wikify(l,a)}}
/*}}}*/
@ColmBritton
<<tabs
	txtMoreTab
	"Spaces" "Tiddlers grouped by space" [[TabMore##Spaces]]
	"Public" "All public tiddlers" [[TabMore##Public]]
	"Private" "All private tiddlers" [[TabMore##Private]]
	"Missing" "Missing tiddlers" TabMoreMissing
	"Orphans" "Orphaned tiddlers" TabMoreOrphans
	"Shadows" "Shadowed tiddlers" TabMoreShadowed
>>
/%
!Spaces
<<groupBy server.bag>>
!Private
<<list filter [is[private]]>>
!Public
<<list filter [is[public]]>>
!END%/
/***
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
***/
//{{{
var spacename = config.extensions.tiddlyspace.currentSpace.name;
var disqus_shortname = spacename + "-tiddlyspace"; // required: replace example with your forum 

(function($) {
config.macros.disqus = {
	handler: function(place, m, p, w, pa, tiddler) {
config.extensions.tiddlyweb.getStatus(function(){
		var host = config.extensions.tiddlyspace.getHost(config.extensions.tiddlyweb.status.server_host, spacename);
		var id = tiddler.title;
		$('<a />').attr("data-disqus-identifier", id).
			attr("href", host + "/" + encodeURIComponent(id) + "#disqus_thread").text("Comment").appendTo(place);
		var s = document.createElement('script'); s.async = true;
		        s.type = 'text/javascript';
		        s.src = 'http://' + disqus_shortname + '.disqus.com/count.js';
		        (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);
});
	}
};

})(jQuery);
//}}}
Today, I messed a bit with the design of @TiddlyWorld
*added GotoPlugin and SimpleSearchPlugin
*redesigned the header so it stretches nicely
** TopMenu@TiddlyWorld and Search@TiddlyWorld
*changed the button styles in the menus
<<bookmarklet>>
<<list filter [tag[bookmark]][sort[-modified]]>>
/***
|''Name:''|twyp|
|''Description:''|search, play and associate youtube videos|
|''Author:''|Tobias Beer|
|''Version:''|0.9.7 (2010-10-25)|
|''Status:''|beta|
|''Source:''|http://twyp.tiddlyspace.com/#twyp|
|''Documentation:''|http://tobibeer.tiddlyspace.com/#twYp|
|''Readable source:''|http://tbsource.tiddlyspace.com/#twyp|
|''Requires:''|TW Version 2.5.3 or better|
!Example
{{{
<<twyp>>
}}}
<<twyp>>
!Code
***/
//{{{
(function(a){window.twyp={maxSearch:6,maxRelated:10,maxUser:10,vidWidth:380,vidHeight:320,restrictTo:"",field:"youtube",txtRelated:"Related",txtUser:"Best rated videos by ",txtPage:"Go to page ",lblShow:"Play %0",tipShow:"Click to play %0",lblHide:"Close video",tipHide:"Click to close video player",txtInfo:"by %0 | viewed: %1 | favourited: %2 | published: %3",txtRating:"rating: ",txtDuration:"duration: ",txtSearch:"-search-",lblSearch:"Please enter a search-term...",txtTag:"-category/tag-",lblTag:"Please enter a category or tag filter to constrain the search results by...",twypTemplate:"twyp##TEMPLATE",fmtSlider:'<<slider chk%0 twyp##TEMPLATE "Search videos" "Search videos on youtube and add one to the tiddler">>',fmtPlayer:'<h2><a class="tiddlyLinkExisting" href="#" title="add to current tiddler (hold CTRL to skip the prompt and use the title as is)" rel="%0">%1</a></h2> <object width="%2" height="%3"> <param name="movie" value="%0%4&fs=1&format=5&iv_load_policy=3&enablejsapi=1&playerapiid=%5"/> <param name="allowFullScreen" value="true" /> <param name="iv_load_policy" value="3" /> <param name="wmode" value="transparent" /> <param name="allowScriptAccess" value="always"> <embed src="%0%4&format=5&fs=1&iv_load_policy=3&enablejsapi=1&playerapiid=%5" 	type="application/x-shockwave-flash" 	allowscriptaccess="always" 	wmode="transparent" 	width="%2" height="%3" 	allowfullscreen="true"> </embed></object>',relRelated:"http://gdata.youtube.com/schemas/2007#video.related",mimeFlash:"application/x-shockwave-flash",feeds:"http://gdata.youtube.com/feeds/standardfeeds/",mapQuery:{rated:"top_rated",recent:"most_recent",popular:"most_popular",respond:"most_responded",discuss:"most_discussed",featured:"recently_featured",all:"videos"},usrSuffix:"/uploads",activeTwyp:null,shadows:[],appendScript:function(c,e,d){a("#"+e).remove();a("head").append(a("<script>").attr({src:c+"&alt=json-in-script&callback="+d,id:e,type:"text/javascript"}))},findHref:function(f,c){var e,d;for(e=0;d=f.link[e];e++){if(d.rel==c){return d.href}}return null},findMediaHref:function(g,f){var e,j,h,d;for(e=0;j=g.media$group.media$content[e];e++){if(j.type==f){d=j.url;h=d.indexOf("?");return h<1?d:d.substr(0,h)}}alert("?!?");return null},getResults:function(f,k,m){var j,d,i=1,h=a(f).closest(".twyp"),g=a(f).closest("[tiddler]"),e=twyp.activeTwyp=g.attr("twyp"),l=m;l=l!=""&&l!=twyp.txtSearch?l:"";if(k){j=f.category.value;j=j!=""&&j!=twyp.txtTag?"&category="+j:"";h.attr({id:e,field:g.attr("field"),search:l,cat:j,query:k})}else{l=h.attr("search");j=h.attr("cat");k=h.attr("query");i=parseInt(a(f).attr("page"))}d=twyp.feeds+twyp.mapQuery[k];if(k=="all"){d=d.replace("standardfeeds/","")}d+="?prettyprint=true&restriction="+twyp.restrictTo+"&max-results="+twyp.maxSearch+"&start-index="+(((i-1)*twyp.maxSearch)+1)+(l==""?"":"&vq="+l)+(j?j:"");twyp.appendScript(d,"twypResults","twyp.cbResults");twyp.updateNav(i,h)},cbResults:function(f){try{var d=a("#"+twyp.activeTwyp),c=a(".vids",d).empty();d.data("main",f.feed);a(f.feed.entry).each(function(j,m){if(!m.yt$noembed){var k=m.media$group.media$title.$t,h=a("<img/>"),o=a("<a/>"),n=m.media$group.media$description.$t,l=a("<p>").html(n);h.attr({src:m.media$group.media$thumbnail[0].url,title:twyp.info(m)}).click(twyp.clickPlay(j,"main",h[0]));o.attr({href:"#","class":"tiddlyLinkExisting"}).click(twyp.clickPlay(j,"main",o[0])).html(k);c.append(a("<div/>").attr("class","vid").append(a("<div/>").attr("class","desc").append(o).append(h).append(a("<span/>").append(a("<div/>").html(twyp.info(m,true)))).append(l).append(a("<div/>").attr("class","tagClear"))))}});if(a.fn.linkify){a("p",c).linkify()}}catch(g){alert(g)}},getRelated:function(e,h,g){var f=g.data(h).entry[e],d=twyp.findHref(f,twyp.relRelated),c=a(".vidRel",g).empty();if(d){d=d.split("?")[0];c.html("<h3>"+twyp.txtRelated+"</h3>");d+="?&restriction="+twyp.restrictTo+"&max-results="+twyp.maxRelated;twyp.appendScript(d,"twypRelated","twyp.cbMore")}},getByUser:function(e,d,c){a(".vidUser",e).empty().html("<h3>"+twyp.txtUser+c+"</h3>");twyp.appendScript(d+twyp.usrSuffix+"?&restriction="+twyp.restrictTo+"&max-results="+twyp.maxUser+"&orderby=rating","twypUser","twyp.cbMore")},cbMore:function(h){var d,c,j,f=a("#"+twyp.activeTwyp),g=h.feed.title.$t.indexOf("Videos related to")==0?"related":"user";f.data(g,h.feed);for(d=0;j=h.feed.entry[d];d++){c=a("<img/>");a(g=="user"?".vidUser":".vidRel",f).append(c.attr({src:j.media$group.media$thumbnail[0].url,rel:j.media$group.media$title.$t,title:twyp.info(j)+" | "+twyp.info(j,true)}).click(twyp.clickPlay(d,g,c[0])).bind("mouseover mouseout",function(k){var l=k?k:window.event,i=a("."+g+"Info");i.empty().html(l.type=="mouseover"?this.getAttribute("rel"):"&nbsp;")}))}},info:function(h,g){var d,c,f;if(g){g=h.gd$rating,c=h.media$group.media$content[0].duration;return[g?twyp.txtRating+g.average.toString().substr(0,3)+" | ":"",twyp.txtDuration,Math.floor(c/60),":",String.zeroPad(c%60,2)].join("")}d=h.author,f=h.yt$statistics;return twyp.txtInfo.format([d?d[0].name.$t:"",f?f.viewCount:"n/a",f?f.favoriteCount:"n/a",h.published.$t.substr(0,10)])},clickPlay:function(d,e,c){return function(){twyp.playVideo(d,e,c);return false}},playVideo:function(d,i,g){twyp.activePlayer=null;twyp.newPlayer=true;var h=a(g).closest(".twyp"),k=h.find(".twplr"),j=h.data(i).entry[d],c=j.author,f=twyp.fmtPlayer.format([twyp.findMediaHref(j,twyp.mimeFlash),j.media$group.media$title.$t,twyp.vidWidth,twyp.vidHeight,"&autoplay=1",h.attr("id")]);k.html(f);k.find("a").first().attr("field",h.attr("field")).click(function(l){var m=l?l:window.event;twyp.addToTiddler(m,this)});k.append(a("<div/>").attr({"class":"vidDescr",title:(twyp.info(j)+twyp.info(j,true))}).html(j.media$group.media$description.$t));if(a.fn.linkify){a(".vidDescr",k).linkify()}twyp.getRelated(d,i,h);if(c&&c.length>0){twyp.getByUser(h,c[0].uri.$t,c[0].name.$t)}},updateNav:function(f,e){var g=f,c=twyp.txtPage,h=g-1<1?"disabled":"";a(".vidNext",e).css("display","inline").attr({page:g+1,title:c+(g+1)});a(".vidPrev",e).css("display","inline").attr({page:g-1,title:c+(g-1),disabled:h})},reset:function(c){var d=a(c).closest(".twyp");a(".vids, .colPlayer div[class]",d).empty();a(".twplr",d).html("&nbsp;");a(".resultsNav",d).hide()},addToTiddler:function(f,d){var h=story.findContainingTiddler(d),g=a(d),c=g.html();h=h?h.getAttribute("tiddler"):"";if(!h){return}if(!f.ctrlKey){c=prompt("Enter your desired video title",c)}if(!c){return}store.setValue(h,g.attr("field"),"[["+c+"|"+g.attr("rel")+"]]");if(config.options.chkAutoSave){story.saveTiddler(h)}},stateChange:function(g){var f,h=a(this),e=h.attr("last"),c=twyp.activePlayer.getVideoUrl(),d=c.indexOf("?v=")>0;c=c.split(d?"?v=":"#!v=")[1].split("&")[0];if(e!=c){h.attr("last",c);if(twyp.newPlayer){twyp.newPlayer=false;return}if(e){twyp.activePlayer.pauseVideo();f="http://gdata.youtube.com/feeds/api/videos/"+c+"?v=2";twyp.appendScript(f,"twypVideoInfo","twyp.getVideo")}}twyp.newPlayer=false},getVideo:function(d){var c=a("#"+twyp.activeTwyp);d.feed={entry:[d.entry]};c.data("video",d.feed);twyp.playVideo(0,"video",c.first())}};config.macros.twyp={handler:function(k,g,x,h,j,r){var y,d,i,o,z,v,l,t=story.findContainingTiddler(k),q=j.parseParams(null,null,true),u=getParam(q,"field",twyp.field),e=x.contains("notitle"),c=x.contains("slider"),n="twyp"+Math.random().toString().substr(3),m=x.contains("search");if(x.contains("player")){m=m?"<<twyp %0>>".format([j.replace("player","")]):"";t=t?t.getAttribute("tiddler"):"";v=getParam(q,"video",store.getValue(t,u));wikify(m,k);if(!v){return}o=v.indexOf("|");z=v.substr(2,o-2);i=["<html>",twyp.fmtPlayer.format([v.substr(o+1,v.length-o-3),z,getParam(q,"width",twyp.vidWidth),getParam(q,"height",twyp.vidHeight),c&!x.contains("noautoplay")?"&autoplay=1":"",n]),"</html>"].join("");if(c){d=a("<div/>");d.addClass("twypSlider");l=d[0];a(k).append(a("<a>"+twyp.lblShow.format([z])+"</a>").attr({href:"#",twyp:n,"class":"button",title:twyp.tipShow.format([z])}).click(function(w){var s=a(this),f=z,B=s.attr("twyp"),A=s.next();if(A.css("display")!="block"){s.attr({title:twyp.tipHide,video:f}).html(twyp.lblHide);A.attr("twyp",B);config.shadowTiddlers[B]=i;A.slideDown("slow")}else{f=s.attr("video");s.attr("title",twyp.tipShow.format([f])).html(twyp.lblShow.format([f]));delete config.shadowTiddlers[B];A.slideUp("slow")}})).append(d)}wikify(i,l?l:k);y=a("a",l?l:k).last();if(e){y.parent().hide().next().css("margin-top","0.5em")}else{y.click(function(f){var p=f?f:window.event;twyp.addToTiddler(p,this)})}}else{wikify(c?twyp.fmtSlider.format([n]):store.getTiddlerText(twyp.twypTemplate),k);a(".txtSearch",k).last().val(twyp.txtSearch).attr("title",twyp.lblSearch);a(".txtTag",k).last().val(twyp.txtTag).attr("title",twyp.lblTag);d=c?a("[tiddler]",k).last():a(k).closest("[tiddler]");d.attr({twyp:n,field:u,not:e})}}};story.closeTiddlerTWYP=story.closeTiddler;story.closeTiddler=function(c){a(".twypSlider",this.getTiddler(c)).each(function(e,d){delete config.shadowTiddlers[a(d).attr("twyp")]});story.closeTiddlerTWYP.apply(this,arguments)};try{a.getJSON("http://www.geoplugin.net/json.gp?jsoncallback=?",function(c){if(c){twyp.restrictTo=c.geoplugin_countryCode}})}catch(b){}window.onYouTubePlayerReady=function(c){a("object, embed",a("#"+c)).each(function(d){try{this.addEventListener("onStateChange","twyp.stateChange");twyp.activePlayer=this;a(this).attr("last",null)}catch(f){}})};config.shadowTiddlers.StyleSheetTwyp="/*{{{*/\n.twyp {font-size:12px;} \n.twyp .frmSearch{margin:10px 0 0 10px;} \n.twyp .txtSearch, .twyp .txtTag{width:100px;} \n.twyp input{border:1px solid #ddd;padding:1px 3px;cursor:pointer;} \n.twyp input:hover{border:1px solid #999;} \n.twyp .colResults {float:left;margin-top:0.5em;width:390px;padding-left:10px;} \n.twyp .vids {width:100%;} \n.twyp .vids img{margin:5px 0 5px 5px;width:100px;cursor:pointer;float:right;clear:none;} \n.twyp .vid{clear:both;font-size:0.9em;padding:5px;} \n.twyp .vid:hover{background:#ddd;} \n.twyp .desc a{display:block;padding:1px 3px;} \n.twyp .desc p{max-height:70px;overflow:hidden;margin-top:5px;display:block;max-width:380px;} \n.twyp .desc p a{display:inline;} \n.twyp .desc:hover p{width:270px;max-height:200px;overflow:auto;} \n.twyp .desc span {font-weight:bold;color:#666;} \n.twyp .resultsNav{text-align:right;margin-bottom:2em;} \n.twyp .resultsNav input, .btnSearch{margin:0.5em 0 0 0.5em;font-weight:bold;width:80px;} \n.twyp .colPlayer {float:left;width:390px;margin:0 5px;} \n.twplr .vidDescr {max-height:1.5em;overflow:hidden;} \n.twplr .vidDescr:hover {max-height:250px;overflow:auto;} \n.twyp .colPlayer img {margin:1px;cursor:pointer;width:72px;height:56px;} \n.twyp h2, .twyp h3 {margin-top: 0.6em;} \n.twyp .vidUser, .vidRel{margin:0 1em 0 0;} \n.twyp .userInfo, .twyp .relatedInfo{padding-right:20px;height:auto;overflow:hidden;font-weight:bold;color:#666;} \n.twypSlider {display:none;margin-bottom:10px;} \n.twypSlider object{display:block;} \n/*}}}*/";store.addNotification("StyleSheetTwyp",refreshStyles)})(jQuery);
//}}}
// /%
/***
!TEMPLATE
<html>
<div class="twyp">
	<form class="frmSearch" onsubmit="twyp.getResults(this,this.query.value,this.search.value); return false;">
		<select name="query">
			<option value="all" selected="true">all videos</option>
			<option value="rated">top rated</option>
			<option value="recent">most recent</option>
			<option value="popular">most popular</option>
			<option value="discuss">most discussed</option>
			<option value="respond">most responded</option>
			<option value="featured">recently featured</option>
		</select>
		<input name="search" class="txtSearch" type="text" value="" onclick="this.select();">
		<input name="category" class="txtTag" type="text" value="" onclick="this.select();">
		<input type="submit" class="btnSearch" value="Search">
		<input type="button" class="btnSearch" value="Reset" onclick="twyp.reset(this);">
	</form>
	<div class="colPlayer">
		<div class="twplr"></div>
		<div>
			<div class="vidRel"></div>
			<div class="relatedInfo">&nbsp;</div>
			<div class="vidUser"></div>
			<div class="userInfo">&nbsp;</div>
		</div>
	</div> 
	<div class="colResults">
		<div class="vids"></div>
		<form class="resultsNav">
			<input type="button" class="vidPrev" value="&laquo; back" style="display: none;" onclick="twyp.getResults(this);"></input>
			<input type="button" class="vidNext" value="next &raquo;" style="display: none;" onclick="twyp.getResults(this);"></input>
		</form>
	</div>
</div>
<div class="tagClear"></div>
</html>
!END*/
//%/
//{{{
config.options.txtFadeTimer = 5000; // 5 seconds 

var displayMessageFADEOUT=displayMessage;
displayMessage=function(text,linkText)
{
	displayMessageFADEOUT.apply(this, arguments);
	ti=config.options.txtFadeTimer;
	if(ti>0)setTimeout(clearMessage,ti); 
}
//}}}
!Admin
tobibeer
UserA
UserB
!PowerUser
jon
fnd
pmario
whatever
UserC
UserD
!User
UserE
UserF
UserG
/***
|''Name''|DiscussPlugin|
|''Author''|[[Tobias Beer|http://tobibeer.tiddlyspace.com]]|
|''Description''|outputs the (modified) html representation with disqus in an iframe for a tiddler on TiddlySpace|
|''Source''|https://raw.github.com/tobibeer/TiddlyWikiPlugins/master/plugins/DiscussPlugin.min.js|
|''Documentation''|http://discuss.tiddlyspace.com|
|''Version''|0.9.3 (2013-09-06)|
|''~CoreVersion''|2.5.2|
|''Requires''|TiddlySpace / TiddlyWeb|
|''License''|Creative Commons 3.0|
***/
// /%
(function(e){config.macros.discuss={config:{always:false,tplSlider:'Show comments for \'\'"""%0"""\'\'  """//""" <<discuss count [[%0]]>>',tipSlider:"Click to show comments for %0...",url:"",header:"{{discuss_header{\nLeave a comment at tiddler [[%0]]...\n}}}",css:{width:"100%",height:"400px",border:"0",marginTop:"1em"}},handler:function(t,n,r,i,s,o){var u,a,f,l=this.config,c=o?o.title:"",h=s.parseParams("anon",null,true),p=getParam(h,"always",l.always),d=store.getTiddlerText(getParam(h,"template",""));if(r[0]=="count"){this.count(r[1],t);return}if(!c||!store.getTiddler(c))return;a=e('<div class="discuss_panel"/>').attr({url:getParam(h,"url",l.url)+"/"+encodeURIComponent(c),title:c}).css("marginTop","1em").appendTo(e(t));if(p){wikify(l.header.format([c]),a[0]);this.render(a[0])}else{u=e("<div/></div>").attr({"class":"button discuss_button",title:l.tipSlider.format([c])}).css({cursor:"pointer",padding:"0.5em 1%",width:"98%"}).appendTo(a).click(this.show);wikify((d?d:l.tplSlider).format([c]),u[0])}},render:function(t,n){var r=config.macros.discuss.config,i=e(t).closest(".discuss_panel");e("<iframe/>").hide().css(r.css).attr({src:i.attr("url")}).appendTo(i).slideDown()},show:function(t){var n=e(this),r=e(resolveTarget(t||window.event));if(!r.is(".discuss_button, .discuss_count")&&r.is("a"))return true;config.macros.discuss.render(n[0],true);n.remove();return false},count:function(t,n){config.extensions.tiddlyweb.getStatus(function(){var r,i=config.extensions.tiddlyspace.currentSpace.name,s=config.extensions.tiddlyspace.getHost(config.extensions.tiddlyweb.status.server_host,i);e("<a/>").attr({"class":"discuss_count","data-disqus-identifier":t,href:s+"/"+encodeURIComponent(t)+"#disqus_thread"}).appendTo(n);r=document.createElement("script");r.async=true;r.type="text/javascript";r.src="http://"+i+"-tiddlyspace.disqus.com/count.js";(document.getElementsByTagName("HEAD")[0]||document.getElementsByTagName("BODY")[0]).appendChild(r)})}}})(jQuery)
// %/
/***
|''Name:''|FilterTiddlersMacro|
|''Description:''|provides a interactive tiddler filtering by date range, tags or modifers|
|''Author:''|[[Tobias Beer]]|
|''Version:''|1.0.2 (2010-09-27)|
|''Source:''|http://filtertiddlers.tiddlyspace.com/#FilterTiddlersMacro|
|''Documentation:''|http://tobibeer.tiddlyspace.com/#FilterTiddlers|
|''~TiddlyWiki:''|Version 2.5 or better|
***/
//{{{
(function($){

config.macros.filtertiddlers = {

//OPTIONS
exclude:'excludeLists',
sortField:'-modified',
showDates:true,
showUsers:false,
showCount:true,
showLabels:true,

//OUTPUT FORMAT
fmtHeaderCount:'%0',
fmtHeaderField:'%0',
fmtHeader:'!Filter results',
fmtItem:'\n*%modified: @@padding-left:5px;%hastags@@ %tags',
fmtCount:'',
fmtField:'%0',
fmtDate:'YYYY-0MM-0DD',
fmtYear:'YYYY',
fmtMonth:'mmm',
fmtTags:'@@padding-left:20px;color:#666; ...tags: %0@@',
fmtTag:'<<tag [[%0]]>>',
fmtTagSeparator:'',

//LOCALISATION
txtSel:'select ',
txtSet:'set or unset filter for ',
txtTag:'tag: ',
txtUser:'user: ',
txtYear:'year: ',
txtMonth:'month: ',

//DO NOT EDIT
handler:function (place, macroName, params, wikifier, paramString, tiddler) {
	var count,dates,f0,f1,fd,fi,fc,fch,ff,ffh,fm,ft,fts,fy,lbl,tags,sep,sf,tags,users,
		fx=config.macros.filtertiddlers,
		p=paramString.parseParams(null,null,true),
		tpl=getParam(p,'template','');
	[
	['count','showCount'],
	['dates','showDates'],
	['users','showUsers'],
	['lbl','showLabels'],
	['f0','fmtHeader'],
	['f1','fmtItem'],
	['fc','fmtCount'],
	['fch','fmtHeaderCount'],
	['fd','fmtDate'],
	['ff','fmtField'],
	['ffh','fmtHeaderField'],
	['fy','fmtYear'],
	['fm','fmtMonth'],
	['ft','fmtTag'],
	['fts','fmtTags'],
	['sep','fmtTagSeparator'],
	['sf','sortField'],
	['tags','tags'],
	['fi','field']
	].map(
		function(f){
			var c='fx.'+f[1],l,p,s,sl,sls,v;
			if(tpl){
				eval(f[0]+'=('+c+'?'+c+':"");');
				sls=store.getTiddlerText(tpl,'').split('\n');
				for(s=0;s<sls.length;s++){
					sl=sls[s];
					p=sl.indexOf(':');
					v=sl.substr(p+1);
					sl=sl.substr(0,p);
					if(sl==f[1]){
						eval(f[0]+'=\''+v+'\';');
						break;
					}
				}
			}else eval(f[0]+'=getParam(p,"'+f[1]+'",('+c+'?'+c+':""));');
		}
	);
	lbl=(lbl?lbl.toString():'')=='true';
	setLbl=function(el,txt){if(lbl)createTiddlyElement(el,'strong',null,null,txt);}

	var b,ex,f,filbl,isDate,lst,m,mo,ms=[],rev,sf,t,ts=[],tids=[],tgs,x,y,
		d=new Date(),
		id='tl'+d.formatString('YYYYMMDDhhmmss')+Math.random().toString().substr(6),
		rev=sf.indexOf('-')==0,
		sf=rev?sf.substr(1):sf,
		ts=store.getTiddlers(sf),
		isDate=fx.isDate(ts?ts[0][sf]:''),
		yMin=isDate?(ts[rev?0:ts.length-1][sf].getYear()+1900):null,
		yMax=isDate?(ts[rev?ts.length-1:0][sf].getYear()+1900):null;

	f=createTiddlyElement(place,'div',null,'tlfilter');
	fi==fi.split('|');
	if(fi[1]){filbl=fi[0];fi=fi[1];}else filbl=fi;
	
	x=ex=(getParam(p,'exclude','')+' '+fx.exclude).readBracketedList();
	store.forEachTiddler(function(tw,t){if(t.tags.containsAny(x))ex.pushUnique(t.title);});

	if(tags.substr(0,8).toUpperCase()=='TIDDLER:')tags=store.getTiddlerText(tags.substr(8));
	if(tags){
		ts=[];
		tgs=tags.readBracketedList().sort();
		tgs.map(function(t){if(!ex.contains(t))ts.push(t);});
		if(ts.length>0){
			var fltGroup=createTiddlyElement(f,'div');
			setLbl(fltGroup,fx.txtTag);
			for(t=0;t<ts.length;t++){
				$(createTiddlyButton(fltGroup,ts[t],fx.txtSet+fx.txtTag+ts[t],fx.filter,'button tltag')).attr({'target':id,'tag':ts[t]});
			}
		}		
	}

	users=users.toString()=='true';
	if(users){
		store.forEachTiddler(function(tw,t){ms.pushUnique(t.modifier);});
		ms.sort();
		var fltGroup=createTiddlyElement(f,'div');
		setLbl(fltGroup,fx.txtUser);
		for(m=0;m<ms.length;m++){
			$(createTiddlyButton(fltGroup,ms[m],fx.txtSet+fx.txtUser+ms[m],fx.filter,'button tluser')).attr({'target':id,'user':ms[m]});
		}
	}

	dates=isDate&&dates.toString()=='true';
	if(dates){
		var fltGroup=createTiddlyElement(f,'div');
		setLbl(fltGroup,fx.txtYear);
		for(y=yMax;y>=yMin;y--){
			yr=new Date(y+'/01/01 00:00:00').formatString(fy);
			$(createTiddlyButton(fltGroup,yr,fx.txtSel+fx.txtYear+yr,fx.filter,'button tlyear')).attr({'target':id,'year':y});
		}
		var fltGroup=createTiddlyElement(f,'div')
		setLbl(fltGroup,fx.txtMonth);
		for(m=1;m<13;m++){
			mo=new Date('2000/'+String.zeroPad(m,2)+'/01 00:00:00').formatString(fm);
			$(createTiddlyButton(fltGroup,mo,fx.txtSel+fx.txtMonth+mo,fx.filter,'button tlmonth')).attr({'target':id,'month':m});
		}
	}else if(!isDate){
		var fltGroup=createTiddlyElement(f,'div');
		setLbl(fltGroup,sf+': ');
		ts=[];
		store.getTiddlers(sf).map(function(t){ts.pushUnique(store.getValue(t.title,sf));});
		ts.sort();
		for(t=0;t<ts.length;t++){
			f=ts[t];
			b=$(createTiddlyButton(fltGroup,f,fx.txtSet+f,fx.filter,'button tl'+sf)).attr('target',id);
			b.attr(sf,f);
		}
	}

	lst=$(createTiddlyElement(place,'div',id,'tllist'));
	lst.attr('exclude','[['+ex.join(']] [[')+']]');
	['count','dates','f0','f1','fd','fc','fch','ff','ffh','fi','filbl','fm','ft','fts','fy','rev','sep','sf','tags','users'].map(
		function(t){eval('lst.attr("'+t+'",'+t+')');}
	);

	this.filter(id);
},

filter:function(id){
	var a,b,clk,d,dEnd,dt,el,ev,ex,fi,filbl,fs,hd,
	n=0,out='',sfv,sk,sTags,t,tid,tag,tags,ts,v,val,usr,
	fx=config.macros.filtertiddlers,
	m0=m1=new Date().getMonth()+1,y0=y1=new Date().getYear()+1900;
	if(this.innerHTML){
		ev=id||window.event;
		id=$(this).attr('target');
	}
	el=$('#'+id);
	var f0,f1,fc,fch,fd,ff,ffh,fm,ft,fts,fy,sep,sf,count,dates,rev,tags,users;
	['f0','f1','fc','fch','fd','ff','ffh','fm','ft','fts','fy','sep','sf','=count','=dates','=rev','=users'].map(
		function(t){var b=t.substr(0,1)=='=';if(b)t=t.substr(1);eval(t+'=el.attr("'+t+'")'+(b?'=="true";':';'))}
	);
	tags=tags?tags.readBracketedList():[];
	ts=store.getTiddlers(sf);
	a=$(this).attr('year')||$(this).attr('month')||$(this).attr('user')||$(this).attr('tag')||$(this).attr(sf);
	if(a){
		if($(this).attr(sf)){
			el.attr(sf,el.attr(sf)==a?'':a);
		}else if(users&&$(this).attr('user')){
			el.attr('user',el.attr('user')==a?'':a);
		}else if(tags&&$(this).attr('tag')){
			el.attr('tag',el.attr('tag')==a?'':a);
		}else if(dates){
			sk=ev.shiftKey;
			if(a.length==4){
				if(sk){
					v=el.attr('yX');v=v?v:y0;
					b=parseInt(a)<parseInt(v);
					el.attr({'y0':b?a:v,'y1':b?v:a});
				}else el.attr({'yX':a,'y0':a,'y1':a});
				if(!ev.ctrlKey)el.attr({'mX':1,'m0':1,'m1':12});
			}else{
				if(sk){
					v=el.attr('mX');v=v?v:m0;
					b=parseInt(a)<parseInt(v);
					el.attr({'m0':b?a:v,'m1':b?v:a});
				}else el.attr({'m0':a,'m1':a,'mX':a});
			}
		}
	}
	v=el.attr('m0');m0=v?v:m0;
	v=el.attr('m1');m1=v?v:m1;
	v=el.attr('y0');y0=v?v:y0;
	v=el.attr('y1');y1=v?v:y1;
	usr=el.attr('user');
	tag=el.attr('tag');
	fi=el.attr('fi');
	filbl=el.attr('filbl');
	sfv=el.attr(sf);
	ex=(el.attr('exclude')).readBracketedList();
	for(t=rev?ts.length-1:0;rev?t>=0:t<ts.length;rev?t--:t++){
		tid=ts[t];
		val=fi?(tid[fi]?tid[fi]:store.getValue(tid.title,fi.toLowerCase())):'';
		if(tid.tags.containsAny(ex)||
			sfv&&sfv!=store.getValue(tid.title,sf.toLowerCase())||
			fi&&!val||
			tag&&!tid.tags.contains(tag)||
			tags.length&&!tid.tags.containsAny(tags)||
			users&&usr&&tid.modifier!=usr)continue;
		d=tid[sf]?tid[sf]:store.getValue(tid.title,sf);
		if(fx.isDate(d))dt=String.zeroPad(d.getDate(),2);
		if(!dates||fx.inRange(d,m0,m1,y0,y1)){
			sTags=tid.tags&&tid.tags.length>0?fts.format([
				tid.tags.length==1?ft.format([tid.tags[0]]):tid.tags.map(
					function(t,n){return ft.format([t]);}
				).join(sep)
			]):'';
			n++;
			out+=f1.replace(/%nl/mg,'\n'
				).replace(/%title/mg,'[['+tid.title+']]'
				).replace(/%modifier/mg,tid.modifier
				).replace(/%modified/mg,tid.modified.formatString(fd)
				).replace(/%created/mg,tid.created.formatString(fd)
				).replace(/%sortfield/mg,dates||fx.isDate(d)?d.formatString(fd):d
				).replace(/%tags/mg,sTags
				).replace(/%hastags/mg,store.getTaggedTiddlers(tid.title).length>0?'<<tag '+tid.title+'>>':'[['+tid.title+']]'
				).replace(/%field/mg,fi?ff.format([fx.isDate(val)?(new Date(val).formatString(fd)):val]):''
				).replace(/%count/mg,count?fc.format([n]):'');
		}
	}

	fs=el.previousSibling;
	[
		['year',true,'y0<=v&&v<=y1'],
		['month',true,'m0<=v&&v<=m1'],
		['user',false,'!usr||usr==v'],
		['tag',false,'!tag||tag==v'],
		[sf,false,'!sfv||sfv==v']
	].map(
		function(s){
			eval('fx.select($(".tl'+s[0]+'",fs),"'+s[0]+'","'+(s[1]?'parseInt(%0)':'\'%0\'')+'",function(v){return '+s[2]+'});');
		}
	);

	el.empty();
	if(out){
		hd=f0.replace(/%field/mg,fi?ffh.format([filbl]):''
			).replace(/%count/mg,count?fch:''
			).replace(/%sortfield/mg,sf);
		wikify(hd+out,el[0]);
	}
	if(config.tableSorting&&config.tableSorting.refresh)config.tableSorting.refresh(el[0].parentNode);
	return false;
},

inRange:function(d,m0,m1,y0,y1){
	var y,dInM=32-new Date(y1,m1+1,32).getDate();
	for(y=y0;y<=y1;y++){
		if(this.getDate(y,m0,1)<=d&&(d<=this.getDate(y,m1,dInM,true)))return true;
	}
	return false;
},

getDate:function(y,m,d,e){
	return new Date(y+'/'+String.zeroPad(m,2)+'/'+String.zeroPad(d,2)+(e?' 23:59:59':' 00:00:00'));
},

isDate:function(d){
	return new Date(d)!='Invalid Date';
},

select:function(els,a,ev,chk){
	els.each(function(){
		var v=$(this).attr(a);
		v=eval(ev.format([v]));
		if(chk(v))addClass(this,'tlSelect'); else removeClass(this,'tlSelect');
	});
}
}

config.shadowTiddlers.StyleSheetFilterTimeLine =
	'.tlfilter{display:block;}\n'+
	'.tlfilter div{display:block;width:100%;padding:0.2em 0;clear:left;vertical-align:middle;}\n'+
	'.tlfilter strong{display:block;float:left;width:100px;text-align:right;padding:0.2em 0.4em 0.2em 0;}\n'+
	'.tlfilter .button{display:block;float:left;margin:0 0.1em;padding:0.2em 0.4em;-moz-border-radius:7px;border-radius:7px;}\n'+
	'.tlfilter .tlSelect{background:#FE8 !important;}\n'+
	'.tllist {clear:left;padding-top:1px;}'+
	'.tllist ul {list-style-type:none;}'+
	'.tllist ul,.tllist ol {margin-left:0;padding-left:0em;list-style-position:inside;}'+
	'.tllist ul li,.tllist ol li {border-bottom:1px solid #eee;margin-bottom:3px;padding-left:0.5em;}';
store.addNotification("StyleSheetFilterTimeLine", refreshStyles);

})(jQuery);
//}}}
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>>
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
Today I have successfully started my new TiddlySpace...

*created @tbtheme to include it as a theme in this space as well as in all other (plugin-)spaces that I am going to create
*uploaded TagSearchPlugin along with GotoPlugin to a dedicated plugin-space called @TagSearchPlugin
Tiddlers listed in [[The News Space|News]]@news 
Tips on things...
{{readOnly{<<newTiddler label:"Create a new tip..." focus:title tag:Tips>>}}}<<tiddlerList tags:"Tips" dateFormat:"ddd, 0DD: " itemTemplate:"*%modified - [[%title|%title]] (%tags)\n" group:"tiddler.created.formatString('YYYY, MMM')" groupTemplate:"!!!%group \n" order:"-created">>
/***
|''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);
//}}}
<<newTiddler
        label:"Create a new SVG"
        tag:"SVG"
        tag:"Image"
        title:"New SVG"
        fields:"server.content-type:image/svg+xml"
        text:{{store.getTiddlerText("YourPrototypeTiddler")}}
>>
!Summary
@TagFiltrPlugin is a fork of @TagsplorerMacro providing new capabilities such as...
* most importantly, an optional tag-bar grouped by either...
** [[tag groups|http://tagfiltr.tiddlyspace.com#Examples]]
** [[prefixed tags|http://tagfiltr.tiddlyspace.com#Groups]]
* use core filters for tiddlers being considered
* fix tags not to be removed
* exclude more than one tag
* custom item template for filter results via ''fmtTiddler'' [[parameter|http://tagfiltr.tiddlyspace.com/#Parameters]]
* integration with @ListFiltr
!Details
For more info, visit the @TagFiltr space.
!Example
{{{
<<tagfiltr fix:"Journal">>
}}}
<<tagfiltr fix:"Journal">>
!Installation
;on ~TiddlySpace
:simply include the @TagFiltrPlugin space
; standalone ~TiddlyWiki
:get it from @TagFiltrPlugin and install
!Preview
[img[http://img.tiddlyspace.com/TagFiltrPlugin_1]]
<!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>
URL: https://plus.google.com/u/1/109308865556494599029/posts/bLS3mPex9uD
Video: https://www.youtube.com/watch?v=a0UZfd48Ixc
!Presentation Mode / Story Mode
There should be kind of a context tiddler object for displaying a single , i.e. the presentation tiddler along with the current position in the index, so there‘s a difference between...
*next <> prev
*rewind << forward
...due to clicking TiddlyLinks outside of the presentation flow
So, when leaving the presentation flow there could be "back to presentation" or "end presentation" buttons in the tiddler toolbars or above which brings you back to the last slide from the presentation

Other than Trello, allow  reodering for all of...
* boards
* columns
* cards
...all are lists with their own scope... and perhaps more / other representations than boards, columns and cards
!Full Screen
Allow to fullscreen individual tiddler...
* display toolbar only when title area is hovered, otherwise not
* toolbar contains a "leave fullscreen" mode, also triggered by //ESC//

!Related Discussions
;TiddlyWiki5 and sections, namespaces and copy-pasting tiddlers
:https://groups.google.com/forum/?fromgroups=#!topic/tiddlywikidev/DA2EnUkEaIM

!Log
;[[3:30|https://www.youtube.com/watch?v=a0UZfd48Ixc&t=3m30s]]
: Build TiddlyWeb edition of ~TW5 uses ''renderTiddler'' as what used to be ''saveTiddler''...
:* https://github.com/Jermolene/TiddlyWiki5/blob/master/wbld.sh#L15
: type turns file into a *.tid file for TiddlyWeb to receive and handle
;Seeing tw5 work on TiddlySpace
: include ''@tw5tiddlyweb'' and then navigate to yourspace/tw5 to see the tw5 version

; [[17:30|https://www.youtube.com/watch?v=a0UZfd48Ixc&t=17m30s]]
: https://github.com/Jermolene/TiddlyWiki5/tree/master/core/templates

; [[23:00|https://www.youtube.com/watch?v=a0UZfd48Ixc&t=23m00s]]
: https://tiddlytools.com
:* Eric is trying to make plugins work again, e.g. ImportTiddlersPlugin
:* discussion for roadmap of merging macros intow tw5 widgets
:** tw5 macros are in-place syntax

; [[40:00|https://www.youtube.com/watch?v=a0UZfd48Ixc&t=40m00s]]
:{{x{
* filesize and embedded images
* network transfer speeds
* Eric mentions AttachFileFormatters
* Will lazy loading reduce load time?
*# loading time for the document
*# placing the base-64 text into the dom representation
*# during startup tw-core reads all divs and creates a store object
* all tw does is transfering the DOM into js objects, the heavy lifting already having been done by the browser
** philosophy: leave all heavy lifting to the browser
}}}

; [[53:00|https://www.youtube.com/watch?v=a0UZfd48Ixc&t=53m00s]]
: tw5 handling images
: {{{ $tw.wiki.filterTiddlers("[type[image/jpeg]]"); }}}
: {{{ $tw.wiki.filterTiddlers("[type[image/gif]]"); }}}


; [[55:00|https://www.youtube.com/watch?v=a0UZfd48Ixc&t=55m00s]]
: "stitching embeded contents into a larger narrative"
: lazy loading helps to load the framework first and then render the contenst when avilable... "smart video"

; [[56:00|https://www.youtube.com/watch?v=a0UZfd48Ixc&t=56m00s]]
: Eric's idea: "detach embedded contents" command

; [[59:00|https://www.youtube.com/watch?v=a0UZfd48Ixc&t=59m00s]]
: Jeremy "TidlyWiki as a madia scrapbook"
: Eric "presentation / slideshow"

; [[61:00|https://www.youtube.com/watch?v=a0UZfd48Ixc&t=61m00s]]
: Jeremy: sort order for list macro — give tags a "natural" sort order

; [[65:00|https://www.youtube.com/watch?v=a0UZfd48Ixc&t=65m00s]]
: presentation mode / story mode
: full screen

; [[68:45|https://www.youtube.com/watch?v=a0UZfd48Ixc&t=68m45s]]
: Jeremy: provide for Trello-style dnd between lists
:* Yay!!! Very much appreciated!
:* trello column = tw story

; [[71:00|https://www.youtube.com/watch?v=a0UZfd48Ixc&t=71m00s]]
:{{x{
* Ted Nelson — Zig Zag — generic list formats
* ZigZag — Xanadu
* lists as the generic data structure below everything else — YES!!!
}}}

; [[91:00|https://www.youtube.com/watch?v=a0UZfd48Ixc&t=91m00s]]
: Jeremy: automating the editor

; [[97:00|https://www.youtube.com/watch?v=a0UZfd48Ixc&t=97m00s]]
: Jeremy: JSON tiddlers

; [[104:00|https://www.youtube.com/watch?v=a0UZfd48Ixc&t=104m00s]]
: Jeremy: http://iftt.com — do this then that
Today I took the time to update @tbTheme to make it work with all the changes introduced by the new @lattice theme. While at it, I created a [[full version|Welcome]]@tbThemeFull of @tbTheme which has all the plugins included that find at work in [[my space|Welcome]]@tobibeer .
/***
|''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);
//}}}
!2010-10-16
in reply to ''@Jon'':
<<<
This mornings quick coffee hack was to get @inclusion up and running.
<<<
That's fantastic!
!2010-10-14
[[That|Who Includes Me?]]@tiddlyspace is something especially interesting for maintainers of themes, plugins or even complex applications ...if not at least to have an idea of how bad it might be if anything (temporarily) broke.

A simple ''popularity count'' would also be immensely interesting for space listings.
ColorPalette
StyleSheet
SiteSubtitle
GettingStarted
SiteTitle
MainMenu
SiteIcon
DefaultTiddlers
ViewTemplate
PageTemplate
SideBarOptions
EditTemplate
SiteInfo
SideBarTabs
ToolbarCommands
[[A much appreciated service hosting your TiddlyWiki online.|http://tiddlyspot.com]].

!My stuff on TiddlySpot
{{list{
!Plugins & Apps
;[[tbGTD|http://tbGTD.tiddlyspot.com]] ([[en|http://tbGTD.tiddlyspot.com]] / [[de|http://tbGTD-deutsch.tiddlyspot.com]])
:my GTD flavor
:can be used as a template
;[[TagSearch|http://tagsearch.tiddlyspot.com]]
:TagSearch — tagging made easy
;[[LinkifyPlugin|http://linkify.tiddlyspot.com]]
:Linkify — autoweaving internal links
;[[VerticalTabs|http://verticaltabs.tiddlyspot.com]]
:how to achieve VerticalTabs in TiddlyWiki
!Tests & [[MTCs|MTC]]
;[[StartupTransclusions|http://startuptransclusions.tiddlyspot.com]]
:demonstrating a problem with transclusion on startup
;[[WeirdTitles|http://weirdtitles.tiddlyspot.com]]
:about clean titles and those that are not quite
}}}
<<listfiltr>>
<<tiddler video with: "bT0IwEPV8oY">>
!Summary
@Paintr  provides an easy way for to conditionally style...
* internal links
* tag buttons
* tiddler titles
* entire tiddlers and tiddler contents
* even transcluded tiddlers, sections or slices
...based on the tiddler title or how a tiddler is tagged.
!Details
For example, notice how this link is red [[GettingStarted]] or open PaintrConfig to see a yellowish tiddler.

The entire configuration is done using a shadow tiddler called PaintrConfig which allows you to define...
* parameter defaults
* the actual css being applied
* style definitions for tags and tiddlers tagging to them or for individual tiddlers
!Features
Compared to its predecessor [[ColoredLinksPlugin|http://coloredlinks.tiddlyspot.com]] the new PaintrPlugin...
* gives you a lot more flexibility in terms of what to style allowing you to...
** selectively and independently style internal links, tag buttons, tiddler titles, even entire tiddlers and their contents
* provides a single spot to define __all__ that is needed, namely PaintrConfig
** once you get the gist, it's pretty self explanatory, so perhaps [[have a look|PaintrConfig]] at it
* works with much more powerful, yet also intuitive and simple configuration
* doesn't shout at you when you accidentially entered malformed css
* doesn't require you to add or edit custom fields
*provides the {{{<<paint>>}}} macro to either...
**paint macro outputs or
**prevent them from being painted
*allows to conditionally enable or disable paintr using global defaults or per definition
*allows to specifiy inside which css selectors to paint

For getting started and configuration, have a look at the @Paintr space.
!Example
<<tiddler PaintrConfig>>
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]]
/***
A quick way to make your whole TiddlyWiki fade in on startup.
***/
//{{{
jQuery('#contentWrapper').hide();
setTimeout((function(){jQuery('#contentWrapper').fadeIn(1000);}),2000);
//}}}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="2 724 68 55" 
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 2.25 756 L 11.25 747 L 24.75 760.4994 L 60.750004 724.4994 L 69.75 733.49902 
		L 24.749977 778.49976 Z" fill="#101010" class="glyph"/>
	</g>
</g>
</svg>
[[Welcome]]
<!--{{{-->
<div macro='slideRevision'></div>
<div class='heading'>
	<span class="titleBar">
		<div class='title' macro='view title text'></div>
	</span>
	<span class='modifierIcon'
		macro='view modifier SiteIcon label:no height:48 width:48 preserveAspectRatio:yes'>
	</span>
	<div class='toolbar'
		macro='toolbar [[ToolbarCommands::RevisionToolbar]] icons:yes height:48 width:48 more:popup'>
	</div>
	<div class='tagClear'></div>
</div>
<div class='content'>
	<div class='viewer' macro='view text wikified'></div>
</div>
<div class='tagInfo'>
	<div class='tidTags' macro='tags'></div>
	<div class='tagging' macro='tagging'></div>
</div>
<!--}}}-->
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
/***
|''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));
//}}}
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
URL: https://plus.google.com/109308865556494599029/posts/9bhsjLaYJWu
Video: https://www.youtube.com/watch?v=SH0BU7ZxjWU
/***
|''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($) {

config.browser.ieVersion = /MSIE (\d{1,2}.\d)/i.exec(config.userAgent);

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);
//}}}
Reply to @cdent:
<<<
There's nothing prevent putting multiple private bags (from anywhere on the system) in the recipes for a space. Nor is there anything preventing doctoring the policies. This points to a need for recipe and policy editor tools. — @cdent
<<<
That sounds like the way to go, if reasonably manageable.
!My original reply from 2010-10-11
[[That|Including private content]]@tiddlyspace sounds like a much needed functionality.
!!Scenario
Imagine having an ''accounts space'' which you want to include in a ''project space''. Yet, what you don't want is for either of those spaces to be public or to maintain all data in one space. Nor do you want all members of the ''project space'' to be able to see the contents of the ''accounts space''. Eventually, the private content I am seeing in any space depends on my membership of the included spaces.

One must be able to differentiate ''included-private'' and ''private'' though. Up until the dawn of some plugin to do so ''remotely'', one might also only be able to edit ''included-private'' tiddlers in the space from which they originate.

No space should ever be designed that whether or not ''it works'' depends on the inclusion of private tiddlers ...unless there were some global fallback that notifies a user that he does not have the required priviledges to access the space.
{{{
Background:#FFF
Foreground:#333
PrimaryPale:#999
PrimaryLight:#777
PrimaryMid:#111
PrimaryDark:#000
SecondaryPale:#DDF
SecondaryLight:#CDF
SecondaryMid:#9AF
SecondaryDark:#05A
TertiaryPale:#EEE
TertiaryLight:#CCC
TertiaryMid:#999
TertiaryDark:#333
Error:#F88

PageBackground:#F9F9F9
Dim:#FDFDFF
}}}
<<listr>>
!Summary
[[ColoredLinksPlugin|http://coloredlinks.tiddlyspot.com]] is a plugin that produces colored tiddlyLinks by adding css styling to any tiddlyLink or tag-button depending on how the corresponding tiddler is tagged.

{{annotation{
ColoredLinks has been replaced by the much more powerful [[Paintr]] an is hence no longer updated .
}}}
!Details
For more information [[see here...|http://coloredlinks.tiddlyspot.com]]
!Get it from...
http://coloredlinks.tiddlyspot.com <<tiddler iframe with: coloredlinks.tiddlyspot.com>>
This is the public space of Tobias Beer, plugin author and contributor to the TiddlyWiki community.
!Projects I initiated / contributed to
<<list filter "[tag[Projects]][sort[-modified]][limit[10]]">>
!My recently updated plugins
<<list filter "[tag[Plugins]][sort[-modified]][limit[10]]">>
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
//{{{
//
// source: http://plugins.jquery.com/project/floatobject
//
// usage: jQuery(selector).makeFloat(params);
//
// where params is an object:
// x: number of pixels from the left of the window, or the string 'current' to use the current object location
// y: the same is x but for the Y axis
// speed: 'slow' , 'normal', 'fast'
//
// example: jQuery('#mydiv').makeFloat({x:'current',y:'100',speed:'normal'});
//

(function($){
/*----------------------------------------------------------------------------------
Class: FloatObject
-------------------------------------------------------------------------------------*/
	function FloatObject(jqObj, params)
	{
		this.jqObj = jqObj;
		
		switch(params.speed)
		{
			case 'fast': this.steps = 5; break;
			case 'normal': this.steps = 10; break;
			case 'slow': this.steps = 20; break;
			default: this.steps = 10;
		};
		var offset = this.jqObj.offset();
		this.right=(params.x.substr(0,5)=='right');
		this.currentX = this.right?this.jqObj.css('right'):offset.left;
		this.currentY = offset.top;
		this.width = this.jqObj.width();
		this.height = this.jqObj.height();
		this.alwaysVisible = params.alwaysVisible;
		this.alwaysTop = params.alwaysTop;
		
		
		this.origX = typeof(params.x) == "string" ?  this.currentX : params.x;
		this.origY = typeof(params.y) == "string" ?  this.currentY : params.y;
				
		//now we make sure the object is in absolute positions.
		var attrX=(this.right?'right':'left');
		this.jqObj.css({'position':'absolute' , 'top':this.currentY ,attrX:this.currentX});
	}
	
	FloatObject.prototype.updateLocation = function()
	{
		this.updatedX = this.right?this.jqObj.css('right'):$(window).scrollLeft() + this.origX;
		
		if( this.alwaysTop == false ){
			this.updatedY = $(window).scrollTop()+ this.origY;
			
			if( this.alwaysVisible ){
				if( this.origX + this.width > this.windowWidth() ) 
					this.updatedX = this.windowWidth() - this.width + $(window).scrollLeft();
				if( this.origY + this.height > this.windowHeight() ) 
				{
					this.updatedY = $(window).scrollTop() + this.windowHeight() - this.height;
					if( this.updatedY < this.origY ) this.updatedY = this.origY;
				}				
			}
		}
		else
		{

			if( $(window).scrollTop() > this.origY )
			{
				this.updatedY = $(window).scrollTop() + 5;
			}
			else
			{
				this.updatedY = this.origY + 5;
			}
		}
		this.dx = Math.abs(this.updatedX - this.currentX );
		this.dy = Math.abs(this.updatedY - this.currentY );
		
		return this.dx || this.dy;
	}
	
	FloatObject.prototype.windowHeight = function()
	{
		var de = document.documentElement;
		
		return self.innerHeight ||
			(de && de.clientHeight) ||
			document.body.clientHeight;
	}
	
	FloatObject.prototype.windowWidth = function()
	{
		var de = document.documentElement;
		
		return self.innerWidth ||
			(de && de.clientWidth) ||
			document.body.clientWidth;
	}
	
	
	FloatObject.prototype.move = function()
	{
		if( this.jqObj.css("position") != "absolute" ) return;
		var cx = 0;
		var cy = 0;
		
		if( this.dx > 0 )
		{			
			if( this.dx < this.steps / 2 )
				cx = (this.dx >= 1) ? 1 : 0;
			else
				cx = Math.round(this.dx/this.steps);
			
			if( this.currentX < this.updatedX )
				this.currentX += cx;
			else
				this.currentX -= cx;
		}
		
		if( this.dy > 0 )
		{
			if( this.dy < this.steps / 2 )
				cy = (this.dy >= 1) ? 1 : 0;
			else
				cy = Math.round(this.dy/this.steps);
			
			if( this.currentY < this.updatedY )
				this.currentY += cy;
			else
				this.currentY -= cy;
		}
		var attrX=(this.right?'right':'left');
		this.jqObj.css({attrX:this.currentX, 'top': this.currentY });			
	}

	
	
/*----------------------------------------------------------------------------------
Object: floatMgr
-------------------------------------------------------------------------------------*/		
	$.floatMgr = {
		
		FOArray: new Array() ,
		
		timer: null ,
		
		initializeFO: function(jqObj,params) 
		{
			var settings =  $.extend({
				x: 0 ,
				y: 0 ,
				speed: 'normal'	,
				alwaysVisible: false ,
				alwaysTop: false},params||{});
			var newFO = new FloatObject(jqObj,settings);
			
			$.floatMgr.FOArray.push(newFO);
			
			if( !$.floatMgr.timer ) $.floatMgr.adjustFO();
			
			//now making sure we are registered to all required window events
			if( !$.floatMgr.registeredEvents ) 
			{
					$(window).bind("resize", $.floatMgr.onChange);
					$(window).bind("scroll", $.floatMgr.onChange);
					$.floatMgr.registeredEvents = true;
			}		
		} , 
		
		adjustFO: function() 
		{
			$.floatMgr.timer = null;
			
			var moveFO = false;
			
			for( var i = 0 ; i < $.floatMgr.FOArray.length ; i++ )
			{
				 FO = $.floatMgr.FOArray[i];
				 if( FO.updateLocation() )  moveFO = true;
			}
			
			if( moveFO )
			{
				for( var i = 0 ; i < $.floatMgr.FOArray.length ; i++ )
				{
					FO = $.floatMgr.FOArray[i];
					FO.move();
				}
				
				if( !$.floatMgr.timer ) $.floatMgr.timer = setTimeout($.floatMgr.adjustFO,50);
			}
		}	,
		
		stopFloatChk: false ,
		
		onChange: function()
		{
			if( !$.floatMgr.timer && !$.floatMgr.stopFloatChk ) $.floatMgr.adjustFO();
		} 		
	};
	
/*----------------------------------------------------------------------------------
Function: makeFloat
-------------------------------------------------------------------------------------*/		
	$.fn.makeFloat = function(params) {
		var obj = this.eq(0); //we only operate on the first selected object;
		$.floatMgr.initializeFO(obj,params); 
		if( $.floatMgr.timer == null ) $.floatMgr.adjustFO();
		return obj;
	};
	$.fn.stopFloat = function(params) {
		$.floatMgr.stopFloatChk = true;
	};
	
	$.fn.restartFloat = function(params) {
		$.floatMgr.stopFloatChk = false;
	};
})(jQuery);
//}}}
(function() {
var getCSRFToken = function(window) {
	// XXX: should not use RegEx - cf.
	// http://www.quirksmode.org/js/cookies.html
	// https://github.com/TiddlySpace/tiddlyspace/commit/5f4adbe009ed4bda3ce39058a3fb07de1420358d
	var regex = /^(?:.*; )?csrf_token=([^(;|$)]*)(?:;|$)/;
	var match = regex.exec(document.cookie);
	var csrf_token = null;
	if (match && (match.length === 2)) {
		csrf_token = match[1];
	}

	return csrf_token;
};

if (typeof config !== 'undefined' && config.extensions &&
		config.extensions.tiddlyspace &&
		config.extensions.tiddlyspace.getCSRFToken === null) {
	config.extensions.tiddlyspace.getCSRFToken = getCSRFToken;
} else {
	window.getCSRFToken = getCSRFToken;
}
})(window);
!Summary
TagSearchPlugin is a TiddlyWiki plugin and all about the <<tagsearch toolbar label:"tags ">>-button in the toolbar. It allows you to set tags of different categories and - when installed - to use the interface of GotoPlugin to add new tags.
!Details
Preferably you should add [[TagSearch|TagSearchPlugin]] to your ViewTemplate while using a tiddler like TagSearchConfig for configuration. [[See here for more information...|http://tagsearch.tiddlyspot.com]]

You can include it as a plugin on TiddlySpace from...
@tagsearchplugin
!Originally published on...
http://tagsearch.tiddlyspot.com
<<tiddler iframe with: tagsearch.tiddlyspot.com>>
!Summary
[[RandomLink|RandomLinkMacro]] is a macro that allows you to fetch a tiddlyLink for any given tiddler in your wiki.
!Usage
{{{<<randomlink label:'Mysterious Link' tags:"tagA [[tag B]]" class:button close:false>>}}}
!Example
Here's a random link to one of my plugins: <<randomlink tags:Plugins>>

''Tip:'' If you {{{CTRL+CLICK}}} on a link it will only fetch a new random tiddler instead of showing the tiddler.
!Parameters
| !Param | !Description | !Required | !Default |h
| {{{label}}} |the link-text| no |the random tiddler's title|
| {{{tags}}} |a bracketed list of tags; only gets a tiddler with any of these tags | no |if not specified -> all tiddlers|
| {{{class}}} |the css class assigned in addition to ''randomLink''| no |{{{tiddlyLink tiddlyLinkExisting}}}|
| {{{close}}} |whether or not to close the last displayed tiddler| no |{{{true}}}|
!Original idea
http://bookmark.noteboko.tiddlyspot.com/#RandomlinkMacro
!Discussion
[[Google groups...|http://groups.google.com/group/tiddlywiki/browse_frm/thread/678648cab3f51955/182250cc99ed5477]]
<<tiddler SiteTitle>> <<tiddler SiteSubtitle>>
/***
|''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);
	}
};
})();
//}}}
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
!Tags
|Plugins
Projects
Talks
Tips
|App| refTag:"##Summary"
|Featured| refTag:"##Summary"
|Theme| refTag:"##Summary"
|Themes| refTag:"##SUMMARY"
Themes|
|Reference| refTag:"##Summary"
References
!Template
{{itemlist{<<get "$1" filter:"[tag[$2]]" format:"* {{item{ {{itemtitle{» [[%1]]}}}{{itemsummary{%0}}} }}}">>}}}<<listfiltr>>
I would love to use a custom svg for buttons that are not part of the default ToolbarCommands. How would I do that?

Check out the icons in [[my space|Welcome]]@tobibeer ...pure css and default icons. Now how would I give that TagSearchPlugin button a lovely bookmark?
[[TiddlerTabsPlugin|http://tiddlertabsplugin.tiddlyspace.com/#TiddlerTabsPlugin]] allows to list all tiddlers in tabs via the {{{<<tiddlerTabs>>}}} macro.
<<tiddlerTabs>>

<<more TiddlerTabs>>
Here's a little experiment for playing back music videos in a player...

/%
!TAPES

|sortable widelinks|k
| !Category | !Artist | !Title | !Play |h
|Pop|Phoenix|Listomania| [[3:21|http://www.tape.tv/musikvideos/Phoenix/Lisztomania]] |
|Pop|Imogen Heap|Last Train Home| [[3:33|http://www.tape.tv/musikvideos/Imogen-Heap/Last-Train-Home]] |
|Alternative|Alice In Chains|No Excuses| [[4:11|http://www.tape.tv/vid/2462]] |
|Alternative|Pearl Jam|Even Flow| [[5:27|http://www.tape.tv/vid/5651]] |
|Alternative|Foo Fighters|Walking After You| [[4:02|http://www.tape.tv/vid/4476]] |
|Alternative|Serj Tankian|Empty Walls| [[3:53|http://www.tape.tv/vid/994]] |
|Alternative|System Of A Down|Aerials| [[4:03|http://www.tape.tv/vid/5778]] |
|Rock|Radiohead|Creep| [[3:55|http://www.tape.tv/vid/10831]] |
|Rock|Marcy Playground|Sex and Candy| [[2:57|http://www.tape.tv/vid/39991]] |
|Rock|Spin Doctors|Two Princes| [[4:19|http://www.tape.tv/vid/5747]] |
|Rock|The Killers|Mr. Brightside| [[3:45|http://www.tape.tv/vid#/7446]] |
|Rock|Bjoerk|#Mixtape#| [[>|http://www.tape.tv/mix/35941]] |
|Rock|Bjoerk|Play Dead| [[3:50|http://www.tape.tv/vid/7377]] |
|Rock|Bjoerk|Army Of Me| [[4:23|http://www.tape.tv/vid/23021]] |
|Rock|Bjoerk|Violently Happy| [[3:31|http://www.tape.tv/vid/7375]] |
|Rock|Bjoerk|It's Oh So Quiet| [[3:58|http://www.tape.tv/vid/7354]] |
|Rock|Bjoerk|All Is Full Of Love| [[4:04|http://www.tape.tv/vid/23111]] |
|Rock|Bjoerk|Isobel| [[4:12|http://www.tape.tv/vid/22941]] |
|Rock|Bjoerk|Possibly Maybe| [[5:10|http://www.tape.tv/vid/22971]] |
|Rock|Bjoerk|Venus As A Boy| [[4:42|http://www.tape.tv/vid/23001]] |
|Indie|Band Of Horses|No One's Gonna Love You| [[3:39|http://www.tape.tv/vid/6105]] |
|Folk|Tracy Chapman|Telling Stories| [[3:40|http://www.tape.tv/vid/52942]] |
|Reggae|Bob Marley|Get Up, Stand Up| [[3:33|http://www.tape.tv/vid/104543]] |
|Reggae|Gentleman|Superior| [[5:47|http://www.tape.tv/vid/5204]] |
|Reggae|Freundeskreis|Tabula Rasa Part 2| [[5:29|http://www.tape.tv/vid/1740]] |
|~HipHop|Freundeskreis|Mit Dir| [[5:20|http://www.tape.tv/vid/1741]] |
|~HipHop|Peter Fox|Haus Am See| [[3:38|http://www.tape.tv/vid/4638]] |
|~HipHop|Kelis|Trick Me| [[3:22|http://www.tape.tv/vid/29091]] |
|~HipHop|Kelis|Millionaire| [[3:37|http://www.tape.tv/vid/29141]] |
|~HipHop|Guru ft. Kelis|Supalove| [[3:18|http://www.tape.tv/vid/47371]] |
|~HipHop|Guru ft. Baybe|Lifesaver| [[3:15|http://www.tape.tv/vid/47361]] |
|~HipHop|Guru ft. Donald Byrd|Loungin| [[2:51|http://www.tape.tv/vid/31451]] |
|~HipHop|Marteria|Endboss| [[3:45|http://www.tape.tv/vid/104957]] |
|~HipHop|Culcha Candela|Hamma| [[3:28|http://www.tape.tv/vid/276]] |
|~HipHop|Clueso|Keinen Zentimeter| [[3:24|http://www.tape.tv/vid/1771]] |
|~HipHop|Clueso|Mitnehm| [[3:30|http://www.tape.tv/vid/1785]] |
|~HipHop|Clueso|Wart Mal| [[3:30|http://www.tape.tv/vid/1699]] |


!CODE
%/<script>
(function($){
var btn,lst,
	out=createTiddlyElement(place,'div',null,'tapetv'),
	key=window.event?'keydown':'keypress';
$('<select/>').appendTo(out).attr({size:10}
).bind(key,function(e){
	var back,song='',
		e=e||window.event,
		key=e.keyCode,
		s=$(this).next();
	if(key==40&&this.selectedIndex==this.options.length-1){
		this.selectedIndex=0;
		return true;
	}
	switch(key){case 13: case 27: case 38: break; default: return true;}
	if(key==38)if(this.selectedIndex<2)back=true; else return true;
	if (key==13&&this.value.length){
		song=this.options[this.selectedIndex].innerHTML;
		s.val(song);
		s.next().attr('play',this.value);
	}
	this.style.display='none';
	if(key==27||back)s.focus();
	else{s.next().attr({
		what:this.value,
		song:song,
		play:'true'
	}).click()}
	return true;
});

$('<input/>').appendTo(out).bind(key,function(e){
	var all,n=0,o,s,v,vi,vs,
		e=e||window.event,
		key=e.keyCode,
		sel=this.previousSibling,
		os=sel.options,
		show=key==38||key==40||key==13;
	if(key==27){this.value='';return false;}
	if (key>0&&key<48) switch(key){
		// backspace=8, enter=13, space=32, up=38, down=40, delete=46
		case 8: case 13: case 32: case 38: case 40: case 46: break; default: return true;
	}
	all=!this.value.length&&show;
	if(!show&&this.value.length<2)return true;
	while(os.length>0)os[0]=null;
	vs=store.getTiddlerText(tiddler.title+'##TAPES').split('\n');
	for(v=3;v<vs.length;v++){
		vi=vs[v].split('|');
		if(vi.length<2)continue;
		s=[vi[1],vi[2],vi[3]].join(' ');
		if(all||s.toLowerCase().indexOf(this.value.toLowerCase())>=0){
			n++;
			if(n==1){
				o=new Option("Select a video...",null,false,false);
				os[0]=o;
				o.style.color='#339';
			}
			o=document.createElement ('option');
			lnk=vi[vi.length-2];
			o.value = lnk.substr(0,lnk.length-3);
			o.appendChild(document.createTextNode(vi[2]+' - '+vi[3]));
			sel.appendChild(o);
		}
	}
	if(n==0)os[0]=new Option("Nothing found...",null,false,false);
	$(sel).css({'display':(n>0?'block':'none')});
	if (show){
		sel.focus();
		sel.selectedIndex=key==38?sel.length-1:1;
	}
	return true;
});

$('<a href="#" class="play">'+'\u25B6'+'</a>').appendTo(out
).attr('title','Click to play selection...'
).click(function(e){
	var lnk,
		e=e?e:window.event,
		btn=$(this),
		p=btn.parent(),
		play=e.ctrlKey||btn.attr('play')=='true'||btn[0].innerHTML=='\u25B6',
		what=btn.attr('what'),
		song=btn.attr('song'),
		plr=$('.player',p);
	if(!what||what==''){
		alert('Please select a song first');
		return false;
	}
	btn.html(play?'\u25A0':'\u25B6');
	btn.attr({
		'play':null,
		'title':(play?'Click to stop or CTRL+CLICK to play next...':'Click to play selection...')
	});
	if(play){
		plr.empty();
		wikify('<<tiddler '+tiddler.title+'##PLAYER with: "'+what+'" "'+song+'">>',plr[0]);
		plr.fadeIn();
	}
	else {
		plr.fadeOut(400,function(e){$(this).empty();});
	}
});

btn=$('<a href="#">Playlist</a>').appendTo(out
).attr({
	'title':'Click to toggle playlist...',
	'show':'true'
});

wikify("{{playlist{}}}{{player{}}}",out);
lst=$('.playlist',out).css('display','none');
wikify(store.getTiddlerText(tiddler.title+"##TAPES"),lst[0]);
$('.externalLink',lst).click(function(e){
	var el=$(this),
		e=e||window.event,
		t=$('td',el.parent().parent()),
		song=t.eq(1).html()+' - '+t.eq(2).html();
	$('.play',el.closest('.tiddler')
	).attr({
		title:'Click to play...',
		what:el.attr('href'),
		song:song,
		play:'true'
	}).click();
	return false;
});

btn.click(function(e){
	var lst,btn=$(this),
		show=btn.attr('show')=='true';
	lst=$('.playlist',btn.parent()).css({'display':(show?'block':'none')});
	if(show){
		lst.css('display','block');
		if(config.tableSorting)config.tableSorting.refresh(lst.parent()[0]);
	}else lst.css('display','none');
	btn.attr('show',(!show).toString());
        return false;
});

setStylesheet('/*{{{*/\n'+
	'.tapetv{width:650px;min-height:250px;padding-top:5px;background:black;border:10px solid black;position:relative;z-index:0;font-size:0.8em;'+
	'-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;'+
	'-moz-box-shadow:3px 3px 4px #000;-webkit-box-shadow:3px 3px 4px #000;box-shadow:3px 3px 4px #000;}\n'+
	'.tapetv select {display:none;float:left;margin-top:1.5em;margin-left:1em;'+
	'min-width:200px;z-index:10;background:white;position:absolute;border:1px solid #333}\n'+
	'.tapetv input {float:left;margin:3px 0 0 1em;width:200px;border:1px solid #333;}\n'+
	'.tapetv a {margin:0 0.2em;padding:0 0.2em;color:#CCC;cursor:pointer;font-size:1.8em;font-weight:bold;border-color:#666;text-decoration:none;}\n'+
	'.tapetv td, .tapetv tr, .tapetv th, .tapetv table, .tapetv thead,.tapetv tbody a {line-height:1em;font-size:1em;border:1px solid black !important;color:#DDD;}\n'+
	'.tapetv tbody a {border:0 !important;display:block;padding:0 5px;}'+
	'.tapetv tbody a:hover {text-decoration:underline;}'+
	'.tapetv tr {min-width:150px;}\n'+
	'.tapetv th, .tapetv th span{background:#333;color:#EEE;padding:1px 3px;line-height:1.4em;}\n'+
	'.tapetv .sortable .sortedCol {background:#161616;color:#CCC;}\n'+
	'.tapetv .playlist{margin:1em 0 0 0;padding:0 1em;clear:left;max-height:250px;overflow:auto;}\n'+
	'/*}}}*/',
	'StyleSheetTapeTv'
);

})(jQuery);
</script>/%
!PLAYER
<html><div style="width:600px;height:360px;overflow:hidden;margin:10px 0 0 0;"><iframe style="position:relative;top: -150px;left: -200px;width: 1000px;height: 600px;z-index:0;" src="$1" scrolling=no></iframe></div><div style="clear:both"></div></html>[[Link to "$2"...|$1]]/%
!INFO
[[Tape.tv|http://www.tape.tv]] ...music tv going mad
!END%/
{{title{Please note, [[tape.tv|http://tape.tv]] only seems to be available in Germany}}}
<script>
(function($){
	if(readOnly) $('.readOnly').hide();

	var
		$tid = $(place).closest('.tiddler'),
		$v = $tid.find('.viewer'),
		tid = store.getTiddler($tid.attr('tiddler')),
		run = $tid.attr('runOnce');

	if(run)return;
	else $tid.attr('runOnce',true);

	if(!tid)return;

	if(tid.tags && tid.tags.contains('follow') && !tid.tags.contains('no-followers')){
		wikify(
			'{{followersFollowers{\n!This users followers...\n'+
			'<<followers "' + tid.title + '" sort:server.bag hide:tobibeer_public>>}}}',
			( $('<div/>').appendTo($v) )[0]
		)
	}

	if(tid.tags && tid.tags.containsAny(['Talks','Tips','Journal','WhatOthersSay'])){
		wikify(
			'{{tbScan{\n!What everyone says right now...\n'+
			'<<tsScan "' + tid.title + '" fat:y template:Templates##TALK sort:server.bag hide:tobibeer_public>>\n}}}',
			( $('<div/>').appendTo($v) )[0]
		)
	}
})(jQuery)
</script>
/***
|''Name:''|TiddlySpaceIntraSpaceInclusion|
|''Description:''|Provides support for {{{<<tiddler Foo@bar>>}}} and {{{<<tiddler [[Foo]]@bar>>}}}|
|''Author:''|Jon Robson|
|''Source:''|https://github.com/jdlrobson/TiddlyWikiPlugins/raw/master/plugins/TiddlySpaceIntraSpaceInclusion/TiddlySpaceIntraSpaceInclusion.js|
|''Version:''|0.3.8a|
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''~CoreVersion:''|2.4|
***/
//{{{
(function() {
	var _tidtext = TiddlyWiki.prototype.getTiddlerText;
	var cache = {};

	// allmost the same regExp as in TiddlySpaceLinkPlugin but .. no "mg" parameter, because it didn't work for this usecase.
	config.textPrimitives.spacenameLinkRegExp = new RegExp(config.textPrimitives.unWikiLink + 
													 "?(" + config.textPrimitives.bareTiddlerLetter + "*)@(" + config.textPrimitives.spaceName + ")", "");
	config.textPrimitives.tiddlyLinkSpacenameLinkRegExp = new RegExp("\\[\\[(.*?)(?:\\|(.*?))?\\]\\]@(" + config.textPrimitives.spaceName + ")", "");
	
	TiddlyWiki.prototype.getTiddlerText = function(title, defaultText) {
		var ct = config.textPrimitives;
		var match = ct.spacenameLinkRegExp.exec(title);	// foo@bar
		var match2 = ct.tiddlyLinkSpacenameLinkRegExp.exec(title); 	// [[foo]]@bar
		
		if(match || match2) {
		//	console.log('inner: ', 'spacename: ', match, 'tiddlyLink: ', match2, 'place: ');
			var tidtitle, space;
			if(match[1] && match.length === 3) {
				tidtitle = match[1];
				space = match[2];
			} else if(match2 && match2.length === 4) {
				tidtitle = match2[1];
				space = match2[3];
			}
			var newtitle = tidtitle + "@" + space;
			if(tidtitle && space) {
				title = newtitle;
			}
			if(tidtitle && space && !store.getTiddler(newtitle)) {
				var tiddler = new Tiddler(title);
				// get the tiddler, where the macro is rendered. //XXX will need more testing
				var el = story.findContainingTiddler(place);
				var refreshTitle = (el) ? el.getAttribute('tiddler') : null;

				tiddler.text = "//retrieving from server//";
				tiddler.fields.doNotSave = "true";
				tiddler.tags = ["excludeLists", "excludeSearch", "excludeMissing"];
				merge(tiddler.fields, config.defaultCustomFields);
				tiddler.fields["server.bag"] = space + "_public";
				tiddler = store.addTiddler(tiddler);
				ajaxReq({ url: "/bags/" + space + "_public/tiddlers/" + tidtitle,
					dataType: "json",
					success: function(tid) {
						var tiddler = store.getTiddler(title);
						tiddler.text = tid.text;
						store.addTiddler(tiddler);
						// store.notify(title,true);
						story.refreshTiddler(refreshTitle,null,true);
						// story.refreshAllTiddlers(); // hacky but above link doesn't always seem to work!
					},
					error: function() {
						var tiddler = store.getTiddler(title);
						tiddler.text = "//error retrieving tiddler {{{" + title + "}}} from space @" + space + "//";
						store.addTiddler(tiddler);
						// store.notify(title,true);
						story.refreshTiddler(refreshTitle,null,true);
						// story.refreshAllTiddlers(); // hacky but above link doesn't always seem to work!
					}
				});
			}
		}
		return _tidtext.apply(this, [title, defaultText]);
	}
})();
//}}}
<<tiddlerList tags:"Videos" dateFormat:"0DD. mmm YYYY" itemTemplate:"*%created - [[%title|%title]] (%tags)\n" order:"-created">>
/***
|''Name''|LinksPlugin|
|''Author''|[[Tobias Beer|http://tobibeer.tiddlyspace.com]]|
|''Description''|outputs links in tiddlers|
|''Documentation''|http://links.tiddlyspace.com|
|''Version''|0.6.0 (2013-10-07)|
|''~CoreVersion''|2.5.2|
|''License''|Creative Commons 3.0|
|''Source''|https://raw.github.com/tobibeer/TiddlyWikiPlugins/master/plugins/LinksPlugin.min.js|
***/
// /%
(function(e){var t=config.macros.links={defaults:{fmtTiddler:"\n;[[%0]]",fmtInternal:"[[%0|%1]]",fmtInternalItem:"\n:%0%1",fmtInternalPlus:"\n:*[[%0]]",fmtExternal:"[[%0|%1]]",fmtExternalItem:"\n:%0%1",fmtExternalPlus:"\n:*%0",fmtSeparator:", ",classTiddler:"tiddlerLinks",external:true,internal:true,listfiltr:true,renamed:false,sort:"title",exclude:"excludeLists excludeSearch systemConfig",filter:"",title:"",link:"",tiddler:""},handler:function(n,r,i,s,o,u){t.refresh(e('<span class="linkIndex"/>').appendTo(n).attr({refresh:"macro",macroName:"links",params:o})[0],o)},refresh:function(n,r){e(n).empty();var i="",s,o,u={},o=[],a=r.parseParams("anon",null,true),f=a[0]["anon"]||[];e.each(t.defaults,function(e,t){u[e]=getParam(a,e,t);if(typeof u[e]=="string")u[e]=u[e].replace(/\\n/mg,"\n");if(f.contains(e))u[e]=true});["external","internal","renamed","listfiltr"].map(function(e){u[e]="true"==u[e].toString()});if(u.tiddler){o.push(store.getTiddler(u.tiddler))}else{o=u.filter?store.filterTiddlers(u.filter):store.getTiddlers(u.sort)}if(u.renamed){u.external=false;u.renamed=[];o.map(function(e){(store.getValue(e.title,"renamed")||"").readBracketedList().map(function(e){u.renamed.pushUnique(e)})})}u.exclude=u.exclude.readBracketedList();s=u.fmtSeparator;u.tids={};o.map(function(e){if(!(u.exclude.contains(e.title)||u.exclude.containsAny(e.tags))){t.getLinks(u,e)}});e.each(u.tids,function(t,n){i+=u.fmtTiddler.format([t]);e.each(n,function(e,t){var n,r=0,o,a,f="",l=config.formatterHelpers.isExternalLink(e);for(a=0;a<t.length;a++){o=t[a];if(e==o&&(l&&u.fmtExternalPlus||!l&&u.fmtInternalPlus))continue;r++;f+=u[l?"fmtExternal":"fmtInternal"].format([o,e])+(a<t.length-1?s:"")}n=f.length-s.length;if(f.lastIndexOf(s)==n)f=f.substr(0,n);i+=u[l?"fmtExternalItem":"fmtInternalItem"].format([r?f:u[l?"fmtExternal":"fmtInternal"].format([e,e]),u.fmtExternalPlus||u.fmtInternalPlus?!r?"":u[l?"fmtExternalPlus":"fmtInternalPlus"].format([e]):e,[e]])})});wikify("{{listfiltrLinks"+(u.tiddler?" "+u.classTiddler:"")+"{"+i+"\n}}}"+(u.listfiltr&&config.macros.listfiltr?"<<listfiltr>>":""),n)},getLinks:function(e,t){var n,r,i,s,o,u=config.textPrimitives.tiddlerAnyLinkRegExp,a=t.text.replace(/\/%((?:.|\n)*?)%\//g,"").replace(/\{{3}((?:.|\n)*?)\}{3}/g,"").replace(/"""((?:.|\n)*?)"""/g,"").replace(/<<((?:.|\n)*?)\>\>/g,"").replace(/<nowiki\>((?:.|\n)*?)<\/nowiki\>/g,"").replace(/<html\>((?:.|\n)*?)<\/html\>/g,"").replace(/<script((?:.|\n)*?)<\/script\>/g,"")+" ",f=function(t,n,r){isExternal=config.formatterHelpers.isExternalLink(n);if(e.title&&r.toLowerCase().indexOf(e.title.toLowerCase())<0||e.link&&n.toLowerCase().indexOf(e.link.toLowerCase())<0||!e.internal&&!isExternal||!e.external&&isExternal||e.renamed&&!isExternal&&!e.renamed.contains(n))return;var i,s=e.tids[t];if(!s)s=e.tids[t]={};i=s[n];if(!i)i=s[n]=[];i.pushUnique(r)};u.lastIndex=0;r=u.exec(a);while(r){n=u.lastIndex;if(r[1]){if(r.index>0){o=new RegExp(config.textPrimitives.unWikiLink+"|"+config.textPrimitives.anyLetter,"mg");o.lastIndex=r.index-1;s=o.exec(a);if(s.index!=r.index-1)f(t.title,r[1],r[1])}else{f(t.title,r[1],r[1])}}else if(r[2])f(t.title,r[3],r[2]);else if(r[4])f(t.title,r[4],r[4]);else if(r[0])f(t.title,r[0],r[0]);u.lastIndex=n;r=u.exec(a)}}};config.shadowTiddlers["StyleSheetLinksPlugin"]="/*{{{*/\n"+".tiddlerLinks > dl > dt,\n"+".tiddlerLinks > .lf-list > dl > dt\n"+"{display:none;}\n"+".tiddlerLinks > dl > dd,\n"+".tiddlerLinks > .lf-list > dl > dd\n"+"{margin:0;}\n"+".tiddlerLinks > dl > dd:before,\n"+".tiddlerLinks > .lf-list > dl > dd:before\n"+'{content:"";}\n'+"/*}}}*/";store.addNotification("StyleSheetLinksPlugin",refreshStyles)})(jQuery)
// %/
//{{{
// $.fn.linkify 1.0 - MIT/GPL Licensed - More info: http://github.com/maranomynet/linkify/
(function(b){var v=/(^|["'(]|&lt;|\s)(www\..+?\..+?)(([:?]|\.+)?(\s|$)|&gt;|[)"',])/g,w=/(^|["'(]|&lt;|\s)(((https?|ftp):\/\/|mailto:).+?)(([:?]|\.+)?(\s|$)|&gt;|[)"',])/g,x=function(h){return h.replace(v,'$1<a href="<``>://$2">$2</a>$3').replace(w,'$1<a href="$2">$2</a>$5').replace(/"<``>/g,'"http')},q=b.fn.linkify=function(e){e=e||{};if(typeof e=='string'){e={use:e}}var c=e.use,k=q.plugins||{},l=[x],f;if(c){c=b.isArray(c)?c:b.trim(c).split(/ *, */);var m,i;for(var n=0,y=c.length;n<y;n++){i=c[n];m=k[i];if(m){l.push(m)}}}else{for(var i in k){l.push(k[i])}}return this.each(function(){var h=this.childNodes,r=h.length;while(r--){var d=h[r];if(d.nodeType==3){var a=d.nodeValue;if(a.length>1&&/\S/.test(a)){var o,p;f=f||b('<div/>')[0];f.innerHTML='';f.appendChild(d.cloneNode(false));var s=f.childNodes;for(var t=0,g;(g=l[t]);t++){var u=s.length,j;while(u--){j=s[u];if(j.nodeType==3){a=j.nodeValue;if(a.length>1&&/\S/.test(a)){p=a;a=a.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');a=b.isFunction(g)?g(a):a.replace(g.re,g.tmpl);o=o||p!=a;p!=a&&b(j).after(a).remove()}}}}a=f.innerHTML;o&&b(d).after(a).remove()}}else if(d.nodeType==1&&!/^(a|button|textarea)$/i.test(d.tagName)){arguments.callee.call(d)}}})};q.plugins={}})(jQuery);
//}}}
URL: https://plus.google.com/109308865556494599029/posts/3xxC82WkbB8
Video: https://www.youtube.com/watch?v=kraMtDEiu7Y

Did a presentation of my recent work...
!Summary
[[x-tagger]] is a predecessor to TagSearchPlugin and first used at [[tbGTD]] and still in use up until I get to release a new version of [[tbGTD]]. For more information read the current [[official documentation...|http://tbgtd.tiddlyspot.com#%5B%5Bx-tagger%20config%5D%5D]]
!Example
Look for the {{button{x-tag}}} button in any tiddlers toolbar at...

http://tbgtd.tiddlyspot.com <<tiddler iframe with: tbgtd.tiddlyspot.com>>
A personal fun log...
<<tiddlerList  filter:'tiddler.tags&&tiddler.tags.contains("Flog")||store.getValue(tiddler.title,"flog")=="Flog"' top:10 dateFormat:'0DD. mmm YYYY' itemTemplate:'!"""%title"""@@display:block;font-size:0.7em;%created (%tags)@@\n%text\n' order:'-created'>>
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
[[IconTabsPlugin|http://icontabs.tiddlyspace.com]] extends the {{{<<tab macro>>}}} in order to allow you to use icons for tabs...
<<tabs chkTabsAccess
	Public "Public tiddlers" SideBarTabs##Public
	--Private "Private tiddlers" SideBarTabs##Private
	Included "Included spaces" SideBarTabs##Spaces
	Draft "Draft tiddlers" SideBarTabs##Drafts
icons:
>>
For more information, [[see here|IconTabs]]...
/***
This is a custom "plugin" used to override the defaults of other plugins.
For information on how to create your own see http://tiddlywiki.org/#zzConfig
***/


/***
enable evaluated parameters
***/
//{{{
config.evaluateMacroParameters = "full";
//}}}

/***
defaults for [[SinglePageHistory]]
***/
//{{{
merge(config.options, {
    chkOpenDefaultOnEmpty:true,
    chkSinglePageMode: true
});
//}}}

/***
defaults for [[Discuss]]
***/
//{{{
merge(config.macros.discuss.config, {
    always: true,
    header:''
});
//}}}

/***
defaults for [[TagSearch]]
***/
//{{{
config.macros.tagsearch.cfg.keepModified=true;
config.macros.tagsearch.cfg.toolbar="source:TagSearchConfig##Tags more:TagSearchConfig##More mode:2";
//}}}

/***
defaults for [[BetterRss]]
***/
//{{{
config.options.txtRssTag='Journal Plugins Talks Tips';
//}}}

/***
length for activity stream
***/
//{{{
config.macros.activity.RECENTNESS = 31; //one month
//}}}

/***
defaults for [[@Links]]
***/
//{{{
merge(config.macros.links.defaults, {
    fmtExternalItem:'\n:%1',
    fmtExternalPlus:'%0'
});
//}}}

/***
defaults for [[Popup]]
***/
//{{{
merge(config.macros.popup, {
    arrow:'',
    hoverables:'#contentWrapper'
});
//}}}

/***
defaults for [[ListFiltr]]
***/
//{{{
merge(config.macros.listfiltr, {
    defaultPreserve: '.st-bullet, .annotation, .plugin',
});
//}}}


/***
defaults for [[Findr]]
***/
//{{{
merge( config.macros.findr.config, {
    where: '.sidebarTabs .tabContents',
    how: 'appendTo',
    empty: true,
    fmtHeader:'',
    fields:'example',
    btnCloseLabel: "Close Search",
    btnOpenLabel: "Open All"
});

config.macros.search.successMsg = "%0 found matching %1";
//}}}
...the one under the hood with today there being...
;TiddlyWiki Classic (TWc), also TiddlyWiki2 (TW2)
:the classic version of TiddlyWiki version <= 2.x for which most of my plugins were developed
;TiddlyWiki Five (TW5), also TiddlyWiki5
:the next generation TiddlyWiki with a whole new architecture redesigned from scratch, extending on the power of reusing transclusion in the core design and a new widget mechanism
in reply to @pmario:
<<<
I liked the concertina, because it was possible to open eg: 5 tiddlers with 6 clicks, and to permanently display the information inside the relavant tiddler.
...
<<<
+1 on all of it

I guess we all agree that the concertina was not good for switching public/private.

But I can surely imagine very viable use-cases... take [[x-tab|http://tbgtd.tiddlyspot.com/#x-tab]] for example (esp. the button in the toolbar).

I would, however, envision [[The Concertina]] not as a one-at-a-time-container to display information triggered by a single plugin but rather allowing a certain ''content stack'' of inner blocks which to close or remove might either be the responsiblity of the plugin or toolbar button that instanciated it or maybe a standard "x" button for each block that provides that ability ...along with another one to close the whole concertina (if there were multiple blocks in it).

The benefit of that were that those content blocks might even be used in combination with each other... if one dares to think of such. Imagine a plugin to filter something and another being able to do something with the result list (without having to reinvent the filtering!).

@jeremolene wrote:
<<<
One way to implement the concertina that's more inline with classic TiddlyWiki  would be to think of it as the ability to nominate certain tiddler toolbar commands to be tabs that slide open to show their controls, instead of using popups as at present.

For instance, in my ToolbarCommands tiddler, I could define something like:
{{{
|~ViewToolbar|+editTiddler +cloneTiddler > (fields) changeToPublic changeToPrivate (revisions) (syncing) permalink references jump closeOthers < closeTiddler|
|~EditToolbar|+saveTiddler saveDraft -cancelTiddler deleteTiddler|
|~RevisionToolbar|> fields revert|
}}}
<<<
That sounds really good. Understanding the concertina as a tab-panel, however, would go down a different road as opposed to having multple blocks in one concertina container that slides open or closed ...I think it were great - in case [[The Concertina]] evolved - if the user could decide as to whether or not he wanted to use it as a single panel or whether "panels" stack up in multiple blocks within it.
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
<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>
<!--{{{-->
<div id='messageArea'></div>

<div id='topMenu'>
    <div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
</div>

<div id='displayArea'>
    <div id='sidebarTabs'>
        <div class='sidebarHeader'>
            <div class='siteTitle' refresh='content' tiddler='SiteTitle'></div>
            <div class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></div>
            <div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
            <div id='sidebarSearch' macro='search'></div>
        </div>
        <div class='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'>
        </div>
    </div>

    <div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<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-opacity="1" fill-opacity="1" stroke="none" stroke-dasharray="none" fill="#000"  transform="matrix(1.2539275,0,0,1.2539275,-84.35669,-61.200181)">
  <g>
  <path class="glyph" d="m332.86,229.58-25.433,27.703,13.625-2.0437-0.99913,13.261,25.296-28.521-12.489-10.4zm0.27249,7.539c2.3029,0,4.1782,1.83,4.1782,4.0874,0,2.2573-1.8753,4.0874-4.1782,4.0874s-4.1328-1.83-4.1328-4.0874c0-2.2573,1.8299-4.0874,4.1328-4.0874z"/>
 </g>
</g>
</svg>
/***
|''Name''|RandomLinkMacro|
|''Description''|creates a random tiddlyLink (refreshes on click)|
|''Author''|Tobias Beer|
|''Version''|1.5.0 (2011-12-05)|
|''Source''|http://tobibeer.tiddlyspace.com/#RandomLinkMacro|
|''Documentation''|http://tobibeer.tiddlyspace.com/#RandomLink|
|''License''|[[Creative Commons Attribution-Share Alike 3.0|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion''|2.5.3|
!Usage
{{{<<randomlink label:'A random link' tags:"tagA [[tag B]]" class:linkClass close:false>>}}}
!Example
<<randomlink tags:systemConfig class:button>>
!Code
***/
//{{{
config.macros.randomlink={

//OPTIONS
closeLast:true,
cssClass:'tiddlyLink tiddlyLinkExisting',
display:null, //where to display the tiddler {{null, 'top', 'bottom'}}
tipOpen:"Click to show '%0'",

handler:function (place, macroName, params, wikifier, paramString, tiddler)
{
	var p=paramString.parseParams(null,null,true);
	this.get(
		getParam(p,'label',''),
		getParam(p,'tags',''),
		getParam(p,'class',this.cssClass),
		getParam(p,'close',this.closeLast).toString(),
		place
	)
},

get:function(label,tags,css,close,place)
{
	var fst,i,num,out,t,ti,tid,tids=[],ts,
		ev=label||window.event;
		cmr=config.macros.randomlink;

	//GET BUTTON
	if(!place){
		var btn=this,
		label=btn.getAttribute('label'),
		open=btn.getAttribute('tiddler'),
		tags=btn.getAttribute('tags'),
		css=btn.getAttribute('css'),
		close=btn.getAttribute('close')=='true',
		last=btn.getAttribute('last');
	}

	//GET TIDS
	ts=tags?tags.readBracketedList():null;
	if(ts){
		ts.map(function(t){
			var tgt=store.getTaggedTiddlers(t);
			tgt.map(function(t){
				tids.pushUnique(t);
			});
		});
	}else tids=store.getTiddlers();

	//GET NEXT
	num=tids.length;
	if(!num)return;
	t=tids[Math.floor(Math.random()*num)];

	//OUTPUT
	ti=t.title;
	tip=cmr.tipOpen.format([ti]);

	//UPDATE LINK
	if(btn){
		if(!label)btn.innerHTML=ti;
		btn.setAttribute('tiddler',ti);
		btn.setAttribute('title',tip);
		if(ev.ctrlKey)return false;
		else{
			btn.setAttribute('last',open);
			if(close){
				tid=story.findContainingTiddler(btn);
				tid=tid?tid.getAttribute('tiddler'):'';
				if(last&&last!=tid)story.closeTiddler(last,true);
			}
			story.displayTiddler(cmr.display,open);
		}
	}

	//CREATE LINK
	else createTiddlyButton(
		place,label?label:ti,tip,cmr.get,'randomLink '+css,null,null,
		{
			tiddler:ti,
			label:label,
			tags:tags,
			css:css,
			close:close
		}
	);
}
}

//}}}
|''Name''|BookmarkletTheme|
|''Description''|A minimal theme designed to be used with the bookmarklet plugin|
|''PageTemplate''|##PageTemplate|
|''StyleSheet''|##StyleSheet|

!PageTemplate
<!--{{{-->
<div class='topMenu'>
    <ul class='topMenuList'>
    <li class='topMenuItem'><span macro='newTiddler'></span></li>
    <li  id="searchMenuItem" class='topMenuItem'><span macro='search'></span></li>
    </ul>
</div>
<div class='displayHolder'>
    <div id='displayArea'>
        <div id='messageArea'></div>
        <div id='tiddlerDisplay'></div>
    </div>
</div>
<!--}}}-->

!StyleSheet
/*{{{*/
#displayArea {
    margin: 0px 0px 0px 0px;
    display: block;
    max-width: 95%;
    overflow: hidden;
}

.displayHolder {
    position: fixed !important;
    position: absolute;
    overflow-y: auto;
    top: 2.5em;
    bottom: 0em;
    z-index: 1;
    max-width: 100%;
}

#mainMenu {
    padding: 0px;
    margin-bottom: 2px;
    text-align: left;
    width: auto;
}

#sidebarTabs, .tabContent {
    background-color: #B0C2ED;
    left: 0;
}

#sidebar {
    left: -60px;
}

#sidebar ul {
    list-style-type: none;
    margin: 0;
    padding: 0;
}

#sidebar ul li {
    list-style: none outside none;
}

#sidebar ul li.listLink {
    margin-left: 0.75em;
}

.topMenu {
    display: block;
    height: 2em;
    position: fixed !important;
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    background-color: #6D94ED;
    padding-bottom: 5px;
    padding-top: 5px;
    padding-left: 2px;
    padding-right: 2px;
    border-bottom: 1px solid black;
    z-index: 10;
}

body {
    position: absolute;
    width: 100%;
    height: 100%;
    margin: 0;
    padding: 0;
}

#contentWrapper {
    height: 100%;
    width: 100%;
}

#backstageButton, #backstageArea {
    display: none !important;
}

.topMenu ul.topMenuList {
    list-style-type: none;
    padding-left: 0px;
    width: 100%;
    display: block;
    position: absolute;
    margin-top: 0;
}

.topMenu ul.topMenuList li.topMenuItem {

    position: relative;
    float: left;
    padding: 5px;
    display: inline-block;
}

.topMenu ul.topMenuList li.topMenuItem div {
    visibility: hidden;
    position: absolute;
    padding: 10px 5px 5px 5px;
    border: 1px solid black !important;
}

.topMenu .button {
    cursor: pointer;
    border: 0;
    padding-left: 2px;
    padding-right: 2px;
}

.topMenu .button:hover {
    background-color: #FFCC65;
    border-color: #FFAA00;
}

.topMenu ul.topMenuList li.topMenuItem:hover {
    background-color: #FFCC65;
    border-color: #FFAA00;
}

.topMenu ul.topMenuList li.topMenuItem:hover div {
    visibility: visible;
}

.topMenu ul.topMenuList li.topMenuItem div {
    background-color: #B0C2ED !important;
}

.footerMenu {
    background-color: #6D94ED;
    padding-bottom: 5px;
    padding-top: 5px;
    border-top: 1px solid black;
    height: 2em;
    position: fixed !important;
    position: absolute;
    bottom: 0;
    padding-left: 2px;
    padding-right: 2px;
    width: 100%;
    z-index: 10;
}

.footerHolder {
    width: 98%;
}

#searchMenuItem {
    float: right;
    padding: 0;
    margin: 0 1em 0 0;
}
/*}}}*/
tbGTD is probably my most noteworthy contribution to the TiddlyWiki community so far. It provides you with a powerful toolset to manage your actions ~GTD-style or to document your project progress. Nowadays you can create your fresh tbGTD directly from the templates provided at [[TiddlySpot|http://tiddlyspot.com]]. As of today you can get it in both an [[English|http://tbgtd.tiddlyspot.com]] or a [[German|http://tbgtd-deutsch.tiddlyspot.com]] version.
!Check it out at...
http://tbgtd.tiddlyspot.com <<tiddler iframe with: tbgtd.tiddlyspot.com>>
|linkTable|k
|width:400px; !by modified date |width:400px; !by date created |
|{{x{<<timeline "modified">>}}}<<listfiltr>>|{{x{<<timeline "created">>}}}<<listfiltr>>|
/***
|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.
***/
// /%
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){var script=document.createElement("script");script.src=src;document.body.appendChild(script);document.body.removeChild(script)}if(code){if(show)wikify("{{{\n"+lookaheadMatch[0]+"\n}}}\n",w.output);if(label){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)}else{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}}});if(typeof wikifyPlainText=="undefined")window.wikifyPlainText=function(e,t,n){if(t>0)e=e.substr(0,t);var r=new Wikifier(e,formatter,null,n);return r.wikifyPlain()};if(typeof $=="undefined"){function $(e){return document.getElementById(e.replace(/^#/,""))}}
// %/
@Jermolene
@CDent is the mastermind behind TiddlyWeb.
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
A less newbee, more power user oriented sibling to TiddlySpace based on TiddlyWeb.
*http://hoster.peermore.com
<script type="text/javascript">
try { snw.load({"id":'auerworld-2014',"lang":'de'});}catch(e){};
</script>

@@Please do not modify this tiddler; it was created automatically upon space creation.@@
@TiddlyWiki
|~ViewToolbar|+editTiddler +cloneTiddler > fields refreshTiddler changeToPublic changeToPrivate revisions syncing permalink references jump closeOthers < closeTiddler|
|~EditToolbar|+saveTiddler saveDraft -cancelTiddler deleteTiddler|
|~RevisionToolbar|> fields revert|
<<tiddlerList tags:"Fun" dateFormat:"0DD. mmm YYYY" itemTemplate:"*%created - [[%title|%title]] (%tags)\n" order:"-created">>
[[GetRandomTids|http://pastebin.com/raYiJin7]] is a script which requires InlineJavascriptPlugin and is now superceded by [[RandomTiddlersMacro|RandomTiddlers]]. As of 2011-02-20 the [[documentation|RandomTiddlers]] is almost identical for both, except that you use [[GetRandomTids|http://pastebin.com/raYiJin7]] via transclusion like this...
{{{
<<tiddler GetRandomTids with: ConfigTiddler>>
}}}
The last version can be found here:
*http://pastebin.com/raYiJin7

The last commented version:
*http://pastebin.com/k4L1bG7Q

The discussion that lead to the creation of both [[GetRandomTids|http://pastebin.com/raYiJin7]] and [[RandomTiddlersMacro|RandomTiddlers]]:
*https://groups.google.com/group/tiddlywiki/browse_frm/thread/e586292de460d95f
<html><div style="margin:0;width:980px;height:500px;overflow:hidden;position:relative;border:none;"><iframe style="position:absolute;margin:15px 0 0 -5px;top:-400px;left:-400px; width:1280px;height:1200px;" src="http://ckeditor.com/demo" scrolling=no></iframe></div><div style="clear:both"></div></html>
!RSS with Author
As suggested [[here|http://groups.google.com/group/tiddlywiki/browse_frm/thread/81566f55d28cc326]], you could use a small plugin that hijacks and extends {{{tiddlerToRssItem}}}:
{{{
(function() { 
var _tiddlerToRssItem = tiddlerToRssItem; 
tiddlerToRssItem = function(tiddler, uri) { 
    var author = tiddler.modifier.htmlEncode(); 
    return _tiddlerToRssItem.apply(this, arguments). 
        replace("</link>", "</link><author>" + author + "</author>"); 
}; 
})();
}}}
!RSS feed only for certain tagged tiddlers
Change respective code in {{{function generateRss()}}} to...
{{{
	var n = config.numRssItems > tiddlers.length ? 0 : tiddlers.length-config.numRssItems;
	for(var i=tiddlers.length-1; i>=n; i--) {
		if(tiddlers[i].tags.containsAny(config.options.txtRSSTag.readBracketedList())){
			s.push("<item>\n" + tiddlerToRssItem(tiddlers[i],u) + "\n</item>");
		}
	}
}}}
Then set the desired tags in your [[zzConfig]] tiddler tagged {{{systemConfig}}} or use AdvancedOptions to save {{{txtRSSTag}}} as a temporary cookie:
{{{
config.options.txtRSSTag="feed [[important notice]]";
}}}
''~ToDo:'' Needs a proper hijack to be a plugin.
/***
|''Name:''|TableSortingPlugin|
|''Description:''|Dynamically sort tables by clicking on column headers|
|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|
|''Source:''|http://tw.lewcid.org/#TableSortingPlugin|
|''Code Repository:''|http://tw.lewcid.org/svn/plugins|
|''Version:''|2.03|
|''Date:''|24-09-2010|
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.2.3|
@@color:red;Mod by Tobias Beer! Refactored the refresh handler to allow triggering a refresh in other macros without refreshing the tiddler!@@
***/
//{{{
config.tableSorting = {
	
	darrow: "\u2193",
	uarrow: "\u2191",
	
	getText : function (o) {
		var p = o.cells[SORT_INDEX];
		return p.innerText || p.textContent || '';
	},

	sortTable : function (o,rev) {
		SORT_INDEX = o.getAttribute("index");
		var c = config.tableSorting;
		var T = findRelated(o.parentNode,"TABLE");
		if(T.tBodies[0].rows.length<=1) 
			return;
		var itm = "";
		var i = 0;
		while (itm == "" && i < T.tBodies[0].rows.length) {
			itm = c.getText(T.tBodies[0].rows[i]).trim();
			i++;
		}
		if (itm == "") 
			return; 	
		var r = [];
		var S = o.getElementsByTagName("span")[0];		
		c.fn = c.sortAlpha; 
		if(!isNaN(Date.parse(itm)))
			c.fn = c.sortDate; 
		else if(itm.match(/^[$|£|€|\+|\-]{0,1}\d*\.{0,1}\d+$/)) 
			c.fn = c.sortNumber; 
		else if(itm.match(/^\d*\.{0,1}\d+[K|M|G]{0,1}b$/)) 
			c.fn = c.sortFile; 
		for(i=0; i<T.tBodies[0].rows.length; i++) {
			 r[i]=T.tBodies[0].rows[i]; 
		} 
		r.sort(c.reSort);
		if(S.firstChild.nodeValue==c.darrow || rev) {
			r.reverse();
			S.firstChild.nodeValue=c.uarrow;
		} 
		else 
			S.firstChild.nodeValue=c.darrow;
		var thead = T.getElementsByTagName('thead')[0]; 
		var headers = thead.rows[thead.rows.length-1].cells;
		for(var k=0; k<headers.length; k++) {
			if(!hasClass(headers[k],"nosort"))
				addClass(headers[k].getElementsByTagName("span")[0],"hidden");
		}
		removeClass(S,"hidden");
		for(i=0; i<r.length; i++) { 
			T.tBodies[0].appendChild(r[i]);
			c.stripe(r[i],i);
			for(var j=0; j<r[i].cells.length;j++){
				removeClass(r[i].cells[j],"sortedCol");
			}
			addClass(r[i].cells[SORT_INDEX],"sortedCol");
		}
	},

	stripe : function (e,i){
		var cl = ["oddRow","evenRow"];
		i&1? cl.reverse() : cl;
		removeClass(e,cl[1]);
		addClass(e,cl[0]);
	},

	sortNumber : function(v) {
		var x = parseFloat(this.getText(v).replace(/[^0-9.-]/g,''));
		return isNaN(x)? 0: x;
	},

	sortDate : function(v) {
		return Date.parse(this.getText(v));
	},

	sortAlpha : function(v) {
		return this.getText(v).toLowerCase();
	},

	sortFile : function(v) { 		
		var j, q = config.messages.sizeTemplates, s = this.getText(v);
		for (var i=0; i<q.length; i++) {
			if ((j = s.toLowerCase().indexOf(q[i].template.replace("%0\u00a0","").toLowerCase())) != -1)
				return q[i].unit * s.substr(0,j);
		}
		return parseFloat(s);
	},
	
	reSort : function(a,b){
		var c = config.tableSorting;
		var aa = c.fn(a);
		var bb = c.fn(b);
		return ((aa==bb)? 0 : ((aa<bb)? -1:1));
	},
	
	refresh : function(elem){
		var ts = elem.getElementsByTagName("TABLE");
		var c = config.tableSorting;
		for(var i=0;i<ts.length;i++){
			if(hasClass(ts[i],"sortable")){
				var x = null, rev, table = ts[i], thead = table.getElementsByTagName('thead')[0], headers = thead.rows[thead.rows.length-1].cells;
				for (var j=0; j<headers.length; j++){
					var h = headers[j];
					if (hasClass(h,"nosort"))
						continue;
					h.setAttribute("index",j);
					h.onclick = function(){c.sortTable(this); return false;};
					h.ondblclick = stopEvent;
					if(h.getElementsByTagName("span").length == 0)
						createTiddlyElement(h,"span",null,"hidden",c.uarrow); 
					if(x===null && hasClass(h,"autosort")) { 
						x = j;
						rev = hasClass(h,"reverse");
					}
				}
				if(x)
					c.sortTable(headers[x],rev);		
			}
		}
	}
};

Story.prototype.tSort_refreshTiddler = Story.prototype.refreshTiddler;
Story.prototype.refreshTiddler = function(title,template,force,customFields,defaultText){
	var elem = this.tSort_refreshTiddler.apply(this,arguments);
	if(elem)config.tableSorting.refresh(elem);
	return elem; 
};

setStylesheet("table.sortable span.hidden {visibility:hidden;}\n"+
	"table.sortable thead {cursor:pointer;}\n"+
	"table.sortable .nosort {cursor:default;}\n"+
	"table.sortable td.sortedCol {background:#ffc;}","TableSortingPluginStyles");

function stopEvent(e){
	var ev = e? e : window.event;
	ev.cancelBubble = true;
	if (ev.stopPropagation) ev.stopPropagation();
	return false;	
}

config.macros.nosort={
	handler : function(place){addClass(place,"nosort");}
}

config.macros.autosort={
	handler : function(place,m,p,w,pS){addClass(place,"autosort"+" "+pS);}
}
//}}}
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
{{linkList{
*//My Projects//
**@Customize
**@Scripts
**//Bit older...//
***@ShowRoom
***@Semantic
*//Tutorials//
**@Formatting
**@MarkDownTutor
*//Themes Created By Me//
**@tbTheme
**@tbThemeFull
**@tbLattice (mod for @lattice)
*//Plugins Spaces//
**//My Plugins//
***@BulletGraph
***@Evalify
***@Filtr
***@FloatObject
***@HideWhenPlugin
***@Listr
***@ListFiltr
***@MasterIncludes
***@MessageFadeout
***@Popup
***@ShowDown
***@SimpleSearchPlugin
***@SinglePageModePlugin (not working yet)
***@TabScroll
***@TagSearchPlugin
***@ToggleSideBarTB
***@Twyp (TiddlyWiki youtube player)
***@TypeWithMe (document collaboration)
**//Maintained By Me//
***@GotoPlugin
*//Contributions//
**@Community  """//""" @CommunityDev  — css & layout
**@TiddlyWorld — css & layout
**@RajiChandrasekhar — created theme
}}}

<<listfiltr>>
/***
|''Name''|EvalifyPlugin|
|''Description''|a simple macro to wikify evaled output|
|''Version''|1.0|
|''Type''|macro|
|''Author''|[[TobiasBeer]]|
|''Source''|http://evalify.tiddlyspace.com|
|''Documentation''|http://tobibeer.tiddlyspace.com/#Evalify|
|''License''|[[Creative Commons Attribution-Share Alike 3.0|http://creativecommons.org/licenses/by-sa/3.0/]]|
***/
//{{{
config.macros.evalify={handler:function(place,macroName,params,wikifier,paramString,tiddler){
  var out=eval(params.shift());
  var el=params.shift();
  if(el)el=document.getElementById(el);
  el=el?el:place;
  if(out)wikify(out,el);
}}
//}}}
Below is a list of <<tag Plugins "all my plugins">>.

<<get "##Summary" list filter:"[tag[Plugins]]" format:"{{plugin{\n{{title{[[%1 »|%1]]}}}%0\n}}}" listfiltr>>
!Summary
Based on a little script @FND once posted on the google groups, I created @MessageFadeOut ...a tiny plugin that makes your TiddlyWiki status message fade after a few seconds.
!Details
To use it, simply include the @MessageFadeOut space or get the plugin [[from there|MessageFadeOut]]. You can adjust {{{config.options.txtFadeTimer}}} to the number of milliseconds after which you want the message to disappear.
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
/***
|''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|
/%***/
(function(e){config.macros.tagsearch={cfg:{defaultSource:"",defaultMore:"",defaultMode:1,keepModified:false,sidebarOffset:20,newAtSingle:30,newAt:18,excludeTagged:"",toolbar:"",label:"tags",options:"Options",more:"More...",tooltip:"Manage tiddler tags",notags:"no tags set...",aretags:"Current tags",addTag:"Add tag...",addTags:"Set tag...",txtEdit:"~ edit categories...",txtEditTip:"edit tiddler with GTD tag categories used by x-tagger",txtNew:"~ add another tag",txtRemove:"remove tag %0",txtAdd:"set tag %0",txtFor:"To be tagged... ",txtCtrl:" (hold SHIFT to just add it or CTRL to replace in category)",promptNew:"Enter new tag:",modeAsk:"Do you want to remove existing tags from category '%0'?\nCancel simply adds tag '%1'."},handler:function(k,g,i,l,h,n){var m=this.cfg,j=story.findContainingTiddler(k),f=h.parseParams("tagman",null,true);e(createTiddlyButton(k,getParam(f,"label",m.label),getParam(f,"tooltip",m.tooltip),this.click,"button")).attr({id:this.newId("btntgs"),tid:(j?j.getAttribute("tiddler"):"")}).data({pa:i,p:f})},click:function(O){var k,G,S,R,K=[],w=true,W,V,U,M,A,Y,T,D,N,L,J=[],C,f,H,aa=O||window.event,X=e(this),F=X.attr("popup"),B=window.event?"keydown":"keypress",I=config.macros.tagsearch,ab=I.cfg,u=X.data("pa"),Q=X.data("p"),h=u.contains("toolbar"),v=getParam(Q,"source",ab.defaultSource),q=getParam(Q,"more",ab.defaultMore),Z=!u.contains("nosearch"),z=!u.contains("notags"),E=!u.contains("nomore"),n=getParam(Q,"goto",""),o=parseInt(getParam(Q,"mode")),g=getParam(Q,"tiddler",""),r=g?g:X.attr("tid"),ac=(getParam(Q,"exclude","")+" "+ab.excludeTagged).readBracketedList(),y=nu=v?ab.newAt:ab.newAtSingle,P=store.getTiddler(r);if(!r){return}o=isNaN(o)?ab.defaultMode:o;ac.map(function(i){K.pushUnique(i)});for(W=0;W<ac.length;W++){store.getTaggedTiddlers(ac[W]).map(function(i){K.pushUnique(i.title)})}if(v&&!store.getTiddlerText(v)){return false}if(F){D=e("#"+F)[0];e(D).empty()}if(!D){M=true;F=I.newId("tgspop");D=Popup.create(this);e(D).addClass("tgs").attr({id:F}).data({btn:X,tiddler:r,source:v,mode:o}).click(I.noBubble);X.attr("popup",F)}if(v){C=store.getTiddlerText(v).readBracketedList();for(L=0;L<C.length;L++){if(!K.contains(C[L])){H=store.getTaggedTiddlers(C[L]);J.push("TAG:"+C[L]);for(N=0;N<H.length;N++){if(!K.contains(H[N].title)){J.push(H[N].title)}}}}}else{J=store.getTags()}G=P?P.tags.sort():[];Y=function(j,i){return createTiddlyElement(createTiddlyElement(j,"li",null,null),"ol",null,i?i:null)};A=function(j,x,i,p){var m,l;m=createTiddlyElement(createTiddlyElement(j,"li"),"span",null,null);l=e(createTiddlyButton(m,x,p.format(["'"+i+"'"]),I.setTag,"button toggleButton",null));l.data({tiddler:r,tag:i,source:v,mode:o});insertSpacer(m);createTagButton(m,i)};S=Y(D,"tgside");if(config.macros.gotoTiddler&&Z){R=Y(S);if(g){U=createTiddlyElement(R,"li",null,"addto","");wikify("{{title{"+ab.txtFor+"}}}<<tag [["+r+"]]>>",U);R=Y(S)}createTiddlyElement(R,"li",null,"title",ab.addTag);wikify("<<gotoTiddler "+n+" >>",R);e("input",D).bind(B,I.noBubble).data("notify",config.macros.tagsearch.notify).focus()}R=Y(S);createTiddlyElement(R,"li",null,"title",ab.aretags);if(G.length==0){wikify("{{notags{"+ab.notags+"}}}",R)}else{for(L=0;L<G.length;L++){A(R,"[X]",G[L],ab.txtRemove)}}if(z){for(W=0;W<J.length;W++){nu++;f=v?J[W]:J[W][0];if(f.indexOf("TAG:")==0){f=f.substr(4);if(nu>y){nu=0;S=Y(D)}R=Y(S);nu++;createTiddlyLink(createTiddlyElement(R,"li",null,null),f,f,"title")}else{if(!G.contains(f)&&!K.contains(f)){if(!v&&nu>y||v&&nu>ab.newAtSingle){nu=0;S=Y(D);R=Y(S);if(w){createTiddlyElement(createTiddlyElement(R,"li",null,null),"li",null,"title",ab.addTags);w=false}}A(R,"["+String.fromCharCode(160,160,160)+"]",f,ab.txtAdd+(v?ab.txtCtrl:""))}}}}if(E){S=Y(D,"tgside");R=Y(S);createTiddlyElement(R,"li",null,"title",ab.options,null);createTiddlyButton(createTiddlyElement(R,"li"),ab.txtNew,null,I.setTag,"tsopt",null,null,{tiddler:r});if(v){createTiddlyButton(createTiddlyElement(R,"li"),ab.txtEdit,ab.txtEditTip,onClickTiddlerLink,"tsopt",null,null,{tiddlyLink:v.split("##")[0]})}w=true;if(q){T=store.getTiddlerText(q).readBracketedList();if(T.length>0){for(W=0;W<T.length;W++){f=T[W];if(f.indexOf("TAG:")==0){f=f.substr(4,f.length-4);R=Y(S);createTiddlyLink(createTiddlyElement(R,"li",null,null),f,f,"title");k=store.getTaggedTiddlers(f);for(V=0;V<k.length;V++){f=k[V].title;if(!G.contains(f)&&!K.contains(f)){A(R,"["+String.fromCharCode(160,160)+"]",f,ab.txtAdd)}}}else{if(w){R=Y(S);createTiddlyElement(R,"li",null,"title",ab.more);w=false}if(!G.contains(f)&&!K.contains(f)){A(R,"["+String.fromCharCode(160,160)+"]",f,ab.txtAdd)}}}}}}if(M){Popup.show(D,false);if(h){N=document.getElementById("sidebarTabs");D.style.left="";D.style.right=(ab.sidebarOffset+(N?N.offsetWidth:0))+"px"}}return I.noBubble(aa)},setTag:function(w){var q,j,z,l=true,n,u,s,g,v=w||window.event,k=config.macros.tagsearch,y=k.cfg,f=e(this),o=f.closest(".tgs"),i=o.data("btn"),A=f.data("tag"),B=o.data("tiddler"),h=o.data("source"),r=parseInt(o.data("mode"));if(!A){z=prompt(y.promptNew,"");if(!z){return false}else{A=z}}tid=k.exists(B,A);if(tid){u=tid.tags;if(!u.contains(A)){if(h&&r<2&&!v.shiftKey){j=store.getTiddlerText(h).readBracketedList();findTagged:for(q=0;q<j.length;q++){g=j[q];s=store.getTaggedTiddlers(g).map(function(m){return m.title});if(s.contains(A)){s.splice(s.indexOf(A),1);if(!v.ctrlKey&&r==1&&u.containsAny(s)){l=confirm(y.modeAsk.format([g,A]))}if(l){for(n=0;n<s.length;n++){g=s[n];if(u.contains(g)){store.setTiddlerTag(B,false,g)}}}break findTagged}}}store.setTiddlerTag(B,true,A)}else{if(!z){store.setTiddlerTag(B,false,A)}}n=store.getTiddler(B);store.saveTiddler(B,B,n.text,y.keepModified?n.modifier:config.options.txtUserName,y.keepModified?n.modified:new Date(),n.tags,n.fields)}if(config.options.chkAutoSave){autoSaveChanges()}i.click();o.find("input").focus();return k.noBubble(v)},newId:function(f){return f+Math.random().toString().substr(3)},notify:function(f,h){var j=e(h).closest(".tgs"),g=e("form input",j)[0];t=config.macros.tagsearch.exists(j.data("tiddler"),f);if(t&&!t.tags.contains(f)){store.setTiddlerTag(t.title,t,f)}j.data("btn").click();g.select()},exists:function(i,g){if(!store.getTiddler(i)){var h=merge({},config.defaultCustomFields);store.saveTiddler(i,i,"",config.options.txtUserName,new Date(),g,h);return false}return store.getTiddler(i)},noBubble:function(g){var h=g||window.event,f=resolveTarget(h);if(h.keyCode==27){Popup.remove(0)}else{if(h.type!="click"&&f.nodeName.toUpperCase()=="INPUT"){return true}}if(hasClass(f,"tiddlyLink")){return true}Popup.remove(1);h.cancelBubble=true;try{event.keyCode=0}catch(h){}if(window.event){h.returnValue=false}if(h.preventDefault){h.preventDefault()}if(h.stopPropagation){h.stopPropagation()}return false}};config.commands.tagSearch={};var d=config.macros.toolbar;d.createCommandTAGS=d.createCommand;d.createCommand=function(f,h,g,i){if(h=="tagSearch"){wikify("<<tagsearch toolbar "+config.macros.tagsearch.cfg.toolbar+">>",f);e(f.lastChild).attr({commandName:"tagSearch",tiddler:g.title})}else{d.createCommandTAGS.apply(this,arguments)}};var b=config.macros.gotoTiddler;if(b){b.processItem=function(i,g,h,f){if(!i.length){return}h.style.display=f?"block":"none";if(i=="*"){story.search(g.value);return false}if(!f){g.value=i}var j=e(g).data("notify");if(j){j.call(this,i,g)}else{story.displayTiddler(null,i)}return false};b.IEtableFixup="%0"}var c=store.getTiddlerText("ColorPalette::TertiaryMid"),a=store.getTiddlerText("ColorPalette::TertiaryDark");config.shadowTiddlers.StyleSheetTagSearch="/*{{{*/\n.tgs {padding:7px !important;-moz-border-radius:5px; -webkit-border-radius:5px;border-radius:5px;}\n.tgs li a, .tgs .quickopentag .tiddlyLink {display:inline;padding:2px;clear:none;}\n.tgs li a.toggleButton {display:inline;margin-left:5px;}\n.tgs .title {margin:3px 0 0 5px;font-weight:bold;font-size:120%;color:"+c+";padding:0;}\n.tgs form{display:block;float:left;clear:both;padding-left:5px !important;}\n.tgs .addto .quickopentag{display:block;clear:both;padding:5px;font-size:120%;}\n.tgs .notags, .tsopt{display:block;clear:both;margin:5px;}\n.tgs .highlight{background:"+a+";}\n.tgs ol{margin:0;padding:0 0 5px 0;}\n.tgs li{display:block;float:left;padding-bottom:10px !important;}\n.tgs li span{line-height:1em;}\n.tgs li ol li{clear:both;min-width:120px;display:inline;border:1px solid transparent;}\n.tgs li ol li:hover{border:1px solid "+c+";}\n.tgs li ol li ol li{padding:0 !important;}\n.tgs li ol li ol li:hover{border:1px solid transparent;}\n.tgside li ol li {min-width:150px;}.tgs .quickopentag {display:inline;}\n.tgs .quickopentag .tiddlyLink:hover {text-decoration:underline;}\n.tgs .quickopentag .button {border:0;padding:2px;font-size:1.5em;}\n/*}}}*/";store.addNotification("StyleSheetTagSearch",refreshStyles)})(jQuery);
//%/
For time being...
*{{{query:select=bag:!Jon_public&select=tag:!foo}}}
...is what @Jon suggests as a workaround to the following problem:

I would like to be able to define exclusion parameters for the {{{<<tsScan>>}}} macro. The most simple cases would be to exclude the current space, it's owner (or members?) or the user viewing it, e.g.:

*hideSpace
*hideUser
*hideOwner
*hideMembers
*hide:space,space,space,space... (named parameter)

Useful? To understand why I want that, take a look at [[Exclusion with tsScan]]@tobibeer ...in a new browser tab or window. Depending on how a tiddler is tagged it fetches a scan of {{title{What everyone says right now...}}}

@@color:#999;By the way, I think it were really great if those almost-core features and their parameters were somewhat documented at a well known spot.@@
@Matias
<<tiddlerList tags:"Sites" dateFormat:"0DD. mmm YYYY" itemTemplate:"*%created - [[%title|%title]] (%tags)\n" order:"-created">>
I recently started an endeavour to create a website for a friend of mine based on TiddlyWiki... eventually not showing much of TiddlyWiki in the final product but leveraging all it's powerfull features, especially - but not exclusively - in the local copy that serves as a kind of editing backend.

There's still (quite) some work for me to do on this ~TiddlyWiki-Website and also elsewhere, so I'd prefer if you not (yet) asked a million questions about it, so I can concentrate on getting it done. I will post back right here on the progress and edit this article as the project matures.
!Features
<html><a href="http://therapie-sport.de" title="link to a draft of the website" target="_blank" style="border:5px solid #eee;margin-top:2em;float:right;display:block;-webkit-border-radius: 5px;-moz-border-radius: 5px;border-radius:5px;width:400px;padding:0;"><img src="http://therapie-sport.de/img/seiten/KontaktWebdesign.jpg" alt="Website draft" style="width:400px;"/></a></html>
*''frontend and backend...''
**sitemap
**dropdown mainmenu
**breadCrumbs ...in their traditional meaning
**smart, prepopulated, contact forms
**reference links as a cute dropdown
**accordion effect to open and close sections
**search via GotoPlugin
**configurable RSS feed of only content pages
**configurable content cloud
**"what others say" ticker
**page images in the sidebar
**lightbox
*''only backend...''
**revision system
**backend notes not shown on the website
**exporting the whole wiki to [[a working single-page non-javascript and also printable alternative|http://therapie-sport.de/index2.html]]
**delicious tagging
!Yet to be done
*integrate [[UploadPlugin|http://tiddlywiki.bidix.info/#UploadPluginDoc]] and [[store.php|http://tiddlywiki.bidix.info/#store.php]] from [[BidiX|http://tiddlywiki.bidix.info/]] to only need [[FileZilla|http://www.filezilla.de/]] if not some other php script for uploading images.
*shrink and externalize core and plugins for faster loadtimes, smaller uploads and smaller backups
!Summary
[[x-tab]] is a plugin that allows you to show crosstables of tags, thus with tiddlers matching both tags in the intersections. It allows you to define your own presets and to interactively change the displayed table. You can also set it up as a button in the toolbar to display a predefined table template depending on how a tiddler is tagged.
!Details
For more information read the current [[official documentation...|http://tbgtd.tiddlyspot.com#%5B%5Bx-tab%20info%5D%5D]]
!Example
Look for the {{button{x-tab}}} button in any tiddlers toolbar at...

http://tbgtd.tiddlyspot.com <<tiddler iframe with: tbgtd.tiddlyspot.com>>
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]].
This initially was a quickshot at improving the new lattice theme now being the TiddlySpace default.

Check it out at @tbLattice and compare it to @lattice

Here's where it's different from the default theme...
*layout and color changes
**wider tiddlers
**different tabs
**basic fixes to the awfully messy backstage area
*nice toolbar icons
!Tips
Try including @TabScroll as seen on the previous @LatticeTest
/***
|''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);
//}}}
{{annotation{
Looking for [[LinksPlugin|@Links]]? [[See here...|@Links]]
}}}
{{linkList{

*//TiddlySpace//
**@Docs """//""" @Glossary """//""" @FAQ """//""" @Security """//""" @WikiText
**@Spaces """//""" @Featured """//""" @Blog """//""" @Osmosoft
**@Translations
**//@Themes//
***[[TiddlySpace Themes|http://customize.tiddlyspace.com/#%5B%5BTiddlySpace%20Theme%20Scan%5D%5D]]
*//Apps//
**//Presentation & 3D//
***@Preso (cecily - @jermolene)
***@MetaCrap
**//Maps//
***@Maps
***@OpenMaps (@jon)
*//Tools//
**//TiddlySpace Tools//
***@InclusionSort
***@gAnalytics
***@Edit
**//Editing//
***[[CkEditor]]
**//Graphics//
***[[Graphics]]
***@IconBuilder (@pmario)
**//Connect//
***[[Video Chat]]
***[[IRC]]
**//Media//
***[[Flog]]
***[[TapeTv]]
** //Files//
***[[PipeBytes]]
*//Templates//{{x{
{{noTitle{<<tagging Templates>>}}}
}}}
}}}
<<listfiltr>>
<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>
/***
|''Name''|ToggleTiddlerPrivacyPlugin|
|''Version''|0.7.1|
|''Status''|@@beta@@|
|''Description''|Allows you to set the privacy of new tiddlers and external tiddlers within an EditTemplate, and allows you to set a default privacy setting|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/ToggleTiddlerPrivacyPlugin.js|
!Notes
When used in conjunction with TiddlySpaceTiddlerIconsPlugin changing the privacy setting will also interact with any privacy icons.

Currently use of
{{{<<setPrivacy defaultValue:public>>}}} is in conflict with {{{<<newTiddler fields:"server.workspace:x_private">>}}}

There is an option, found in the tweak tab of the backstage, called txtPrivacyMode. Set this to either ''public'' or ''private'' depending on your security preference. If you choose not to set it then it will default to ''public''.
!Params
defaultValue:[private|public]
Allows you to set the default privacy value (Default is private)

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

	var tiddlyspace = config.extensions.tiddlyspace,
		macro;
	macro = config.macros.setPrivacy = {
		handler: function(place, macroName, params, wikifier, paramString, tiddler) {
			if(readOnly) {
				return;
			}
			var el = $(story.findContainingTiddler(place)),
				args = paramString.parseParams("name",
					null, true, false, true)[0],
				container = $("<div />").
					addClass("privacySettings").
					appendTo(place)[0],
				currentSpace = tiddlyspace.currentSpace.name,
				currentBag = tiddler ? tiddler.fields["server.bag"] : false,
				// XXX: is the following reliable?
				isNewTiddler = el.hasClass("missing") || !currentBag,
				tiddlerStatus = tiddlyspace.getTiddlerStatusType(tiddler),
				customFields = el.attr("tiddlyfields"),
				defaultValue = "public",
				options = config.macros.tiddlerOrigin ?
						config.macros.tiddlerOrigin.getOptions(paramString) :
						{};
			customFields = customFields ? customFields.decodeHashMap() : {};
			if(isNewTiddler || !["public", "private", "unsyncedPrivate",
					"unsyncedPublic"].contains(tiddlerStatus)) {
				if(args.defaultValue) {
					defaultValue = args.defaultValue[0].toLowerCase();
				} else {
					defaultValue = config.options.chkPrivateMode ?
							"private" : "public";
				}
				defaultValue = defaultValue ?
						"%0_%1".format(currentSpace, defaultValue) :
						customFields["server.bag"];
				this.createRoundel(container, tiddler, currentSpace,
						defaultValue, options);
			}
		},
		updateEditFields: function(tiddlerEl, bag) {
			var saveBagField = $('[edit="server.bag"]', tiddlerEl),
				saveWorkspaceField = $('[edit="server.workspace"]', tiddlerEl),
				input = $("<input />").attr("type", "hidden"),
				workspace = "bags/" + bag;
			if(saveBagField.length === 0) {
				input.clone().attr("edit", "server.bag").val(bag).
					appendTo(tiddlerEl);
			} else {
				saveBagField.val(bag);
			}
			// reset to prevent side effects
			$(tiddlerEl).attr("tiddlyFields", "");
			if(saveWorkspaceField.length === 0) {
				input.clone().attr("edit", "server.workspace").
					val(workspace).appendTo(tiddlerEl);
			} else {
				saveWorkspaceField.val(workspace);
			}
		},
		setBag: function(tiddlerEl, newBag, options) {
			var bagStatus,
				title = $(tiddlerEl).attr("tiddler"),
				tiddler = store.getTiddler(title),
				originButton = $(".originButton", tiddlerEl)[0],
				refreshIcon,
				newWorkspace = "bags/" + newBag,
				rPrivate = $("input[type=radio].isPrivate", tiddlerEl),
				rPublic = $("input[type=radio].isPublic", tiddlerEl);
			refreshIcon = function(type) {
				var originMacro = config.macros.tiddlerOrigin;
				if(originButton && originMacro) {
					options.noclick = true;
					originMacro.showPrivacyRoundel(tiddler, type,
							originButton, options);
				}
			};
			macro.updateEditFields(tiddlerEl, newBag);
			if(tiddler) {
				tiddler.fields["server.bag"] = newBag;
				// for external tiddlers
				tiddler.fields["server.workspace"] = newWorkspace;
			}
			if(newBag.indexOf("_public") > -1) {
				rPrivate.attr("checked", false);
				rPublic.attr("checked", true);
				bagStatus = "public";
			} else {
				rPublic.attr("checked", false); // explicitly do this for ie
				rPrivate.attr("checked", true);
				bagStatus = "private";
			}
			refreshIcon(bagStatus);
		},
		createRoundel: function(container, tiddler, currentSpace,
							   defaultValue, options) {
			var privateBag = "%0_private".format(currentSpace),
				publicBag = "%0_public".format(currentSpace),
				rbtn = $("<input />").attr("type", "radio").
					attr("name", tiddler.title),
				el = story.findContainingTiddler(container);
			rbtn.clone().val("private").addClass("isPrivate").
				appendTo(container);
			$("<label />").text("private").appendTo(container); // TODO: i18n
			rbtn.clone().val("public").addClass("isPublic")
				.appendTo(container);
			$("<label />").text("public").appendTo(container); // TODO: i18n
			$("[type=radio]", container).click(function(ev) {
				var btn = $(ev.target);
				tiddler.fields["server.page.revision"] = "false";
				if(btn.hasClass("isPrivate")) { // private button clicked.
					$(el).addClass("isPrivate").removeClass("isPublic");
					macro.setBag(el, privateBag, options);
				} else {
					$(el).addClass("isPublic").removeClass("isPrivate");
					macro.setBag(el, publicBag, options);
				}
			});
			window.setTimeout(function() {
				macro.setBag(el, defaultValue, options);
			}, 100);
			// annoyingly this is needed as customFields are added to end of EditTemplate so are not present yet
			// and don't seem to respect any existing customFields.
		}
	};

}(jQuery));
//}}}
Here are some tools that might come in handy with web colors and graphics...
<<tabs
    chkColorTools
    Wheel Wheel Graphics##WHEEL
    "SVG Editor" "SVG Editor" Graphics##SVG
    Harmony Harmony Graphics##HARMONY
    Blender Blender Graphics##BLENDER
    OdoSketch OdoSketch Graphics##ODO
>>/%
!ODO
<<tiddler iframe with: sketch.odopod.com/sketches/new>>
http://sketch.odopod.com
!BLENDER
<<tiddler iframe with: meyerweb.com/eric/tools/color-blend>>
http://www.meyerweb.com/eric/tools/color-blend ...thanks @PMario
!WHEEL
<<tiddler iframe with: www.ficml.org/jemimap/style/color/wheel.html>>
http://www.ficml.org/jemimap/style/color/wheel.html  ...thanks @PMario
!HARMONY
<<tiddler iframe with: mrdoob.com/projects/harmony/>>
http://mrdoob.com/projects/harmony/ ...thanks @BauweBijl
!SVG
<<tiddler iframe with: svg-edit.googlecode.com/svn/branches/2.5.1/editor/svg-editor.html>>
http://svg-edit.googlecode.com/svn/branches/2.5.1/editor/svg-editor.html ...thanks @AlexHough
!END%/
var user, userbag;
var friends = [];
var host = "http://tiddlyspace.com";

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

function printMessage(txt) {
	alert(txt);
}

function printError(txt) {
	alert(txt);
}

var simpleDate = (function() {

	var measures = {
		second: 1,
		minute: 60,
		hour: 3600,
		day: 86400,
		week: 604800,
		month: 2592000,
		year: 31536000
	};

	var chkMultiple = function(amount, type) {
		return (amount > 1) ? amount + " " + type + "s":"a " + type;
	};

	return function(thedate) {

		var dateStr, amount,
			current = new Date().getTime(),
			diff = (current - thedate.getTime()) / 1000; // work with seconds

		if(diff > measures.year) {
			amount = Math.round(diff/measures.year);
			dateStr = "about " + chkMultiple(amount, "year") + " ago";
		} else if(diff > measures.month) {
			amount = Math.round(diff/measures.month);
			//if(typeof amount == "")
			dateStr = "about " + chkMultiple(amount, "month") + " ago";
		} else if(diff > measures.week) {
			amount = Math.round(diff/measures.week);
			dateStr = "about " + chkMultiple(amount, "week") + " ago";
		} else if(diff > measures.day) {
			amount = Math.round(diff/measures.day);
			dateStr = "about " + chkMultiple(amount, "day") + " ago";
		} else if(diff > measures.hour) {
			amount = Math.round(diff/measures.hour);
			dateStr = "about " + chkMultiple(amount, "hour") + " ago";
		} else if(diff > measures.minute) {
			amount = Math.round(diff/measures.minute);
			dateStr = "about " + chkMultiple(amount, "minute") + " ago";
		} else {
			dateStr = "a few seconds ago";
		}

		return dateStr;

	};
})();

function prettyDate(t) {
	var date = 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)
	));
	return simpleDate(date);
}

function endsWith(str, suffix) {
	return str.indexOf(suffix) == str.length - suffix.length;
}

function isShadow(tid) {
	var shadows = ["MarkupPreHead", "DefaultTiddlers", "PageTemplate", "SideBarTabs",
		"GettingStarted", "MainMenu", "SiteTitle", "SiteSubtitle", "ColorPalette",
		"SiteIcon", "ViewTemplate", "EditTemplate", "ServerSettings", "MarkupPostHead",
		"MarkupPostBody", "MarkupPreBody"];
	return tid.title.indexOf("StyleSheet") === 0 ||
		tid.title.indexOf("SideBar") === 0 ||
		shadows.indexOf(tid.title) > -1 || endsWith(tid.title, "SetupFlag") ? true : false;
}

function isPlugin(tid) {
	return tid.tags.indexOf("systemConfig") > -1 ? true : false;
}

function isArtifact(tid) {
	var follow = tid.tags.indexOf("follow") > -1;
	var type = tid.type;
	if(follow || type) {
		return true;
	} else {
		return false;
	}
}

function chooseTiddlers(tiddlers) {
	var _tiddlers = [];
	for(var i = 0; i < tiddlers.length; i++) {
		var tid = tiddlers[i];
		if(!isPlugin(tid) && !isShadow(tid) && !isArtifact(tid)) {
			_tiddlers.push(tid);
		}
	}
	return _tiddlers;
}

function bubbleDown() {
	var friends = $(".friend");
	friends.css({ position: "relative" });
	var target;
	friends.each(function(i, el) {
		if(!target && $(el).hasClass("silentFriend") &&
			$(el).next(".friend").hasClass("noisyFriend")) {
			target = el;
		}
	});
	if(target) {
		var other = $(target).next(".friend");
		// we want to move target above the prev element
		// target is an element which has the class noisy and the previous node is quiet
		var swapDuration = 50;
		var otherHeight = other.height();
		var thisHeight = $(target).height();
		$(target).animate({ top: + otherHeight }, { duration: swapDuration });
		$(other).animate({ top:  - thisHeight }, { duration: swapDuration,
				complete: function() {
					var newTarget = $(target).clone(true).insertAfter(other)[0];
					$(target).remove();
					$(other).css({ top: 0 });
					$(newTarget).css({ top: 0 });
					bubbleDown();
				}
		});
	}
}

function renderTiddlerList(container,friend) {
	var tidList = $("<ul />").appendTo(container)[0];
	$("<li />").text("loading").appendTo(tidList);
	var oncompletion = function() {
		if($(".errorFriend,.silentFriend,.noisyFriend").length === $(".friend").length) {
			bubbleDown();
		}
	}
	$.ajax({ dataType: "json",
		url: "/search?q=modifier:" + friend + "&select=modified:>3d&sort=-modified",
		error: function() {
			$(container).addClass("errorFriend");
			oncompletion();
		},
		success: function(tiddlers) {
			$(tidList).empty();
			tiddlers = chooseTiddlers(tiddlers);
			if(tiddlers.length === 0) {
				$(container).addClass("silentFriend");
				$("<li />").text("No recent activity.").appendTo(tidList);
				oncompletion();
				return;
			} else {
				$(container).addClass("noisyFriend").removeClass("inactiveFriend");
				oncompletion();
			}
			for(var i=0; i < tiddlers.length; i++) {
				var tiddler = tiddlers[i];
				var item = $("<li />").appendTo(tidList)[0];
				var win;
				var space = tiddler.bag.split("_")[0];
				var spaceUrl = "http://" + space + ".tiddlyspace.com";
				var path = "/bags/" + tiddler.bag + "/tiddlers/" + encodeURIComponent(tiddler.title);
				var link = $("<a />").text(tiddler.title).
					attr("href", spaceUrl + path).
					data("path", path).
					click(function(ev) {
						var win = $(ev.target).data("win");
						if($(ev.target).hasClass("active")) {
							$(win).toggle(1000);
						} else {
							$(ev.target).addClass("active");
							$(".text", win).text("loading...");
							$(win).show();
							$.ajax({
								url: $(ev.target).data("path"),
								data: {
									render: "y"
								},
								dataType: "json",
								success: function(tiddler) {
									$(".text",win).html(tiddler.render);
									$(win).show(1000);
								},
								error: function() {
									$(".text", win).text("error loading that tiddler");
								}
							});
						}
						ev.preventDefault();
					}).
					appendTo(item)[0];
				var space = tiddler.bag.split("_")[0];
				$("<span />").text(" in ").appendTo(item);
				$("<a />").attr("href", spaceUrl).text(space).appendTo(item);
				$("<span />").text(" (" + prettyDate(tiddler.modified) + ")").appendTo(item);
				win = $("<div />").addClass("tiddler").appendTo(item)[0];
				$("<div />").addClass("text").appendTo(win);
				var toolbar = $("<div />").addClass("toolbar").appendTo(win)[0];
				var extra = $("<div />").addClass("extra").appendTo(win)[0];
				$("<button />").data("bag", tiddler.bag).data("title", tiddler.title).text("give feedback").
					data("revision", tiddler.revision).click(function(ev) {
					var title = $(ev.target).data("title");
					var revision = $(ev.target).data("revision");
					var bag = $(ev.target).data("bag");
					var revisionURL = host + "/bags/" + bag + "/tiddlers/" + encodeURIComponent(title) + "/revisions/" + revision;
					var space = bag.split("_")[0];
					var area = $(ev.target).parents(".tiddler").children(".extra")[0];
					$(area).hide();
					$("<textarea />").appendTo(area);
					$("<button />").text("save feedback").click(function(ev) {
						var tid = new tiddlyweb.Tiddler("Feedback for " + title, userbag);
						tid.tags = ["feedback", "@" + space];
						tid.text = ["In reply to [[", title, "]]@", space,
							" (revision [[", revision, "|", revisionURL, "]])\n\n"].join("") + $("textarea", area).val();
						tid.put(function(tiddler) {
							$(area).empty();
							$("<span />").text("your comment: ").appendTo(area);
							$("<a />").attr("href", "/" + encodeURIComponent(tiddler.title)).text(tiddler.title).appendTo(area);
						}, function() {
							printError("error commenting!");
						});
					}).appendTo(area);
					$(area).show(1000);
					ev.preventDefault();
					$(ev.target).remove();
					return false;
				}).appendTo(toolbar);

				$(win).hide();
				$(link).data("win", win);
			}
		}
	})
}

function removeFriend(friend) {
	var tiddler = new tiddlyweb.Tiddler("@" + friend, userbag);
	var success = function() {
		printMessage("User removed from friends");
		var newFriends = [];
		for(var i = 0; i < friends.length; i++) {
			var f = friends[i];
			if(f !== friend) {
				newFriends.push(f);
			}
		}
		friends = newFriends;
		$("#friend-" + friend).hide(2000);
	};
	tiddler["delete"](success, function() {
		var old = new tiddlyweb.Tiddler(friend, userbag);
		old["delete"](success, function() {
			printError("Unable to remove friend " + friend);
		})
	})
}

function renderFriend(list, friend) {
	var bag = friend + "_public";
	var item = $("<li />").addClass("friend").attr("id", "friend-" + friend).addClass("inactiveFriend").appendTo(list)[0];
	$("<img />").attr("alt", friend).attr("title", friend).
		attr("src", host + "/bags/" + bag + "/tiddlers/SiteIcon").css({ width: 48, height: 48 }).appendTo(item);
	var heading = $("<h2>").appendTo(item)[0];
	$("<a />").attr("href", "#friend-" + friend).attr("name", "friend-" + friend).text(friend).appendTo(heading);
	$("<button />").data("who", friend).text("remove from friends").
		click(function(ev) {
			if(confirm("Are you sure you want to remove " + friend + " as a friend?")) {
				removeFriend($(ev.target).data("who"));
			}
		}).appendTo(item)[0];
	renderTiddlerList(item,friend);
}

function renderFriends() {
	var list = $("<ul />").appendTo("#friends")[0];
	$("<li />").text("Activity of your friends will appear below when available").appendTo(list);
	for(var i = 0; i < friends.length; i++) {
		var friend = friends[i];
		renderFriend(list, friend);
	}
}

function followWidget() {
	$("#friends").empty();
	var container = $("<div />").addClass("addfriends").appendTo("#friends")[0];
	$("<input />").attr("name", "friend").appendTo(container);
	$("<button />").text("add friend").click(function(ev) {
		var friend = $(ev.target).parent().children("[name='friend']").val();
		if(friends.indexOf(friend) > -1) {
			return printError("You already follow " + friend + "!");
		}

		var title;
		if(friend.indexOf("@") !== 0) {
			title = "@" + friend;
		} else {
			title = friend;
		}

		$.ajax({ dataType: "text", url: "/users/" + friend,
			success: function() {
				var tid = new tiddlyweb.Tiddler(title, userbag);
				tid.tags = ["follow", "excludeLists"];
				tid.put(function(tiddler) {
					printMessage("Added friend " + friend);
					renderFriend($("#friends ul")[0], friend);
					window.location.hash = "#friend-" + friend;
				}, function() {
					printError("Failed to add friend " + friend);
				})
			},
			error: function() {
				printError("No one with name " + friend + " exists!");
			}
		});
	}).appendTo(container);
	renderFriends();
}
$.ajax({
	url: "/status",
	dataType: "json",
	success: function(status) {
		user = status.username;
		userbag = new tiddlyweb.Bag(user + "_public", "/");
		$.ajax({ url: "/bags/" + user + "_public/tiddlers?select=tag:follow", dataType: "json", success: function(tiddlers) {
				for(var i = 0; i < tiddlers.length; i++) {
					var title = tiddlers[i].title;
					if(title.indexOf("@") === 0) {
						title = title.substr(1, title.length);
					}
					friends.push(title);
				}
				friends.sort();
				followWidget();
			}
		});
	}
})
The projects I have invested most time and effort in...

{{noTitle{<<tagging Projects>>}}}<<listfiltr>>
@semantic
@community
/***
|''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);
//}}}
As for plugins I host on TiddlySpace, I prefer to always create two spaces...
;@SpecialPlugin
:for the actual plugin to be includable, e.g. @SlidrPlugin
;@Special
:for the documentation, e.g. @Slidr
As for me, I don't think any documentation should be inside a plugin __at all__. Many plugins are way too bloated like that while all it takes is a reliable target in the ''Documentation'' slice and then, well, just enough documentation for people to understand the thing.

Code is code and prose, examples, parameters, configuration, version history, readable source, etc... are a different thing. They perhaps require proper example tiddlers and something that looks better than plain nothingness.
!Plugin Spaces
As for the includable plugin space, here are the things I do...
* remove ''__all__'' included bags, unless the plugin depends on any
* ''__especially__'' delete the ColorPalette, as well as GettingStarted
* tag the plugin not only <<tag systemConfig>>, but also <<tag excludeLists>> and <<tag excludeSearch>> because they have literally nothing to do with the content in space that includes them
* put SiteInfo into DefaultTiddlers
* name the SiteTitle with the plugin name to directly link it
** indicate in the SiteSubtitle that this space is a plugin space for inclusion
* when actually ready for inclusion / go-live, I add the tag <<tag plugin>> to the SiteInfo
** I also tag it with <<tag @tobibeer>> and <<tag official>> to indicate that I am the actual author
** if I am just  the creator of a plugin space for something I haven't created, I tag it <<tag unofficial>> and with the source site, e.g. <<tag TiddlyTools>>.
/***
|''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);
//}}}
/***
|''Name''|StoryFilters|
|''Author''|Jon Robson|
|''Version''|0.6.7|
|''Status''|@@experimental@@|
|''Source''|https://raw.github.com/jdlrobson/TiddlyWikiPlugins/master/plugins/Filters/StoryFiltersPlugin.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Notes
Adds the following filters
{{{
[story[open]]
[story[sort]]
}}}
***/
//{{{
(function($) {
var _display = Story.prototype.displayTiddler;
Story.prototype.displayTiddler = function() {
	var res =  _display.apply(this, arguments);
	$("[macroName=list]").each(function(i, el) {
		config.macros.list.refresh(el);
	});
	return res;
};
var _close = Story.prototype.closeTiddler;
Story.prototype.closeTiddler = function() {
	var res =  _close.apply(this, arguments);
	$("[macroName=list]").each(function(i, el) {
		config.macros.list.refresh(el);
	});
	return res;
};

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

}(jQuery));
//}}}
URL: https://plus.google.com/u/1/109308865556494599029/posts/QJXtJZQoafR
Video: http://www.youtube.com/watch?v=3SsSh_p_zno
!Summary
@Findr, available for inclusion via the @FindrPlugin space, started as a fork of @SimpleSearchPlugin and brings a few improvements...
*more flexible options to render the search results panel
*grouped search results by match category, e.g.
** in the title
** in tags
** in the text
** in fields
!Details
Try it out right here and use the search box to your right.
/***
|''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);
//}}}
!Replies with different titles
Would be the most important bit if ever possible. That way one could have nested conversations instead of copy and pasting reply over reply over reply into the same tiddler always keeping the initial thread name.
!Parameters
I believe a few additional parameters would do good to TiddlySpaceFollowingPlugin.

For one, I would want to restrict the number of followers or following people that one wishes to list, e.g.: {{{<<following user max>>}}} ...which should by default be set to maybe 20 and overriden with 0 or everything <=0 to display all.

On the other hand, I don't think it beneficial to introduce a bunch of non-named parameters. So here's a much better solution in therms of extensiblility... {{{<<following user max:20>>}}} or {{{<<following user max:0>>}}}

Also, the icons need be spacelinks by default. If one wishes to turn that off, one could introduce another a parameter called {{{noimglink}}} or even {{{nolink}}} if one wishes no links at all, not even the text ones.

Those additions would not require people to develeop somewhat unneeded plugins like FollowingWallPlugin@colmbritton
/***
|''Name:''|FiltrPlugin|
|''Description:''|provides interactive tiddler filtering by date range, tags or modifers|
|''Documentation:''|http://filtr.tiddlyspace.com|
|''Author:''|[[Tobias Beer|http://tobibeer.tiddlyspace.com]]|
|''Version:''|1.4.5 (2013-10-07)|
|''Source''|https://raw.github.com/tobibeer/TiddlyWikiPlugins/master/plugins/FiltrPlugin.min.js|
|''License''|[[Creative Commons Attribution-Share Alike 3.0|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''CoreVersion:''|2.5|
<<filtr showTags exclude:''>>
/%***/
(function(e){var t=config.macros.filtr={};config.macros.filtr=e.extend(t,{exclude:"excludeLists",sortField:"-modified",showSpaces:false,showTags:false,showUsers:false,showValues:false,showDates:true,showMonths:true,showLabels:true,showCount:true,showNoTag:true,showNoValue:true,allYears:true,listfiltr:true,fmtHeaderCount:"%0",fmtHeaderField:"%0",fmtHeader:"",fmtItem:"\n*{{filtrDate{%modified}}}%hastags %tags",fmtCount:"",fmtField:"%0",fmtDate:"YYYY-0MM-0DD",fmtYear:"YYYY",fmtMonth:"mmm",fmtTags:'{{filtrTags{<<tags "%0">>}}}',fmtLabel:"%0:",txtSel:"select ",txtSet:"set or unset %0 filter to %1...",txtSpace:"space",txtTag:"tag",txtUser:"user",txtYear:"year",txtMonth:"month",txtEmpty:{tag:"<untagged>",user:"<missing>",space:"<missing>",field:"<undefined>"},spaces:"",users:"",tags:"",field:"",handler:function(n,r,i,s,o,u){var a,f,l,c,h=0,p,d,v,m={},g=0,y=[],b,w={},E,S,x,T,N=[],b=config.extensions.tiddlyspace,C=o.parseParams("anon",null,true),k=getParam(C,"template","");(store.getTiddlerText(k)||"").split("\n").map(function(e){var t=e.indexOf(":"),n=t<0?e:e.substr(0,t);w[n]=t<0?true:e.substr(t+1)});["exclude|x","sortField|sf","showSpaces|bS","showTags|bT","showUsers|bU","showValues|bF","showDates|bD","showMonths|bM","showLabels|bL","showCount|bC","showNoTag|nT","showNoValue|nV","allYears|aY","listfiltr|lf","fmtHeader|f0","fmtItem|f1","fmtCount|fc","fmtHeaderCount|fch","fmtDate|fd","fmtField|ff","fmtHeaderField|ffh","fmtYear|fy","fmtMonth|fm","fmtTags|fts","fmtLabel|fl","spaces","tags","users","field|fi"].map(function(e){e=e.split("|");var n=e[0],r=e[1]||e[0];m[r]=getParam(C,n,k&&w[n]?w[n]:t[n]!=undefined?t[n]:"");if(i.contains(n)){m[r]=true}});m.desc=0==m.sf.indexOf("-"),m.sf=m.desc?m.sf.substr(1):m.sf;p=createTiddlyElement(n,"div",null,"filtr");m.fi=m.fi.split("|");m.filbl=m.fi[0];m.fi=(m.fi[1]||m.fi[0]).toLowerCase();m.ex=[];m.x=m.x.readBracketedList();m.x.map(function(e){m.ex.push(e)});store.forEachTiddler(function(e,t){if(m.x.containsAny(t.tags)){m.ex.pushUnique(t.title)}else{y.push(t)}});["bS","bT","bU","bF","bD","bM","bL","bC","nT","nV","lf"].map(function(e){m[e]="true"==m[e].toString()});if(m.spaces&&b){l=true;m.spaces=m.spaces.readBracketedList()}else m.spaces=[];m.bS=b&&!l&&m.bS;if(m.tags)f=true;else m.tags=[];m.bT=!f&&m.bT;if(f){if(m.tags.substr(0,8).toUpperCase()=="TIDDLER=")m.tags=store.getTiddlerText(m.tags.substr(8))||"";m.tags=m.tags.readBracketedList()}if(m.users){c=true;m.users=m.users.readBracketedList()}else m.users=[];m.bU=!c&&m.bU;m.vals=[];while(g<y.length){a=1;tid=y[g];if(m.x.containsAny(tid.tags)){a=0}if(a&&b.resolveSpaceName&&(l||m.bS)){T=b.resolveSpaceName(store.getValue(tid.title,"server.bag"));if(l&&!m.spaces.contains(T))a=0}if(a&&f){if(!m.tags.containsAny(tid.tags))a=0}if(a&&m.bT){S=[];if(tid.tags.length==0){if(m.nT)S.push("");else a=0}tid.tags.map(function(e){if(config.macros.untagged&&(config.macros.untagged.hideTags+(readOnly?" "+config.macros.untagged.hideTagsReadOnly:"")).readBracketedList().contains(e))return true;if(!m.tags.contains(e)){var t=store.getTiddler(e);if(m.ex.contains(e)||m.ex.containsAny(t?t.tags:[])){a=0}else{S.push(e)}}})}if(a&&(c||m.bU)){x=tid.modifier;if(c&&!m.users.contains(x))a=0}if(a&&m.bF){E=store.getValue(tid.title,m.fi);if(!m.nV&&!E||m.vals.contains(E)){a=0}}if(a&&m.bD){if(0==h){d=t.isDate(tid[m.sf]);m.yMin=3e3;m.yMax=0;h=1}if(d){var L=(new Date(tid[m.sf])).getYear()+1900;m.yMin=Math.min(m.yMin,L);m.yMax=Math.max(m.yMax,L);N[L]=true}}if(a){if(T!=undefined)m.spaces.pushUnique(T);if(S!=undefined)S.map(function(e){m.tags.pushUnique(e)});if(x!=undefined)m.users.pushUnique(x);if(E!=undefined)m.vals.pushUnique(E);g++}else{y.splice(g,1)}}"Space|User|Tag|VAL|Year|Month".split("|").map(function(n){var r,i,s,o,u,a=n.toLowerCase(),f=m[a+"s"],l=n=="VAL"?m.filbl:t["txt"+n],c=m.bL?m["fl"].format([l.length<15?l:l.replace(/(\.|\_)/mg,".\n")]):"",r="filtr_"+(n=="VAL"?m.fi.replace(/\./mg,"_"):a),h=n=="VAL"?m.fi:a;if(f){if(f.length){f.sortCaseInsensitive();if(""==f[0]){f.splice(0,1);f.push("")}}else return true}else if(!m.bD||!m.bM&&n=="Month"){return true}i=createTiddlyElement(p,"div",null,"filtrGroup");if(c)createTiddlyElement(i,"strong",null,null,c);i=createTiddlyElement(i,"div",null,r,null,{group:h});for(o=h=="year"?m.yMax:h=="month"?1:0;h=="year"?o>=m.yMin:h=="month"?o<13:o<f.length;h=="year"?o--:o++){if(h=="year"&&(!m.yMin||!N[o])||h=="month"&&(!m.bM||!m.yMin))continue;s=f?f[o]:o;u=h=="year"?(new Date(o+"/01/01 00:00:00")).formatString(m.fy):h=="month"?(new Date("2000/"+String.zeroPad(o,2)+"/01 00:00:00")).formatString(m.fm):""==s?t.txtEmpty[n=="VAL"?"field":h]:s;e(createTiddlyButton(i,u,t.txtSet.format(l,u),t.filter,"button")).data("value",s==""?"":["year","month"].contains(h)?o:u).dblclick(function(){return false})}});v=e(createTiddlyElement(n,"div",null,"filtrList"));v.data(m);this.filter(v)},filter:function(n){var r,i,s,o,u,a=0,f="",l,c,h,p,d,v,m,g,y=config.extensions.tiddlyspace,b=e(n.html?n:this),m=b.data("value"),w=n||window.event,l=w.shiftKey,E=n.html?b:b.closest(".filtr").next(),S=E.prev(),x=E.data(),T="space|user|tag|VAL|year|month".split("|");if(x.y0==undefined){x.y1=x.yMax;x.y0=x.aY?x.yMin:x.y1;x.m0=1;x.m1=12}d=store.getTiddlers(x.sf);if(m!=undefined){o=b.closest("div").attr("group");switch(o){case"space":x.space=x.space==m?undefined:m;break;case"tag":x.tag=x.tag==m?undefined:m;break;case"user":x.user=x.user==m?undefined:m;break;case"year":if(l){u=x.yX;u=u?u:x.y0;x.y0=m<u?m:u;x.y1=m<u?u:m}else{if(b.hasClass("filtr_active")&&b.parent().find(".button").not(".filtr_active").length>0){x.yX=x.y0=x.yMin;x.y1=x.yMax}else{x.yX=x.y0=x.y1=m}}if(!w.ctrlKey){x.m0=x.mX=1;x.m1=12}break;case"month":if(l){u=x.mX;u=u?u:x.m0;x.m0=m<u?m:u;x.m1=m<u?u:m}else{if(b.hasClass("filtr_active")&&b.parent().find(".button").not(".filtr_active").length>0){x.mX=x.m0=1;x.m1=12}else{x.m0=x.m1=x.mX=m}}break;default:x.field=x.field==m?undefined:m;break}}for(h=x.desc?d.length-1:0;x.desc?h>=0:h<d.length;x.desc?h--:h++){p=d[h];g=x.fi?store.getValue(p.title,x.fi):"";space=y&&y.resolveSpaceName?y.resolveSpaceName(store.getValue(p.title,"server.bag")):"";i=p[x.sf]?p[x.sf]:store.getValue(p.title,x.sf);if(x.ex.containsAny(p.tags)||undefined!=x.space&&space!=x.space||undefined!=x.tag&&!(x.tag==""&&!p.tags.length)&&!p.tags.contains(x.tag)||undefined!=x.user&&x.user!=p.modifier||undefined!=x.field&&!(x.field==""&&g==undefined)&&x.field!=g||x.bD&&!t.inRange(i,x.m0,x.m1,x.y0,x.y1)||x.fi&&!x.bF&&!g)continue;c=!p.tags||p.tags.length<1?"":x.fts.format([p.title]);a++;f+=x.f1.replace(/%title/mg,"[["+p.title+"]]").replace(/%modifier/mg,p.modifier).replace(/%modified/mg,p.modified.formatString(x.fd)).replace(/%created/mg,p.created.formatString(x.fd)).replace(/%sortfield/mg,x.bD||t.isDate(i)?i.formatString(x.fd):i).replace(/%space/mg,space).replace(/%tags/mg,c).replace(/%hastags/mg,store.getTaggedTiddlers(p.title).length>0?"<<tag [["+p.title+"]]>>":"[["+p.title+"]]").replace(/%field/mg,x.fi?x.ff.format([t.isDate(g)?(new Date(g)).formatString(x.fd):g]):"").replace(/%count/mg,x.bC?x.fc.format([a]):"").replace(/(%nl)|\\n/mg,"\n")}T.map(function(t){s=0;if(t=="VAL"){s=1;t=x.fi.replace(/\./mg,"_")}var n=e(".filtr_"+t+" .button",S);n.each(function(){var r=e(this),i=r.data("value");if(n.length==1||t=="space"&&(undefined==x.space||x.space==i)||t=="tag"&&(undefined==x.tag||x.tag==i)||t=="user"&&(undefined==x.user||x.user==i)||t=="year"&&x.y0<=i&&i<=x.y1||t=="month"&&x.m0<=i&&i<=x.m1||s&&(undefined==x.field||x.field==i))r.addClass("filtr_active");else r.removeClass("filtr_active")})});E.empty();if(f){wikify((x.lf&&config.macros.listfiltr?"\n{{filtr_list{%0\n}}}<<listfiltr>>":"%0").format([x.f0.replace(/%field/mg,x.fi?x.ffh.format([x.filbl]):"").replace(/%count/mg,x.bC?x.fch:"").replace(/%sortfield/mg,x.sf).replace(/(%nl)|\\n/mg,"\n")+f]),E[0])}if(config.tableSorting&&config.tableSorting.refresh)config.tableSorting.refresh(E[0].parentNode);return false},inRange:function(e,t,n,r,i){var s,o=32-(new Date(i,n+1,32)).getDate();for(s=r;s<=i;s++){if(e>=this.getDate(s,t,1)&&e<=this.getDate(s,n,o,true))return true}return false},getDate:function(e,t,n,r){return new Date(e+"/"+String.zeroPad(t,2)+"/"+String.zeroPad(n,2)+(r?" 23:59:59":" 00:00:00"))},isDate:function(e){return(new Date(e)).getMonth()}});if(!Array.prototype.sortCaseInsensitive)Array.prototype.sortCaseInsensitive=function(){return this.sort(function(e,t){var n=e.toLowerCase(),r=t.toLowerCase();return n<r?-1:n>r?1:0})};config.shadowTiddlers.StyleSheetFiltr=["/*{{{*/",".filtr {display:block;}",".filtr .button{display:block;float:left;margin:3px 3px 0 0;padding:0.2em 0.4em;-moz-border-radius:7px;border-radius:7px;}",".filtr .filtr_active{background:#FE8 !important;}",".filtrGroup {display:block;padding:5px 0 0 0;clear:left;vertical-align:middle;}",".filtrGroup div {display:block; float:left; width:85%;}",".filtrGroup strong{display:block;float:left;min-width:80px;width:14%;text-align:right;padding-top:0.2em;margin:3px 1% 0 0;}",".filtrList {clear:left;padding-top:1px;}",".filtrList ul {list-style-type:none;}",".filtrList ul,.filtrList ol {margin-left:0;padding-left:0em;list-style-position:inside;}",".filtrList ul li,.filtrList ol li {padding:2px 0 2px 0.5em;border-bottom:1px solid [[ColorPalette::TertiaryPale]];}",".filtrList ul li:hover,.filtrList ol li:hover {background:[[ColorPalette::TertiaryPale]];}",".filtrList table ul li:hover,.filtrList table ol li:hover {background:transparent;}",".filtrList table ul li,.filtrList table ul li {padding:0;margin:0;}",".filtrDate {color:[[ColorPalette::TertiaryMid]];margin-right:5px;}",".filtrTags {max-width:50;float:right;text-align:right;display:inline-block;margin-right:0.5em;}",".filtrTags .button {margin:0 0 0 3px;}",".filtrTags .listTitle {display:none}",".filtrTags ul, .filtrTags li {margin:0 !important;padding:0 !important;list-style-type:none;display:inline;}","/*}}}*/"].join("\n");store.addNotification("StyleSheetFiltr",refreshStyles)})(jQuery)
//%/
/***
|''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));
//}}}
I think it were beneficial if spaces meant for inclusion  - like @following - would mark all tiddlers (esp. plugins) with [[excludeLists]] that are not essential to the content being created by someone using those spaces.
!Summary
SimpleRolesPlugin allows you to assign a role to a user in a non-secure, but pragmatic manner and thus display content conditionally.
!Security notice
@@color:red;This is by no means a secure user management system!@@ Any ~TiddlyWiki literate can easily figure out how to take any of the roles you've defined! Why then invent such a roles management system? To be able to display different __default__ contents even though a user may chose to change its username on the fly and thus grab --priviledges-- which in a security sense do __NOT__ deserve that notion!
!Howto
You can display user and role information using the {{{<<simpleroles>>}}} macro:

<<simpleroles info "Hello ''%0''! Here's your role: ''%1''.">>
{{{
<<simpleroles info "Hello ''%0''! Here's your role: ''%1''.">>
}}}
...whereas the first parameter would be {{{info}}} and the second the output format; {{{%0}}} will be replaced with the username and {{{%1}}} with the detected role.
!Step 1
Create a tiddler called SimpleRolesConfig containing the roles that you want to use as headings. Put the users having that role in the corresponding section. If you want to use different role names than the default ones, you must also adjust the roles array by putting something like the following into your [[zzConfig]] tiddler tagged {{{systemConfig}}}:
{{{
config.macros.simpleroles.roles=['MyHighestRole','MyAverageRole','MyLowestRole'];
}}}
For more information, please read the ''Configuration'' section at the bottom.
!Step 2
To conditionally show or hide elements in your templates, use the {{{<<simpleroles>>}}} macro like this:
{{{
<span macro="simpleroles Admin">
    <span refresh='content' tiddler='AdminOptions'></span>
</span>
}}}
This way, the containing span will only be shown if the user has a role of {{{Admin}}}.

You can also hide elements like this:
{{{
<span macro="simpleroles !User">
    <span refresh='content' tiddler='AllButGuests'></span>
</span>
}}}
Note the exclamation mark before the name of the role. It means to not show the containing block if the user does not at least have that role.

You can also wikify contents without any inner blocks like this...
{{{
<span macro="simpleroles role content"/>
}}}
Meaning, if a user does have {{{role}}} assigned, the {{{content}}} will be wikified. If you prefix the {{{content}}} parameter with {{{tiddler:}}} the contents from that tiddler, slice or section will be wikified.

It is possible to use the {{{<<simpleroles>>}}} macro in tiddlers (and thus transclusions) like so...
{{{
<<simpleroles Admin>>
}}}
Meaning, if the user is not an {{{Admin}}}, the tiddler will be displayed as if it were empty.

If you want to have a block in your tiddler that you want to conditionally show or hide, use an outer class wrapper like so...
{{{
{{admin{<<simpleroles Admin tiddler:SideBarTabs##ADMIN>>}}}
}}}

You might also use HideWhenPlugin to conditionally display contents by using the following syntax:
{{{
<span macro="showWhen window.simpleRoles.contains('Admin')">
	<span refresh='content' tiddler='AdminOptions'></span>
</span>
}}}
!Configuration
As mentioned above, use your [[zzConfig]] to assign any values to the following parameters which you find [[at the beginning of the sourcecode|SimpleRolesPlugin]].
| !Parameter | !Default | !Use |h
|{{{def}}}|{{{SimpleRolesConfig}}}|your tiddler with your roles and users...<br>- section titles are roles<br>- section contents contain users, one per line<br>''Note:'' Putting additional information in that tiddler does no harm.|
|{{{roles}}}|{{{['Admin','PowerUser','User']}}}|your user roles<br>- assumption: any role entails those to its right<br>- there must be a corresponding section in your SimpleRolesConfig|
|{{{defaultRole}}}|{{{'Guest'}}}|default user role when a user is not in any of the roles sections|
|{{{variableName}}}|{{{simpleRoles}}}|the __global__ array in which a user's roles are stored<br>- better not mess with this or be careful not to overwrite existing global objects!|
|{{{fmtInfo}}}|{{{%0 (%1)}}}|The default info format when not specified for {{{<<simpleroles info>>}}}|
!An example [[SimpleRolesConfig]]...
@@display:block;padding:5px;background:#eee;border:1px solid #999;<<tiddler SimpleRolesConfig>>@@
/***
|''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";

})();
//}}}
<<filtr template:FiltrExampleTemplate##TEMPLATE>>
!Template Contents
<<code at:FiltrExampleTemplate##TEMPLATE>>/%
!TEMPLATE
tags:tiddler=FiltrExampleTemplate##TAGS
showUsers
showTags
showLabels
showSpaces
fmtDate:YYYY-0MM-0DD
fmtYear:YYYY
fmtMonth:mmm
fmtTag:<<tag [[%0]]>>
tagSeparator: 
!END%/
!TAGS
systemConfig
Journal
Talks
Plugins
/*!**
|''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($) {
var _display = Story.prototype.displayTiddler;
Story.prototype.displayTiddler = function() {
	var res =  _display.apply(this, arguments);
	$("[macroName=list]").each(function(i, el) {
		config.macros.list.refresh(el);
	});
	return res;
};
var _close = Story.prototype.closeTiddler;
Story.prototype.closeTiddler = function() {
	var res =  _close.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));
//}}}
<<list filter [tag[Star]]>><<listfiltr>>
R0lGODlhAQEBAYIAMQAAACQkJEhISG1tbZGRkba2ttra2v///ywAAAAAAQEBAQID/ii63P4wykmrvTjrzbtvRCiOZGmeaKqubOu+cCzPdB0qdq7vfO//wBUuSCwaj8gkaqhsOp/Q6IgprVqvWBg1y+16pduveEzuhcvotFp1Xrvf6DZ8TsfK6/i88q7v+318f4KDMoGEh4hLAomMjUKLjpGSN5CTlomGl5pwmZueaZ2fomKho6ZZpaeqYJWrrqStr7KosbO2rLe5Vam6vTm8vsGFtcLFZsTGyTbAys0lzM7RBNDSzdTVydfYxdrbwd3eveDhuePktubnsunqruztqu+DBQf19vf4+fr7B9/Ir/T4CRyYz5+vgAQTCjTYC6HCh/gY6nIIsaLEXBQrPrx4/iujxoQcbXn8ODDkrJEk+ZmUhTKlvpUAXW70JU9QS5n3YLq6ibOezlU8e/5UFRTn0FNFZR41ldTl0lFNUz4VFZXk1E9VP171lFXj1k1dLdL8t7Mnwa+awkJEe0ntTHFkgZotOfbg3IV1G95VmXfi3n1sLblVGHjSYJB9Mf59mbjj4oKNRT6OGPnk5JyVWV62V1jS4bOZY27uF7rs6M6RPtOFa/d0abmuWeuNravmH9V4ZfulXS4u0dGkdSvmfcu2H9x8hTsmjs43UuCoHSEH/Po381nG+0xnrFzy9XXOmUKv/vz7q+x6tkPubtm8u/BQx7PX7H4V+jzqKc8XvTl6/qP8mO1nWn/kiVdfPPBRJV9tCe5QwIMQRijhhBRWaOGFGBoAHIYcdujhhw8+cZ8IwJVo4okQGSBigzqg6OKLMKroxIghwGjjjZvJ2ASNBODo449m6bgHizkAaeSRFQmZBI9INunkPkoiweSTVD4Z5RFTVqmlkVcakeWWYN7YZRFfhmkmimMSUeaZbI6WZhBrtinnYm8CEeeceAa54hN59rlXnT/c6eegSe7pBKGIpgQoIETakOijhc7YaA2QVprQosfwaemmUBraBKeg4oMpD4KG+uioO5RqKqKo6qDqqoO2+sukNMAKqqzL0DqDrZziWsOrvOLpKw3ABivnsDMU/mssm8gOo+myiTYbg7LQhimtFrrKUG20niqxLavdJvEtode+QO24VJbrwrnoOqluC+y2i+S7LMQrL5fherdZAQXGd+ApPM4BIGf9KvivKQHDMbBPBWO1YG+tESggbBIzGPFl/jGycHAWz1YxxB5j3DBXDxeXbWolN3fxZBknsnHLiLw8MlgpY3eydDWDt/JjMB8i88TWfWzyzov1TMjPHe8mtMohszxzWjmfd/N/Ub9H9F9Gz1O1fVNrvDWCV++VtU1fA9y1y2UjfHbMaY+S8BtIg6y0yECXt7TNYd819m1ti/K2G3EP3TTPT7fV9yd/rxE403M7XbeBd+s8eNGF/gt2uCeJq7E43pNjXblhl2+SeRqbS9444Y/7G7nUec+193GhazI6GqWz3rnYn3sW+yWzl1G71bfrnTvKB7u9ts+7W9I7Gb9z3bpZr2uX/CTLj1GAAdhnr/323HfvPb2IVA/PH+KP30f55ueBfvp1rM/+HO6//0b88q9Bf/2gHI8/7/rvT33//ovE/QIICwJaA4AGxAQCE3iIATKQFg/kxgIjSL4JUvB8Fryg+jKowfZxsIPw+yAI5yfCEdqvhCbMXwo5t0LgtdB5L4RhDM02Q7DVUG03xGEO/YbCHdqhhz60ggODmCkiyg6IRoTCEJM4KyYqD4lOHNIHpkjFKlrxCIpYzKIWK5AAADs=
/***
|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);
}
})();
//}}}
/***
|''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);
//}}}
FiltrPlugin allows you to __interactively__ filter tiddlers by different criteria, such as space, modifier, tag, field values, dates, etc. Depending on your parameters, this is what the interface may look like...
!Details
{{annotation{
''Important:'' FiltrPlugin has moved to the @FiltrPlugin space. For detailed documentation, such as parameters, installation, etc... please refer to the @Filtr space.
}}}
;How To Use...
:click on a button to set it as a filter
:clicking on a {{{tag}}} or {{{user}}} filters by it
:*clicking it again reenables all  {{{tags}}} or {{{users}}}
:clicking on a {{{year}}} will select all months unless you do a {{{CTRL+CLICK}}}
:*with {{{SHIFT+CLICK}}} you can select a month- or year range
:*you can also do a {{{SHIFT+CTRL+CLICK}}}
!Example
<<filtr showTags exclude:"excludeLists" template:"FiltrExampleTemplate##TEMPLATE">>
[[A TiddlySpace exploring semantics in a TiddlyWiki context...|Welcome]]@semantic
The [[amazing platform|http://tiddlyspace.com]] providing you with all of this...
/***
|''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);
//}}}
@FND
I would agree with Chris that lattice and TiddlyWiki in general look a whole lot better if the number of colors, especially for whole areas is being reduced to a balanced few. For a while now I've found that using the same colors for primary and secondary just looks better ...with a few necessary adjustments.

I have always been rather confused by the ColorPalette. Those abstract naming conventions never really cut it for me. I would have hoped that a ColorPalette reads more like:

hdB:#EEE
hdF:#333
lnkB:transparent
lnkF:#669
sbB:#EEE
sbF:#666

From my point of view, the names of those slices should correspond to actual layout elements or collections ...and there would only (have to) be different slices for actually different colors being used. If the header and the sidebar had the same background, then there is no need for an explicit slice for the sidebar background up until someone wanted it to be distinct and thus created it. Otherwise, I would give the slice an abbreviation for the visually most dominant element ...which in this example probably were the header.

With all that mind, I highly welcome Jeremy's idea about ~ColorWays ...which seems to finally use slicenames that indicate how a color is being used ...while the colors were still pulled from a palette with primary, secondary and tertiary.
Tiddlers that don't show tagging...
@JnthnLstr
This is the public space of Tobias Beer, TiddlyWiki enthusiast and plugin author currently living in Leipzig, Germany.
[[LinkifyPlugin|Linkify]] allows you to automatically turn certain words into tiddler links, which can be very hand when you want all of...
*link
*links
*linked
*linking
...to point to one and the same tiddler, e.g. [[Linking Stuff|Linkify]].

For more information, [[see here|Linkify]]...
@featured
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
<<tiddler "Therapie-Sport.de">>
<script>
(function($){
var tid = story.findContainingTiddler(place);
$('.readOnly',tid).hide();
})(jQuery);
</script>
/***
|''Name:''|~PopupMacro|
|''Description:''|create (nested) popups with custom content|
|''Documentation:''|http://tobibeer.tiddlyspace.com/#Popup|
|''Author:''|Tobias Beer (original author: Saq Imtiaz)|
|''Version:''|1.5.0 (2013-10-13)|
|''CoreVersion:''|2.5.3 or better|
|''Source''|https://raw.github.com/tobibeer/TiddlyWikiPlugins/master/plugins/PopupMacro.min.js|
/%***/
(function(e){var t=config.macros.popup={hover:true,toggle:false,sticky:false,arrow:document.all?" ▼":" ▾",hoverables:"#mainMenu",showAfter:400,showStandardAfter:800,enableHover:".button[tag], .tiddlyLink[tag]",disableHover:".slidr_button",err1:"missing macro parameters",err2:"missing label or content parameter",handler:function(n,r,i,s,o,u){var a,f,l,c,h,p=o.parseParams("anon",null,true),d={content:(i[1]||"").replace(/(\$\)\)|\>\+\>)/g,">>"),arrow:getParam(p,"arrow",t.arrow)},v=getParam(p,"class","");f=i[0];if(!f||!d.content){createTiddlyError(n,t.err1,t.err2);return false}["sticky","toggle","hover"].map(function(e){var n=getParam(p,e,t[e]);d[e]=i.contains("no"+e)?false:n||i.contains(e);if(n=="true")d[e]=1;if(n=="false")d[e]=0});if(i.contains("noarrow"))d.arrow="";a=e(createTiddlyButton(n,f+d.arrow,f,d.toggle?t.toggleButton:t.show,"button popupbutton"+(v?" "+v:""),null,null));d.popclass="popup popupmacro"+(t.inPopup(a)?" nested":"")+(v?" "+v:"");d.show=!d.hover;a.data(d);if(d.hover){a.on("mouseover",t.showAfter?t.delay:t.show);a.on("mouseout",t.abort)}},delay:function(n){var r=e(this.innerHTML?this:n);r.data("show",true);setTimeout(function(){if(r.data("show")){if(r.is(".popupbutton"))t.show(r[0]);else r.click()}},r.is(".popupbutton")?t.showAfter:t.showStandardAfter)},abort:function(t){e(this).data("show",false)},toggleButton:function(n){var r=e(this),i=r.data("popup");if(i)Popup.removeFrom(e(i).data("level"));else t.show.apply(this,arguments)},show:function(n){n=n||window.event;var r,i=Popup.stack.length,s=e(this.innerHTML?this:n),o=t.inPopup(s),u=o?s.closest(".popup").data("level"):0;if(!s.data("popup")){if(!o&&i)Popup.removeFrom(0);else if(o&&i>1){i=u+1;Popup.removeFrom(i)}r=createTiddlyElement(document.body,"ol",null,s.data("popclass")+(i?" nested"+i:""),null);s.data("popup",r).addClass("popupopen");e(r).data({button:s,level:i,sticky:s.data("sticky")}).click(t.popupClick);Popup.stack.push({root:s[0],popup:r});wikify(s.data("content"),r);Popup.show(r,true)}if(n){n.cancelBubble=true;if(n.stopPropagation)n.stopPropagation()}return false},popupClick:function(t){var t=t||window.event,n=e(this).closest(".popup"),r=resolveTarget(t),i=e(r).closest("a").length;Popup.removeFrom(n.data("level")+1);if(i&&!n.data("sticky")){Popup.remove()}else{t.cancelBubble=true;if(t.stopPropagation)t.stopPropagation()}return false},inPopup:function(t){return e(t).closest(".popup").length},linkOver:function(n){var r=e(this),i=r.closest(".popup").data("level")||0;Popup.removeFrom(i);if((r.is(t.enableHover)||r.data("tiddlers"))&&!r.is(t.disableHover))t.delay(r)},makeHoverable:function(n){var r=e(n);if(r.is("a")&&r.closest(t.hoverables).length&&!r.is(".popupbutton")){r.off("mouseover",t.linkOver);r.on("mouseover",t.linkOver);r.off("mouseout",t.abort);r.on("mouseout",t.abort)}}};window.refreshElementsPOPUP=window.refreshElements,window.refreshElements=function(n,r){window.refreshElementsPOPUP.apply(this,arguments);var i=e(n);e("a",i).add(i).each(function(){t.makeHoverable(this)})};window.invokeMacroPOPUP=window.invokeMacro;window.invokeMacro=function(r,i,s,o,u){window.invokeMacroPOPUP.apply(this,arguments);var a=e(r.lastChild);e("a",a).add(a).each(function(){t.makeHoverable(this)})};Popup.removeFromPOPUP=Popup.removeFrom;Popup.removeFrom=function(t){var n,r,i;for(i=Popup.stack.length-1;i>=t;i--){r=Popup.stack[i],e(r.root).removeData("popup").removeClass("popupopen")}Popup.removeFromPOPUP.apply(this,arguments)};setStylesheet(".nested {padding:3px;margin:-0.5em 0 0 2em !important;}"+".popupbutton {cursor:pointer};","PopupMacroStyles")})(jQuery)
//}%/
/***
|''Name''|ActivityStreamPlugin|
|''Version''|0.5.4|
|''Description''|Provides a following macro|
|''Author''|Jon Robson|
|''Requires''|TiddlySpaceFollowingPlugin|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''Source''|https://github.com/jdlrobson/TiddlyWiki/raw/master/plugins/TiddlySpaceInstaller/ActivityStreamPlugin.js|
!Usage
{{{<<activity>>}}}
!!Supressing activity
You can supress notifications by  id:
"plugin", "shadow", "standard", "follow", "followYou", "siteInfo", "siteIcon", "ownSiteIcon", "notify", "reply"
e.g. {{{ <<activity supress:siteIcon>> }}} will hide siteIcon activity from you.

!!Supressing people
{{{<<activity ignore:person}}} will ignore all activity where person is the subject of the activity. eg. person followed other-person will not appear in the feed.
!!Controlling displayed dates.
{{{<<activity timestampFormat:"<0hh o' clock>" headingFormat:"0DD/0MM" >>}}} will display date headings as date/month eg.
3rd of January would be displayed as 03/01. This particular timestamp example gives you the hour of the activity.

!!Even more content
{{{<<activity limit:no>>}}} will show you all possible activity in the last X days where X is set at a macro level (advanced developers should see config.macros.activity.RECENTNESS).
!StyleSheet

.activityStream .externalImage, .activityStream .image {
	display: inline;
}

.feedItem .siteIcon {
	display: inline;
}

.activityStream .error {
	background-color: red;
	color: white;
	font-weight: bold;
}

.activityStream .feedItem {
list-style: none;
}

.activityStream .notification {
	background-color: yellow;
	color: black;
}

.activityStream .activityGroupTitle {
	font-weight: bold;
	margin-top: 8px;
}
.activityStream .feedItem {
	margin-left: 8px;
}
!Code
***/
//{{{
(function($) {
var name = "StyleSheetActivityStream";
config.shadowTiddlers[name] = store.getTiddlerText(tiddler.title +
     "##StyleSheet");
store.addNotification(name, refreshStyles);

var followMacro = config.macros.followTiddlers;
var tweb = config.extensions.tiddlyweb;
var tiddlyspace = config.extensions.tiddlyspace;
var scanMacro = config.macros.tsScan;

var modifierSpaceLink = "<<view modifier spaceLink>>";
var spaceTiddlyLink = "<<view server.bag spaceLink server.title>>";
var bagSpaceLink = "<<view server.bag spaceLink>>";
var bagSiteIcon = "<<view server.bag SiteIcon width:24 height:24 label:no preserveAspectRatio:yes>>";
var modifierSiteIcon = "<<view modifier SiteIcon width:24 height:24 label:no preserveAspectRatio:yes>>";
var timestamp = "[<<view modified date '0hh:0mm'>>]";
var replyLink = "<<view server.title replyLink>>";
config.shadowTiddlers.ActivityStreamTemplates = [
	"!notify\n%3 {{notification{%0 %1 has modified %2 in %0 %1 and flagged it for your attention!}}} %8\n",
	"!reply\n%3 {{notification{%0 %1 replied with %2 to your %4 %5 post.}}} %8\n",
	"!userSiteIcon\n%3 %6 %7 has a new ~SiteIcon.\n",
	"!spaceSiteIcon\n%3 %6 %7 updated the SiteIcon for the %0 %1 space.\n",
	"!image\n%3 %6 %7 drew the image %2 in the %1 space.\n",
	"!plugin\n%3 %6 %7 modified a plugin called %2 in the %0 %1 space.\n",
	"!shadow\n%3 %6 %7 modified a shadow tiddler %2 in the %0 %1 space.\n",
	"!geo\n%3 %6 %7 modified a geo tiddler called %2 in the %0 %1 space <<view title maplink 'view on map'>>. %8\n",
	"!followYou\n%3 %0 %1 is now following you.\n",
	"!follow\n%3 %0 %1 is now following %4 %5 <<view server.title link follow>>\n",
	"!siteInfo\n%3 %6 %7 <<view server.bag spaceLink server.title label:described>> the %0 %1 space.\n",
	"!video\n%3 %6 %7 modified a video entitled %2 in the %0 %1 space. %8\n",
	"!standard\n%3 %6 %7 modified %2 in the %0 %1 space. %8\n"
	].join("").format(bagSiteIcon, bagSpaceLink, spaceTiddlyLink, timestamp,
		"<<view server.title SiteIcon width:24 height:24 label:no preserveAspectRatio:yes>>", "<<view server.title spaceLink>>",
		modifierSiteIcon, modifierSpaceLink, replyLink);
story.refreshTiddler("ActivityStreamTemplates", null, true);
config.annotations.ActivityStreamTemplates = "This is a special tiddler used by the ActivityStreamPlugin. It is used for templating notifications. Templates at the top have preference over templates at the bottom.";

var macro = config.macros.activity = {
	default_limit: 50,
	templates: [],
	init: function() {
		var templates = [];
		var regex = new RegExp(/^!(.*)\n/gm);
		var text = store.getTiddlerText("ActivityStreamTemplates");
		var match = regex.exec(text);
		while(match) {
			templates.push(match[1]);
			match = regex.exec(text);
		}
		macro.templates = templates;
	},
	// order matters - earlier templates override older ones
	RECENTNESS: 2, // in days
	TIMESTAMP_FORMAT: "<0hh:0mm>",
	info: {},
	locale: {
		pleaseWait: "please wait while we load your stream...",
		errorLoading: "The activity stream failed to load. Please make sure you have an internet connection and try again.",
		userHeading: "Below is the activity stream for spaces that this space follows with the follow tag. (%0/%1 spaces have been loaded)",
		emptyStream: "Activity stream currently empty. (%0/%1 loaded)"
	},
	getTimeStamp: function() {
		var today = new Date();
		macro._lastRun = today.getTime();
		var previous = new Date(today.setDate(today.getDate() - macro.RECENTNESS));
		return previous.convertToYYYYMMDDHHMM();
	},
	handler: function(place, macroName, params, wikifier, paramString, tiddler) {
		var container = $("<div />").text(macro.locale.pleaseWait).appendTo(place).
			attr("refresh", "macro").attr("macroName", macroName).attr("paramString", paramString);
		var space = tiddlyspace.currentSpace.name;
		var options = macro.getOptions(paramString);
		$(container).attr("activity-limit", options.limit);
		macro._session = Math.random();
		var activityType;
		var sourceActivity = function(user) {
			macro.CURRENT_USER = user.name;
			macro.USER_AT_TAG = "@%0".format(user.name);
			followMacro.getFollowers(function(users) {
				macro.getActivity(container, users, activityType, options);
			}, macro.CURRENT_USER);
			container.attr("activity-type", activityType);
			macro._renderStream(container, activityType, options);
		};

		if(options.user) {
			sourceActivity({name: options.user});
		} else {
			sourceActivity({ name: tiddlyspace.currentSpace.name });
		}
	},
	getOptions: function(paramString) {
		var options = {};
		var args = paramString.parseParams("name")[0];
		var toMap = ["timestampFormat", "headingFormat", "limit", "user"];
		var i;
		for(i = 0; i < toMap.length; i++) {
			var map = toMap[i];
			options[map] = args[map] ? args[map][0] : false;
		}
		var supress = args.supress || [];
		var templates = [];
		var show = args.show ? args.show : macro.templates;
		for(i = 0; i < show.length; i++) {
			var template = show[i];
			if(supress.indexOf(template) === -1) {
				templates.push(template);
			}
		}
		options.ignore = args.ignore || [];
		options.templates = templates;
		return options;
	},
	_getActivityQuery: function(user, timestamp) {
		timestamp = timestamp || macro.getTimeStamp();
		if(user) {
			return "/bags/%0_public/tiddlers?select=modified:>%1".format(user, timestamp);
		} else {
			return false;
		}
	},
	refresh: function(container) {
		var type = $(container).attr("activity-type");
		var limit = $(container).attr("activity-limit");
		var options = macro.getOptions($(container).attr("paramString"));
		options.limit = parseInt(limit, 10);
		macro.renderStream(container, type, options);
	},
	getActivity: function(place, users, type, options) {
		var i;
		var timestamp = macro.activityTimestamp;
		var firstRun =  timestamp ? false : true;
		macro.info.loaded = firstRun ? 0 : macro.info.loaded;
		var afterAjax = function(tiddlers) {
			if(firstRun) {
				macro.info.loaded += 1;
			}
			macro.updateStream(tiddlers, type, options);
			macro.renderStream(place, type, options);
		};
		var success = function(tiddlers) {
			afterAjax(tiddlers);
		};
		var error = function() {
			afterAjax([]);
		};
		if(macro._lastRun > new Date().getTime() - 300000) { // leave 5 minutes between calls
			afterAjax([]);
			return;
		}
		macro.info.queries = users.length;
		for(i = 0; i < users.length; i++) {
			var user = users[i];
			ajaxReq({
				url: macro._getActivityQuery(user, timestamp),
				dataType: "json", success: success, error: error
			});
		}
		macro.activityTimestamp = new Date().convertToYYYYMMDDHHMM();
	},
	reportError: function(place) {
		var error = $("<div />").addClass("error").text(locale.errorLoading);
		$(place).empty().append(error);
	},
	createFeedEntry: function(container, tiddler, options) {
		var item = $("<li />").addClass("feedItem");
		var content = $("<div />").appendTo(item);
		var wikifyPlace = $("<span />").appendTo(content)[0];
		var author = tiddler.modifier;
		if(author && !options.ignore.contains(author)) {
			$(container).append(item);
			config.macros.view.views.activityItem(null, wikifyPlace, null, null, null, tiddler);
			return item;
		}
		return false;
	},
	renderStream: function(place, type, options) {
		window.clearTimeout(macro._renderTimeout);
		macro._renderTimeout = window.setTimeout(function() {
			macro._renderStream(place, type, options);
		}, 100);
	},
	_renderStream: function(place, type, options) {
		$(place).empty();
		var limit = options.limit;
		var container = $("<ul />").addClass("activityStream").appendTo(place);
		var textHeading = macro.locale.userHeading.format(macro.info.loaded, macro.info.queries);
		$("<li />").addClass("listTitle").text(textHeading).appendTo(container);
		var tiddlers = store.sortTiddlers(store.filterTiddlers("[server.activity[true]]"), "-modified"); // TODO: sort headings instead if possible (conflicts with limit)
		var headings = [];
		var groups = {};
		var processed = 0, i, j;
		var atEndOfActivityFeed = true;
		for(i = 0; i < tiddlers.length; i++) {
			var tiddler = tiddlers[i];
			if(options.templates.contains(tiddler.fields["server.activity.type"])) {
				if(!limit || processed < limit) {
					var modified = tiddler.modified;
					if(modified) {
						// format date.
						var modifiedString = modified.formatString(options.headingFormat || config.macros.timeline.dateFormat);
						if(headings.contains(modifiedString)) {
							groups[modifiedString].push(tiddler);
						} else {
							headings.push(modifiedString);
							groups[modifiedString] = [ tiddler ];
						}
					}
					processed += 1;
				} else {
					atEndOfActivityFeed = false;
				}
			}
		}
		var somethingRendered;
		for(i = 0; i < headings.length; i++) {
			var heading = headings[i];
			var _tiddlers = store.sortTiddlers(groups[heading], "-modified");
			var headingEl;
			if(_tiddlers.length > 0) {
				headingEl = $("<li />").addClass("listTitle activityGroupTitle").text(heading).appendTo(container);
			}
			var rendered = [];
			for(j = 0; j < _tiddlers.length; j++) {
				var item = macro.createFeedEntry(container, _tiddlers[j], options);
				if(item) {
					rendered.push(item);
				}
			}
			if(rendered.length === 0) {
				headingEl.remove();
			} else {
				somethingRendered = true;
			}
		}
		if(!somethingRendered) {
			var msg;
			if(macro.gotActivity) { // it has been run before
				msg = macro.locale.emptyStream.format(macro.info.loaded, macro.info.queries);
			} else {
				msg = macro.locale.pleaseWait;
			}
			$(container).text(msg);
		}
		if(!atEndOfActivityFeed) { // show more button
			$("<input />").attr("type", "button").val("more").click(function(ev) {
				var currentLimit = $(place).attr("activity-limit");
				var newLimit = parseInt(currentLimit, 10) + 50;
				macro.default_limit = newLimit;
				$(place).attr("activity-limit", newLimit);
				macro.refresh(place);
			}).appendTo(place);
		}
		this.gotActivity = true;
	},
	updateStream: function(jstiddlers, type, options) {
		// assume already sorted.
		var tiddlers = scanMacro._tiddlerfy(jstiddlers, options);
		var _dirty = store.isDirty();
		$.each(tiddlers, function(i, tid) {
			var info = config.macros.view.activity.getActivityInfo(tid, options);
			tid.fields["server.activity.type"] = info.type;
			tid.fields["server.activity"] = "true";
			if(!tid.tags.contains("excludeLists")) {
				tid.title = tiddlyspace.getLocalTitle(tid.title, tid.fields["server.workspace"]);
				tid.tags = tid.tags.concat(["excludeLists", "excludeMissing", "excludeSearch"]);
				tid.fields.doNotSave = "true";
				store.addTiddler(tid); // save caused unsaved changes alert and slowdown
			}
		});
		store.setDirty(_dirty);
	}
};

config.macros.view.views.activityItem = function(value, place, params, wikifier,
	paramString, tiddler) {
	var info = config.macros.view.activity.getActivityInfo(tiddler, {});
	wikify(info.template, place, null, tiddler);
};

var helper = config.macros.view.activity = {
	_isNotification: function(tiddler) {
		return tiddler.tags.contains(macro.USER_AT_TAG) || tiddler.tags.contains("@all");
	},
	_repliesOn: function() {
		return tiddlyspace.currentSpace.name === macro.CURRENT_USER;
	},
	types: {
		video: function(tiddler) {
			return tiddler.tags.contains("video");
		},
		geo: function(tiddler) {
			return tiddler.fields["geo.lat"] && tiddler.fields["geo.long"];
		},
		siteInfo: function(tiddler) {
			var title = tiddler.fields["server.title"];
			return title === "SiteInfo";
		},
		userSiteIcon: function(tiddler) {
			var modifierBag = "%0_public".format(tiddler.modifier);
			var title = tiddler.fields["server.title"];
			return title === "SiteIcon" && modifierBag === tiddler.fields["server.bag"];
		},
		spaceSiteIcon: function(tiddler) {
			var title = tiddler.fields["server.title"];
			return title === "SiteIcon"; // note userSiteIcon above does the bag check
		},
		shadow: function(tiddler) {
			var title = tiddler.fields["server.title"];
			return title in config.shadowTiddlers;
		},
		plugin: function(tiddler) {
			return tiddler.tags.contains("systemConfig");
		},
		followYou: function(tiddler) {
			var title = tiddler.fields["server.title"];
			title = title.indexOf("@") === 0 ? title.substr(1) : title;
			return tiddler.tags.contains("follow") && title === macro.USER_AT_TAG;
		},
		follow: function(tiddler) {
			return tiddler.tags.contains("follow");
		},
		reply: function(tiddler) {
			var title = tiddler.fields["server.title"];
			var myTiddler = store.getTiddler(tiddler.title);
			var myTiddlerIsOlder = myTiddler && myTiddler.modified < tiddler.modified;
			return store.tiddlerExists(title) && myTiddlerIsOlder && helper._repliesOn(tiddler);
		},
		notify: function(tiddler) {
			var title = tiddler.fields["server.title"];
			var myTiddler = store.getTiddler(title);
			var myTiddlerIsNewer = myTiddler && myTiddler.modified > tiddler.modified;
			return helper._isNotification(tiddler) && helper._repliesOn(tiddler) && !myTiddlerIsNewer;
		},
		standard: function(tiddler) {
			return true;
		},
		image: function(tiddler) {
			return config.macros.image.isImageTiddler(tiddler);
		}
	},
	// each type should point to a slice in ActivityStreamTemplates tiddler
	getActivityInfo: function(tiddler, options) {
		var repliesOn = tiddlyspace.currentSpace.name === macro.CURRENT_USER;
		var activityType, i;
		if(tiddler) {
			for(i = 0; i < macro.templates.length; i++) {
				var type = macro.templates[i];
				if(!activityType && helper.types[type]) {
					if(helper.types[type](tiddler)) {
						activityType = type;
					}
				}
			}
		}
		template = store.getTiddlerText("ActivityStreamTemplates##" + activityType) || locale.standardTemplate;
		return activityType ? { template: template, type: activityType } : false;
	}
};

config.macros.view.views.link = function(value, place, params, wikifier,
		paramString, tiddler) {
		var el = createTiddlyLink(place,value,true);
		if(params[2]) {
			$(el).text(params[2]);
		}
};

config.macros.view.views.maplink = function(value, place, params, wikifier,
		paramString, tiddler) {
		var lat = tiddler.fields["geo.lat"];
		var lng = tiddler.fields["geo.long"];
		var label  = params[2] || value;
		if(lat && lng) {
			$("<a />").attr("href", "http://maps.google.com/maps?saddr=%0,%1".format(lat, lng)).text(label).appendTo(place);
		}
};

var _displayS = tiddlyspace.displayServerTiddler;
tiddlyspace.displayServerTiddler = function(src, title, workspace, callback) {
	var localTitle = tiddlyspace.getLocalTitle(title, workspace);
	var localTiddler = store.getTiddler(localTitle);

	var _callback = function(src, tiddler) {
		if(callback) {
			callback(src, tiddler);
		}
		if(localTiddler) {
			tiddler.fields["server.activity"] = "true";
			tiddler.fields["server.activity.type"] = localTiddler.fields["server.activity.type"];
		}
	};
	return _displayS.apply(this, [ src, title, workspace, _callback ]);
};
}(jQuery));
//}}}
As mentioned [[here|RandomColorPalette naggings]]@tobibeer ...would you mind removing all non plugin related includes and tiddlers (esp. the ColorPalette) from...
*http://singletiddler.tiddlyspace.com
That would be most welcome... and thanks for a neat little script!
<<tabs
txtTiddlySpaceTabs
  	--Public "All public tiddlers" [[SideBarTabs##Public]]
	--Private "All private tiddlers" [[SideBarTabs##Private]]
	--Spaces "Tiddlers grouped by space" [[SideBarTabs##Spaces]]
icons: %0.gif
>>
Below a list of themes...
<!DOCTYPE html>
<html>
<head>
    <title>@tivity</title>
    <link rel="stylesheet" type="text/css"
    href="/bags/common/tiddlers/reset.css">
    <link rel="stylesheet" type="text/css"
    href="http://tiddlyspace.com/bags/tivity-extra_public/tiddlers/activity.css">
</head>
<body>
    <div id="message"></div>
    <div class="box">
        <h1 title="from spaces you follow">&#9634;</h1>
        <ul id="bbox" class="tiddlers"></ul>
    </div>
    <div class="box">
        <h1 title="tagged for you">@</h1>
        <ul id="atbox" class="tiddlers"></ul>
    </div>
    <div class="box">
        <h1 title="from your friends">&#x263A;</h1>
        <ul id="fbox" class="tiddlers"></ul>
    </div>
    <div class="box">
        <h1 title="from everybody">&#x221E;</h1>
        <ul id="upbox" class="tiddlers"></ul>
    </div>
    <div id="sizer">M</div>
    <div id="more">
        <input type="text" id="newsub" value="#tag, +modifier or @space">
        <button id="addsub">+</button>
    </div>
</body>
<script src="/bags/common/tiddlers/jquery.js"></script>
<script src="http://tiddlyspace.com/bags/tivity-extra_public/tiddlers/jquery.timeago.js"></script>
<script src="/status.js"></script>
<script src="http://tiddlyspace.com/bags/tivity-extra_public/tiddlers/tiddlersocket.js"></script>
<script src="http://tiddlyspace.com/bags/tivity-extra_public/tiddlers/activity.js"></script>
</html>

Here's how I would extend the core {{{getTiddler}}} method (by overwriting) in order to retrieve a private/public sibling to a public/private tiddler. It would require two (optional) fields, namely {{{private}}} and {{{public}}} containing a unique identifier that is the same for both the public and the private sibling.

{{{
TiddlyWiki.prototype.getTiddler = function(title,priv)

//new param 'priv' means:
//true: get private sibling for title=publicTitle
//false: get public sibling for title=privateTitle

{
	var find,sibl,t,tid,val;

	//if priv set
	if(priv!=null){
		//get id of corresponding sibling
		find=store.getValue(title,priv?'private':'public'));
		//if not specified, then there is no such sibling
		if(!find)return null;
		//otherwise loop all tiddlers
		for(t in tiddlers) {
			//get object
			var tid = tiddlers[t];
			//if tiddler
			if(tid instanceof Tiddler){
				//get corresponding sibling id
				val=tid.fields[priv?'public':'private')];
				//if that's the same
				if(val==find){
					//store title in sibl
					sibl=tid.title;
					//quit loop
					break;
				}
			}
		}
		//not found, then deleted
		if(!sibl)return null;
	}

	//if sibling, fetch sibling, otherwise fetch original title
	t = this.fetchTiddler(sibl?sibl:title);
	if(t != undefined)
		return t;
	else
		return null;
};
}}}

Switching between a public and a private version of a tiddler could be as easy as clicking on a toolbar button. This, however, would initially have to create the private or public sibling tiddlers and associate either sibling with a unique id - stored at the corresponding {{{private}}} and {{{public}}} fields - that allowed one to later on lookup the corresponding sibling indpendent of any subsequent namechanges.

Obviously, changing the {{{public}}} or {{{private}}} status of such sibling tiddlers were somewhat nonsensical or otherwise would break the sibling relationship, so one would probably want to be notified about that. On the other hand, instead of {{{make public}}} and {{{make private}}} buttons - or in addition to them - one would rather want some {{{open private version}}} or {{{open public version}}} buttons.
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
Apps I've created...
<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>
I had been using a slightly modded version of PopupMacro for a while now on [[tbGTD|http://tbGTD.tiddlyspot.com]]. A [[request of  Saverio on the google groups|http://groups.google.com/group/tiddlywiki/browse_frm/thread/00ba0f73fbd276e0]] made me revisit PopupMacro only to make it ever more useful. The result can be seen int the MainMenu above.

<<more PopupMacroMod>>
Things to do...
[[White-Theme|http://white.tiddlyspace.com]] mimicks the new [[tw5|http://five.tiddlywiki.com]] design and comes in three variants...
;@white
: somewhat closest to tw5
;@white-fixed
: with a fixed header and sidebar and a scrolling story
;@white-classic
: classic layout with horizontal header
These themes are also available for standalone TiddlyWiki here...
» http://white-standalone.tiddlyspace.com
!Preview
[img[http://img.tiddlyspace.com/White-Theme]]
!Summary
PopupMacro renders buttons that display popups with custom content which can be nested.
!Details
The @Popup space provides a much extended fork of PopupMacro from [[Saq Imtiaz|http://tiddlywiki.squize.org/#PopupMacro]] for inclusion on TiddlySpace or use in a standalone TiddlyWiki. Here is how it works...
!Examples
{{{
<<popup "Title Foo" "[[Custom Content|Popup]]" sticky>>
}}}
<<popup "Title Foo" "[[Custom Content|Popup]]" sticky>>
> The keyword ''sticky'' makes the popup stay open even when any links inside are clicked.

To transclude content or use macros in popup contents, replace any closing {{{>>}}} with either  {{{>+>}}} or {{{$))}}}.
{{{
<<popup "Popup" "<<tiddler Popup##Defaults>+>">>
}}}
<<popup "Popup" "<<tiddler Popup##Defaults>+>">>

You can assign custom classes, deactivate hover or redefine arrows...
{{{
<<popup Popup '<<tiddler Popup##Examples>+>' nohover class:'pinkish' arrow:' >' toggle>>
}}}
<<popup Popup '<<tiddler Popup##Examples>+>' nohover class:'pinkish' arrow:' >' toggle>>
> Clicking anywhere inside a popup closes all deeper popups.
!Defaults
The following defaults can be set via a [[zzConfig]].
|!Setting|!Type|!Description|!Default|
|''hover''|boolean|whether or not popups by default open on hover|{{{true}}}|
|''toggle''|boolean|toggles the popup when clicking the popup button|{{{false}}}|
|''sticky''|boolean|makes the popup stay open, when a link inside it is clicked|{{{false}}}|
|''showAfter''|integer|the delay in milliseconds after which popups open on hover|{{{200}}}|
|''hoverables''|string|any links within an element matching this css selector will be made "popup-aware" which means...<br>» when you hover them, any open popup will be closed<br>» any tag buttons will be activated onhover<br>» ''tip:'' make all tagpopups open onhover by using {{{'#contentWrapper'}}}|{{{'#mainMenu'}}}|
|''arrow''|string|an arrow shown at the end of a popup button|{{{document.all ? " ▼" : " ▾"}}}|
!Parameters
You can override defaults using the following parameters...
|!Parameter|!Type|!Description|
|1st|simple|''mandatory:'' the popup title|
|2st|simple|''mandatory:'' the popup contents<br>» macro calls need to end in either {{{>+>}}} or {{{$))}}} rather than {{{>>}}}!|
|''class''|named|a css class assigned to both the button and the opened popup<br>» popups also have the classes ''nested'' and ''nestedLEVEL'' when openened within a popup<br>» buttons have the class ''popupbutton'' |
|''arrow''|named|overrides the default ''arrow'', e.g. {{{arrow:' +'}}}|
|''noarrow''|keyword|deactivates the default arrow|
|''sticky''|keyword|activates hover overriding the global default for ''sticky''<br>» alternatively use {{{sticky:true}}}|
|''nonsticky''|keyword|deactivates hover overriding the global default for ''sticky''<br>» alternatively use {{{sticky:false}}}|
|''toggle''|keyword|activates hover overriding the global default for ''toggle''<br>» alternatively use {{{toggle:true}}}|
|''notoggle''|keyword|deactivates hover overriding the global default for ''toggle''<br>» alternatively use {{{toggle:false}}}|
|''hover''|keyword|activates hover overriding the global default for ''hover''<br>» alternatively use {{{hover:true}}}|
|''nohover''|keyword|deactivates hover overriding the global default for ''hover''<br>» alternatively use {{{hover:false}}}|

Get PopupMacro from the @popup space!
/***
|''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);
//}}}
URL:https://plus.google.com/109308865556494599029/posts/651EwbDv1oS
Video:http://www.youtube.com/watch?v=o70TtNIe-L4
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
<<tiddler video with: "uQITWbAaDx0">>
/***
|''Name:''|SinglePageHistoryPlugin|
|''Description:''|Limits to only one tiddler open (mostly). Manages an history stack and provides macro to navigate in this history (<<history>><<history back>><<history forward>>).|
|''Author:''|[[Tobias Beer|http://tobibeer.tiddlyspace.com]]|
|''Version:''|1.0.6 (2013-10-14)|
|''~CoreVersion:''|2.5.2|
|''Documentation:''|http://singlepagehistory.tiddlyspace.com|
|''Source:''|https://raw.github.com/tobibeer/TiddlyWikiPlugins/master/plugins/SinglePageHistoryPlugin.min.js|
|''License''|Creative Commons 3.0|
***/
// /%
(function(e){var t=config.options;e.each({chkOpenDefaultOnEmpty:true,chkSinglePageMode:true,chkOpenTop:true},function(e,n){if(t[e]===undefined)t[e]=n});var n=config.macros.history={maxHistory:30,intervalUpdateURL:500,lingo:{historyLbl:"History",historyTip:"Click to show history...",forwardLbl:">",forwardTip:"Forward to previous in history...",backLbl:"<",backTip:"Back to last in history...",cancelEdit:"'%0' is being edited.\n\n"+"OK saves and closes it.\n"+"CANCEL leaves it open."},history:[],historyIndex:-1,currentTiddler:null,button:false,timeoutChangedURL:0,lastURL:window.location.href,openAll:false,handler:function(t,r,i){var s,o=i[0],u=n.historyIndex,a="button btn-history btn-history-";if(o){type=o=="back"?o:"forward";s=createTiddlyButton(t,n.lingo[type+"Lbl"],n.lingo[type+"Tip"],n.go,a+type);if(o=="back"&&u==0||o!="back"&&u==n.history.length-1)e(s).addClass("btn-history-none")}else{createTiddlyButton(t,n.lingo.historyLbl,n.lingo.historyTip,n.showPopup,"button btn-history btn-history-popup")}},showPopup:function(t){var r,i,s,o=t||window.event,u=Popup.create(this);for(r=0;r<n.history.length;r++){s=n.history[r];i=createTiddlyButton(createTiddlyElement(u,"li"),s,s,n.go);e(i).attr("historyIndex",r);if(s==n.currentTiddler)e(i).addClass("btn-history-current")}Popup.show(u,false);o.cancelBubble=true;if(o.stopPropagation)o.stopPropagation();return false},go:function(){var t,r=e(this),i=n.history.length,s=r.hasClass("btn-history-forward"),o=r.attr("historyIndex"),u=n.currentTiddler,o=undefined!=o?parseInt(o):n.historyIndex+(s?1:-1);t=n.history[o];if(!t||t==u||n.checkDirty()){return false}n.historyIndex=o;n.button=true;story.displayTiddler(null,t);n.button=false;e(".btn-history-back, .btn-history-forward").addClass("btn-history-none");if(o>=0&&o<i-1)e(".btn-history-forward").removeClass("btn-history-none");if(o<=i-1&&o>0)e(".btn-history-back").removeClass("btn-history-none");return false},checkDirty:function(){var e=false;story.forEachTiddler(function(t,r){if("true"==r.getAttribute("dirty")){if(confirm(n.lingo.cancelEdit.format([t])))story.saveTiddler(t);else{e=true;return false}}});return e},startURL:function(e){var t=window.location.href.split("#");return e?t[0]:!t[1]||t.length==1},openTiddlers:function(e){n.openAll=true;story.displayTiddlers(null,e?e:store.getTiddlerText("DefaultTiddlers").readBracketedList());story.permaView();n.openAll=false}};checkChangedURL=function(){var e,r,i=window.location.href,s=i.indexOf("#"),o=t.chkSinglePageMode;if(i==n.lastURL)return;r=decodeURIComponent(i.substr(s+1)).readBracketedList();if(o&&r.length==1&&!story.getTiddler(r[0])||!o&&t.chkOpenTop&&story.getTiddler(r[0]))story.displayTiddler(null,r[0]);else if(o){n.lastURL=i;e=r.length;r.map(function(t){e=e&&story.getTiddler(t);return e});if(!e){if(r.length)n.openTiddlers(r);else n.openTiddlers()}}};var r=Story.prototype;r.displayTiddlerSINGLEPAGEHISTORY=r.displayTiddler;r.displayTiddler=function(r,i,s,o,u){var a,f=[],l,c,h,p=0,d,v=t.chkSinglePageMode,m=n.historyIndex,g=n.history.length,y=n.currentTiddler,b=typeof i==="string"?i:i.title;if(y!=b&&s!=2){if(!n.button){if(n.checkDirty()&&v){return false}if(g>0&&m<g-1){for(h=0;h<=m;h++)f.push(n.history[h]);f.push(b);n.historyIndex+=1;n.history=f}else{n.history.push(b);if(g>n.maxHistory)n.history.shift();else n.historyIndex+=1}e(".btn-history-forward").addClass("btn-history-none");if(b!=y&&m>=0)e(".btn-history-back").removeClass("btn-history-none")}if(y&&!n.openAll&&v&&s!=2){n.openAll=true;story.closeAllTiddlers();n.openAll=false}n.currentTiddler=b;if(!n.openAll){href=n.startURL(true)+"#"+encodeURIComponent(String.encodeTiddlyLink(b));window.location.href=href}n.lastURL=window.location.href;document.title=wikifyPlain("SiteTitle")+" - "+b}c=story.displayTiddlerSINGLEPAGEHISTORY("top",b,s,v?false:o);this.forEachTiddler(function(){p++;return p<3});if(s!=2&&p<2||!v){if(t.chkOpenTop)e("#tiddlerDisplay").prepend(e(c));d=(v||t.chkOpenTop)&&!e("#displayArea #searchResults").length?0:ensureVisible(c);if(t.chkAnimate)e(document.body).animate({scrollTop:d});else window.scrollTo(0,d)}if(!n.timeoutChangedURL)n.timeoutChangedURL=window.setInterval(function(){checkChangedURL()},n.intervalUpdateURL);return c};r.closeTiddlerSINGLEPAGEHISTORY=r.closeTiddler;r.closeTiddler=function(e,i,s){r.closeTiddlerSINGLEPAGEHISTORY.apply(this,arguments);if(s!="OPENING"&&t.chkOpenDefaultOnEmpty&&!n.openAll){var o=0;this.forEachTiddler(function(e,t){o++;return o<2});if(o==0)n.openTiddlers()}};onClickTagOpenAllSINGLEPAGEHISTORY=onClickTagOpenAll;onClickTagOpenAll=function(e){n.openAll=true;story.closeAllTiddlers();onClickTagOpenAllSINGLEPAGEHISTORY.apply(this,arguments);story.permaView();n.openAll=false};config.commands.saveTiddler.handlerSINGLEPAGEHISTORY=config.commands.saveTiddler.handler;config.commands.saveTiddler.handler=function(e,t,r){n.openAll=true;var i=config.commands.saveTiddler.handlerSINGLEPAGEHISTORY.apply(this,arguments);n.openAll=false;return i};var i=config.paramifiers;e.each(config.paramifiers,function(e,t){t.onstartSINGEPAGEHISTORY=t.onstart;t.onstart=function(e){n.openAll=true;t.onstartSINGEPAGEHISTORY.apply(this,arguments);n.openAll=false}})})(jQuery)
// %/
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
Ok, now where is the "I like [[that|tiddlerSVGLinkExample]]@jon" button ;o)
/***
|''Name:''|SimplePopupMacro|
|''Version:''|0.9.0 BETA (2012-08-04)|
|''Source:''|http://simplepopup.tiddlyspace.com/#SimplePopupMacro|
|''Author:''|[[Tobias Beer]]|
|''Description:''|Creates a popup from WikiText|
|''Documentation:''|http://simplepopup.tiddlyspace.com|
|''~TiddlyWiki:''|Version 2.5.3 or better|
!Info
Use the {{{<<pop>>}}} macro as in the example below. You can nest popups as much as you please. Assigning the class {{{simple}}} via {{{popClass:simple}}} will turn all links to block level elements and remove .listTitles, e.g. when using the {{{<<tagging>>}}} macro.
!Example
{{{
<<pop
	Roots
	Grass##ROOTS
	popClass:'myPop'
	tooltip:'All about grass roots...'
	tiddler:'Grass'
>>
}}}
!Macro Parameters
{{{
<<pop
"Parameter 1 (mandatory) = the popup button title"
[[Parameter 2 (mandatory) = reference to the popup contents as Tiddler or Tiddler##Section or Tiddler::Slice]]
popClass:"(optional, defaults to .pop) -> CSS classes applied to this and ALL nested popups"
popClassOnce:'(optional) -> CSS classes applied only to this popup'
tiddler:[[(optional) -> the tiddler to be opened when the popup button is clicked]]
tooltip:"(optional) -> the popup button toolip"
buttonClass:'(optional, defaults to .popButton) -> Popup button css classes'
>>
}}}
***/
//{{{
(function($){

config.macros.pop = {
	
	hoverButton:true,
	bullet:'&gt;',
	bulletOnlyWhenNested:true,
	closeOnClick:true,
	err:'{{popErr{empty popup}}}',

	handler:function(place,macroName,params,wikifier,paramString,tiddler){
		var b,
			x=this,
			act=x.act,
			tid=story.findContainingTiddler(place),
			p=paramString.parseParams('pop',null,true),
			lbl=params[0],
			btn=$(createTiddlyButton(
				place,
				lbl,
				getParam(p,'tooltip',''),
				act,
				'button popButton ' + getParam(p,'buttonClass','')
			)),
			outer=btn.closest('.pop'),
			popClasses=(outer.attr('popClasses')||'').split(' '),
			level=parseInt(outer.attr('popLevel')),
			bullet=getParam(p,'bullet', outer.length ? outer.attr('bullet') : x.bullet);

		level = isNaN(level)?0:level;
		$.each(getParam(p,'popClass','').split(' '),function(i,v){
			popClasses.pushUnique(v);
		});
		
		btn.attr({
			'id':this.newId('popBtn'),
			'source': params[1],
			'bullet': bullet,
			'popLevel': (outer.length ? level : 0),
			'popClass1': getParam(p,'popClassOnce',''),
			'popClasses': popClasses.join(' '),
			'tid': getParam(p,'tiddler','')
		});
		
		if(bullet && !(getParam(p,'bulletOnlyWhenNested',x.bulletOnlyWhenNested).toString()=='true' && level == 0)){
			$b=$('<span class="popBullet"></span>').appendTo(btn);
			wikify(bullet,$b[0]);
		}
		
		if(getParam(p,'hover',x.hoverButton.toString())=='true'){
			btn.hover(
				//Enter PopupButton
				function(ev){
					console.log('Enter -> Button Level '+ $(this).attr('popLevel'));
					outer.attr('windowY',$(window).scrollTop());
					act(ev||window.event,this,false)
				},
				//Leave PopupButton
				function(ev){
					var $last,level,
						e=ev||window.event,
						$btn=$(this),
						$where=$(e.toElement || e.relatedTarget).closest('.pop'),
						pop=$btn.attr('popup'),
						$pop=$('#'+pop);
					console.log('Leave -> Button Level '+ $btn.attr('popLevel'));
					if(pop && pop != $where.attr('id')){
						if(x.windowDidNotScroll(outer)){
							$btn.removeClass('active').attr('popup','');
							level=parseInt($pop.attr('popLevel'))-1;
							$last = Popup.stack[level];
							$last = $($last ? $last.popup : null);
							if($last.attr('btn')==$btn.attr('id'))
								Popup.remove(level);
							return false;
						}
					} else if(pop) {
						act(e,this,true)
					}
				}
			);
		}
	},

	act: function(ev,btn,out){
		
try{
		var clsx=' ',pop,
			click=btn==undefined,
			e=ev||window.event,
			el=$(btn?btn:this),
			x=config.macros.pop,
			id=el.attr('popup'),
			source=store.getTiddlerText(el.attr('source')),
			tid=el.attr('tid'),
			cls=el.attr('popClasses'),
			cls1=el.attr('popClass1'),
			bullet=el.attr('bullet'),
			level=parseInt(el.attr('popLevel')) + 1,
			outer=el.closest('.pop');
		
		if(click && tid){
			el.attr('popup','');
			if(Popup.stack.length)Popup.remove(0);
			story.displayTiddler(null,tid);
			return false;
		}

		if(!id || !$('#' + id).length){
			id=x.newId('pop');
			pop=Popup.create(el[0]);
			$.each((cls+cls1).split(' '),function(i,v){
				clsx += v ? (v + '__' + level + ' ') : '';
			});
			$(pop)
				.addClass(
					'pop ' +
					'pop__' + level + ' ' +
					(level > 1 ? 'popsub ':'') +
					cls + ' ' + 
					cls1 + ' ' + 
					clsx)
				.attr({
					'id':id,
					'btn':el.attr('id'),
					'windowY':$(window).scrollTop(),
					'bullet':bullet,
					'popClasses':cls,
					'popLevel': level})
				.click(x.noBubble);
			
			$('.active',outer).removeClass('active');
			el.attr('popup',id).addClass('active');
			wikify(source,pop);
			Popup.show(pop,false);
			
			$(pop).hover(
				//Enter Button
				function(ev){
					var e = ev||window.event,
						$pop = $(this),
						$btn = $('#' + $pop.attr('btn'));
					console.log('Enter -> Popup Level '+ $pop.attr('popLevel'));
					if($pop.attr('id') != $btn.attr('popup'))
						$btn.attr('popup','');
						Popup.remove(parseInt($pop.attr('popLevel')));
				},
				//Leave Button
				function(ev){
					var e = ev||window.event,
						inPop = $(e.toElement || e.relatedTarget).closest('.pop').length;
					console.log('Leave -> Popup Level '+ $(this).attr('popLevel'));
					if(!inPop && x.windowDidNotScroll(this)){
						$('#' + $(Popup.stack[0]?Popup.stack[0].popup:'').attr('btn'))
							.removeClass('active')
							.attr('popup','');
						Popup.remove(0);
					}
				}
			);			
			return x.noBubble(e,click?null:pop);
		}
}catch(err){alert(err);}

	},

	windowDidNotScroll: function(el){
		var $el = $(el);
		return !$el.length || $el.attr('windowY') == $(window).scrollTop().toString();
	},
	
	newId:function(p){
		return p+Math.random().toString().substr(3);
	},

	noBubble:function(ev,pop){
		var e=ev||window.event,
			$el=$(resolveTarget(e)).closest('a'),
			result=false;
		//do nothing when button or link clicked
		if(config.macros.pop.closeOnClick && $el.is('a')) return true;
		//otherwise, go out
		else if(pop)Popup.remove(1);
		//cancel out
		e.cancelBubble=true;
		if (window.event) e.returnValue=false;
		if (e.preventDefault) e.preventDefault();
		if (e.stopPropagation) e.stopPropagation();
		return result;
	}
}

//click anywhere
$(document).click(function(ev) { 
		var e = ev || window.event;
    //if left mouse click and not in any popup
    if (e.button == 0 && !$(e.toElement || e.relatedTarget).closest('.popup').length) {
			//no more active popups
      $(".popButton").removeClass('active').attr('popup','');
    }
		return true;
});

config.shadowTiddlers['StyleSheetSimplePopup']='/*{{{*/\n'+
	'.pop {padding: 0.2em 0.1em 0.1em;}\n'+
	'.pop.simple .listTitle {display:none}\n'+
	'.pop.simple ul {list-style-type:none;padding:0;}\n'+
	'.pop.simple ul li a, .pop.simple a.button, .pop.simple a.tiddlyLink {display: block;text-align:left;font-weight:bold;}\n'+
	'.pop.simple br {display:none;}\n'+
	'.popBullet {float:right;color:#bbb;margin-right: -5px;padding-left: 10px;}\n'+
	'.main ul li a  {font-weight:bold;}\n'+
	'/*}}}*/';
store.addNotification('StyleSheetSimplePopup',refreshStyles);

})(jQuery);
//}}}
/*
 * A new bookmarklet for TiddlySpace
 *
 * Use the following Bookmarklet to test:
 * javascript:(function(a,b)%7Ba=b.createElement('script');a.setAttribute('src','http://sandben.tiddlyspace.com/bookmarklet.js');b.body.appendChild(a);a.addEventListener('load',function()%7BloadBookmarker('http://sandben.tiddlyspace.com/bookmark','sandben');%7D,false);%7D(null,document))
 */

/*
 * @url: url of the bookmarklet
 * @space: space to save back to
 * @callback: callback to call when the window closes
 */
(function() {

var $; // make sure jQuery is mapped to $ internally

window.Bookmarker = {
	//load jQuery
	loadScript: function(url, testFn, callback) {
		if (!testFn()) {
			var scr = document.createElement('script');
			scr.type = 'text/javascript';
			scr.src = url;
			scr.onload = scr.onreadystatechange = function() {
				if (testFn()) {
					callback();
				}
			};
			document.body.appendChild(scr);
		} else {
			setTimeout(callback, 50);
		}
	},

	loadDependencies: function(callback, options) {
		var self = this,
			local = options.local,
			jQueryLib = local ? 'jquery.min.js' : 'http://ajax.googleapis.com/' +
				'ajax/libs/jquery/1.6.4/jquery.min.js',
			chrjsLib = local ? 'chrjs.js' : 'http://tiddlyspace.com/bags/' +
				'tiddlyspace/tiddlers/chrjs';

		function jQueryTest() {
			return (typeof window.jQuery !== 'undefined');
		}

		function loadChrjs() {
			$ = jQuery;
			self.loadScript(chrjsLib, chrjsTest, callback);
		}

		function chrjsTest() {
			return (typeof window.tiddlyweb !== 'undefined' &&
				typeof window.tiddlyweb.Tiddler === 'function');
		}

		// load jQuery, then load chrjs
		this.loadScript(jQueryLib, jQueryTest, loadChrjs);
	},

	// init/constructor function
	load: function(url, space, source) {
		var self = this,
			isExtension = source === 'extension';

		this.bookmarkletID = 'bookmarklet' + this.randID;
		this.stylesheet.innerHTML = generateStylesheet(this.bookmarkletID);
		document.head.appendChild(this.stylesheet);
		this.urlBase = url.replace(/^(.*)([^\/])(\/[^\/].*)/,
			function($0, $1, $2) {
				return ($1) ? $1 + $2 : '';
			});

		this.loadDependencies(function() {
			var mover;

			self.iframe = $('<iframe/>', {
				src: url,
				id: self.bookmarkletID
			}).appendTo(document.body)[0];

			self.iframe.addEventListener('load', function() {
				var message = self.getMessage(space, { local: isExtension });
				self.iframe.contentWindow.postMessage(message, self.urlBase);
			}, false);

			mover = Mover($(self.iframe), self.urlBase, self.randID);
			window.addEventListener('message', function(event) {
				var message = JSON.parse(event.data);
				if (event.origin === self.urlBase &&
						message.id === self.randID) {
					switch (message.type) {
						case 'close':
							self.close();
							break;
						case 'startMove':
							mover.start(message.payload);
							break;
						case 'stopMove':
							mover.stop(message.diff);
							break;
					}
				}
			}, false);
		}, { local: isExtension });
	},

	getText: function() {
		var text = '';
		if (window.getSelection) {
			text = window.getSelection().toString();
		} else if (document.getSelection) {
			text = document.getSelection();
		} else if (document.selection) {
			text = document.selection.createRange().text;
		} else {
			text = '';
		}

		return text;
	},

	getImages: function() {
		var images = [],
			candidates = document.getElementsByTagName('img'),
			res = [],
			i, l, image;

		for (i = 0, l = candidates.length; i < l; i++) {
			image = candidates[i];
			if ((image.offsetWidth >= 150 && image.offsetHeight >= 50)
					|| (image.offsetWidth >= 50 && image.offsetHeight >= 150)) {
				images.push(image);
			}
		}

		images = images.sort(function(a, b) {
			var aSize = a.offsetWidth * a.offsetHeight,
				bSize = b.offsetWidth * b.offsetHeight;

			return (aSize > bSize) ? -1 : ((aSize === bSize) ? 0 : 1);
		});

		for (i = 0, l = images.length; i < l; i++) {
			image = images[i];
			if (image.src) {
				res.push(image.src);
			}
		}

		return res;
	},

	getTitle: function() {
		return document.title.replace(/\|/g, '-');
	},

	getMessage: function(space, options) {
		return JSON.stringify({
			title: this.getTitle(),
			url: window.location.href,
			space: space,
			text: this.getText(),
			images: this.getImages(),
			id: this.randID,
			local: !!options.local
		});
	},

	close: function() {
		document.body.removeChild(this.iframe);
	},

	iframe: null,
	stylesheet: document.createElement('style'),
	randID: ('' + Math.random()).slice(2),
	bookmarkletID: null,
	urlBase: null

};

function generateStylesheet(uniqueID) {
	return [
		'#' + uniqueID + ' {',
		'width: 555px;',
		'height: 87%;',
		'max-height: 527px;',
		'min-height: 300px;',
		'position: fixed;',
		'top: 0;',
		'left: 0;',
		'bottom: 0;',
		'margin: 10% 25%;',
		'z-index: 10000;',
		'border: 0;',
		'}',
		'@media all and (min-width: 1360px) {',
		'#' + uniqueID + ' {',
		'margin: 10% 30%;',
		'}',
		'}',
		'@media all and (max-width: 800px) {',
		'#' + uniqueID + ' {',
		'margin: 10%;',
		'}',
		'}',
		'@media all and (max-width: 600px) {',
		'#' + uniqueID + ' {',
		'margin: 10% 5%;',
		'}',
		'}',
		'@media all and (max-width: 550px) {',
		'#' + uniqueID + ' {',
		'margin: 10% 0;',
		'width: 100%;',
		'}',
		'}'
	].join('\n');
}

function Mover($el, urlBase, randID) {
	var borderSize,
		oldCSS = {},
		devMode = /csrf_token=[0-9]{10}:bengillies/.test(document.cookie);

	return {
		start: function(payload) {
			var diff = { y: $el.offset().top, x: $el.offset().left };
			oldCSS.top = $el.offset().top;
			oldCSS.left = $el.offset().left;
			oldCSS.right = $el.css('right');
			oldCSS.bottom = $el.css('bottom');
			oldCSS.height = $el.css('height');
			oldCSS.width = $el.css('width');
			oldCSS['max-height'] = $el.css('max-height');
			oldCSS['max-width'] = $el.css('max-width');
			oldCSS.margin = $el.css('margin');
			$el.css({
				top: 0,
				left: 0,
				right: 0,
				bottom: 0,
				margin: 0,
				width: '100%',
				height: '100%',
				'max-height': 'none',
				'max-width': 'none'
			});
			$el[0].contentWindow.postMessage(JSON.stringify({
				type: 'initMove',
				diff: diff,
				id: randID
			}), urlBase);
		},
		stop: function(diff) {
			$el.css({
				top: oldCSS.top + diff.y,
				left: oldCSS.left + diff.x,
				right: oldCSS.right,
				bottom: oldCSS.bottom,
				//margin: oldCSS.margin,
				height: oldCSS.height,
				width: oldCSS.width,
				'max-height': oldCSS['max-height'],
				'max-width': oldCSS['max-width']
			});
			$el[0].contentWindow.postMessage(JSON.stringify({
				type: 'doneMove',
				id: randID
			}), urlBase);
		}
	};
}

window.loadBookmarker = function() {
	Bookmarker.load.apply(Bookmarker, arguments);
};

// check if we should run straight away
var scripts = document.getElementsByTagName('script');
for (var i = 0, l = scripts.length; i < l; i++) {
	var attribute = scripts[i].getAttribute('data-tiddlyspace-trigger-hack'),
		args;
	// if there's a script from tiddlyspace with the right attribute
	if (attribute) {
		args = JSON.parse(attribute);
		// remove the script when the bookmarklet closes
		args.push(function() {
			document.body.removeChild(scripts[i]);
		});
		Bookmarker.load.apply(Bookmarker, args);
		return;
	}
}

}());
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
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="434 218 68 68"
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
	<g>
		<path d="M 478.39694 232.53705 L 478.39694 232.53705 
		C 477.1145 231.85132 475.77875 231.30147 474.41058 230.88734 L 474.41058 218.24994 L 461.58942 218.24994 
		L 461.58942 230.88734 C 460.22125 231.30147 458.8855 231.85132 457.60306 232.53705 L 448.66824 223.60214 
		L 439.6022 232.66814 L 448.53717 241.60304 C 447.8515 242.8854 447.30157 244.22116 446.88745 245.58936 
		L 434.25 245.58936 L 434.25 258.41052 L 446.88745 258.41052 
		C 447.30157 259.77869 447.8515 261.11447 448.53717 262.39688 L 439.6022 271.33173 L 448.66824 280.3978 
		L 457.60306 271.46283 C 458.8855 272.14862 460.22125 272.69846 461.58942 273.11252 L 461.58942 285.74988 
		L 474.41058 285.74988 L 474.41058 273.11252 C 475.77875 272.69846 477.1145 272.14862 478.39694 271.46283 
		L 487.33176 280.3978 L 496.39767 271.33173 L 487.46286 262.39688 
		C 488.14853 261.11447 488.69836 259.77869 489.11255 258.41052 L 501.74988 258.41052 L 501.74988 245.58936 
		L 489.11255 245.58936 C 488.69836 244.22116 488.14853 242.8854 487.46286 241.60304 L 496.39767 232.66814 
		L 487.33176 223.60214 Z M 475.3328 244.66714 C 479.3825 248.71698 479.3825 255.2829 475.3328 259.33273 
		C 471.28296 263.3826 464.71704 263.3826 460.66724 259.33273 
		C 456.61737 255.2829 456.61737 248.71698 460.66724 244.66714 
		C 464.71704 240.61734 471.28296 240.61734 475.3328 244.66714" fill="#111"
		class="glyph"/>
	</g>
</g>
</svg>
R0lGODlhAQEBAYIAMQAAACQkJEhISG1tbZGRkba2ttra2v///ywAAAAAAQEBAQID/ii63P4wykmrvTjrzbtvRCiOZGmeaKqubOu+cCzPdB0qdq7vfO//wBUuSCwaj8gkaqhsOp/Q6IgprVqvWBg1y+16pduveEzuhcvotFp1Xrvf6DZ8TsfK6/i88q7v+318f4KDMoGEh4hLAomMjUKLjpGSN5CTlomGl5pwmZueaZ2fomKho6ZZpaeqYJWrrqStr7KosbO2rLe5Vam6vTm8vsGFtcLFZsTGyTbAys0lzM7RBNDSzdQoBQYF1bLXJwUHB9rcq94m4OHi2+Sj5iXo6ersn+4k8PHy85f1I/f4+foi8RPh7x/AgJiQ5Sho8CDCQQNDMGzo8GGfiAQmUqxo/rEORo0bOXZ88zFkyHEj6ZQ0eXJdSjcrWbZ8uSamzJk0y9i8iTPnl508e/qkFQRkUIMoh14BetRkUqVRmDZ16hKqE6lTqVq9qtCG0awbn24tghUsS7Fjf5Q1e7Zq2mNF2bJF+3ZZ1xpf5batu2Ot3pt0+b7w+xewW8EuCBc2jFjLXRp5F/MM3PjZ4xmRJU8+XJmEYs1BKVf+DDo059GXZWQufVR0XdKsW59+nTrG6thNXVuFjTv37N21YdzuPVV3Tt7Ei/8+HvzF8ORZjXdEDj368unNXTyvDla6Purcu1//nr3F9vBmvVcDjz79+PXlWZxvP/e9M/b061vEn19//kD+/fnHDoABCghfXAUGqN4tBCYo14LdxLfCfA5KBmE5EqpAYYUW2udKgxz+daEoIIYoooftZJjChiaCNuI+KmLTYosvSlLijIvV2MiNOOaIoo0xftNjjzoSwuOQHWKIIJJE/njIkUxqVmQeUEYppZN+VGnllZtouSWXlnj5JZgCBXnOmGNOGYeZ76CJpppjiOlmaXB6IeecdGKpE5v24IlnnUvx2Y+ffgKKCxAsEqqgnlzcqShuhjbh6KOQMrqLoARRSmmkRkyqaW+cBuHpp6BaugemEpFKaqg8jKoqcaz+gmpGr74aKw2u1prcrTHkquuupsKF6K+/8sqCr8RC/mdsCsgmq2ywuM6aqLNILuuZtNRSay0lS2abrLXNehueseGKOy60zGJrrrislrsuegYQ4e67z5KlLr3E3jovvnkmsS+/Pkp6L8CPbjvNwAT/ia5j3Sb85sK9IuywlQZb1vDE1UIc7cUYz1ixIhx3zOHH6YYscoEksyHxyYvuaTLL54KyMszcpTzYzDTDqrG9L+fcLyc4+0wm0D0LrZfNdhVttHgXBb20dX/8my3Swv4w7dJUA+L003shInWtWYu6NddI7Wzn2GSnE3anaJO99hFfE/o2EnHPObe/bed896lK6202SXmLvPcTdWf8SuE4Dn6o1U8rfmnfBDtuBeIO/koeKOTvWm5H4N5qTtSwHXveKOf5/u0I5dWJ/hPpqqoOC+a2mg4j7J+67jLo7MruCepJPsT7iSP9buB+rG9pu0rFM3m8R8k3CZXwjAFHu/NjQR+W7r5YX7Zg2sezvNfN5/d9QtO33NnB5dM3/unh13v+FO2X+r7FuNOI/Tx1r99l/L3PD3L9KLsf8dI3NP+VDIDt0Z8qmqVAJSHQfQZk2APlF8FhEFA5FdzYBF0kwOrxTygZnIGXGhiMKpFQGEc6YTFupEJjgKiFySAQDJXBnxlaI3k2vA/rchgN3vBQGqT54YE2iA8hcsMvRiRHWZI4oJkxEX8SeyJ5uiXF/6irjooI+QgWfTerEALOi6bACBhr0sUxysyM9CgjGskgxjWyUY1uXF0cZzfHSbSxjl24Ix4/t8cdwbGPk/sjIBc3yCcJspCEOyQiBbZIQzbSSIp8JNwiKUmeVTJLlLwkEPSoyUl2Ug+c/KS8MinKvpCylLJCJfJUOYdQsrJVp3zlMD5Ay1ra8pa4zKUud1mBBAAAOw==
!Followers
<<followers>>
!Activity
[[Replies and Notifications]]
<<tiddler Activities>>
!Following
All spaces tagged follow
<<list filter [tag[follow]][sort[title]]>>

<<followSuggestions>>
/***
|''Name:''|ToggleSideBarTB|
|''Description''|allows to toggle left and right sidebar|
|''Version:''|1.1|
|''Type''|macro|
|''Author:''|[[TobiasBeer]]|
|''Info:''|http://tbgtd.tiddlyspot.com/#ToggleSideBarTB|
|''Source:''|http://tbgtd.tiddlyspot.com/#ToggleSideBarTB|
|''License''|[[Creative Commons Attribution-Share Alike 3.0|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion''|2.xx|
!Code
***/
//{{{
config.macros.toggleSideBarTB={
  settings:{
    arr1:"►",arr2:"◄",
    lblToggle:"toggle %0",
    leftBarID:"mainMenu",leftBarLbl:"main menu",
    leftBarHide:"margin-left:2em;",leftBarShow:"margin-left:2em;",
    rightBarID:"sidebarTabs",rightBarLbl:"sidebar",
    rightBarHide:"margin-right:2em;",rightBarShow:"margin-right:24em;"
  },
  handler:function(place,macroName,params,wikifier,paramString,tiddler){
    var l=params[0]&&params[0]=="left";
    var h=params[1]&&params[1]=="hide";
    var no=params[2]&&params[2]=="notip";
    var s=this.settings;
    var el=l?s.leftBarID:s.rightBarID;
    var btnId="ToggleSideBar"+(l?"Left":"Right");
    var arr=l?(h?s.arr1:s.arr2):(h?s.arr2:s.arr1);
    var lbl=(no?'':s.lblToggle.format([(l?s.leftBarLbl:s.rightBarLbl)]));
    var fct=function(){config.macros.toggleSideBarTB.toggle(btnId)};
    document.getElementById(el).setAttribute("toggle","hide");
    createTiddlyButton(place,arr,lbl,fct,"button HideSideBarButton",btnId);
    if(h)config.macros.toggleSideBarTB.toggle(btnId);
  },
  toggle:function(btnId){
    var btn=document.getElementById(btnId);
    var l=btn.id=="ToggleSideBarLeft";
    var s=config.macros.toggleSideBarTB.settings;
    var bl=document.getElementById(s.leftBarID);
    var br=document.getElementById(s.rightBarID);
    var bar=(l?bl:br);
    var hl=bl.getAttribute("toggle")=='show';if(l)hl=!hl;
    var hr=br.getAttribute("toggle")=='show';if(!l)hr=!hr;
    var h=(l?hl:hr);
    setStylesheet("#tiddlerDisplay, #searchResults {"+
        (hl?s.leftBarHide:s.leftBarShow)+
        (hr?s.rightBarHide:s.rightBarShow)+
      "}","ToggleSideBarStyles");
    bar.style.display=h?"none":"block";
    bar.setAttribute("toggle",(h?"show":"hide"));
    arr1=l?s.arr2:s.arr1;arr2=l?s.arr1:s.arr2;
    btn.innerHTML=h?arr2:arr1;
  }
}
//}}}
/***
|Name|TiddlerTabsPlugin|
|Author|[[Tobias Beer|http://tobibeer.tiddlyspace.com]]|
|Documentation|http://tiddlertabs.tiddlyspace.com|
|Source|http://tiddlertabsplugin.tiddlyspace.com/#TiddlerTabsPlugin|
|Requires||
|~CoreVersion|2.6.2|
|License|Creative Commons 3.0|
|Version|0.9.1 beta|
!Info
This plugin lists all tiddlers in tabs via the {{{<<tiddlerTabs>>}}} macro.
!Parameters
group = number of starting letters per group
sub = max number of columns in a tab
!Example
An Example...
{{{<<tiddlerTabs group:1 sub:1>>}}}
<<tiddlerTabs group:1 sub:1>>
!Code
***/
//{{{
(function ($) {

config.macros.tiddlerTabs = {
	fmtSubTitle: '\n{{ttTitle{%0}}}',
	fmtListItem: '\n[[%0]]',
	defaultGroup: 3,
	defaultSub: 3,
	defaultRanges: 'az 09 _ *',
	caseInsensitive: true,
	onlyRanges: true,
	specialChars: /[\W\_]+/,
	minSubLength: 5,
	subTitles: true,
	subTitleMaxLength: 3,
	txtTabTitle: 'list tiddlers in "%0"',

	handler: function(place,macroName,params,wikifier,paramString,tiddler){
		var a, a0, a1, an, at=[], aOut=[], aSub, c, cx, first, g=0, head, l, last, len, lt={}, lOut=[], n=0, newRange, next, r, r0, r1, rItems={},
			s, secs ='', sh, sp = 0, split, sub0, sub1, special, subStart, subTids, subTitle, style='', t, tabs ='', ti, tx,

			//named params
			p = paramString.parseParams(null,null,true),
			name = getParam(p,'name',$('#tiddlerDisplay').html().length % 100000),
			group = parseInt(getParam(p,'group',0)),
			sub = parseInt(getParam(p,'sub',0)),
			noCase = getParam(p,'caseInsensitive',null),
			ranges = getParam(p,'ranges',this.defaultRanges).split(' '),
			only = getParam(p,'onlyRanges',this.onlyRanges),
			tids = store.getTiddlers('title');

		noCase = noCase == null ? this.caseInsensitive : noCase.toString().toLowerCase() == 'true';
		only = only == null ? this.onlyRanges : only.toString().toLowerCase() == 'true';
		
		//sort tids when case insensitive
		if(noCase) tids.sort(function(x,y){ 
			var a = String(x.title).toUpperCase(); 
			var b = String(y.title).toUpperCase(); 
			if (a > b) return 1
			if (a < b) return -1 
			return 0;
		});

		group = isNaN(group) || group < 1 ? this.defaultGroup : group;
		sub = isNaN(sub) || sub < 1 ? this.defaultSub : sub;

		function addChar(l,ti){
			at.pushUnique(l);
			if(!lt[l])lt[l] = ti&&isNaN(ti)?[ti]:[];
			else lt[l].push(ti);
			if(!isNaN(ti)) {
				rItems[l] = ti;
			}
		}

		function setCase(c){
			return !c ? null : (noCase ? c.toUpperCase() : c );
		}
		
		function nextChar(i){
			var l;
			i--;
			do {
				i++;
				l = at[i];
			} while (lt[l] && lt[l].length < 1);
			return {i:i,l:l};
		}

		if(ranges[0]){
			for (r=0; r<ranges.length; r++){
				r0 = ranges[r].substr(0,1);
				if(r0 == '*') addChar('*',r);
				else if(r0 == '^') noCase = true;
				else if(ranges[r].length == 1) addChar(r0,r);
				else {
					r0 = setCase( r0 );
					r1 = setCase( ranges[r].substr(ranges[r].length-1,1) );
					c = r0.charCodeAt(0) -1;
					cx = r1.charCodeAt(0);
					do {
						c++;
						addChar(String.fromCharCode(c),r);
					} while (c < cx);
				}
			}
		}

		for(t=0; t<tids.length; t++){
			ti=tids[t].title;
			c = ti.substr(0,1);
			if( !at.contains( setCase(c) ) ) c = this.specialChars.exec(c) ? '*' : setCase(c);
			if( ranges[0] && only && !at.contains(c) ) continue;
			addChar(c,ti);
		}

		a = next = nextChar(0);
		
		while(next.l && a.i < at.length){
			a = $.extend({}, next);
			next = nextChar(a.i+1);
			if(g==0) {
				a0 = a.i;
				lOut[n] = '';
				aOut[n] = [];
			}
			newRange = rItems[a.l] != rItems[next.l];
			if(group < 3 || g == 0 || newRange || (group > 2 && g == group - 1) || a.i == at.length - 1) lOut[n] += a.l;
			else if(group > 2 && g == 1) {
				if (a.i < at.length - group + 1) {
					lOut[n] += '-';
				} else {
					a1 = at[a0];
					an = at[a.i];					
					lOut[n] += (a1 == an ? '...' : ( a1.charCodeAt(0) < an.charCodeAt(0) + 2 ? '' : '-') + an);
				}
			}
			
			aOut[n] = aOut[n].concat(lt[a.l]);
			g++;
			if(g==group || newRange) {
				g = 0;
				newRange = false;
				if(!aOut[n][0]){
					aOut.pop();
					lOut.pop();
				}else {
					n++;
				}
			}
		}
		sh = 'TiddlerTabs_' + name;

		for(n=0; n<aOut.length; n++){
			aSub = sub + 1;
			do {
				aSub--;
				split = Math.floor(aOut[n].length / aSub)+1;
			} while( split < Math.max(this.minSubLength,aSub) && aSub > 1 );

			tab = lOut[n];
			tabs += '\n' + tab + ' \'' + this.txtTabTitle.format([tab]) +'\' [[' + sh + '##' + tab + ']]';
			tids = sub0 = sub1 = subTids = '';
			len = 0;
			for(t = 0; t<aOut[n].length; t++) {
				if(sp == 0) subStart = t;
				subTids += this.fmtListItem.format([aOut[n][t]]);
				sp++;
				if(sp == split || t == aOut[n].length-1){
					subTitle = '';
					sp = l = 0;
					if(this.subTitles){
						while(sub0 == sub1){
							l++;
							if(len > 0 && l < len) l = len;
							sub0 = setCase( aOut[n][subStart].substr(0,l) );
							sub1 = setCase( aOut[n][t].substr(0,l) );
							if(subStart == t || l == this.subTitleMaxLength){sub1='';break;}
						}
						len = l;
						head = sub0.substr(0,this.subTitleMaxLength);
						first = (sub1 ? sub0 : (head == last ? '&nbsp;' : head + ' ... ' ) );
						tx = setCase( aOut[n][t].substr(0,l) );
						subTitle = first == '&nbsp;' ? '... ' + tx : first + ( sub1 ? ' ... ' + sub1 : '' );
						subTitle = (aSub < 2 ? '' : this.fmtSubTitle.format([subTitle]) );
					}
					tids += '{{ttSub ttSub' + aSub + '{ {{ttInner{' + subTitle + subTids + ' }}} }}}';
					
					last = head;
					sub0 = sub1 = subTids = '';
				}
			}
			secs += '\n!' + tab + '\n' + tids + '{{ttClear{ }}}';
		}

		config.shadowTiddlers[sh] = '{{ttTabs{<<tabs txt' + sh + tabs + '\n>>}}}/%' + secs + '\n!END%/';

		wikify('<<tiddler [[' + sh + ']]>>',place);	
	}
}

var s, style ='';
for(s=1; s<10; s++)style+='\n.ttSub'+ s.toString() +'{\n\twidth:'+ (Math.floor(100/s)).toString() +'%;\n}';
config.shadowTiddlers['StyleSheetTiddlerTabs'] =
'/*{{{*/'+
'\n.ttTabs .tab{\n\tpadding:3px 5px 2px 5px;margin: 0 0 0 1px;\n\tborder:1px solid transparent;\n\tborder-bottom:none;\n}' +
'\n.ttTabs .tabSelected{\n\tborder-color: [[ColorPalette::TertiaryLight]];\n}' +
'\n.ttTitle{\n\tdisplay:block;\n\tfont-size:1.2em;margin: 0 10px -10px 0;padding-left:10px;border-bottom:1px solid #aaa;\n}' +
'\n.ttInner{\n\tmargin:0 5px;\n}' +
'\n.ttClear{\n\tdisplay:block;\n\tclear:both;\n}' +
'\n.ttSub{\n\tdisplay:block;\n\tfloat:left;overflow:hidden;\n}'+
'\n' + style + '\n'+
'/*}}}*/';
store.addNotification('StyleSheetTiddlerTabs', refreshStyles);

})(jQuery);
//}}}
TabScrollMacro is a plugin which makes the {{{tabset}}} in SideBarTabs scroll vertically. To use it, simply include the space @TabScroll

<<more TabScroll>>
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
/***
|''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)
//%/

In the context of [[this question|https://groups.google.com/d/msg/tiddlyspace/h82RjnKS6IU/ftibeaw2-6sJ]] by [[Jonathan Lister|http://jaybyjayfresh.com/tag/jonathan-lister/]], I actually tried to create this tiddler as [[Clean%20Titles]] rather than [[Clean Titles]].

While classic TiddlyWiki allows me to do that — see my experiment on TiddlySpot [1] — TiddlySpace doesn't. As for me, it rather meaningfully turns what appears to be URL encoded titles into actual text while also giving me a somewhat inappropriate edit conflict warning.

''(A)'' So, is it reasonable to have tiddler titles that contain otherwise URL encoded text?

''(B)'' What are the reasons to prevent this?

''(C)'' Are there URL encoding / decoding troubles allowing this?
> The TiddlyWiki {{{<<permalink>>}}} and {{{<<permaview>>}}} macros seem to [[handle even those titles just fine|http://weirdtitles.tiddlyspot.com/#Foo%2520Bar]].

''(D)'' What are the actual limitations and restrictions as to tiddler titles at the moment? — in Tiddlyspace vs. in TiddlyWiki?
> I do remember that it's no good to try and use single quotes {{{Foo 'Bar 'Baz}}} or a pipe {{{Foo|Bar}}} in a tiddler title. What else?

[1] http://weirdtitles.tiddlyspot.com
{{preview{[>img[http://img.tiddlyspace.com/PagrPlugin_2][Pagr]]}}}.An earlier version of @PagrPlugin has been around for a while on a tutorial space I once created called @MarkDownTutor. Now I have taken the time to make it a bit more official and take it into my [[Github repo for TiddlyWikiPlugins|https://github.com/tobibeer/TiddlyWikiPlugins]].

Have a look at [[Pagr]] for more details or go to the @Pagr space for getting started, configuration, parameters and an example.
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
/***
|''Name:''|SimpleRolesPlugin|
|''Description:''|provides a simple user management system|
|''Author:''|[[Tobias Beer]]|
|''Version:''|1.1.0 (2010-10-16)|
|''Source:''|http://tobibeer.tiddlyspace.com/#SimpleRolesPlugin|
|''Documentation:''|http://tobibeer.tiddlyspace.com/#SimpleRoles|
|''Readable code:''|http://bit.ly/apnRUh|
|''~TiddlyWiki:''|Version 2.5 or better|
/%***/
config.macros.simpleroles={def:"SimpleRolesConfig",roles:["Admin","PowerUser","User"],defaultRole:"Guest",variableName:"simpleRoles",fmtInfo:"%0 (%1)",errGroup:'Error in SimpleRolesPlugin: User group "%0" not found in "%1"!',handler:function(h,d,g,k,f,l){var n,e,a,j,b,m=this.variableName,c=this.roles,p=g[0],o=g[1],i=config.options.txtUserName;if(!f||!window[m]){window[m]=[this.defaultRole];for(a=0;a<c.length;a++){j=c[a];b=store.getTiddlerText(this.def+"##"+j);if(!b){alert(this.errGroup.format(j,this.def));break}if(b.readBracketedList().contains(i)){c.splice(0,a);window[m]=c;break}}}if(!p){return}if(p=="info"){if(!o){o=this.fmtInfo}wikify(o.format(i,window[m][0]),h)}else{e=p.indexOf("!")==0;if(e){p=p.substr(1)}n=window[m].contains(p);n=n&&!e||e&&!n;if(n){if(o){wikify(o.indexOf("tiddler:")==0?store.getTiddlerText(o.substr(8)):o,h)}}else{removeChildren(h);h.parentNode.removeChild(h)}}}};
//%/
; Google Plus hangouts
:» TW5 / TW2 updates & ~TiddlyClinic hangout by[[@Jeremy||https://plus.google.com/109308865556494599029/posts]]
:» http://www.google.com/+/learnmore/hangouts
;TiddlyTools on Tiny Chat (abandoned)
:» http://tinychat.com/tiddlytools
!Summary
The @CodePlugin space provides the {{{<<code>>}}} macro that allows to either demo or show inline HTML code or code for InlineJavascriptPlugin.
!Details
;Why oh why?
:In the @Scripts space I wanted to be able to both, show the code and run it without diplicating stuff.
;How to use?
:To ''run'' the code from the ''Code'' section in the current tiddler use...
:*{{{<<code run>>}}}
:To ''show'' the code from another tiddler, section or slice...
:*{{{<<code at:[[The Tiddler]]>>}}}
:*{{{<<code at:"Tidler##Section Title">>}}}
:*{{{<<code at:Tidler::Slice>>}}}
:To ''run'' the code from another tiddler, section or slice
:*{{{<<code run:[[The Tiddler]]>>}}}
:*{{{<<code run:"Tidler##Section Title">>}}}
:*{{{<<code run:Tidler::Slice>>}}}
!Example
{{{
<<code run>>
}}}
<<code run>>

Here is the section with the code being run...
!Code
{{{
<html><a href="#" onclick="alert('Hello Section!');return false;">Click me!</a></html>
}}}
!Example Slice
{{{
<<code run:Code::code>>
}}}
<<code run:"Code::code">>

And here is the code in a slice being run...
''code:'' {{{<html><a href="#" onclick="alert('Hello Slice!');return false;">Click me!</a></html>}}}
!Displaying (Just) Code
Just for the sake of proof...
{{{
<<code>>
}}}
outputs...
<<code>>

Just like...
{{{
<<code at:Code##Code>>
}}}

outputs...
<<code at:Code##Code>>

and...
{{{
<<code at:"Code::code">>
}}}

outputs...
<<code at:"Code::code">>
!Source Code
The readable source code can be found at...
https://github.com/tobibeer/TiddlyWikiPlugins/blob/master/plugins/CodePlugin.js
Pearl is a TiddlyWiki flavour that is yet unfinished as a theme which however as been appreciated by a few already. It is unfinished in that you cannot just load it into your TiddlyWiki and that updating it to the newest TiddlyWiki version will likely break it as I have removed all styling from TiddlyWiki and created my own shadow versions of StyleSheetLayout, StyleSheetColors, etc
!Take a sneak peak...
http://goto.bplaced.net <<tiddler iframe with: goto.bplaced.net>>
<<tiddlerList tags:"Music" dateFormat:"0DD. mmm YYYY" itemTemplate:"*%created - [[%title|%title]] (%tags)\n" order:"-created">>
In a @TiddlySpace + [[Skype|http://www.skype.com/]] collaboration with @BauweBijl I've got to develop my new icon styling for the toolbar of [[tbTheme]]. All is achievedd with the default icon-set and a little bit of pure css. Check out the StyleSheet right after {{{thanks bauwebijl}}}...
AAABAAEAEBAAAAEACABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADLnXMAy551AMyfdgDMoHcAzaJ6AM6kfQDRqoUA06yJANSuiwDUr40A1rKRANe0lADYt5gA27ueAN2/pADdwKUA38OpAODEqwDgxawA4sixAOPLtQDkzbcA5c+6AOfSvwDn08AA6NTBAOvZyQDs3M4A7t/RAO/h1ADx5tsA8ubcAPbu5gD27ugA+PLtAPn07wD69vIA+/j2AP7+/gAA4fAAEe//ADHx/wBR8/8AcfX/AJH3/wCx+f8A0fv/AP///wAAAAAAAC8hAABQNwAAcEwAAJBjAACweQAAz48AAPCmABH/tAAx/74AUf/IAHH/0wCR/9wAsf/lANH/8AD///8AAAAAAAAvDgAAUBgAAHAiAACQLAAAsDYAAM9AAADwSgAR/1sAMf9xAFH/hwBx/50Akf+yALH/yQDR/98A////AAAAAAACLwAABFAAAAZwAAAIkAAACrAAAAvPAAAO8AAAIP8SAD3/MQBb/1EAef9xAJj/kQC1/7EA1P/RAP///wAAAAAAFC8AACJQAAAwcAAAPZAAAEywAABZzwAAZ/AAAHj/EQCK/zEAnP9RAK7/cQDA/5EA0v+xAOT/0QD///8AAAAAACYvAABAUAAAWnAAAHSQAACOsAAAqc8AAMLwAADR/xEA2P8xAN7/UQDj/3EA6f+RAO//sQD2/9EA////AAAAAAAvJgAAUEEAAHBbAACQdAAAsI4AAM+pAADwwwAA/9IRAP/YMQD/3VEA/+RxAP/qkQD/8LEA//bRAP///wAAAAAALxQAAFAiAABwMAAAkD4AALBNAADPWwAA8GkAAP95EQD/ijEA/51RAP+vcQD/wZEA/9KxAP/l0QD///8AAAAAAC8DAABQBAAAcAYAAJAJAACwCgAAzwwAAPAOAAD/IBIA/z4xAP9cUQD/enEA/5eRAP+2sQD/1NEA////AAAAAAAvAA4AUAAXAHAAIQCQACsAsAA2AM8AQADwAEkA/xFaAP8xcAD/UYYA/3GcAP+RsgD/scgA/9HfAP///wAAAAAALwAgAFAANgBwAEwAkABiALAAeADPAI4A8ACkAP8RswD/Mb4A/1HHAP9x0QD/kdwA/7HlAP/R8AD///8AAAAAACwALwBLAFAAaQBwAIcAkAClALAAxADPAOEA8ADwEf8A8jH/APRR/wD2cf8A95H/APmx/wD70f8A////AAAAAAAbAC8ALQBQAD8AcABSAJAAYwCwAHYAzwCIAPAAmRH/AKYx/wC0Uf8AwnH/AM+R/wDcsf8A69H/AP///wAAAAAACAAvAA4AUAAVAHAAGwCQACEAsAAmAM8ALADwAD4R/wBYMf8AcVH/AIxx/wCmkf8Av7H/ANrR/wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvLwAALy8vLy8vAAAAAAAALy8AAC8vLy8vLy8AAAAAAC8vAAAvLwAAAC8vAAAAAAAvLwAALy8AAAAvLwAAAAAALy8AAC8vLy8vLwAAAAAAAC8vAAAvLwAAAC8vAAAAAAAvLwAALy8AAAAvLwAALy8vLy8vLy8vLy8vLy8AAC8vLy8vLy8vLy8vLy8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
URL: https://plus.google.com/u/1/109308865556494599029/posts/LFZj3EJno7s
Video: https://www.youtube.com/watch?v=SX0jvQ0vYVk
/***
|''Name''|BinaryUploadPlugin|
|''Version''|0.3.16|
|''Author''|Ben Gillies and Jon Robson|
|''Type''|plugin|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/BinaryUploadPlugin.js|
|''Description''|Upload a binary file to TiddlyWeb|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig TiddlyWebConfig|
!Usage
{{{
<<binaryUpload bag:<name> edit:tags edit:title tags:<default tags> title:<title> >>
}}}
* {{{bag:<name>}}}: optional; if left out, the file will be saved to the current workspace
* {{{edit:tags}}}: specifies that you want to tag the file being uploaded
* {{{edit:title}}}: specifies that you want to set the title to something other than the filename
* {{{tags:<default tags>}}}: specifies a default set of tags to apply to the file (requires {{{edit:tags}}} to be set)
* {{{title:<title>}}}: predefines the title of the binary tiddler
!Requires
TiddlyWeb
tiddlywebplugins.form
!Code
***/
//{{{
(function($) {

var tiddlyspace = config.extensions.tiddlyspace;

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

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

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

})(jQuery);
//}}}
/***
|''Name''|BetterPopupsPlugin|
|''Author''|[[Tobias Beer|http://tobibeer.tiddlyspace.com]]|
|''Description''|stops the document from scrolling when openeing popups|
|''Documentation''|http://betterpopupsplugin.tiddlyspace.com|
|''Version''|0.1.0 (2013-10-06)|
|''~CoreVersion''|2.5.2|
|''License''|Creative Commons 3.0|
|''Source''|https://raw.github.com/tobibeer/TiddlyWikiPlugins/master/plugins/BetterPopupsPlugin.js|
***/
/*{{{*/
Popup.enableScrolling = false;
Popup.animDuration = 400;
Popup.show = function(valign,halign,offset)
{
	var curr = Popup.stack[Popup.stack.length-1];
	this.place(curr.root,curr.popup,valign,halign,offset);
	jQuery(curr.root).addClass("highlight");
	if(Popup.enableScrolling){
		if(config.options.chkAnimate && anim)
			jQuery('body,html')
				.animate(
					{scrollTop: ensureVisible(curr.popup)},
					Popup.animDuration
				);
		else
			window.scrollTo(0,ensureVisible(curr.popup));
	}
};
/*}}}*/
/***
|''Name''|LoadMissingExternalTiddler|
|''Version''|0.1.0|
|''Author''|Jon Robson|
***/
//{{{
var _loadMissing = Story.prototype.loadMissingTiddler;
Story.prototype.loadMissingTiddler = function(title,fields,callback) {
	var matches = title.match(/([^\*]*) \*\(@([^\)]*)\)\*/);
	if(matches && matches.length > 0) {
		var sTitle = matches[1];
		var space = matches[2];		config.extensions.tiddlyspace.displayServerTiddler(story.getTiddler(title),
			sTitle, "bags/%0_public".format(space));
	} else {
	_loadMissing.apply(this, arguments)
	}
};
//}}}
URL: https://plus.google.com/u/1/109308865556494599029/posts/f3bcVWMZE2u
Video: https://www.youtube.com/watch?v=hJuDlLQI9pQ
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
/***
|''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);
//}}}
{{x{
;endsWith
:{{{config.extensions.BinaryTiddlersPlugin.endsWith}}}
;resolveNameSpace
:{{{config.extensions.tiddlyspace.resolveSpaceName}}}
:returns spacename as lowercase
:removes ''bags/'', ''recipes/'', ''@'' as well as ''_public'' and ''_private''
;mySpaces
:http://myspaces.tiddlyspace.com/#MySpacesPlugin
;RevisionTemplate
:http://system-theme.tiddlyspace.com/#RevisionTemplate
}}}<<listfiltr>>
|''max''|10|
|''sample''|50|
|''tagged''|systemConfig|
|''exclude''|excludeLists|
|''content''|Source|
|''type''|slice|
|''required''|yes|
|''sort''|modified|
|''dateformat''|DD. MMM, YYYY|
|''saveTo''||
|''saveWithTags''||
!Template
{{{
!!![[%0]] @@color:#333;font-size:0.7em;%3@@
%2
}}}
@twYp or [[TiddlyWiki YouTube Player|twYp]] is a plugin which allows you to search, play and associate youtube videos with tiddlers. It's a custom application built on top of the ~YouTube API

<<more twYp>>
!An example
This is what the default search interface looks like...
<<twyp>>
!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
/*global window,tiddlyweb,$*/
/*
 * Bookmarker code
 * The tabs object encapsulates all the code for each actual tab.
 * Each tab is an instance of the Tab object, which includes functions for
 * populating the tab with data, turning the data in the tab into a tiddler,
 * etc.
 * There is a Default tab, which can be extended, with specific values
 * overidden only when they differ.
 * The app starts up when it receives a message (i.e. receiveMessage).
 * This triggers a callback from details (an event queue like thing) that is
 * listening for the data to arrive.
 */
(function() {
	var id; // we use this ID to verify that we only take notice of the correct
			// messages that we receive from postMessage

	var details = {
		queue: [],
		set: function(target, data) {
			this[target] = data;
			this.done(target);
		},
		done: function(target) {
			var self = this;
			this.queue = $.map(this.queue, function(obj, i) {
				if (obj.target === target) {
					obj.fn(self[target]);
					return null;
				}
				return obj;
			});
		},
		when: function(target, func) {
			this.queue.push({
				target: target,
				fn: func
			});
			if (this[target]) {
				this.done(target);
			}
		}
	};

	function _extend(target, obj) {
		var key;
		for (key in obj) {
			if (obj.hasOwnProperty(key)) {
				if ((!~['string', 'function'].indexOf(typeof obj[key]))
						&& (!$.isArray(obj[key]))
						&& (target.hasOwnProperty(key))) {
					target[key] = _extend(_extend({}, target[key] || {}),
						obj[key]);
				} else {
					target[key] = obj[key];
				}
			}
		}
		return target;
	}

	function Tab(opts) {
		_extend(this, opts);
		this.$el = $(this.el);
	}

	Tab.prototype.extend = function(opts) {
		var newTab = new Tab(this);
		_extend(newTab, opts);
		newTab.$el = $(newTab.el);
		return newTab;
	};

	Tab.prototype.setTab = function(data) {
		var $el = this.$el,
			self = this;
		$.each(this.bind, function(field, selectors) {
			var res = (self.populate[field]) ?
					self.populate[field].call(self, data) : data[field];
				res = $.isArray(res) ? res : [res];
				selectors = $.isArray(selectors) ? selectors : [selectors];
			$.each(selectors, function(i, selector) {
				var $subEl = $el.find(selector),
					setFn = ($subEl[0].nodeName === 'DIV') ? 'html' : 'val';
				if (res[i]) {
					$subEl[setFn](res[i]);
				}
			});
		});
		this.setFocus();
	};

	Tab.prototype.setTiddler = function() {
		var tiddler = new tiddlyweb.Tiddler(),
			priv = this.getPrivate(),
			self = this;

		$.each(this.bind, function(field, selectors) {
			var fn = self.toTiddler[field] || function(txt) { return txt; };
			if (tiddler.hasOwnProperty(field)) {
				tiddler[field] = self.callWithValues(field, fn);
			} else {
				tiddler.fields = tiddler.fields || {};
				tiddler.fields[field] = self.callWithValues(field, fn);
			}
		});

		details.when('data', function(data) {
			tiddler.bag = new tiddlyweb.Bag(data.space + priv, '/');
			details.set('tiddler', tiddler);
		});
	};

	Tab.prototype.getPrivate = function() {
		return $('.form-actions [name="private"]input').attr('checked') ?
						'_private' : '_public';
	};

	Tab.prototype.setFocus = function() {
		var $el = this.$el.find(this.focus);
		// use a setTimeout due to weirdness in chrome
		window.setTimeout(function() {
			$el.focus();

			// HACKY: changing the text forces the cursor to the end of the textarea
			var val = $el.val();
			$el.val('');
			$el.val(val);
		}, 0);
	};

	Tab.prototype.callWithValues = function(field, fn) {
		var args = [],
			selectors = this.bind[field],
			$el = this.$el;
		selectors = $.isArray(selectors) ? selectors : [selectors];
		$.each(selectors, function(i, selector) {
			args.push($el.find(selector).val());
		});
		if (typeof fn === 'function') {
			return fn.apply(this, args);
		} else {
			return this[fn].apply(this, args);
		}
	};

	Tab.prototype.figureTags = function(tagString) {
		var brackets = /^\s*\[\[([^\]\]]+)\]\](\s*.*)/,
			whitespace = /^\s*([^\s]+)(\s*.*)/,
			match,
			rest = tagString,
			tags = [];

		match = brackets.exec(rest) || whitespace.exec(rest);
		while (match) {
			tags.push(match[1]);
			rest = match[2];
			match = brackets.exec(rest) || whitespace.exec(rest);
		}

		return tags;
	};


	Tab.prototype.isEmpty = function() {
		return this.$el.find((this.bind && this.bind.title) || this.focus)
			.val() === '';
	};

	var Default = new Tab({
		focus: '[name="text"]textarea',
		bind: {
			title: '[name="title"]input',
			text: '[name="text"]textarea',
			tags: '[name="tags"]input',
			url: '[name="url"]input'
		},
		populate: {},
		toTiddler: { tags: 'figureTags' }
	});

	var tabs = {
		post: Default.extend({
			el: '#postForm',
			populate: {
				text: function(data) {
					return data.text ?
						'> ' + data.text.split('\n').join('\n> ') : '';
				}
			}
		}),
		link: Default.extend({
			el: '#linkForm',
			bind: { text: [ '[name="text"]textarea', '[name="url"]input'] },
			toTiddler: {
				text: function(txt, url) {
						return ['!URL', url, '!Description', txt].join('\n');
				}
			}
		}),
		quote: Default.extend({
			el: '#quoteForm',
			bind: { text: [ '[name="text"]textarea', '[name="quote"]textarea'] },
			populate: {
				text: function(data) {
					var text = '[[' + data.title.replace('|', '>') + '|'
							+ data.url + ']]',
						quote = data.text;
					return [ text, quote ];
				}
			},
			toTiddler: {
				text: function(txt, quote) {
						return ['<<<', quote, '<<<', txt].join('\n');
				}
			}
		}),
		image: Default.extend({
			el: '#imageForm',
			bind: { text: [
				'[name="text"]textarea', '[name="image"]input', '.imagePicker'
			] },
			populate: {
				text: function(data) {
					var quotedTxt = (data.text) ? '\n\n>'
							+ data.text.replace('\n', '\n> ') : '',
						text = '[[' + data.title.replace('|', '>') + '|'
							+ data.url + ']]' + quotedTxt,
						images = this.setImages(data.images);
					return [ text, data.images[0], images ];
				}
			},
			toTiddler: {
				text: function(txt, image) {
						return ['[img[' + image + ']]', txt].join('\n');
				}
			},
			setImages: function(images) {
				var selector = $('<div/>'),
					setCurrent = function($el) {
						$el.siblings()
								.removeClass('current').end()
							.addClass('current')
							.closest('label')
								.children('[name="image"]input')
								.val($el.attr('src')).end();
					};
				$.each(images, function(i, img) {
					$('<img/>').attr('src', img)
						.css({
							'max-height': '90px',
							'max-width': '100px',
							display: 'inline-block'
						}).click(function() {
							setCurrent($(this));
						}).appendTo(selector);
				});

				setCurrent($('img:first', selector));

				return selector;
			}
		})
	};

	function pickDefaultTab(data) {
		if (!data.text) {
			return 'link';
		} else {
			return 'quote';
		}
	}

	function receiveMessage(event) {
		var data = JSON.parse(event.data);

		if (!id) {
			id = data.id;
		} else if (data.id !== id) {
			return;
		}

		details.set('data', data);
		details.set('eventSrc', {
			origin: event.origin,
			source: event.source
		});
	}

	window.addEventListener('message', receiveMessage, false);

	function saveTiddler(callback) {
		details.when('tiddler', function(tiddler) {
			tiddler.put(function() {
				callback(true);
			}, function(xhr, error, exc) {
				callback(false, error, exc);
			});
		});
	}

	function closePage(timeout) {
		window.setTimeout(function() {
			details.when('eventSrc', function(src) {
				src.source.postMessage(JSON.stringify({
					type: 'close',
					id: id
				}), src.origin);
			});
		}, timeout || 0);
	}

	function getCurrentTab() {
		return $('.nav-tabs .active').data('tab-name');
	}

	function saveBookmark(event) {
		var $successBtn = $('[type="submit"]input');

		tabs[getCurrentTab()].setTiddler();

		$successBtn.val('Saving...')
			.addClass('disabled')
			.attr('disabled', 'disabled');

		$('.closeBtn').addClass('disabled')
			.attr('disabled', 'disabled');

		saveTiddler(function(success) {
			if (success) {
				$successBtn
					.val('Saved!')
					.removeClass('primary')
					.addClass('success');
				closePage(1000);
			} else {
				$successBtn
					.removeClass('disabled')
					.removeAttr('disabled')
					.removeClass('primary')
					.addClass('danger')
					.val('Error saving. Please try again');
			}
		});

		event.preventDefault();
		return false;
	}

	function Mover($el) {
		var moving = false,
			initPos = {},
			oldPos = {};

		var src,
			height;

		var doMove = function(ev) {
			var diff = { x: ev.pageX - oldPos.x, y: ev.pageY - oldPos.y };
			$el.animate({
				top: '+=' + diff.y,
				left: '+=' + diff.x
			}, 0);
			oldPos.x = ev.pageX;
			oldPos.y = ev.pageY;
		};

		var _receive = function _receive(message) {
			var payload = JSON.parse(message.data);
			if (payload.id !== id) {
				return;
			}
			switch(payload.type) {
				case 'initMove':
					$el.css({
						top: payload.diff.y + 'px',
						left: payload.diff.x + 'px'
					}).show();
					initPos.x = oldPos.x = payload.diff.x + oldPos.x;
					initPos.y = oldPos.y = payload.diff.y + oldPos.y;
					break;
				case 'doneMove':
					$el.show();
					window.removeEventListener('message', _receive, false);
			}
		};

		var self;
		self = {
			start: function(ev) {
				if (moving) {
					return self.stop(ev);
				} else {
					moving = true;
				}
				oldPos.x = ev.pageX;
				oldPos.y = ev.pageY;
				$el.hide();
				window.addEventListener('message', _receive, false);
				details.when('eventSrc', function(eventSrc) {
					src = eventSrc;
					src.source.postMessage(JSON.stringify({
						type: 'startMove',
						id: id
					}), src.origin);
				});
				// fix the height so that increasing the iframe height doesn't mess things up
				height = $el.css('height');
				$el.css('height', $el.height());
				// stop the user selecting text awkwardly while trying to move
				$el.css({
					'-webkit-user-select': 'none',
					'-moz-user-select': 'none',
					'-ms-user-select': 'none',
					'-o-user-select': 'none',
					'user-select': 'none'
				});
				$(document).bind('mousemove', doMove);
			},
			stop: function() {
				if (!moving) {
					return;
				}
				window.addEventListener('message', _receive, false);
				moving = false;
				$el.hide();
				$el.css({
					top: 0,
					left: 0
				});
				$el.css('height', height);
				src.source.postMessage(JSON.stringify({
					type: 'stopMove',
					id: id,
					diff: { x: oldPos.x - initPos.x, y: oldPos.y - initPos.y }
				}), src.origin);
				$el.css({
					'-webkit-user-select': 'auto',
					'-moz-user-select': 'auto',
					'-ms-user-select': 'auto',
					'-o-user-select': 'auto',
					'user-select': 'auto'
				});
				$(document).unbind('mousemove', doMove);
			}
		};
		return self;
	}

$(function() {

	$('.form-actions [type="submit"]input').click(saveBookmark);
	$('.closeBtn').click(closePage);

	var mover = new Mover($('.modal'));
	$('.modal-header').mousedown(function(ev) {
		if (ev.target.nodeName !== 'LI' &&
				$(ev.target).closest('.nav-tabs li, #help, #help-info').length === 0) {
			mover.start(ev);
		}
	});
	$(document).mouseup(mover.stop);

	details.when('data', function(data) {
		// some initialisation: if there are no images, remove the images tab
		if (data.images.length === 0) {
			$('#imageForm').remove();
			$('.nav-tabs li').each(function(i, el) {
				if ($(el).data('tab-name') === 'image') {
					$(el).remove();
				}
			});
		}

		// figure out which tab we should start off on
		var tab = pickDefaultTab(data);

		// populate the tab with data and switch to it
		$('.nav-tabs').delegate('li', 'click', function() {
			var tabName = $(this).data('tab-name');
			$('.nav-tabs li').removeClass('active');
			$(this).addClass('active');
			$('.modal-body').removeClass('active').each(function(i, el) {
				if (el.id === tabName + 'Form') {
					$(el).addClass('active');
				}
			});
			if (tabs[tabName].isEmpty()) {
				tabs[tabName].setTab(data);
			}
		});

		// initialise the app by switching to the correct tab.
		$('.nav-tabs li').each(function(i, el) {
			var $el = $(el);
			if ($el.data('tab-name') === tab) {
				$el.find('a').click();
				return false;
			}
		});

		// now display the container again
		$('#container').show();
	});

});
}());
<<tiddler video with: "Z19zFlPah-o">>
Created an exciting new macro called [[FiltrPlugin|Filtr]] which interactively filter tiddlers by date, user, tags or fields.

<<more Filtr>>

<<tsScan "$1" fat:y template:Templates##SCAN>>
[[Tobias Beer|Welcome]]
''NOTE:'' renamed the thread to give colm a (better) chance to comment

in reply to @jon:
<<<
This max parameter you are suggesting - I'm not sure I understand the motivation. If there was a limit of 5 applied it might only show the 5 most recent or 1st 5 alphabetically. If my name was Z or your first follower these limits might upset me and random is never really random..
<<<
Assume having 100+ followers. I remember sites that would not show all 100 unless I click that additional button to open the full list. I don't know how they select, but I would guess by number of followers of those who follow ...or maybe random chance every time it displays.

By the way, if I hit {{{reply}}} shouldn't that reply be tagged with the {{{@user}}} I am replying to?
[[TiddlerTabsPlugin|http://tiddlertabsplugin.tiddlyspace.com/#TiddlerTabsPlugin]] allows to list all tiddlers in tabs via the {{{<<tiddlerTabs>>}}} macro.

To get it, include the @TiddlerTabsPlugin space or import / copy [[TiddlerTabsPlugin|http://TiddlerTabsPlugin.tiddlyspace.com/#TiddlerTabsPlugin]] from it into your local ~TiddlyWiki.

To use it, simply invoke the {{{<<tiddlerTabs>>}}} macro like so:
<<tiddlerTabs>>
TiddlerTabsPlugin only lists tabs for the first letters of tiddler titles that actually exist. You will never click on a tab only to find that it's empty.

For configuration options and other plugin details, see @tiddlertabs.
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
/***
|''Name''|TiddlySpaceSearcher|
|''Version''|0.2.5|
|''Requires''|TiddlySpaceConfig TiddlySpaceFollowingPlugin|
***/
//{{{
(function($) {
var tiddlyspace = config.extensions.tiddlyspace;
var tsScan = config.macros.tsScan;

config.shadowTiddlers.SearchTemplate = "<<view server.bag SiteIcon label:no width:24 height:24 preserveAspectRatio:yes>> <<view server.bag spaceLink title external:no>> in space <<view server.bag spaceLink>>";
config.shadowTiddlers.StyleSheetSearch = [".resultsArea .siteIcon { display: inline; }",
	".searchForm {text-align: left;}"].join("\n");
store.addNotification("StyleSheetSearch", refreshStyles);

var search = config.macros.tsSearch = {
	locale: {
		advanced: "Advanced Options",
		header: "Search",
		resultsHeader: "Results (%0)",
		find: "find",
		noResults: "No tiddlers matched your search query",
		query: "QUERY: ",
		error: "please provide a search query or a tag, modifier or title!",
		titleAdvanced: "where the title is",
		modifierAdvanced: "where the last modifier is",
		spaceAdvanced: "only in the space: ",
		notspaceAdvanced: "but not in the spaces: ",
		tagsAdvanced: "with the tags: "
	},
	andConstructor: function(container, label, fieldname, negationMode) {
		var tags = $("<div />").appendTo(container);
		$('<span />').text(label).appendTo(tags);
		var id = "area" + Math.random();
		container = $("<span />").attr("id", id).appendTo(tags)[0];
		function add(container) {
			var el = $('<input type="text" />').attr("field", fieldname).appendTo(container);
			if(negationMode) {
				el.attr("negation", "true");
			}
		}
		add(container);
		var el = $("<button />").text("AND").click(function(ev) {
			add($(ev.target).data("container"));
			ev.preventDefault();
		}).appendTo(tags);
		$(el).data("container", container);
	},
	fieldConstructor: function(container, label, field) {
		container = $("<div />").appendTo(container)[0];
		$("<span />").text(label).appendTo(container);
		$("<input />").attr("text", "input").attr("field", field).appendTo(container);
	},
	advancedOptions: function(form) {
		var locale = search.locale;
		var container = $("<div />").addClass("tsAdvancedOptions").appendTo(form)[0];
		$("<h2/ >").text(search.locale.advanced).appendTo(container);
		$("<div />").addClass("separator").appendTo(container);
		search.fieldConstructor(container, locale.titleAdvanced, "title");
		search.fieldConstructor(container, locale.modifierAdvanced, "modifier");
		search.fieldConstructor(container, locale.spaceAdvanced, "space");
		search.andConstructor(container, locale.notspaceAdvanced, "space", true);
		search.andConstructor(container, locale.tagsAdvanced, "tag");
	},
	constructSearchQuery: function(form) {
		var data = [], select = [];
		var query = $("[name=q]", form).val();
		if(query) {
			data.push("q=%0".format(query));
		}

		// add tags, fields etc..
		$("[field]", form).each(function(i, el) {
			var val = $(el).val();
			var name = $(el).attr("field");
			var negate = $(el).attr("negation") == "true";
			if(val && name) {
				val = encodeURIComponent(val);
				val = negate ? "!" + val : val;
				if(name == "space") {
					val += "_public";
					name = "bag";
				}
				if(negate) {
					select.push("select=%0:%1".format(name,val));
				} else {
					var prefix = data.length === 0 ? "q=" : "";
					data.push('%0%1:"%2"'.format(prefix, name, val));
				}
			}
		});
		var dataString = data.join(" ");
		if(dataString.length === 0 && !query) {
			return false;
		}
		var selectStatement = select.join("&");
		if(dataString.length > 0 && selectStatement.length > 0) {
			dataString += "&";
		}
		dataString += selectStatement;
		return "/search?%0".format(dataString);
	},
	constructForm: function(place) {
		var locale = search.locale;
		$("<h1 />").text(locale.header).appendTo(place);
		var form = $("<form />").appendTo(place)[0];
		$('<input type="text" name="q" />').appendTo(form);
		$('<input type="submit" />').val(locale.find).appendTo(form);
		search.advancedOptions(form);
		var query = $('<h2 class="query"/>').appendTo(place)[0];
		var results = $("<div />").appendTo(place).addClass("resultsArea")[0];
		var lookup = function(url) {
			if(!url) {
				results.empty().addClass("error").text(locale.error);
				return;
			}
			config.extensions.tiddlyweb.getStatus(function(status) {
				$(query).text(locale.query);
				var href = status.server_host.url + url;
				$("<a />").attr("href", href).text(href).appendTo(query);
				tsScan.scan(results, { url: url, emptyMessage: search.locale.noResults, cache: true,
					template: "SearchTemplate", sort: "title", callback: function(tiddlers) {
						$("<h2 />").text(locale.resultsHeader.format(tiddlers.length)).prependTo(results);
					}
				});
			});
		};
		$(form).submit(function(ev) {
			ev.preventDefault();
			var url = search.constructSearchQuery(form);
			config.macros.tsSearch.lastSearch = url;
			lookup(url);
		});
		if(search.lastSearch) {
			lookup(search.lastSearch);
		}
		return form;
	},
	handler: function(place) {
		var container = $("<div />").addClass("searchForm").appendTo(place)[0];
		search.constructForm(container);
	}
};

})(jQuery);
//}}}
/%
!info
Mod of http://www.TiddlyTools.com/#ShowReferences that allows to show references for a remote tiddler

Usage: {{{<<tiddler ShowReferences with: "format" "remote tiddler">>}}}
!end
!show
$1
!end
%/<<tiddler {{'ShowReferences##'+(tiddler&&tiddler.title=='ShowReferences'?'info':'show')}} with: {{
	var out=''; var fmt='[[%0]]\n'; if ('$1'!='$'+'1') fmt='$1';
	var here=story.findContainingTiddler(place);
	if (here) {
		var title='$2'=='$'+'2'?here.getAttribute('tiddler'):'$2';
		var refs=store.getReferringTiddlers(title);
		for(var r=0; r<refs.length; r++)
			if(refs[r].title!=title && !refs[r].isTagged('excludeLists'))
				out+=fmt.format([refs[r].title]);
	}
	out;
}}>>
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
/bags/common/tiddlers/jquery.js
http://htmljs.tiddlyspace.com/htmljs-disqus
@SkyeRiquelme
If you ever want to use any of Eric's transclusions from [[Tiddlytools|http://tiddlytools.com]] on @TiddlySpace you will need to reenable {{{ {{evaluated parameters}} }}}

In order to do so, put this into a [[zzConfig]] tiddler tagged <<tag systemConfig>> and parameter evaluation for macros -- especially the tiddler macro -- will be reenabled:
{{{
config.evaluateMacroParameters = "full";
}}}
''requires:'' TiddlySpaceConfig (comes with the core @system-plugins)
The #1 TiddlyWiki serverside.
!SpaceUnplugged
{{unpluggedSpaceTab{
{{wizard{
<<image unsyncedIcon width:48>> Sync is currently unavailable in ~TiddlyWiki due to security constraints in modern browsers. Research is being done to build a suitable alternative. In the meantime if you have changed content in an offline ~TiddlyWiki, you can get your content back into ~TiddlySpace by using the ''import'' functionality from the backstage of the online wiki.
}}}
}}}

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

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

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

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

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

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

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

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

!BatchPrivate
<<TiddlySpacePublisher type:private>>

!BatchPublic
<<TiddlySpacePublisher type:public>>

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

<<tiddler PluginManager>>

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

<<tiddler AdvancedOptions>>
/***
|''Name''|TiddlySpaceRevertRevision|
|''Description''|Revert to a previous revision|
|''Author''|BenGillies|
|''Version''|0.1|
|''Status''|unstable|
|''Source''|http://github.com/TiddlySpace/tiddlyspace|
|''CodeRepository''|http://github.com/TiddlySpace/tiddlyspace|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.6.0|
|''Requires''|TiddlyWebAdaptor TiddlySpaceRevisionView|
!Usage
Add a control button to revert to a particular revision.

The button must be called from within a revision, as generated by TiddlySpaceRevisionView
!Code
***/
//{{{
(function($) {

config.commands.revert = {
	text: "revert",
	tooltip: "make this revision the current one",
	handler: function(ev, src, title) {
		var revElem = story.getTiddler(title);
		var tidToRevert = store.getTiddler($(revElem).attr("revName"));

		var revision = store.getTiddler(title);
		if ((revision) && (tidToRevert)) {
			tidToRevert.text = revision.text;
			var newFields = merge({}, revision.fields);
			for (var fieldName in newFields) {
				if (fieldName.substr(0, 7) === "server.") {
					delete newFields[fieldName];
				}
			}
			merge(tidToRevert.fields, newFields);
			tidToRevert.tags = merge([], revision.tags);
			tidToRevert.fields.changecount = 1;
			delete tidToRevert.fields.doNotSave;

			store.saveTiddler(tidToRevert.title, tidToRevert.title,
				tidToRevert.text, null, null, tidToRevert.tags,
				tidToRevert.fields, false, tidToRevert.created, tidToRevert.creator);

			autoSaveChanges(true);
		}
	}
};

})(jQuery);
//}}}
<!DOCTYPE HTML>
<html>
<body style="display:none">
topics: <ul id="topics"></ul>
<button id='addtopic'>add topic</button>
stream:
<ul id="stream"></ul>
<script type='text/javascript' src='/bags/common/tiddlers/jquery.js'></script>
<script type='text/javascript' src='/bags/tiddlyspace/tiddlers/chrjs'></script>
<script src="/twikifier.js" type="text/javascript" charset="utf-8"></script>
<script type='text/javascript'>
	$.ajaxSetup({
		beforeSend: function(xhr) {
			xhr.setRequestHeader("X-ControlView", "false");
		}
	});
	function renderTopic(topic) {
		var item = $("<li />").appendTo("#topics");
		$("<button class='show' />").text(topic).appendTo(item);
		$("<button class='delete'>x</button>").appendTo(item);
		return item[0];
	}
	var host =  '/';
	var space = "jon";
	var active_topics = [];
	var current_topic, offset;
	function renderTopics() {
		var topics = active_topics;
		$("#topics").empty();
		for(var i = 0; i < topics.length; i++) {
			var topic = topics[i];
			if(topic) {
				renderTopic(topic);
			}
		}
		$("body").show();
	}
	// Array Remove - By John Resig (MIT Licensed)
	Array.prototype.remove = function(from, to) {
		var rest = this.slice((to || from) + 1 || this.length);
		this.length = from < 0 ? this.length + from : from;
		return this.push.apply(this, rest);
	};

	var topicList = new tiddlyweb.Tiddler("Topics", new tiddlyweb.Bag(space + "_public", host));
	topicList.get(function(tid) {
			active_topics = tid.text.split("\n");
			renderTopics(active_topics);
			$("#topics .show:first").trigger("click");
		},
		function() {
			active_topics = ["tiddlyspace"];
			renderTopics(active_topics)
		}
	);
	$("#addtopic").click(function(ev) {
		var text = prompt("What topic would you like to watch?");
		if(active_topics.indexOf(text) === -1) {
			active_topics.push(text);
		}
		var el = renderTopic(text);
		topicList.text = active_topics.join("\n");
		topicList.put(function() {
			$("button.show", el).trigger("click");
		}, function() {
			alert("eek!")
		});
	});
	$("#topics .delete").live("click",function(ev) {
		var topic = $(".show", this.parentNode).text();
		active_topics.remove(active_topics.indexOf(topic));
		renderTopics();
		topicList.text = active_topics.join("\n");
		topicList.put(function() {}, function() {
			alert("eek!")
		});
	});
	w = createWikifier(window, jQuery, { host: host, container: "recipes/" + space + "_public" });
	$("#topics .show").live("click",function(ev) {
		var tag = $(this).text();
		current_topic = tag;
		offset = 0;
		$("#stream").empty();
		var search = new tiddlyweb.Search('tag:"' + tag + '" &fat=y', host);
		search.get(function(tiddlers) {
			for(var i = 0; i < tiddlers.length; i++) {
				var tiddler = tiddlers[i];
				var item = $("<li />").appendTo("#stream")[0];
				$("<h2 />").text(tiddler.title + ": ").appendTo(item);
				
				$("<div class='text' />").text(tiddler.text).appendTo(item);
				$("<div class='author' />").text(tiddler.modifier).appendTo(item);
			}
		}, function() {
			$("<li>no topics :-(</li>").appendTo("#stream");
		});
	});
	$(window).scroll(function(){
		if($(window).scrollTop() == $(document).height() - $(window).height()) {
			offset += 10;
			// find a way to get all tiddlers created before the ones above
			console.log("loadMore();");
		}
	});
</script>
</body>
</html>
/***
|''Name''|ImportExternalLinksPlugin|
|''Author''|Jon Robson|
|''Version''|0.3.0|
|''Requires''|TiddlySpaceConfig TiddlySpaceLinkPlugin TiddlySpaceCloneCommand|
|''Description''|Turns space links into ajax links so you don't have to leave the comfort of your own TiddlyWiki|
!Notes
This maybe should hides the editTiddler, cloneTiddler commands. Ideally the toolbar commands should hide themselves but we need a strong concept of "this is a sucked in tiddler" to do that.
***/
//{{{
(function($){
var tiddlyspace = config.extensions.tiddlyspace;
_createSpaceLink = createSpaceLink;
if(_createSpaceLink) {
	createSpaceLink = function(place, spaceName, title, alt, isBag) {
		var tooltip = "Click to open in current document. Right click to open in original space.";
		_createSpaceLink(place, spaceName, title, alt, isBag);
		var workspace;
		if(isBag) {
			workspace = "bags/%0".format(spaceName);
		} else {
			workspace = "bags/%0_public".format(spaceName);
		}
		if(title && spaceName != tiddlyspace.currentSpace.name) {
			var link = $("a:last", place);
			var newlink = $("<a />").text("[link]").after(link[0]);
			// very hacky
			var updateInterval = setInterval(function() {
				var href = link.attr("href");
				if(href) {
					$(newlink).attr("href", href);
					clearInterval(updateInterval);
				}
			}, 200);
			
			if(link.parent(".replyLink").length == 0) { // don't suck in a reply link.
				link.attr("title", tooltip).addClass("importLink").click(function(ev) {
					if(config.floorboards) {
						config.floorboards.pushUnique("%0_public".format(spaceName));
					}
					tiddlyspace.displayServerTiddler(ev.target, title, workspace, function(el) {
						// TODO: the commands should disable themselves based on the meta information.
						//$("[commandname=editTiddler], [commandname=cloneTiddler]", el).hide(); 
					});
					ev.preventDefault();
				});
			}
		}
	};
}

var _cloneHandler = config.commands.cloneTiddler.handler;
config.commands.cloneTiddler.handler = function(event, src, title) {
	var _tiddler = store.getTiddler(title);
	var source = _tiddler ? _tiddler.fields["server.bag"] : false;
	var imported = _tiddler ? _tiddler.fields["tiddler.source"] : false;
	var realTitle = _tiddler ? _tiddler.fields["server.title"] : title;
	_cloneHandler.apply(this, [event, src, title]);
	var tidEl = story.getTiddler(title);
	$(story.getTiddlerField(title, "title")).val(realTitle);
	if(source) {
		$("<input />").attr("type", "hidden").attr("edit", "tiddler.source").val(source).appendTo(tidEl);
		$("<input />").attr("type", "hidden").attr("edit", "server.activity").appendTo(tidEl);
	}
}
})(jQuery);
//}}}
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
URL:https://plus.google.com/109308865556494599029/posts/VEtYxSt5PKG
Video:http://www.youtube.com/watch?v=umV13nEJZBk
Listr is a cool new plugin that allows you to manage (tiddlers in) lists. It is still under heavy development, yet this is already a sneak preview of what it can do for you...

<<listr height:'0'>>
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
<<activity supress:shadow limit:no ignore:tobibeer>>
Once you have some content then you may choose to determine a tiddler, or set of tiddlers to display each time you load ~TiddlySpace. This is determined by the [[DefaultTiddlers]].
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
	<title>This Space</title>
	<link href="/bags/common/tiddlers/profile.css" type='text/css' rel='stylesheet' >
	<link href="/bags/common/tiddlers/admin.css" type='text/css' rel='stylesheet' >
	<!--[if lte IE 8]>
	<script type="text/javascript" src="/bags/common/tiddlers/json2.js"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/es5-shim.min.js"></script>
	<![endif]-->
</head>
<body>
<div id="container">
	<div id="text-html" class="main section">
		<a class="app" href="/">home</a>
		<div class="left">
		<h2>About this space <button class='toggleNext'></button></h2>
		<div id="siteinfo"></div>
		<h2>Site Icon</h2>
		<div>
			<img id="siteicon" class="siteicon">
			<form id="upload" method="POST" enctype="multipart/form-data">
				<input type="hidden" name="title" value="SiteIcon" />
				<input type="hidden" name="tags" value="excludeLists">
				<input type="hidden" name="csrf_token" class="csrf" />
				<input type="file" name="file" accept="image/*" />
				<input class="btn" type="submit" value="upload" />
			</form>
			<div id="dropzone">Drop file here
				<img class="notloading" src="/bags/common/tiddlers/ajax-loader.gif" alt="submitting SiteIcon" />
			</div>
		</div>
		<h2>Vital Statistics</h2>
		<div id="info">please wait while information is loaded about this space...</div>
		<button class="spacereset">Reset Space</button>
		<div class="reset-confirm-wrap messageArea">
			<button class="close-btn" title="cancel reset">×</button>
			<p>Are you sure you want to reset the space? You can't go back! This will remove all the content from the space!</p>
			<form class="cf">
				<label for="reset-confirm">Enter the space name to confirm.</label>
				<input type="text" name="reset-confirm" class="reset-confirm-input inputBox" />
				<button type="submit">Reset Now</button>
			</form>
			<div class="reset-message-area">
				<p class="performing">Resetting...</p>
				<p class="finished">Reset Done!</p>
				<p class="recipe-error-msg">Error removing includes. Please remove manually.</p>
			</div>
		</div>
		</div>
		<div class="right">
		<div class="ts-membership">
			<h2>
				Add Member
				<a href="http://docs.tiddlyspace.com/What%20is%20a%20member%3F" title="What is a Member?" class="help">What is a Member?</a>
			</h2>
			<div>
				<p>Add a new member to your space by entering their name below. Enter a space name instead and prefix with @ to add everyone who is already a member of that space.</p>
				<form class="ts-members">
					<input class="inputBox" type="text" name="username">
					<input type="submit" value="Add Member" class="btn" />
				</form>
			</div>
			<h2>
				Existing Members <button class='toggleNext'></button>
			</h2>
			<div>
				Your space currently has the following members: 
				<ul class="ts-members"></ul>
			</div>
			<h2>
				Include Space
				<a class="help" href="http://docs.tiddlyspace.com/What%20is%20space%20inclusion%3F" title="What is inclusion?">What is Inclusion?</a>
			</h2>
			<form class="ts-includes">
				<input class="inputBox" type="text" name="spacename">
				<input type="submit" value="Include Space" class="btn" />
			</form>
		</div>
		<div>
			<h2>Included Spaces <button class='toggleNext'></button></h2>
			<div>
			This space includes the following spaces:
			<ul class="ts-includes"></ul>
			</div>
		</div>
		</div>
		<div class="clear"></div>
	</div>
</div>
<script src='/bags/common/tiddlers/backstage.js'></script>
<script src='/bags/common/tiddlers/jquery.js'></script>
<script src='/bags/tiddlyspace/tiddlers/chrjs'></script>
<script src='/bags/common/tiddlers/chrjs.space'></script>
<script src='/bags/common/tiddlers/chrjs.users'></script>
<script src='/bags/common/tiddlers/chrjs.identities'></script>
<script src='/bags/tiddlyspace/tiddlers/TiddlySpaceCSRF'></script>
<script src='/bags/common/tiddlers/jquery-form.js'></script>
<script src="/bags/common/tiddlers/siteiconupload.js"></script>
<script src="/bags/common/tiddlers/ts.js"></script>
<script src="/status.js"></script>
<script src="/bags/common/tiddlers/space.js"></script>
</body>
</html>
/***
|''Name''|TiddlySpaceLinkedTiddlers|
|''Version''|0.1.4|
!Usage
Enables the linkedTiddlers macro as default.
Note the @following space must be included.
}}}
***/
//{{{
config.options.chkFollowTiddlersIsLinkedTiddlers = true;
//}}}
Today I have created a new plugin called [[TypeWithMePlugin|GettingStarted]]@typewithme which gives you a simple mechanism to associate individual tiddlers with collaborative documents hosted on [[http://www.typewith.me|http://bit.ly/9jjIQa]].

For a working example and maybe some useful rules as to how to use it, have a look at [[semantic space|TypeWithMe]]@semantic ...check out the speech bubble in the toolbar.

Currently, all visitors can see and edit those documents. Although it currently can't be disabled in a secure manner, I am looking into ways to optionally disallow opening the document for either guests or non members of the space. Any ideas or code samples highly welcome.

<<more TypeWithMe>>
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
[[Replies and Notifications]]
{{activityList{
!People
<<groupBy modifier filter:"[server.activity[true]]" template:Templates##ModifierItem groupTemplate:Templates##ModifierHeading>>
!Tagcloud
<<tagcloud threshold:2 filter:[server.activity[true]] exclude:excludeMissing exclude:excludeLists exclude:excludeSearch>>

<<allActivity>>
/%
<<newtimeline modified 250 filter:"[server.activity[true]][isnot[privateAndExternal]]" template:Templates##Item groupTemplate:Templates##Heading>>
%/
}}}
An MTC is a Minimal Test Case providing a standard TiddlyWiki loaded with just enough demo data and plugins in order to demonstrate a problem or issue.
<html><div align="center"><iframe src="http://webchat.freenode.net?channels=tiddlyweb&uio=d4" "frameborder="0" width="100%" height="400"></iframe></div></html>
/* Use this tiddler for your custom CSS and leave StyleSheet to get theme updates. */
/*{{{*/
@font-face {
	font-family: 'Lobster';
	font-style: normal;
	font-weight: normal;
	src: local('Lobster'), url('http://fonts.tiddlyspace.com/Lobster.ttf') format('truetype');
}

@font-face {
	font-family: 'Vollkorn';
	font-style: normal;
	font-weight: normal;
	src: local('Vollkorn'), url('http://fonts.tiddlyspace.com/Vollkorn-Regular.ttf') format('truetype');
}

.siteTitle{
  font-family: 'Lobster';
}

#topMenu,
.siteSubtitle {
  font-family: 'Vollkorn';
}

#sidebarOptions .btn-history-none,
#sidebarOptions .popup .btn-history-current{
    color:[[ColorPalette::TertiaryPale]];
    cursor:default !important;
}

.frmTypeWithMe {
    margin-left:1%;
    width:86%;
}

.popList a{
    display: block;
    padding: 5px 7px;
}

.popList br{
    display:none;
}

.admin a.tiddlyLink {
    color:transparent !important;
    margin-left:20px !important;
    padding: 3px 20px !important;
}

.adminLinks a{
    display:block;
}

.infoBox{
    display:block;
    float:right;
    margin: 10px 0 10px 10px;
    text-align:center;
}

.infoBox h1{
    padding:0;
    margin: 0;
}

.infoBox .tiddlyLink{
    display:block;
    font-size:1.4em;
    line-height:1.4em;
}

.viewer .listTitle {
    margin-left:0;
}

.followersFollowers .spaceName {
    list-style-type:none;
    float:left;
    min-height:30px;
    min-width: 150px;
}

#tiddlerDisplay .tbScan,
#tiddlerDisplay .followersFollowers{
    margin:1em 0 0 0;
    overflow:auto;
}

#tiddlerDisplay .scanResults > ul,
.followersFollowers .followers > ul{
    margin:0;
    padding:0;
}

.scanUser {display:block;display:block;font-size:1.5em;height:2em;margin-top:10px;padding:0.5em 0.3em 0;background:[[ColorPalette::TertiaryPale]];margin-top:5px;-moz-border-radius-topleft:10px;-moz-border-radius-topright:10px; -webkit-border-radius-topleft:10px;-webkit-border-radius-topright:10px;border-radius-topleft:10px;border-radius-topright:10px;}
.scanUser .externalImage,.scanUser .image{display:block;float:left;margin:-0.3em 0.5em 0 0 ;}
.scanText {display:block;background:[[ColorPalette::SecondaryPale]];font-size:0.9em;padding:0.5em;-moz-border-radius-bottomleft:10px;-moz-border-radius-bottomright:10px; -webkit-border-radius-bottomleft:10px;-webkit-border-radius-bottomright:10px;border-radius-bottomleft:10px;border-radius-bottomright:10px;}
.tbScan .scanResults blockquote {border-left:2px solid [[ColorPalette::SecondaryDark]];margin:0.7em 0 0.7em 0.7em;padding-left:0.5em;}
.tbScan .scanResults .spaceName li {list-style-type:circle;margin:0.7em 0 0.7em 0.7em;padding-left:0.5em;}
.tbScan .scanResults code{color:[[ColorPalette::SecondaryDark]];}

/* UNVERIFIED */

.video,.video object{z-index:0;position:relative;}

.activityList ul{list-style-type:none;}
.activityList .listItem,.activityList .listLink, .activityList ul, .activityList li,.activityList .image,.activityList .label {display:block;float:left;}
.activityList .listLink, .activityList .groupBy{clear:both;float:left;}
.activityList .label {padding-left:5px;}
.activityList .label a {font-style:normal; font-weight:bold;}
.activityList .siteIcon {padding:5px;float:left;}

.linkified .tiddlyLink {color: #33a !important;}
.iconTabs .tab {padding: 18px 0 1px 0 !important;}
.iconTabs .tabContents .timeline,
.viewer .tabContents .timeline {background: transparent !important;}

#sidebarTabs .tabsetWrapper .iconTabs .tabset {min-height: 32px;margin:-7px 0 7px 0;}
#sidebarTabs .tabsetWrapper .iconTabs .tabset .tabSelected,
#sidebarTabs .tabsetWrapper .iconTabs .tabset .tab {margin: 0 !important; padding: 16px 0 0 0 !important;}
#sidebarTabs .tabIcon {margin: -13px 3px 0 3px;}
#sidebarTabs .tabsetWrapper .iconTabs .tabset .tabSelected,
#sidebarTabs .tabsetWrapper .iconTabs .tabset .tab:hover {background: [[ColorPalette::TertiaryLight]];}

.linkList .lf-list > ul > li em {
    font-size:1.4em;
    font-style:normal;
}

.linkList .lf-list > ul > li li em {
    font-size:1.2em;
}

.toolbarReadOnly .button{
    display:none !important;
}

.discuss_panel{
    margin:1em;
}

.pinkish.button, .pinkish.popup{
    background:#fee;
}

.plugin + br{
    display:none;
}

.plugin{
    border:2px solid  [[ColorPalette::PageBackground]];
    padding:5px;
    margin:7px 0;
    background:[[ColorPalette::Dim]];
}

.plugin:hover{
    background:[[ColorPalette::PageBackground]];
}

.plugin > .title > a {
    display:block;
    line-height: 1.4em;
    padding:3px;
}

.plugin .lf-found {
    background:inherit;
}

.plugin.lf-found {
    background: inherit;
}


/* FINDR */
#sidebarTabs #searchResults {
    margin: 0 1em 0 0;
}

#searchResults #findr-buttons{
    margin:0.5em 0 0 5px;
}

#searchResults .search_list .button{
    float:none;
    background:transparent;
    padding:2px;
    margin: 0;
}

#searchResults .search_list .button:hover{
    color:[[ColorPalette::SecondaryMid]];
}

#searchResults #findr-buttons .button{
    float:none;
}

.search_details strong{
   font-weight:normal;
   color:[[ColorPalette::TertiaryMid]];
}

.findr > strong{
    display: block;
    clear: both;
    padding-top: 0.5em;
}

/* PLUGIN PREVIEWS */

.preview img {
    float: right;
    width: 300px;
    margin-left:10px;
    border:5px solid [[ColorPalette::PageBackground]];
    -webkit-border-radius: 5px;
    -moz-border-radius: 5px;
    border-radius: 5px;
}

.modifierIcon  .siteIcon img {
    z-index: 0;
    -webkit-border-radius: 30px;
    -moz-border-radius: 30px;
    border-radius: 30px;
}

.modifierIcon .siteIcon{
    webkit-border-radius: 30px;
    -moz-border-radius: 30px;
    border-radius: 30px;
    -moz-background-clip: padding;
    -webkit-background-clip: padding-box;
    background-clip: padding-box;
    height: 32px;
    width: 32px;
    border: 10px solid transparent;
    position: absolute;
    left: -20px;
    top: -10px;
}

.tiddler .followPlaceHolder {
    right: 72px;
}

[[StyleSheetContact]]
/*}}}*/
!Tags
[[Contributions]]
!More
[[Journal]]
[[Notes]]
[[Talks]]
[[Flog]]
follow
[[systemConfig]]
[[systemConfigDisable]]
[[excludeMissing]]
[[excludeSearch]]
[[excludeLists]]
<!--{{{-->
<div class='toolbar'
    macro='toolbar [[ToolbarCommands::EditToolbar]] icons:yes'>
</div>
<div class='heading editorHeading'>
    <div class='editor title' macro='edit title'></div>
    <div class='tagClear'></div>
</div>
<div class='annotationsBox' macro='annotations'>
    <div class='editSpaceSiteIcon'
        macro='tiddlerOrigin  height:12 width:12 preserveAspectRatio:yes label:no interactive:no'>
    </div>
    <div class="privacyEdit" macro='setPrivacy label:no interactive:no'></div>
    <div class='tagClear'></div>
</div>
<div class='editor' macro='edit text'></div>
<div class='editorFooter'>
    <div class='tagTitle'>tags</div>
    <div class='editor' macro='edit tags'></div>
    <div class='tagAnnotation'>
        <span macro='message views.editor.tagPrompt'></span>
        <span macro='tagChooser excludeLists'></span>
    </div>
</div>
<!--}}}-->
@MartinBudden
[[RandomTiddlersMacro|RandomTiddlers]] gives you the ability to generate, for example, a list with a ''Summary'' for each of 10 random tiddlers out of the 50 last modified ones tagged [[Journal]].

<<more RandomTiddlers>>
/***
|''Macro''|LinkifyPlugin|
|''Description''|Automatically turns text into links, optionally using aliases<br>The plugin idea is based on Clint Checketts and Paul Petterson's [[RedirectMacro|http://checkettsweb.com/styles/themes.htm#RedirectMacro]]|
|''Documentation''|http://linkify.tiddlyspot.com|
|''Author''|Tobias Beer|
|''Version''|1.1.2 (2013-10-04)|
|''CoreVersion''|2.5.2|
|''Source''|https://raw.github.com/tobibeer/TiddlyWikiPlugins/master/plugins/LinkifyPlugin.min.js|
|''Usage''|define redirects in LinkifyConfig|
/%***/
(function(e){config.shadowTiddlers.LinkifyConfig="!Exclude\n-excludeLists systemConfig noLinkify\n!Linkify\nLinkifyPlugin|^linkif\n^Tiddler";var t=config.extensions.linkify={defaults:{linkifyAllTiddlers:true,doNotLinkifyInside:"h1,h2,h3,h4,h5,h6,.header,.noLinkify,th",doNotLinkifySameTiddler:true},linkified:[],excluded:[],handler:function(n){var r,i,s=e(n.output).closest(t.defaults.doNotLinkifyInside).length>0,o=story.findContainingTiddler(n.output);o=o?o.getAttribute("tiddler"):"";s=s||t.defaults.doNotLinkifySameTiddler&&o==this.target;r=o.indexOf("##");if(r<0)r=o.indexOf("::");if(r>0)o=o.substr(0,r);i=n.source.substr(n.matchStart,1)==config.textPrimitives.unWikiLink;if(s||i||o&&t.excluded.contains(o)){n.outputText(n.output,n.matchStart+(i?1:0),n.nextMatch)}else{n.outputText(createTiddlyLink(createTiddlyElement(n.output,"span",null,"linkified"),this.target,false),n.matchStart,n.nextMatch)}},addFormatter:function(e,n,r,i,s){var o,u,a=0,f,l,c,h,p,d,v,m,g=config.formatters,y=e.substr(0,1);if(e.substr(e.length-1,1)=="*"){m=true;e=e.substr(0,e.length-1)}e:while(!o&&['"',"~","^","*","("].contains(y)){switch(y){case"~":if(i)return false;case"^":d=true;break;case'"':o=e.substr(e.length-1,1)=='"';if(o)e=e.substr(0,e.length-1);else break e;break;case"(":v=e.substr(e.length-1,1)==")";if(v)e=e.substr(0,e.length-1);else break e;break;case"*":p=true}e=e.substr(1);y=e.substr(0,1)}if(!v)e=e.replace(/\\/mg,"");l="linkify_"+e.replace(/([\W])/mg,function(e){return e.charCodeAt(0)});if(s){c="linkify_"+s.replace(/([\W])/mg,function(e){return e.charCodeAt(0)})}while(a<g.length){u=u||g[a].name==l;if(s&&g[a].name==c){g.splice(a,1)}else a++}if(u||r||!e)return false;h=config.textPrimitives.unWikiLink+"?"+(v?"(?:%2)":"(?:\\b%0%2%1\\b)").format([p?"[\\w]*":"",m?"[\\w]*":"",v?e:e.escapeRegExp().replace(/([a-z]|[A-Z])/img,function(e){return"["+(o?e:/[\W]/mg.exec(e)?"'"+e:e.toUpperCase()+e.toLowerCase())+"]"}).replace(/[\s]/mg,"[\\s]")]);f={name:l,match:h,target:n,handler:t.handler};if(d)g.unshift(f);else g.push(f);return true},indexConfig:function(){var e,n,r,i,s,o,u,a,f,l,c,h,p=config.formatters,d=function(e){e=e.replace(/^(\'|\*|\^|\~|\()+/mg,"");return e.replace(/(\*|\))+?/mg,"")};t.linkified=[];u=store.getTiddlerText("LinkifyConfig")||store.getShadowTiddlerText("LinkifyConfig");u=u?u.split("\n"):[];for(var v=0;v<p.length;v++){if(p[v].name.indexOf("linkify_")==0){p.splice(v,1);v--}}for(s=0;s<u.length;s++){if(!u[s]||[" ","!"].contains(u[s][0]))continue;o=u[s].split("|");l=d(o[0]);n=0;t.linkified.pushUnique(l);for(e=1;e<o.length;e++){a=d(o[e]);if(a.toLowerCase().indexOf(l.toLowerCase())==0){h=o[e];o[e]=o[n];o[n]=h;n=e}}for(e=0;e<o.length;e++)t.addFormatter(o[e],l,false,e==n)}if(t.defaults.linkifyAllTiddlers){c=store.getTiddlers();for(f=0;f<c.length;f++){l=c[f].title;t.addFormatter(l,l,t.excluded.contains(l)||t.linkified.contains(l))}}},indexExcludes:function(){var e,n="",r,i,i=store.getTiddlerText("LinkifyConfig")||store.getShadowTiddlerText("LinkifyConfig");t.excluded=[];i=i?i.split("\n"):[];for(r=0;r<i.length;r++)if(i[r].indexOf("-")==0)n+=i[r].substr(1,i[r].length-1)+" ";n=n.readBracketedList();n.map(function(e){t.excluded.pushUnique(e)});for(e=0;e<n.length;e++)store.getTaggedTiddlers(n[e]).map(function(e){t.excluded.pushUnique(e.title)})},init:function(){this.indexConfig();this.indexExcludes();formatter=new Formatter(config.formatters)}};config.extensions.linkify.init();window.linkifyTiddlers=function(){};TiddlyWiki.prototype.saveTiddlerLINKIFY=TiddlyWiki.prototype.saveTiddler;TiddlyWiki.prototype.saveTiddler=function(n,r,i,s,o,u,a,f,l,c){var h=[],p=store.saveTiddlerLINKIFY.apply(this,arguments),d=r;t.addFormatter(d,d,t.excluded.contains(d)||t.linkified.contains(d),true,d!=n?n:null);if(n=="LinkifyConfig"||r=="LinkifyConfig"){t.indexConfig()}t.indexExcludes();formatter=new Formatter(config.formatters);if(d!=n){e("[tiddler]",e("[content]")).each(function(){var t=e(this),i=t.text()||"",s=t.attr(tiddler)|"";if(i.indexOf(r)>-1||i.indexOf(n)>-1){if(s)h.pushUnique(s)}});e("a[tag], a[tiddlyLink]").each(function(){var t,i=e(this),s=i.attr("tiddlyLink");s=s?s:i.attr("tag");if(s==n||s==r){t=e(this).closest(".tiddler").attr("tiddler");if(t)h.pushUnique(t)}});h.map(function(e){story.refreshTiddler(e,null,true)})}return p};store.removeTiddler_Linkify=store.removeTiddler;store.removeTiddler=function(e){var t=store.removeTiddler_Linkify.apply(this,arguments);config.extensions.linkify.addFormatter("*",null,null,null,e);formatter=new Formatter(config.formatters);story.refreshAllTiddlers(true);return t};config.shadowTiddlers.StyleSheetLinkify="/*{{{*/\n"+".linkified .tiddlyLink{color:[[ColorPalette::PrimaryMid]];font-weight:normal;}\n"+".linkified .tiddlyLink:hover{color:[[ColorPalette::PrimaryLight]];background:transparent;}\n"+".headerShadow .linkified .tiddlyLink {color:transparent !important;}\n"+".siteSubtitle .linkified .tiddlyLink{color:[[ColorPalette::PrimaryPale]];background:transparent;}\n"+".siteSubtitle .linkified .tiddlyLink:hover{color:[[ColorPalette::Background]];background:transparent;}\n"+"dt .linkified .tiddlyLink{font-weight:bold;}\n"+"/*}}}*/";store.addNotification("StyleSheetLinkify",refreshStyles)})(jQuery)
//%/
/***
|''Name''|tsScanCountPlugin|
|''Description''|Provides ability to count tiddlers at a given tiddlyspace url and display a button that when clicked lists them. Also upgrades tsScan to replace any options containing with $1 with the current space|
|''Version''|0.2.0|
***/
//{{{
(function($) {

var tsScan = config.macros.tsScan;
var tiddlyspace = config.extensions.tiddlyspace;

var macro = config.macros.tsScanCount = {
	cache: true,
	countCache: {},
	handler: function(place, macroName, params, w, paramString, tiddler) {
		var container = $("<a href='#' class='button' />").attr("refresh", "macro").attr("macroName", macroName).appendTo(place)[0];
		$(container).data("params", paramString);
		macro.refresh(container);
	},
	refresh: function(container) {
		var paramString = $(container).data("params");
		var options = tsScan.getOptions(paramString, tiddler);
		var url = options.url;
		options.cache = macro.cache;
		options.callback = function(tiddlers) {
				options.cache = true;
				macro.cache = true;
				var count = tiddlers[0] ? tiddlers[0].fields['server.page.revision'] : 0;
				var lastCount = macro.countCache[url] || 0;
				if(lastCount != count) {
					var interval, step = 0;
					interval = window.setInterval(function() {
						var last = step;
						step += 1;
						$(container).removeClass("step" + last);
						if(step > 10) {
							macro.countCache[url] = count;
							window.clearInterval(interval);
						} else {
							$(container).addClass("step" + step);
						}
					}, 500)
				}
				$(container).empty().addClass("enabled").text(tiddlers.length).click(function(ev) {
				$(ev.target).addClass("active");
				var target = options.popupSelector ? $(options.popupSelector)[0] : ev.target;
				var p = Popup.create(target, "div");
				var container;
				if(options.heading) {
					container = $("<div />").addClass("heading").appendTo(p)[0];
					wikify(store.getTiddlerText(options.heading) || "", container);
				}
				container = $("<div />").addClass("followTiddlersList").appendTo(p)[0];
				tsScan.scan(container, options);
				Popup.show();
				ev.stopPropagation();
				return false;
			});
		};
		tsScan.scan(container, options);
	}
}

var _getOptions = tsScan.getOptions;
config.macros.tsScan.getOptions = function(paramString, tiddler) {
	var options = _getOptions.apply(this, arguments);
	var optionsClone = {};
	for(var i in options) {
		if(typeof(options[i]) == "string") {
			optionsClone[i] = options[i].format(tiddlyspace.currentSpace.name);
		} else {
			optionsClone[i] = options[i];
		}
	}
	return optionsClone;
}

// every 5 minutes make tsScan update.
window.setInterval(function() {
	macro.cache = false;
	$("[macroName=tsScanCount]").each(function(i, el) {
		macro.refresh(el);
	});
}, 1000 * 60 * 5);
})(jQuery);
//}}}
!Summary
BetterRssHack does two things...
*it allows you to only add tiddlers with a certain tag to the feed
**defined via option [[txtRssTag|AdvancedOptions]]: <<option txtRssTag>>
*it adds the author to each feed item
**[[idea and codebase provided by FND|http://groups.google.com/group/tiddlywiki/msg/712dade9e1eee7c7]]
*sets a reasonable default for the maximum number of RSS items
**{{{config.numRssItems=50;}}}
!Details
To permanently set  {{{txtRssTag}}} and to set a different maximum number of tiddlers in the feed add the following to your [[zzConfig]] tiddler tagged [[systemConfig]]:
{{{
config.options.txtRssTag="ThisTag [[And That Too]]";
config.numRssItems=20;
}}}
@@color:red;''Important:'' ~BetterRssHack does (currently) not work with ~TiddlySpace but only in a standard ~TiddlyWiki... though one wonders how one is supposed to save the feed at some server other than using ftp software or using TiddlySpot.
@@
!INFO
<<tsScan SiteInfo>>
!END
/***
|''Name''|TiddlySpaceCloneCommand|
|''Version''|0.5.8|
|''Description''|provides a toolbar command for cloning external tiddlers|
|''Status''|stable|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceCloneCommand.js|
|''Requires''|TiddlySpaceConfig TiddlySpaceFilters|
!Code
***/
//{{{
(function($) {

var cmd = config.commands;
var tiddlyspace = config.extensions.tiddlyspace;

var fieldsCache = {};

cmd.cloneTiddler = {
	text: cmd.editTiddler.text,
	tooltip: "Create a copy of this tiddler in the current space",
	errorMsg: "Error publishing %0: %1",

	isEnabled: function(tiddler) {
		return !config.filterHelpers.is.local(tiddler) && !readOnly;
	},
	handler: function(ev, src, title) {
		var tiddler = store.getTiddler(title);
		if(tiddler) {
			fieldsCache[title] = $.extend({}, tiddler.fields);
			tiddler.fields["server.workspace"] = tiddlyspace.getCurrentWorkspace(config.options.chkPrivateMode ?
		"private" : "public");
			tiddler.fields["server.permissions"] = "read, write, create"; // no delete
			delete tiddler.fields["server.page.revision"];
			delete tiddler.fields["server.title"];
			delete tiddler.fields["server.etag"];
			// special handling for pseudo-shadow tiddlers
			if(tiddlyspace.coreBags.contains(tiddler.fields["server.bag"])) {
				tiddler.tags.remove("excludeLists");
			}
		} else { // ensure workspace is the current space
			var el = story.findContainingTiddler(src);
			el = $(el);
			var fields = el.attr("tiddlyfields");
			if(fields) { // inherited via TiddlyLink
				fields = fields.decodeHashMap();
				fields["server.workspace"] = config.
					defaultCustomFields["server.workspace"];
			} else {
				fields = config.defaultCustomFields;
			}
			fields = String.encodeHashMap(fields);
			el.attr("tiddlyfields", fields);
		}
		cmd.editTiddler.handler.apply(this, arguments);
		if(tiddler) {
			tiddler.fields["server.permissions"] += ", delete";
		}
		return false;
	}
};

cmd.editTiddler.isEnabled = function(tiddler) {
	return !cmd.cloneTiddler.isEnabled.apply(this, arguments);
};

// hijack cancelTiddler to restore original fields
var _cancelHandler = cmd.cancelTiddler.handler;
cmd.cancelTiddler.handler = function(ev, src, title) {
	var tiddler = store.getTiddler(title);
	if(tiddler) {
		tiddler.fields = fieldsCache[title] || tiddler.fields;
		delete fieldsCache[title];
	}
	return _cancelHandler.apply(this, arguments);
};

// hijack saveTiddler to clear unused fields stash
var _saveHandler = cmd.saveTiddler.handler;
cmd.saveTiddler.handler =  function(ev, src, title) {
	delete fieldsCache[title];
	return _saveHandler.apply(this, arguments);
};

})(jQuery);
//}}}
Talks here on TiddlySpace...
{{readOnly{<<newTiddler label:"Create a new talk..." focus:title tag:Talks>>}}}<<tiddlerList tags:"Talks" dateFormat:"ddd. 0DD" itemTemplate:"*%modified - [[%title|%title]] (%tags)\n" group:"tiddler.modified.formatString('YYYY, MMM')" groupTemplate:"!!!%group \n" order:"-modified">>
@developers
<<tabs
	txtMainTab
	Recent "Recently edited tiddlers" SideBarTabs##Timeline
	Tags "All tags" SideBarTabs##Tags
	All "All tiddlers" SideBarTabs##All
	--More "Admin stuff" SideBarTabs##More
>>/%
!Timeline
<<timeline modified 17 "YYYY-0MM-0DD">><<listfiltr>>
{{title{[[Full Timeline|Timeline]]}}}
!Tags
<<allTags excludeLists>><<listfiltr>>
!All
<<list all>><<listfiltr>>
!Spaces
<<groupBy server.bag>><<listfiltr>>
!Private
<<list filter [is[private]]>><<listfiltr>>
!Public
<<list filter [is[public]]>><<listfiltr>>
!Missing
<<list missing>><<listfiltr>>
!Orphans
<<list orphans>><<listfiltr>>
!Shadows
<<list shadowed>><<listfiltr>>
!Untagged
<<untagged list>><<listfiltr>>
!ThemAll
{{adminLinks{
<<list all>>excludeLists<<list filter [tag[excludeLists]]>>
}}}<<listfiltr>>
!Config
<<newTiddler>>
{{noTitle{
[[MySpaces]]
<<tagging config>>
}}}<<listfiltr>>
!More
<<tabs
	txtMoreTab
	"Config" "Config tiddlers" SideBarTabs##Config
	"All!" "Really all tiddlers" SideBarTabs##ThemAll
	"Spaces" "Tiddlers grouped by space" SideBarTabs##Spaces
	"Activity" "What people you are following are up to" TabFollowing##Activity
        "Following" "People you are following" TabFollowing##Following
        "Followers" "People who are following you" TabFollowing##Followers
	"Public" "All public tiddlers" SideBarTabs##Public
	"Private" "All private tiddlers" SideBarTabs##Private
	"Missing" "Missing tiddlers" SideBarTabs##Missing
	"Orphans" "Orphaned tiddlers" SideBarTabs##Orphans
	"Shadows" "Shadowed tiddlers" SideBarTabs##Shadows
	"Untagged" "Untagged tiddlers" SideBarTabs##Untagged
>>
!End%/
Useful things...
Today, I have created a new TiddlySpace called @ShowRoom which is an attempt for contributors in the TiddlyWiki community to collaboratively provide others with valuable information on what can be done in TiddlyWiki.
/***
|''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);
//}}}
See [[Popup]]...
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
!Step1 - Create
Create a favicon.ico with 16x16 pixels on 16 colors. There are a bunch of free editors outthere that allow you to do so.
!Step2 - Upload 
Use an uploader like this to upload your new [[favicon.ico]]...
<<binaryUploadPublic title:favicon.ico>>
!Step 3 - Enable
Remove the following from your MarkupPreHead...
<!--{{{-->
<link rel='shortcut icon' href='/bags/tiddlyspace/tiddlers/favicon.ico' />
<!--}}}-->
!Step 4
Enjoy!
@Jon
KGZ1bmN0aW9uKG9iaikgeyAgICAKICAgIC8vY3JlYXRlIGFuIGlmcmFtZSBhbmQgbG9hZCB0aWRkbHl3aWtpIGludG8gaXQKICAgIG9iai5vcGVuVGlkZGx5V2lraSA9IGZ1bmN0aW9uKHVybEJhc2UsIHBhdGgsIHRpZGRsZXIsIHNpdGVUaXRsZSkgewogICAgICAgIHZhciBjc3MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7CiAgICAgICAgY3NzLnR5cGUgPSAndGV4dC9jc3MnOwogICAgICAgIGNzcy5yZWwgPSAnc3R5bGVzaGVldCc7CiAgICAgICAgY3NzLmhyZWYgPSB1cmxCYXNlICsgcGF0aCArICcvdGlkZGxlcnMvYm9va21hcmtsZXQuY3NzJzsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNzcyk7CiAgICAKICAgICAgICB2YXIgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgY29udGFpbmVyLmNsYXNzTmFtZSA9ICdUaWRkbHlXaWtpSW1wb3J0Q29udGFpbmVyJzsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7CiAgICAKICAgICAgICB2YXIgY2xvc2VCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICAgICAgY2xvc2VCdXR0b24uY2xhc3NOYW1lID0gJ1RpZGRseVdpa2lJbXBvcnRDbG9zZUJ1dHRvbic7CiAgICAgICAgY2xvc2VCdXR0b24uaHJlZiA9ICdqYXZhc2NyaXB0OjsnOwogICAgICAgIGNsb3NlQnV0dG9uLmlubmVySFRNTCA9ICdYJzsKICAgICAgICBjbG9zZUJ1dHRvbi5vbmNsaWNrID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIC8vaGlkZSwgZG9uJ3QgcmVtb3ZlCiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoY3NzKTsKICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChjb250YWluZXIpOwogICAgICAgIH07CiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNsb3NlQnV0dG9uKTsKICAgIAogICAgICAgIHZhciBjb250YWluZXJUaXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIGNvbnRhaW5lclRpdGxlLmNsYXNzTmFtZSA9ICdUaWRkbHlXaWtpQ29udGFpbmVyVGl0bGUnOwogICAgICAgIGNvbnRhaW5lclRpdGxlLmlubmVySFRNTCA9IHNpdGVUaXRsZTsKICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY29udGFpbmVyVGl0bGUpOwogICAgCiAgICAgICAgdmFyIHRpZGRsZXJMaW5rID0gKHRpZGRsZXIpID8gJyNbWycgKyB0aWRkbGVyICsgJ11dJyA6ICcnOwogICAgICAgIHZhciBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTsKICAgICAgICBpZnJhbWUuY2xhc3NOYW1lID0gJ1RpZGRseVdpa2lJbXBvcnRJRnJhbWUnOwogICAgICAgIGlmICh3aW5kb3cucG9zdE1lc3NhZ2UpIHsKICAgICAgICAgICAgaWZyYW1lTGluayA9IHVybEJhc2UgKyBwYXRoICsgJy90aWRkbGVycy53aWtpJyArIHRpZGRsZXJMaW5rOwogICAgICAgICAgICBpZnJhbWUuc3JjID0gaWZyYW1lTGluazsKICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGlmcmFtZSk7CiAgICAgICAgCiAgICAgICAgICAgIC8vd2FpdCB1bnRpbCB0aGUgc2l0ZSBoYXMgbG9hZGVkIGFuZCB0aGVuIHNlbmQgc29tZSBtZXNzYWdlcwogICAgICAgICAgICBpZnJhbWVPbkxvYWRIYW5kbGVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBzZW5kU2l0ZUluZm8oaWZyYW1lLCB1cmxCYXNlKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWZyYW1lLm9ubG9hZCA9IGlmcmFtZU9uTG9hZEhhbmRsZXI7CiAgICAgICAgICAgIAogICAgICAgICAgICAvL0lFIG9uTG9hZCBoYW5kbGVyOgogICAgICAgICAgICBjb21wbGV0ZVJlYWR5U3RhdGVDaGFuZ2VzID0gMDsKICAgICAgICAgICAgaWZyYW1lLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGlmICgrKyhjb21wbGV0ZVJlYWR5U3RhdGVDaGFuZ2VzKSA9PSAzKSB7CiAgICAgICAgICAgICAgICAgIGlGcmFtZU9uTG9hZEhhbmRsZXIoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvL25vIHBvc3RNZXNzYWdlICNwcm9iYWJseSBpZTYKICAgICAgICAgICAgdmFyIGlmcmFtZUxpbmsgPSB1cmxCYXNlICsgcGF0aCArICcvdGlkZGxlcnMud2lraT8nOwogICAgICAgICAgICB2YXIgcGFyZW50VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CiAgICAgICAgICAgIHZhciBxdWVyeVN0cmluZyA9ICdib29rbWFya2xldFBhcmVudFVSTD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHBhcmVudFVybCk7CiAgICAgICAgICAgIHF1ZXJ5U3RyaW5nICs9ICcmYm9va21hcmtsZXRQYXJlbnRUaXRsZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGRvY3VtZW50LnRpdGxlIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsKICAgICAgICAgICAgcXVlcnlTdHJpbmcgKz0gJyZib29rbWFya2xldFBhcmVudERlc2M9JyArIGVuY29kZVVSSUNvbXBvbmVudChnZXRTaXRlVGV4dCgpKTsKCiAgICAgICAgICAgIGlmcmFtZUxpbmsgKz0gcXVlcnlTdHJpbmcgKyB0aWRkbGVyTGluazsKICAgICAgICAgICAgaWZyYW1lLnNyYyA9IGlmcmFtZUxpbms7CiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpZnJhbWUpOwogICAgICAgIH0KICAgIH07CiAgICAKICAgIGZ1bmN0aW9uIHNlbmRTaXRlSW5mbyhpZnJhbWUsIHRhcmdldExpbmspIHsKICAgICAgICB2YXIgc2l0ZVVSTCA9ICd1cmw6JyArIHdpbmRvdy5sb2NhdGlvbi5ocmVmOwogICAgICAgIHNlbmRNZXNzYWdlKHNpdGVVUkwsIHRhcmdldExpbmssIGlmcmFtZS5jb250ZW50V2luZG93KTsKCiAgICAgICAgdmFyIHNpdGVUaXRsZSA9ICd0aXRsZTonICsgKGRvY3VtZW50LnRpdGxlIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsKICAgICAgICBzZW5kTWVzc2FnZShzaXRlVGl0bGUsIHRhcmdldExpbmssIGlmcmFtZS5jb250ZW50V2luZG93KTsKCiAgICAgICAgc2l0ZURlc2MgPSAnZGVzYzonICsgZ2V0U2l0ZVRleHQoKTsKICAgICAgICBzZW5kTWVzc2FnZShzaXRlRGVzYywgdGFyZ2V0TGluaywgaWZyYW1lLmNvbnRlbnRXaW5kb3cpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldFNpdGVUZXh0KCkgewogICAgICAgIHZhciB0ZXh0ID0gJyc7CiAgICAgICAgaWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24pIHsKICAgICAgICAgICAgdGV4dCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKS50b1N0cmluZygpOwogICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKSB7CiAgICAgICAgICAgIHRleHQgPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTsKICAgICAgICB9IGVsc2UgaWYgKGRvY3VtZW50LnNlbGVjdGlvbikgewogICAgICAgICAgICB0ZXh0ID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkudGV4dDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0ZXh0ID0gJyc7CiAgICAgICAgfQoKICAgICAgICBpZiAoIXRleHQpIHsKICAgICAgICAgICAgdmFyIG1ldGFUYWdzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ21ldGEnKTsKICAgICAgICAgICAgdmFyIHNpdGVEZXNjcmlwdGlvbiA9ICcnOwogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGkgPCBtZXRhVGFncy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIHRhZyA9IG1ldGFUYWdzW2ldOwogICAgICAgICAgICAgICAgaWYgKCh0YWcuY2xhc3NOYW1lKSAmJiAodGFnLmNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpID0gJ2Rlc2NyaXB0aW9uJykpIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGFnLmlubmVyVGV4dDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCF0ZXh0KSB7CiAgICAgICAgICAgIHRleHQgPSBkb2N1bWVudC50aXRsZSB8fCB3aW5kb3cubG9jYXRpb24uaHJlZjsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0ZXh0OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbmRNZXNzYWdlKG1lc3NhZ2UsIHRhcmdldCwgaFduZCkgewogICAgICAgIGhXbmQucG9zdE1lc3NhZ2UobWVzc2FnZSwgdGFyZ2V0KTsKICAgIH07Cn0pKHdpbmRvdyk7Cg==
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
	<title>Reply</title>
	<link rel="stylesheet" href="//tiddlyspace.com/bags/benspa_public/tiddlers/bootvelcro.css">
	<style>
		html,
		body {
			overflow: hidden;
			background-color: transparent;
		}

		#container {
			/* prevent a fouc if no images present */
			display: none;
		}

		.modal-header {
			border-bottom: none;
			padding: 5px 0 0;
			position: absolute;
			width: 100%;
			background-color: #e0e0e0;
			-webkit-border-radius: 6px 6px 0 0;
			-moz-border-radius: 6px 6px 0 0;
			border-radius: 6px 6px 0 0;
			cursor: move;
		}

		.form-actions {
			position: absolute;
			bottom: 0;
			box-sizing: border-box;
			-moz-box-sizing: border-box;
			width: 100%;
			margin: 0;
			border-radius: 0 0 6px 6px;
			background-color: #e0e0e0;
			border-top: 1px solid gray;
		}

		.form-actions input.btn {
			width: auto;
			float: right;
			margin: 0 0.2em;
		}

		.closeBtn {
			background-color: #DCE7F1 !important;
		}

		.primary {
			background-color: #09F !important;
		}

		h1 {
			margin-bottom: 9px;
			margin-top: 9px;
		}

		body {
			width: 100%;
			height: 100%;
			position: absolute;
		}

		.modal {
			margin: 10px;
			top: 0;
			left: 0;
			bottom: 0;
			width: 510px;
			position: absolute;
			box-shadow: #444 0px 0px 10px 2px;
			border-radius: 6px;
			background-color: white;
			border: 1px solid gray;
			background-color: #F0F4F8;
		}

		label em {
			cursor: pointer;
		}

		.modal-body {
			overflow: auto;
			position: absolute;
			top: 0;
			bottom: 0;
			left: 0;
			right: 0;
			margin: 65px 20px 67px;
			background-color: transparent;
		}

		.nav-tabs {
			padding-left: 1%;
			margin: 0;
			width: 99%;
			border-color: gray;
		}

		.nav-tabs > li {
			cursor: pointer;
		}

		.nav-tabs > li > a {
			line-height: 2.4em;
			font-weight: bold;
			font-size: 100%;
		}

		.nav-tabs > li.active > a{
			background-color: #F0F4F8;
			border-color: gray;
			border-bottom-color: #F0F4F8;
		}

		.active {
			display: block;
		}

		input,
		textarea,
		select,
		.uneditable-input {
			color: #606060;
		}

		.imagePicker {
			-moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
			-webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
			box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
			border: 1px solid #CCC;
			height: 110px;
			overflow: auto;
			-webkit-border-radius: 3px;
			-moz-border-radius: 3px;
			border-radius: 3px;
			margin-left: 0;
		}

		.imagePicker img {
			margin: 5px;
			border: 2px solid transparent;
		}

		.imagePicker .current {
			border: 2px dotted #555;
		}

		label {
			font-weight: bold;
		}

		.form-actions label {
			float: left;
			margin-top: 0.75em;
		}

		fieldset input,
		fieldset textarea {
			width: 90%;
			border-color: gray;
		}

		@media all and (max-width: 550px) {
			.modal {
				width: 95%;
			}
		}

		#help {
			position: absolute;
			border: 0;
			right: 4px;
			top: 5px;
			text-indent: -9999px;
			color: transparent;
			height: 16px;
			width: 16px;
			background: none;
			background-image: url(/bags/common/tiddlers/help.png);
			background-repeat: no-repeat;
			background-color: white;
			z-index: 2;
			border-radius: 10px;
		}

		#help-info {
			padding: 0;
			border: 1px solid gray;
			width: 60%;
			height: 50px;
			color: #404040;
			background-color: white;
			position: absolute;
			top: 5px;
			right: 5px;
			z-index: 1;
			cursor: auto;
			border-radius: 5px;

		}

		#help-info p {
			padding: 10px 25px;
			margin-bottom: 0;
		}
	</style>
</head>
<body>
	<div id="container">
		<form action="#" class="modal">
			<div class="modal-header">
				<button id="help">help</button>
				<div id="help-info" style="display:none;"><p>
				Found something interesting? Write about it in your own space. <a href="//docs.tiddlyspace.com/Reply to this Tiddler" target="_blank">Find out more</a>
				</p></div>
				<ul class="nav nav-tabs" data-tabs="tabs">
					<li class="active" data-tab-name="post"><a href="#postForm">Reply</a></li>
				</ul>
			</div>


			<fieldset id="postForm" class="modal-body">
				<label>Title
					<input type="text" name="title">
				</label>
				<input type="hidden" name="url">
				<label>Post
					<textarea name="text" rows="8"></textarea>
				</label>
				<label>Tags
					<input type="text" name="tags" value="">
				</label>
			</fieldset>


			<div class="form-actions">
				<label class="checkbox">
					<input type="checkbox" name="private" val="private">
					keep private
				</label>
				<input type="submit" class="btn primary btn-large" value="Done">
				<input type="button" class="btn btn-large closeBtn" value="Cancel">
			</div>
		</form>
	</div>

	<script type="text/javascript"
            src="/bags/common/tiddlers/jquery.js"></script>
	<script type="text/javascript" src="/bags/tiddlyspace/tiddlers/chrjs"></script>
	<script type="text/javascript" src="/bags/common/tiddlers/_reply.js"></script>
</body>
</html>
Things that don't work anymore...
/***
|''Name''|TiddlyWebAdaptor|
|''Description''|adaptor for interacting with TiddlyWeb|
|''Author:''|FND|
|''Contributors''|Chris Dent, Martin Budden|
|''Version''|1.4.10|
|''Status''|stable|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/adaptors/TiddlyWebAdaptor.js|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/association/|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5|
|''Keywords''|serverSide TiddlyWeb|
!Notes
This plugin includes [[jQuery JSON|http://code.google.com/p/jquery-json/]].
!To Do
* createWorkspace
* document custom/optional context attributes (e.g. filters, query, revision) and tiddler fields (e.g. server.title, origin)
!Code
***/
//{{{
(function($) {

var adaptor = config.adaptors.tiddlyweb = function() {};

adaptor.prototype = new AdaptorBase();
adaptor.serverType = "tiddlyweb";
adaptor.serverLabel = "TiddlyWeb";
adaptor.mimeType = "application/json";

adaptor.parsingErrorMessage = "Error parsing result from server";
adaptor.noBagErrorMessage = "no bag specified for tiddler";
adaptor.locationIDErrorMessage = "no bag or recipe specified for tiddler"; // TODO: rename

// retrieve current status (requires TiddlyWeb status plugin)
adaptor.prototype.getStatus = function(context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/status";
	var uri = uriTemplate.format([context.host]);
	var req = httpReq("GET", uri, adaptor.getStatusCallback, context,
		null, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getStatusCallback = function(status, context, responseText, uri, xhr) {
	context.status = responseText ? status : false;
	try {
		context.statusText = xhr.statusText;
	} catch(exc) { // offline (Firefox)
		context.status = false;
		context.statusText = null;
	}
	context.httpStatus = xhr.status;
	if(context.status) {
		context.serverStatus = $.evalJSON(responseText); // XXX: error handling!?
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// retrieve a list of workspaces
adaptor.prototype.getWorkspaceList = function(context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.workspaces = [];
	var uriTemplate = "%0/recipes"; // XXX: bags?
	var uri = uriTemplate.format([context.host]);
	var req = httpReq("GET", uri, adaptor.getWorkspaceListCallback,
		context, { accept: adaptor.mimeType }, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getWorkspaceListCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		try {
			var workspaces = $.evalJSON(responseText);
		} catch(ex) {
			context.status = false; // XXX: correct?
			context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
			if(context.callback) {
				context.callback(context, context.userParams);
			}
			return;
		}
		context.workspaces = workspaces.map(function(itm) { return { title: itm }; });
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// retrieve a list of tiddlers
adaptor.prototype.getTiddlerList = function(context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/%1/%2/tiddlers%3";
	var params = context.filters ? "?" + context.filters : "";
	if(context.format) {
		params = context.format + params;
	}
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name), params]);
	var req = httpReq("GET", uri, adaptor.getTiddlerListCallback,
		context, merge({ accept: adaptor.mimeType }, context.headers), null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerListCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		context.tiddlers = [];
		try {
			var tiddlers = $.evalJSON(responseText); //# NB: not actual tiddler instances
		} catch(ex) {
			context.status = false; // XXX: correct?
			context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
			if(context.callback) {
				context.callback(context, context.userParams);
			}
			return;
		}
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = adaptor.toTiddler(tiddlers[i], context.host);
			context.tiddlers.push(tiddler);
		}
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// perform global search
adaptor.prototype.getSearchResults = function(context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/search?q=%1%2";
	var filterString = context.filters ? ";" + context.filters : "";
	var uri = uriTemplate.format([context.host, context.query, filterString]); // XXX: parameters need escaping?
	var req = httpReq("GET", uri, adaptor.getSearchResultsCallback,
		context, { accept: adaptor.mimeType }, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getSearchResultsCallback = function(status, context, responseText, uri, xhr) {
	adaptor.getTiddlerListCallback(status, context, responseText, uri, xhr); // XXX: use apply?
};

// retrieve a particular tiddler's revisions
adaptor.prototype.getTiddlerRevisionList = function(title, limit, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions";
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name), adaptor.normalizeTitle(title)]);
	var req = httpReq("GET", uri, adaptor.getTiddlerRevisionListCallback,
		context, merge({ accept: adaptor.mimeType }, context.headers), null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerRevisionListCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		context.revisions = [];
		try {
			var tiddlers = $.evalJSON(responseText); //# NB: not actual tiddler instances
		} catch(ex) {
			context.status = false; // XXX: correct?
			context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
			if(context.callback) {
				context.callback(context, context.userParams);
			}
			return;
		}
		for(var i = 0; i < tiddlers.length; i++) {
			var tiddler = adaptor.toTiddler(tiddlers[i], context.host);
			context.revisions.push(tiddler);
		}
		var sortField = "server.page.revision";
		context.revisions.sort(function(a, b) {
			return a.fields[sortField] < b.fields[sortField] ? 1 :
				(a.fields[sortField] == b.fields[sortField] ? 0 : -1);
		});
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// retrieve an individual tiddler revision -- XXX: breaks with standard arguments list -- XXX: convenience function; simply use getTiddler?
adaptor.prototype.getTiddlerRevision = function(title, revision, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.revision = revision;
	return this.getTiddler(title, context, userParams, callback);
};

// retrieve an individual tiddler
//# context is an object with members host and workspace
//# callback is passed the new context and userParams
adaptor.prototype.getTiddler = function(title, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = title;
	if(context.revision) {
		var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions/%4";
	} else {
		uriTemplate = "%0/%1/%2/tiddlers/%3";
	}
	if(!context.tiddler) {
		context.tiddler = new Tiddler(title);
	}
	context.tiddler.fields["server.type"] = adaptor.serverType;
	context.tiddler.fields["server.host"] = AdaptorBase.minHostName(context.host);
	context.tiddler.fields["server.workspace"] = context.workspace;
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name), adaptor.normalizeTitle(title),
		context.revision]);
	var req = httpReq("GET", uri, adaptor.getTiddlerCallback, context,
		merge({ accept: adaptor.mimeType }, context.headers), null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		try {
			var tid = $.evalJSON(responseText);
		} catch(ex) {
			context.status = false;
			context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
			if(context.callback) {
				context.callback(context, context.userParams);
			}
			return;
		}
		var tiddler = adaptor.toTiddler(tid, context.host);
		tiddler.title = context.tiddler.title;
		tiddler.fields["server.etag"] = xhr.getResponseHeader("Etag");
		// normally we'd assign context.tiddler = tiddler here - but we can't do
		// that because of IE, which triggers getTiddler in putTiddlerCallback,
		// and since ServerSideSavingPlugin foolishly relies on persistent
		// object references, we need to merge the data into the existing object
		$.extend(context.tiddler, tiddler);
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// retrieve tiddler chronicle (all revisions)
adaptor.prototype.getTiddlerChronicle = function(title, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = title;
	var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions?fat=1";
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name), adaptor.normalizeTitle(title)]);
	var req = httpReq("GET", uri, adaptor.getTiddlerChronicleCallback,
		context, { accept: adaptor.mimeType }, null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerChronicleCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(status) {
		context.responseText = responseText;
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// store an individual tiddler
adaptor.prototype.putTiddler = function(tiddler, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = tiddler.title;
	context.tiddler = tiddler;
	context.host = context.host || this.fullHostName(tiddler.fields["server.host"]);
	var uriTemplate = "%0/%1/%2/tiddlers/%3";
	try {
		context.workspace = context.workspace || tiddler.fields["server.workspace"];
		var workspace = adaptor.resolveWorkspace(context.workspace);
	} catch(ex) {
		return adaptor.locationIDErrorMessage;
	}
	var uri = uriTemplate.format([context.host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name),
		adaptor.normalizeTitle(tiddler.title)]);
	var etag = adaptor.generateETag(workspace, tiddler);
	var headers = etag ? { "If-Match": etag } : null;
	var payload = {
		type: tiddler.fields["server.content-type"] || null,
		text: tiddler.text,
		tags: tiddler.tags,
		fields: $.extend({}, tiddler.fields)
	};
	delete payload.fields.changecount;
	$.each(payload.fields, function(key, value) {
		if(key.indexOf("server.") == 0) {
			delete payload.fields[key];
		}
	});
	payload = $.toJSON(payload);
	var req = httpReq("PUT", uri, adaptor.putTiddlerCallback,
		context, headers, payload, adaptor.mimeType, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.putTiddlerCallback = function(status, context, responseText, uri, xhr) {
	context.status = [204, 1223].contains(xhr.status);
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(context.status) {
		var loc = xhr.getResponseHeader("Location");
		var etag = xhr.getResponseHeader("Etag");
		if(loc && etag) {
			var bag = loc.split("/bags/").pop().split("/")[0];
			context.tiddler.fields["server.bag"] = bag;
			context.tiddler.fields["server.workspace"] = "bags/" + bag;
			var rev = etag.split("/").pop().split(/;|:/)[0];
			context.tiddler.fields["server.page.revision"] = rev;
			context.tiddler.fields["server.etag"] = etag;
			if(context.callback) {
				context.callback(context, context.userParams);
			}
		} else { // IE
			context.adaptor.getTiddler(context.tiddler.title, context,
				context.userParams, context.callback);
		}
	} else if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// store a tiddler chronicle
adaptor.prototype.putTiddlerChronicle = function(revisions, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = revisions[0].title;
	var headers = null;
	var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions";
	var host = context.host || this.fullHostName(tiddler.fields["server.host"]);
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name),
		adaptor.normalizeTitle(context.title)]);
	if(workspace.type == "bag") { // generate ETag
		var etag = [adaptor.normalizeTitle(workspace.name),
			adaptor.normalizeTitle(context.title), 0].join("/"); //# zero-revision prevents overwriting existing contents
		headers = { "If-Match": '"' + etag + '"' };
	}
	var payload = $.toJSON(revisions);
	var req = httpReq("POST", uri, adaptor.putTiddlerChronicleCallback,
		context, headers, payload, adaptor.mimeType, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.putTiddlerChronicleCallback = function(status, context, responseText, uri, xhr) {
	context.status = [204, 1223].contains(xhr.status);
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// store a collection of tiddlers (import TiddlyWiki HTML store)
adaptor.prototype.putTiddlerStore = function(store, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	var uriTemplate = "%0/%1/%2/tiddlers";
	var host = context.host;
	var workspace = adaptor.resolveWorkspace(context.workspace);
	var uri = uriTemplate.format([host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name)]);
	var req = httpReq("POST", uri, adaptor.putTiddlerStoreCallback,
		context, null, store, "text/x-tiddlywiki", null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.putTiddlerStoreCallback = function(status, context, responseText, uri, xhr) {
	context.status = [204, 1223].contains(xhr.status);
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// rename an individual tiddler or move it to a different workspace -- TODO: make {from|to}.title optional
//# from and to are objects with members title and workspace (bag; optional),
//# representing source and target tiddler, respectively
adaptor.prototype.moveTiddler = function(from, to, context, userParams, callback) { // XXX: rename parameters (old/new)?
	var self = this;
	var newTiddler = store.getTiddler(from.title) || store.getTiddler(to.title); //# local rename might already have occurred
	var oldTiddler = $.extend(true, {}, newTiddler); //# required for eventual deletion
	oldTiddler.title = from.title; //# required for original tiddler's ETag
	var _getTiddlerChronicle = function(title, context, userParams, callback) {
		return self.getTiddlerChronicle(title, context, userParams, callback);
	};
	var _putTiddlerChronicle = function(context, userParams) {
		if(!context.status) {
			return callback(context, userParams);
		}
		var revisions = $.evalJSON(context.responseText); // XXX: error handling?
		// change current title while retaining previous location
		for(var i = 0; i < revisions.length; i++) {
			delete revisions[i].revision;
			if(!revisions[i].fields.origin) { // NB: origin = "<workspace>/<title>"
				revisions[i].fields.origin = ["bags", revisions[i].bag, revisions[i].title].join("/");
			}
			revisions[i].title = to.title;
		}
		// add new revision
		var rev = $.extend({}, revisions[0]);
		$.each(newTiddler, function(i, item) {
			if(!$.isFunction(item)) {
				rev[i] = item;
			}
		});
		rev.title = to.title;
		rev.created = rev.created.convertToYYYYMMDDHHMM();
		rev.modified = new Date().convertToYYYYMMDDHHMM();
		delete rev.fields.changecount;
		revisions.unshift(rev);
		if(to.workspace) {
			context.workspace = to.workspace;
		} else if(context.workspace.substring(0, 4) != "bags") { // NB: target workspace must be a bag
			context.workspace = "bags/" + rev.bag;
		}
		var subCallback = function(context, userParams) {
			if(!context.status) {
				return callback(context, userParams);
			}
			context.adaptor.getTiddler(newTiddler.title, context, userParams, _deleteTiddler);
		};
		return self.putTiddlerChronicle(revisions, context, context.userParams, subCallback);
	};
	var _deleteTiddler = function(context, userParams) {
		if(!context.status) {
			return callback(context, userParams);
		}
		$.extend(true, newTiddler, context.tiddler);
		context.callback = null;
		return self.deleteTiddler(oldTiddler, context, context.userParams, callback);
	};
	callback = callback || function() {};
	context = this.setContext(context, userParams);
	context.host = context.host || oldTiddler.fields["server.host"];
	context.workspace = from.workspace || oldTiddler.fields["server.workspace"];
	return _getTiddlerChronicle(from.title, context, userParams, _putTiddlerChronicle);
};

// delete an individual tiddler
adaptor.prototype.deleteTiddler = function(tiddler, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = tiddler.title; // XXX: not required!?
	var uriTemplate = "%0/bags/%1/tiddlers/%2";
	var host = context.host || this.fullHostName(tiddler.fields["server.host"]);
	var bag = tiddler.fields["server.bag"];
	if(!bag) {
		return adaptor.noBagErrorMessage;
	}
	var uri = uriTemplate.format([host, adaptor.normalizeTitle(bag),
		adaptor.normalizeTitle(tiddler.title)]);
	var etag = adaptor.generateETag({ type: "bag", name: bag }, tiddler);
	var headers = etag ? { "If-Match": etag } : null;
	var req = httpReq("DELETE", uri, adaptor.deleteTiddlerCallback, context, headers,
		null, null, null, null, true);
	return typeof req == "string" ? req : true;
};

adaptor.deleteTiddlerCallback = function(status, context, responseText, uri, xhr) {
	context.status = [204, 1223].contains(xhr.status);
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// compare two revisions of a tiddler (requires TiddlyWeb differ plugin)
//# if context.rev1 is not specified, the latest revision will be used for comparison
//# if context.rev2 is not specified, the local revision will be sent for comparison
//# context.format is a string as determined by the TiddlyWeb differ plugin
adaptor.prototype.getTiddlerDiff = function(title, context, userParams, callback) {
	context = this.setContext(context, userParams, callback);
	context.title = title;

	var tiddler = store.getTiddler(title);
	try {
		var workspace = adaptor.resolveWorkspace(tiddler.fields["server.workspace"]);
	} catch(ex) {
		return adaptor.locationIDErrorMessage;
	}
	var tiddlerRef = [workspace.type + "s", workspace.name, tiddler.title].join("/");

	var rev1 = context.rev1 ? [tiddlerRef, context.rev1].join("/") : tiddlerRef;
	var rev2 = context.rev2 ? [tiddlerRef, context.rev2].join("/") : null;

	var uriTemplate = "%0/diff?rev1=%1";
	if(rev2) {
		uriTemplate += "&rev2=%2";
	}
	if(context.format) {
		uriTemplate += "&format=%3";
	}
	var host = context.host || this.fullHostName(tiddler.fields["server.host"]);
	var uri = uriTemplate.format([host, adaptor.normalizeTitle(rev1),
		adaptor.normalizeTitle(rev2), context.format]);

	if(rev2) {
		var req = httpReq("GET", uri, adaptor.getTiddlerDiffCallback, context, null,
			null, null, null, null, true);
	} else {
		var payload = {
			title: tiddler.title,
			text: tiddler.text,
			modifier: tiddler.modifier,
			tags: tiddler.tags,
			fields: $.extend({}, tiddler.fields)
		}; // XXX: missing attributes!?
		payload = $.toJSON(payload);
		req = httpReq("POST", uri, adaptor.getTiddlerDiffCallback, context,
			null, payload, adaptor.mimeType, null, null, true);
	}
	return typeof req == "string" ? req : true;
};

adaptor.getTiddlerDiffCallback = function(status, context, responseText, uri, xhr) {
	context.status = status;
	context.statusText = xhr.statusText;
	context.httpStatus = xhr.status;
	context.uri = uri;
	if(status) {
		context.diff = responseText;
	}
	if(context.callback) {
		context.callback(context, context.userParams);
	}
};

// generate tiddler information
adaptor.prototype.generateTiddlerInfo = function(tiddler) {
	var info = {};
	var uriTemplate = "%0/%1/%2/tiddlers/%3";
	var host = this.host || tiddler.fields["server.host"]; // XXX: this.host obsolete?
	host = this.fullHostName(host);
	var workspace = adaptor.resolveWorkspace(tiddler.fields["server.workspace"]);
	info.uri = uriTemplate.format([host, workspace.type + "s",
		adaptor.normalizeTitle(workspace.name),
		adaptor.normalizeTitle(tiddler.title)]);
	return info;
};

// create Tiddler instance from TiddlyWeb tiddler JSON
adaptor.toTiddler = function(json, host) {
	var created = Date.convertFromYYYYMMDDHHMM(json.created);
	var modified = Date.convertFromYYYYMMDDHHMM(json.modified);
	var fields = json.fields;
	fields["server.type"] = adaptor.serverType;
	fields["server.host"] = AdaptorBase.minHostName(host);
	fields["server.bag"] = json.bag;
	fields["server.title"] = json.title;
	if(json.recipe) {
		fields["server.recipe"] = json.recipe;
	}
	if(json.type && json.type != "None") {
		fields["server.content-type"] = json.type;
	}
	fields["server.permissions"] = json.permissions.join(", ");
	fields["server.page.revision"] = json.revision;
	fields["server.workspace"] = "bags/" + json.bag;
	var tiddler = new Tiddler(json.title);
	tiddler.assign(tiddler.title, json.text, json.modifier, modified, json.tags,
		created, json.fields, json.creator);
	return tiddler;
};

adaptor.resolveWorkspace = function(workspace) {
	var components = workspace.split("/");
	return {
		type: components[0] == "bags" ? "bag" : "recipe",
		name: components[1] || components[0]
	};
};

adaptor.generateETag = function(workspace, tiddler) {
	var revision = tiddler.fields["server.page.revision"];
	var etag = revision == "false" ? null : tiddler.fields["server.etag"];
	if(!etag && workspace.type == "bag") {
		if(typeof revision == "undefined") {
			revision = "0";
		} else if(revision == "false") {
			return null;
		}
		etag = [adaptor.normalizeTitle(workspace.name),
			adaptor.normalizeTitle(tiddler.title), revision].join("/");
		etag = '"' + etag + '"';
	}
	return etag;
};

adaptor.normalizeTitle = function(title) {
	return encodeURIComponent(title);
};

})(jQuery);


/*
 * jQuery JSON Plugin
 * version: 1.3
 * source: http://code.google.com/p/jquery-json/
 * license: MIT (http://www.opensource.org/licenses/mit-license.php)
 */
(function($){function toIntegersAtLease(n)
{return n<10?'0'+n:n;}
Date.prototype.toJSON=function(date)
{return this.getUTCFullYear()+'-'+
toIntegersAtLease(this.getUTCMonth())+'-'+
toIntegersAtLease(this.getUTCDate());};var escapeable=/["\\\x00-\x1f\x7f-\x9f]/g;var meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};$.quoteString=function(string)
{if(escapeable.test(string))
{return'"'+string.replace(escapeable,function(a)
{var c=meta[a];if(typeof c==='string'){return c;}
c=a.charCodeAt();return'\\u00'+Math.floor(c/16).toString(16)+(c%16).toString(16);})+'"';}
return'"'+string+'"';};$.toJSON=function(o,compact)
{var type=typeof(o);if(type=="undefined")
return"undefined";else if(type=="number"||type=="boolean")
return o+"";else if(o===null)
return"null";if(type=="string")
{return $.quoteString(o);}
if(type=="object"&&typeof o.toJSON=="function")
return o.toJSON(compact);if(type!="function"&&typeof(o.length)=="number")
{var ret=[];for(var i=0;i<o.length;i++){ret.push($.toJSON(o[i],compact));}
if(compact)
return"["+ret.join(",")+"]";else
return"["+ret.join(", ")+"]";}
if(type=="function"){throw new TypeError("Unable to convert object of type 'function' to json.");}
var ret=[];for(var k in o){var name;type=typeof(k);if(type=="number")
name='"'+k+'"';else if(type=="string")
name=$.quoteString(k);else
continue;var val=$.toJSON(o[k],compact);if(typeof(val)!="string"){continue;}
if(compact)
ret.push(name+":"+val);else
ret.push(name+": "+val);}
return"{"+ret.join(", ")+"}";};$.compactJSON=function(o)
{return $.toJSON(o,true);};$.evalJSON=function(src)
{return eval("("+src+")");};$.secureEvalJSON=function(src)
{var filtered=src;filtered=filtered.replace(/\\["\\\/bfnrtu]/g,'@');filtered=filtered.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']');filtered=filtered.replace(/(?:^|:|,)(?:\s*\[)+/g,'');if(/^[\],:{}\s]*$/.test(filtered))
return eval("("+src+")");else
throw new SyntaxError("Error parsing JSON, source is not valid.");};})(jQuery);
//}}}
/9j/4AAQSkZJRgABAQEAZABkAAD/4gv4SUNDX1BST0ZJTEUAAQEAAAvoAAAAAAIAAABtbnRyUkdCIFhZWiAH2QADABsAFQAkAB9hY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA9tYAAQAAAADTLQAAAAAp+D3er/JVrnhC+uTKgzkNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBkZXNjAAABRAAAAHliWFlaAAABwAAAABRiVFJDAAAB1AAACAxkbWRkAAAJ4AAAAIhnWFlaAAAKaAAAABRnVFJDAAAB1AAACAxsdW1pAAAKfAAAABRtZWFzAAAKkAAAACRia3B0AAAKtAAAABRyWFlaAAAKyAAAABRyVFJDAAAB1AAACAx0ZWNoAAAK3AAAAAx2dWVkAAAK6AAAAId3dHB0AAALcAAAABRjcHJ0AAALhAAAADdjaGFkAAALvAAAACxkZXNjAAAAAAAAAB9zUkdCIElFQzYxOTY2LTItMSBibGFjayBzY2FsZWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAACSgAAAPhAAAts9jdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23//2Rlc2MAAAAAAAAALklFQyA2MTk2Ni0yLTEgRGVmYXVsdCBSR0IgQ29sb3VyIFNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAAAABQAAAAAAAAbWVhcwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWFlaIAAAAAAAAAMWAAADMwAAAqRYWVogAAAAAAAAb6IAADj1AAADkHNpZyAAAAAAQ1JUIGRlc2MAAAAAAAAALVJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUMgNjE5NjYtMi0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA9tYAAQAAAADTLXRleHQAAAAAQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQ29sb3IgQ29uc29ydGl1bSwgMjAwOQAAc2YzMgAAAAAAAQxEAAAF3///8yYAAAeUAAD9j///+6H///2iAAAD2wAAwHX/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCAD9APEDASIAAhEBAxEB/8QAHAAAAAcBAQAAAAAAAAAAAAAAAAIDBAUGBwEI/8QAPBAAAgEDAgQFAgQFAwMEAwAAAQIDAAQRBSEGEjFBBxMiUWFxgRQykaEIFSNCUiSxwTPR8BdicuE0Q5L/xAAZAQACAwEAAAAAAAAAAAAAAAAAAwECBAX/xAAnEQACAwACAgEFAAIDAAAAAAAAAQIDERIhBDETFCIyQVEFYRVCgf/aAAwDAQACEQMRAD8AjoeU7Y6U31aUw2kjkZwNh9qcwxkb4pvrELTWckYHVTv7Ux+jHH2Y1LGb7XAp5n55vVk9BmvYHhFpi2eiWiDGcduwryZw6rXPGVvbIvo84hz969oeHkGNOgKjCgACsPke0dSn8S6RRf1FOOlTNqCAKYQKcjNSVqMkCqRQ5rEO496dxqAKQjQ5HenOMbVpijJOQYda7XAc12mFAUKFCgAUKFCgAUKFCgAUKFCgAUKFCgDjDvUDxNC1xYTIN9sjap2Q4FM54w0b7dQarL0MreM8X+Ic0Oi+KtnqCqycsmZGHfOxrRYSGiQp0K56e+9U7+JzS3N/DdQ7DJ5sD5z/AMVa9CIl0m0mU5EkCMN//aKpH0Pu9DhgcUmVpyVIFJhDk00zjflbPXajYFLFMdKKUI7VVghF1FEcDbApwU+KTKKetADd1zQpaRMdBQoBlKXIWmuqypDYzO56RtgfOKequSAKiOLvLTQ7iSYsqKp3Hvg4p8vRihHtGYeHQeTiqJsnnab/AHNe4uCrcw6bCD/iK8ZeDFkt7xtpiczANLkjHUA17h01RCiIo2A2rn3vs6tKxExCfentvIE9bHYdTUHcXqQqzMQAoyapXEfHtlFcG2S9hAVeZkBPNVFLih/Hka5Dexdm5qUa+i7EH3rzzeeK9lpu73ykMMKiHLE/Sq9q3jJcxBPws1unq9azcxYjtjHT71aNz/RT6WLPU8d9E2wPel/OXHU4ryvYeOEKFRLKnNnYK/XAyatOm+OejSIvP5j46kN070z5ml6I+j38Tf1mQ7c1KBgehrL+F/EXSNcdUt3YMRncEVebG9WRAwbOatG5SFWeNKBMA0N8daZi6A70jNe8oJ5qZyWClXJkln5oZ+RUD/OIGJXzkDexNGGrQqDmVMjvmq/Ii308yb79a6c4xUB/P7ftKvzR14gtehYfXNTziH08/wCE2DjrXd8bGof+e2hTmV1P3p3ZX8V0nMrD7Gp5JlXVOPbQ4lJO2aQmJCH6UsxUNkHrSNxuh+lEgj7PO38Q+mPNpjOo6SED42qG8Op3n4P01mOSkXlk/wDxOKtX8QUrDSJY0PLynn+9U3wojZODbYMf/wBrkD2BIqkTTcvtRayARSRBztS7Ci8oHamGUQYNXMN8UuwHtRGAo0BI5G3ak5B7UswzRWAowkQION6FHcewoVBBS7dGZ8ft7/FSHH3B8p8Pbq7jkeW7YKyw8uBg5/2pgr+VMHGMqObpXNE4t1XSdQvtI1x5LuxuWxE7kYiB6DNVunKOYN8Px427pnngJHJ/6lWFuylDGXzn4r2ejDylZemMfSvMvBui2+jeOxt7aTzIXtjPERuMMOxr0layM1moA3Zay3NN6jRGLXRjX8SnGF/psdjo2kFgbhGmunVyrBc4C57d896wCG54l1i7NxEzySGMIeQ4HXb5OK9GeKHC9xq920hWPmBGC4zke1J8FcH6fo9jJqGoiIKCWbmXAH/mKW7M/RohFYZDbcAcT6lGqhAmcKZOU5zXZPAri2QNIl2zZO25rfYOK4Z42bRrKL8LCPXd3TeXEnvj3xUNqviJw7Zt5V9xqDOwyIrG0Zw3TGCBTIub/FF+o/kjBr7wb4psG5mkViAcjBqJHA2t28xMtxyf5BeYY9q3W5414Xv5/wANBxdqNtPI3Kn4y28oMdtgSu+P+aYajPqFnKWnuItThPcIFyPhhsaifyo0Uxrm+iveF1vrmk6rFHNczSRY2PNkCvUnDF21xBGfM6oARmsF0lreRUmtsKCckdx/3rcPDqEzWUUrb5ApEXLkT5Cio6WzmKrktmoXX75oYWC9SOvtVrayHKCOvtVM43t3it2bGBvWmzkkc/x5xlIwjxP4j1azmmNndHn7AGsvk8UuK9PUo89y5HUHp+uK0riCJbrUpEYB9+UkAEj5+1Vya20Z5mtoopbyZcgmOMFM1njLPaOyqeSILT/Gu9KsuoiZemJEO4+oqe0/xquYTELlpLizJwZUQc4+o6VMadwxpkqRifhOeUkb8sIwakRwjwkxWG6sRZNzDae2ZB+o2Harcl/BHw4/Y90bxZ0i5ihiZypcD1svpq78N+JNhDeQQzTRKHflUg7Gs/n8KtKEKvpoQkDGY3HKT9Bt3qncTcGaxpUUjQmUrGwcOQWCt2+lWjLsrKmM+mz2TpuoRX1t58T8wHXHanofmBBHUVg38PPE+qM/8r1oSFnT0y8nKpxW6xNkYA7VrjLUcq+n4pYYZ/EWBytbIyglckZ7VVfDiOWPRo19QX5Gxqx+OqPecUXUEYGY7ZM5Pvn/ALU04NtpLbRLeNxnkXrjberRIsi+JJFSRvRSMdqcSAYypz8g7Ulg75q5mEyM0RlNLfWuEUYA3ZT7VzlJ6ilyN96KwFGkMbupHShSrjIoVUCgKrMSG6EY6U907SItUvkjkUFuxIzuSO30zSMYJODvVx8OdPabVHuduW3TnIPferWdIPEclPoh9G4e/lnjFBcoT+GGnFUz23xjf6VtOnQfkDN6Rt9qoWtyxpxragKNrYKSP/kdq0bhsiUq2M7d65nLk8OpOLXbE9U0W3uo+dZVO3Qiss8QOHNa1W4TTrRsW6g55ZcAnbqBW8CGIrvEpz8UxnsbeNzywL6jn0pv+tMcRddvFmCaP4X319e20nEWoy3FnECos42Mafflxnp9+9RPGnhrrVlxPd3nDemRyWstoqQFSG8lwGySDuM7dPavSkVsgAIBT6jFGkiwuzJ8ENg1rpn8aC2SsPI/Dnh/xw4nt+JrddQuHuEMASIMsXTLZI9j074+K0biXgy10uzX+Tj8z5lhlyVc4GcDtW0SjkdmUnmbqQTTSOFWkzhWIIOMVW2zn00Moj8b5JmN8McFPLaPqcP4qAMn/wCO4GzZ9sbVtnAOmtZWkcbdlBwe1O47V2QNKoUewqS0dAoPvSoVpMr5XkuyLJIdftVF8SVkFk4QbGr2MVAcRWq3GzdO1aLI6jF4slGxHmfUeF79rCS+kuVtoWJZ5GJXAz0z81J8DcOXl6ph0ICEKnMbqaP0uf8AFVPXuc/ArXpNHtbm3a0vbRZ4A2eRh6SR02p3pNhaWXMIEZPYZ6fHxWeEPu7O3LyZcMR5z4nhl0281LUNV8QtQ0y3sJDb5iiQszY/NgDHUgYx2ocJcU8Xusf4XVLLizTbonyIrmDy5WjAJ5i2MA5XGDnrW4a94acM61LdzXNsrfjJBJNHJEJELdyAdhnA/So7hXwu0vh/VYbu3llkjtVZba3EYSNATnoPn/etUuGYkYVbY32VjRrqy1GCe90ESadqVvJ/q9MkG3mBQWQc3b1DcY6VadNGn8R6FKUAFxGOS5hK5CuOuc0+1Tw5sdX1dtZaea1vyvIJYXwT7Z9/vTjTeHJtOmL55JscshG3mfJA2zWOdbT01fJGS99kZwXpKWN0vlxgYO2F2H0rS4WKxZ74yPrUJpdiyPzcmDtU5IpWMAjbbNMrWGO+XJpMxHjzSr3XPEbUIrVgitEicxz27/bP71q2gWmk6JokVve/hlihjAeSUDB2361X1kjg1fULkIGkMpRTgZ3x/wBqqvjFB58um2jPzxzqxYuds+kDb6kVDt4mqvxvqGq9wlOLU0ttTM+jvG9rLGCDG2VzvkioMrtT+6i/DW9tZ8oVYIVQKvTpTXpT4S5LTm+TWq5uKYj5eO1FKml6KQOtW0QIMvuKIRSr7miFT1qWATGxxQow6GhVWBRIQWFad4aWvLp15MAeaX0AkdhWaWoIcVtvAMKtoCKAAWBYfJoufQzw/wAtKnrlqV1yC4ZRuSRv9Kv3CcuIhnrVB4unCcY6dpxDCR0G2+O/ervwyCpXP0Nc/O+jpWS14XGJuZetLeTcOuI5BHt15c0ztyfbbNSVo55gPetMNOdZqI99HuHcs2oSuT2KjH7U1m0XUObMVzEPrHVkwBQ2p/FC4+RYiuQ6NeNj8RcjbsiYzUjDp9tbplY/V3JNSew6Cm8/161WaSLO+c2MZzj0jpTnS19DE01lBzuafWC4hqIrsLHkBwfimd1F5n5qe53pNlySad7ExljIo2q56UjPpoJ5ldh9BU15SnG1H5V/Ly7VVRz2O+oaKrNbXsXqRXkA6YbFJJdTqwEtrOPgDNWx4Ebpt96J+Ej6kH9ar8Y1eUs+5EXZh5V5lUr3IIwadvZiRQxw3yadrbxqQR2+TSyj2o4CJW69RHw2vKcDYUnfkIMA796kz9KgNdmWBJZD0VSapJcUWqbsmU/Tbq2u7idFVWZblsk9iDQ4o0uC61KxuJkzHDGTnsN1OP1H7VC6H6ZWuI9vOdpOvcmrLxNOY9Gt4wMPKwXPxg1mgnNncsb8dqaKlqUxnvJJMAcxyBntTbFKFfSCw7UQ9a2xXFYcOyXKTYUiuEUY/FFx71JQTcKDuKKW2wKUkUHtSLBh0qUAUf3UK4QR96FVYFIgYBl5uhIzWueF2qQXWji3lb/UW77bdVzWRpGSB9aneGL6Sw1JZElMYb0sB33FTbDY6iPFs4vC4+INqRxlpl8W54XCKuB+VucDP6GrZw6A5BDAgHGR3qj8QXAvte0kh2EYT/LvzZ/4q86IiwRgKdgdjXPfs6Ui0QMMgVJWuOxqFglAIOKkLaYDvWmDMtsGSdAkAZPSmM90oXIao+/1Ty4SebFMlNJaJhRKT6JG/wBQgtkLM4/Woa11Wa/nfylPkqccxGM1AXiXeoy8ynCqQSCe1WG3dFgVQe3as3yc2bn48aY/1j+3XzG+Kk4UCryimOmFSM53qQHXNa4JJGC1vcOkA03uZOQ7U4HWm1zHzHNXKQzexsmqQrKI3Jz2zUgrB15lOar+t2rfhGlVfUm9Dh/VAyLFKSDjoaS58XjNMqFKHOBYwNqGBRY2Dbg7UemmQ5gUMCu0KkAkhCjNU/jibytMuJQob0nr9Ktt0eWImqLx/OBYRRMpZZpORgPodqTd2jZ4S+/Sv2USRraRRY8yRRsB3OKmeOVWOxsVB3V9x8gb1I6BZRCxhnSALMsQUZycbVX+MblZtS/DRvzrbjBOf7j1qlMeKN3lX83n8K6Tkk9tsfpRSB7UeRcdKSOe5pxzmBRnOa6wFBMYoNmgo0JvsKSJHcUs4yKQkTIoZKEyc0KNy4XNChgykxseUUvE2Dze2Gx9KbxbIM0uo2Jxvj3prj0ZV00PtN1RZNfsobglpI1byl+Dite0vK28YwBkcxxXni0lMHHsLsy/kxys/St/0e4B09D8CubZ1I6letJssMNwnpjPWnayH3qBguF8wd6fPPhSw7CpjPB/HR3d3axxkselQMk73l2Eh333HxRLySSdtyFXvvXbOaK2/wCkyuW6kUiy3WPhFVr/AGWC2t44LUx53I3NZHxTx5rPCfED2V3aLdaezeidDhlHcY+9X+51Nlt2JJXA3xWW8b3UeomSNoCxX8rYqJWLOhviwSk3Psu3CPiRpupxeZbXHMu+fdfqKtlrxdC3S4XBrypa2t3p160tsHQk9EJAb60ueJb6NzzSSHl2IB6VML5odZ4dM2erJeLbRBvcLmlouJrNY/NmnjVe5ZgAP1ryrHxHq93D/pDyY/NIx3HttTe70JuIYCNWvLuZiQdpWC5+gOKbHyJiX/jqfWnq1uKtN1BZLe2nikyCDysD/tRLe25UWSMHasd8MdFt9AihjgJJbrkCtt06eL8KoYjOOlX58/YnyKIeOsr7TJHTbsheVv3qTSRWHWq9IVVueNvtmnNtdnbPWmwnnRzLKd7RNZx3ojy4GxpmbgMOtJtJtsd6cpaJVbHFzMGjJ9hVJ4yRrg2sEaeY6zB2UHGB/wCZq2AHl981UuJgv46KbdWRgSexApU2a/HSix3HfLpWluTIzPy5QEb5/wDqqU7tI7yOcu55mzTvU7+W9uGdjhFOEX2FMsnBq8fRFzTfQm29JMATg0o2aJg53NWFBGGDtRWLd6UNFagqJkmivShApNhQAn1BB7dKFBgO33oUBhRos4GaXTfY4x9KTjAKrSyYDZI7VpMi9lJ120ks+PrS8UFzcMoGD0Axnb71v9heo1gApx/goG4HzWDcfXP4XULOVgqqjA+aRuOnStK4LvfMhjgRpGYIpBc59JzXI8rqWnT8d8oYX2zvNo+cjBNS4u05OTG5HWqyFUsqo+cHrUp5gWHLgk4pMpmmJH69rMenzlWI5SuNxUXo2qvcPyJjmb8oAOTTHiuZbiUoqHGRuT9apM3H8eg3cZnaKGGIAvKI2Y47is0tlLofCOo2MW1xNFylG6eokVB6locs7ExEA53yKjtD8WtGvLYCxu7e45sElnwd/jGRUzDxzYgqGVfUeuOtNdfXodGq5/ogptHZLWVzCqsucEpWbS2MKXrGKGQo7E5YHr3rd7fXNNvoGWRFZHNInQeHZZPxDPjI/KM7UKtr0Mjzr9ox+y0sSL/QT1g7in3kTwpyqgDqdwBWlLo+kWVwTb5KsN80o2madM+UdVJ98UfGy2tdkBocq+TFIfS47irnaaskcaGWQYI/MDTCPR7dUARo9umDTfUY4UiaOOTLDrhc1TuHYqUk/ZPw6zGt8ImnHKVzg1MWl4JmJQggNjY1lrXEZkCvKhbsc7/FWvg28Z7qSNjkYB+porublgqdazS8xOSMmutOFOTnakYmwuTSMj8zFa6KniMPDWPzM5UMD+lUvjGU27yq8h8twCD7VaY2AiYBtsVn/E90LvUGhPMHj25SNqsnyYZx0SUkoCfailjXIjhACMYFdbHan5hkbOZNEalFx3oj1IIIxAohOaO4BFJUEM6aTyTmj0VhgUAJgDcmhQzjNCgllKjAIG1OFUY6dqbwnIx7U7ix0NaDnpsguM7CO50WRzGreT6yCd8DtTrgDUJpWt3IPlCLqSNh2G1L8RQRy6VOroWQxn0g4JrOfD/WodOvri1uEnjeNhyAtnbeud5tba1HR8OX6N9sL7kvPW/p5Cc479qsFlc/iYPUANvaszh4iRp42gYeWFwxI3Oatmh6vbfhWj80Ehebr/3rnb/Tel0NPEBvwNl5sXKWYhVGP7jUrwVwTpOp20EtyqTy8oLhlyAe4waonGnEMlzxBZ2VqF8tp/LPMQc5Gc/bFbjwNGINOhQlGYKASBjO1XrxsZKThDogOIfBrgDU4mM/DtqjN1eImJj91Iqg3XgHwgszrDLq1uM+kxXzYX9TXoVmVo8Yz96i7mFS+Su2a6Mczsnx/Ntj7ZikPgbdWbK+i8Y6xBHj8swEoz+1K3fh94jWwAseLLGQAYJmtyDj963C2vI4kEbE4HvR5Ly1ZSOUHamfHU0O/wCU8je0n/4jzpNwd4tRT5F5ol2M7Eyyp+3SuS8KeKgADrpLbbg3DfttXoAyI5yuFrscQJ7VT4ax7/ys/wDtFHm244Y8XGfltns7chhgrIzjH3qPveEfFixc31/xGkkYOHhhi5cj2O29eqvIXG6j9KaanAj2rrgY+lZ7K4pehEv8h8j/ABR5u06K/R4WvQ6OWHUbnets4JtPKs3uMHllc8oI6KKzzxClMGpQ+SFJMqgnl6b9a1LRriGDRIFZshU7VhhFKRW2baJd+RIvznA3O3QYqPtLtJ7p2A9IGxz1260xutQaWBvJyM7HPemmkzJCChwpY9zWxNMRxaHuv37W0VqIiQXcq5B6bbGqGZ3udeMwZ5EQkMx7kgVYONJ44rM3HmGNUOc9dh1/avNevfxB32i8X6jp8PD1jd6dBJ5aF5GjlPKAM5Bx1z2706pNy6E2ySieinIIzjrSXOAdxWYcGePHBXEEq21/+I0G6lfCLceuLGBj1jpvkbj2rT43jmhS4idWilHNGynII+D3rVxf7MZ0Hm6CinPMaMhI2br70WQjNQCCmk8UpkGiAbGgGFbainpXWordDQQJk0KLkktntQoJZTohinKHGKaqSOlLAnGa0MwDohXXmIDcvYjNYz4z6VPo+rx6vp0I8q4YB8ORyn9a2SAj9aqviHYHUdGnt+RGLIVQvjCnb79qXPtYNrk4soWh8WXjRCC2tuS4VcFyQRirXpWutptxKXnWS5lH9RSC2FA6DsM5/asXtdRvNKvpbaV0TlIQqFGSvwalotUuLmbz1lXkfYYJBGP9+tcq2lxZ1q7VhcuHbrVLziuS7TlkcO7IJcAJnYdPjNekOANSvwI4Lq55xGMEqRjp0ryvwrcSWczyJNGxbchn36/NbRwdfvNnmlKEEMwAI/Ss9mxl0Pj9yPQtndiZRyt0z3pK/vERgpzke3eqxpWqrBDGiqfWNids1IyzTPC0nJ68bYNMjY2inBaOJL1JM85Gfnao24vlimCJJzEnAwai72O8VXkZZCWGM/Wq9Z+f+N8uSQhkPTJzQ5sdGMkaFZXZNyY5G6Yx81NwzIjhGOCemazyze55jKjsWz1NWbTdRYwojYMw682+1Wjc0yJxckWoTLy9R+tMNWmCWruhHMB0qLk1VIGxKep2IqI17WozzRxOS7KeUEVMrnJC4049Mt8S7mVLua5jyxPpIHSprhjivz9IsmNyHHkAMPkdc1VtXdtTLWvOTIbjfb2zTNLcaHbeZO8ccXTDHGxpEI96aZSTWGjT8TLEqvyLJFjflPenFprAaHzQVyQSAr9+1ZVa67p8cTrHdwzqAzBAx9ulNzxtp406HzIZY5JRzRHnUIXHYnt1G1OhrYp9IcePHHl1Z8OXFkjyI7oQz84wwIwU+M56jfavJEk8k8zTSMWd2LEk5zWo+O1o1voui38q38dzfXFw06TsOTYJy8o69z1+KyqIbV0aY4jmX2a8HcGSOmc9a3b+HDxGfTdRThbXLvOn3JxbSSEnyZOy/AO1YRCQMdP1p7bSNFKrBypBBHuD2IrVFasZmUsZ77OVPr/MNj7Vw4Y1n3gnxtDxbwqkE0jfzSwVY5+bfzV3w4+djmr9zb7dMdaztY8G6DoTiu5NFyc5roO1AaFfpSRY4OTtSjtTeRhiglBWbfb70KTJJ3HShUgVZV2zSiA96IHOM8rEH/EZo4JBwxxjtynP3zT20YP2KRkk7HpSNxbrO+HUN8EDf9acw8oXmIwD3zSd1JFb28l3O6w20YzJMy5CD3+Kq2i/ozTxW4HgvtNuNZsU8u4s4wW5hyqUHbI7/wC9Y9ZXmY2RQoYHAGe/x+lTvjH4jScS3b6TpEjQ6TA5AZWKmc7bt+mwqg2dxySZbf2GaRdXqNVFmezRuEka55vxE9uhYnDSDZQO2R7/APFa5wRePA7L+JMoZRgA7j6V5+ttTkgtIre1k/o4BdTjHPnc/atd4S1GxjtGlW9h81EAcpluXOMEnoM7/pXNuR06Zabrw/eSzTRmZwMp+Q7kf9q0Hh54JLVVQg4zmsc4HmRLGWbzfMkwQh5s/v3q9cM6o0SrGN8AEknqaRCzGO6ZoNx5It+SQLjB2qAg03S7jUzdiLkYLg79aR1DWYFiKvzBipxtVY4e1mRtSlhlkXlP5SPamSsWomEGl7L8NLsguIkYE75NMLy2WHnQlUflOMGpG1u1e2VyrYx1qD4i1FYOWXGQWxmryawiKlvZFalIpjRnduZBgjNVDUtY8u5kt5n5mHqiIYDFLa7qRjH4hpDyv1ANVHilrC5had5h58ceQgG+D7fpSeW9IkhdT1lU4gjBlCOz5LZwufmofj7icXc8MbSGJ4Ijzrzelz2Ix9P3qFv3iubtFHOyoQwxu33zUHqNvJPz3E8ZHl3BUMuceXjpua1VwSKSkHOrvMUWELjPrGNz2wP3qx+HvDj8S6iYpuX+U6ZMZGUjd36/fp+9UHR7e+1i8WzsA7eYSpKpnlx3raNNNrw5o0emwTSOIog87MORs/3ZwatZJQ9eytf3vsoX8VF5HqE+k2kAH+kjaRiQAcPgb/8A81iMa4wP3q3eJmu/zfXriVD6WwiDr6R0qqIMdwK1ePqiuRzvJUVL7RZMHADKfgjFLp1HVT7Z/wBqQyxG4Rl+lKRHOOU5/wDadj9q2xwylm4C4m1PhXiC31XTW/qI3rjdiElXurY9xmvYnDWtWfEGh2esWCslvdR84RiCVPQjPwc14ZiYZxv1+4r1l/D0k0fhRpjT+lXnnaInoU5gMj7g1W2CzkXiaMzAURn9qIzD/LPzRHf2NZxoaRsde9JtymuMSeprhoBgPKBsKFJuwxihQVR5E4s8TeJNU1B/5fqM2nWSn+lFAcE/JPU/c7VzQvFjjPTJP6mpfzCI4zHdIHzg+/Ud+9UInPSuDGd61OSZlSxG2w+PMwtwJOFrdpxn1C6YJ1/x69NutULjXxE4k4nDQ3N1+Gs2JP4a39Kffu33NVHm2xjaik5O9U1In9gJA2xXMkbrQOfrXD09qpJaXXRJadOH9C5DY6HvVx0TWbuSOHS2MKQNJhkjUBn2/u98ftk+9UXRpIo9WtWnXmi81RIAcZXO4q8cXaHNw3qMN9CrLbSMTFITkj4/Q1jugjZTN4bHwXxDZx2n+onZm5uWFIozydB3rUdH1BQzk/2YyPbNeTNE4nktbeSOS6k7eUqjYEdjjFaBZ+Iim3tLNLyFZLgf13GSQw9z261zbKZxfRvhZFrs9A61qREUgiHMF2JB+KqOjXwk1nljdjIv5ifms50/jKeKPK3P4hmYksdwffp9qcx8W+VE1wrQhsnLBSDjbf7f81Vpv2aItG9waq8SgGX04wRk7Uy1vVop7ORTKgVBzEntWRzcaRW+miObUEimlflj5lJ2OMHb79arGpcdxRpfSSXLTQqCsKp1c+xz0FTrz0Q+vbLnrXEdss0cTOJFduQkHdVPU4qo67r9rBYsZW5n88xqyHonY/f/AIqn3PFWnXZa4kf8PIkQUBVJHP75z/8AVVTifXkv79ZoEMalAHAbIZh1bHatFNDYmy5R9EjruriVjLb7MTh8nqO2KZW95PNMsSSvmQ45SxxUTaW13fSBkU+XnAJFX/h7R7a0hLsOaVl6n3rU8ijPDlNkvwe9rw+JfIDCRhmSTOQT3Az7f81Gcb8RGOxlVBjn79C2fc9TSequtnE/K2CFywB6Cs64h1NtRvMr6YlGAM9aXGv5J6NutjXDBlLI00zSNuxroDAZ8sGiIB7mlcEAcr7/ADXSikujjyesC8hbYsje1KAbgOhYe4O9EXm/vXPyKPGAPyN03waul0QLIwRS35lHv1FXzgXxn4u4Z0630qEWV9ptuhSK3mgUcoJJ/MoB6k9+9Zpd3HP6FXGRvXIGI3xn4qOSfRKPVvh94zaRxJqMel6rp40i5k2SUS80Rb2OdxmtMhmhmkZIZoJXA3EUofB+orwnBK2QwJUg9R1qR0zV9S0q6jurC8ngkVuYFZCMH3x3qrr30W5ntwsD8dtxvnvXGIx1rHvD7xmsL1ILDigta3RwguwP6bn3YDpn4rWI7hZ4VmhdJIm6OhyD9KXKMo+y6lp1zjOaFEY5wScg0Kqw08HDFd270358bAfvQMh+lO1GfBxgdjXeWmwm9xSscoPQ/Y0amRjDHOaIdzuKU2b4orDFQShM5G46joa9L29tDxR4f6fJyxzNc2iOedR6WXKnH6H9a80V6C8BtRF5wH+FLGSWwuWjKZHpV91O2/XmrL5SyKkbfFa3GUfWuDLpD5ttyhs8vlkY3qq6hYapp1yyXFvIhHxtXofXtPWQF1653GO/vVd1Xh9dRTlk5uYD3patTXZpdX8MZh1m8gjjhSQxohJwPen78VXDwCIjmAOd6tOpcHJzFQoXGxJAqNk4TCZ5FSQgf3HAqfsf6KZYvRXr/iC7vJg7S45CGQDoCKjZLm6ndiWYknJwMVZjoccSlXZfMzuAuw+9HTR0UbEjPcDpUrivSKvnJ9sqyW1xKeTl+dzUlp2l88yNL6lzuCelTMWkvz4jhaQ/5E4Aqf07h5IgDK6yPsSAuy0StwvCl6G0ayQRbRtyqdsLT+d1jVjkAAHbPelZpYraHBfy4V6s3TpWd8WcTC7RrHTyfLP/AFZWG5+B8UlcrHiNFlkaY/7G3FWtteXTwwH0D0uwPWoFVJ7dK4i52pZENdCutQWI5Nljm9Zxcj+2unl9iKPy47mu9em9NwWgqc2dmz8UW5mCJkfmzXJJVRcnb4pjK5kkLHO9DkCOqSzZJ6mncK4OabRr3pyhLCqoBYN5cgI6GnBwykZ+lNOUkb/anCEAA5pieALRufLwTuOo9qvHhh4j6nwpdCzu5ZLjS3OZITuV+VJ6fSqA0hU8y9TSonZhlsH7USly6YJnsXhriDSOIrP8Vo92J0BwyEYdPqD9/wBKFeTdJ1/VtJu0vdOvZbeaPB9J2bHY+9Ckyqa9F1JFPOa5vShG9cC1LQsJg1zOKWK+nNJEVAB45SNm3FL529xTXBo8TkHB6UAKMMfTNaT/AA962dO4vfTH3h1CPlxj+9ckH9yPvWbkbEjvTjSrt9P1S1vo25WglV8/eq2Q5xwZVPjLT1/f2weETR9cd1x/52qNljUsSy4JHtUrYSJeaXDf2YR45YkdCg2ZSowcGkZ7Zslm6EVylp1Yy6K7e2lsVJYqSelQN3Z8zHk5D9hVmvLfchj0qLkREJ6fWr8mkW46VmbSYicurZ+pptJY8zFVxgVOajcwQjmZsAZy3XHziqRxDxjYWrNHak3M4OMKcKPnNWi5y/FC5cIe2WKKGCCRQ5XbuaT1TWLOwt2kmmWNOylvUfcgf+dazmXjTWpGPK8Cg9AIwcfrULdXk93OZrl/Mcnqe1MXjt/k+hcvLUVkSX4i4lvtYZoIwILQH0r3Pyah4oFA9RJx80m0qAbt9MUPOVj6Aem+a21xjD0c+U3N6xyoRepFBpFXcbimTSYFEaXIprkUwePMuduh96RluQjYXc01eQnvROtU0kO7tI3M1GRSTRUWnEa0IgMi8vUZFLxgAe1JMQNqLkg7GraSLuwxgUQOQcZogBJ2pTyydx1oIDrlutdAKtk9DXFZkHqXp7Uqrg9MVZAw6nJGKFFZWyWjyCN8ZoVeLZG9EWcUYCi4yaUHSkkCb/FEbrR+pzRG3JqMBHSPSDRCN6VfHLiiADrRhcPE3pIPSuuv9uevSiJswzSyrzFVz1O2an9EHpD+Gbipb/h5tAu+Uz2LnkZiMtGe32wf1rWL/SfNXMIypHMB9a8b+HmvNw5xVa6h6vLJ5JOU9jtXs3hXUU1LTo5C3RQAcfmXs21c62PGf+mb6p6ioanp8itIGJRgpyT0Hz81nfGes2ug2hlu5ySdokx6pW9sdh8/Stg8TeIdH4P4ak1rWI1kXPl20GP6l1J2Uf4jbJboBnuRXjfjHiLUeK9fuda1Ly1lnbKxRDEcS9lUewG3v7miqjm9/RNnkOKxDjiLi3UNVlYRf6aAjlCKdyO+TVd5z70Dt0rlbYxUfRilJyfZ3mb/ACrmfk1zeh9asVO5WjCQAbUnQ7UAdZuaik7UO1CgAAZo4FcUGlEG9GAKRrtvtRuldHSuYztVsIO7mjhcjBoi+k4NKAg1ZEoA5l6LmjCT3BFKKRjbeunkx6t6MA6g5hjtQ8oA8ysMe2aIGwuwxSYYKSanMAc846Y+9CkDKAOtChSIxDRN2zRzRUAAo1VKBG6UmOuKUkoi/mFQwR1xlsCi9NqUAoh61KJXsCjbNKZyAaJ2o6jaqlsOnfcbZ6fWvSP8PPFy3nD38svLgQvZLgzsdhHncH3+K82jqR8E/pT3Sb+5slufw8rx86crcrYyDVLalYsG12cC3+OHG83GfF0hjdxptizQ2qs2ebBwXP1wOlUGNoxKplUsmfUqnBIrr7Er7d/eks71dRUViKSk5PRS48ppnMMZjjJ9Ks2SBSZWu8xxXKhlThFAjbFdoUEhSNsCgRtRqGKCAhoKpNHAGaUUYqUg0KBgUdVOM0BSi9KlIAmSDg0cVxqAO1SAqilsAb0cogwAM0mpPLXQcip0gMQo3Gx+tcVx070GHKu1Ilt9qhkijSY2zSbNkUmWJO9KIuc0eyAo5j2oUvF+bGKFWUQ/R//ZDQotLS0tLS1XZWJLaXRGb3JtQm91bmRhcnl0emY4V1J6NGtzdFdEWUhFLS0=
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
	<title>Bookmark</title>
	<link rel="stylesheet" href="http://tiddlyspace.com/bags/benspa_public/tiddlers/bootvelcro.css">
	<style>
		html,
		body {
			overflow: hidden;
			background-color: transparent;
		}

		#container {
			/* prevent a fouc if no images present */
			display: none;
		}

		.modal-header {
			border-bottom: none;
			padding: 5px 0 0;
			position: absolute;
			width: 100%;
			background-color: #e0e0e0;
			-webkit-border-radius: 6px 6px 0 0;
			-moz-border-radius: 6px 6px 0 0;
			border-radius: 6px 6px 0 0;
			cursor: move;
			overflow: hidden;
		}

		.form-actions {
			position: absolute;
			bottom: 0;
			box-sizing: border-box;
			-moz-box-sizing: border-box;
			width: 100%;
			margin: 0;
			border-radius: 0 0 6px 6px;
			background-color: #e0e0e0;
			border-top: 1px solid gray;
		}

		.form-actions input.btn {
			width: auto;
			float: right;
			margin: 0 0.2em;
		}

		.closeBtn {
			background-color: #DCE7F1 !important;
		}

		.primary {
			background-color: #09F !important;
		}

		h1 {
			margin-bottom: 9px;
			margin-top: 9px;
		}

		body {
			width: 100%;
			height: 100%;
			position: absolute;
		}

		.modal {
			margin: 10px;
			top: 0;
			left: 0;
			bottom: 0;
			width: 510px;
			position: absolute;
			box-shadow: #444 0px 0px 10px 2px;
			border-radius: 6px;
			background-color: white;
			border: 1px solid gray;
			background-color: #F0F4F8;
		}

		label em {
			cursor: pointer;
		}

		.modal-body {
			overflow: auto;
			position: absolute;
			top: 0;
			bottom: 0;
			left: 0;
			right: 0;
			margin: 65px 20px 67px;
			background-color: transparent;
			display: none;
		}

		.nav-tabs {
			padding-left: 1%;
			margin: 0;
			width: 99%;
			border-color: gray;
		}

		.nav-tabs > li {
			cursor: pointer;
		}

		.nav-tabs > li > a {
			line-height: 2.4em;
			font-weight: bold;
			font-size: 100%;
		}

		.nav-tabs > li.active > a{
			background-color: #F0F4F8;
			border-color: gray;
			border-bottom-color: #F0F4F8;
		}

		.modal-body.active {
			display: block;
		}

		input,
		textarea,
		select,
		.uneditable-input {
			color: #606060;
		}

		.imagePicker {
			-moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
			-webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
			box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
			border: 1px solid #CCC;
			height: 110px;
			overflow: auto;
			-webkit-border-radius: 3px;
			-moz-border-radius: 3px;
			border-radius: 3px;
			margin-left: 0;
		}

		.imagePicker img {
			margin: 5px;
			border: 2px solid transparent;
		}

		.imagePicker .current {
			border: 2px dotted #555;
		}

		label {
			font-weight: bold;
		}

		.form-actions label {
			float: left;
			margin-top: 0.75em;
		}

		fieldset input,
		fieldset textarea {
			width: 90%;
			border-color: gray;
		}

		@media all and (max-width: 550px) {
			.modal {
				width: 95%;
			}
		}
	</style>
</head>
<body>
	<div id="container">
		<form action="#" class="modal">
			<div class="modal-header">
				<ul class="nav nav-tabs" data-tabs="tabs">
					<li data-tab-name="post"><a href="#postForm">Post</a></li>
					<li class="active" data-tab-name="link"><a href="#linkForm">Link</a></li>
					<li data-tab-name="quote"><a href="#quoteForm">Quote</a></li>
					<li data-tab-name="image"><a href="#imageForm">Image</a></li>
				</ul>
			</div>


			<fieldset id="postForm" class="modal-body">
				<label>Title
					<input type="text" name="title">
				</label>
				<input type="hidden" name="url">
				<label>Post
					<textarea name="text" rows="8"></textarea>
				</label>
				<label>Tags
					<input type="text" name="tags" value="post">
				</label>
			</fieldset>


			<fieldset id="linkForm" class="modal-body active">
				<label>Title
					<input type="text" name="title">
				</label>
				<label>URL
					<input type="text" class="span8" name="url">
				</label>
				<label>Description
					<textarea name="text" rows="5"></textarea>
				</label>
				<label>Tags
					<input type="text" name="tags" value="bookmark">
				</label>
			</fieldset>



			<fieldset id="quoteForm" class="modal-body">
				<input type="hidden" name="title">
				<input type="hidden" name="url">
				<label>Quote
					<textarea name="quote" rows="5"></textarea>
				</label>
				<label>Note
					<textarea name="text" rows="4"></textarea>
				</label>
				<label>Tags
					<input type="text" name="tags" value="bookmark">
				</label>
			</fieldset>


			<fieldset id="imageForm" class="modal-body">
				<input type="hidden" name="title">
				<input type="hidden" name="url">
				<label>Image
					<input type="hidden" name="image">
					<div class="imagePicker"></div>
				</label>
				<label>Notes
					<textarea name="text" rows="4"></textarea>
				</label>
				<label>Tags
					<input type="text" name="tags" value="bookmark image">
				</label>
			</fieldset>


			<div class="form-actions">
				<label class='checkbox'>
					<input type="checkbox" name="private" val="private">
					keep private
				</label>
				<input type="submit" class="btn primary btn-large" value="Done">
				<input type="button" class="btn btn-large closeBtn" value="Cancel">
			</div>
		</form>
	</div>

	<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
	<script type="text/javascript" src="http://tiddlyspace.com/bags/tiddlyspace/tiddlers/chrjs"></script>
	<script type="text/javascript" src="bookmarker.js"></script>
</body>
</html>
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
!Background
With respect to my recent work, redesigning and extending Saq's PopupMacro, I am at a point where I think it makes sense to ask for your feedback as to how best implement further changes or whether or not the implementation ideas as described below make sense to you.

First of all, you can see a somewhat inflexible version at work in this space's MainMenu or a highly flexible one as posted [[here|http://dl.dropbox.com/u/2040050/group/2010.10.06%20popup%20saverio.html]].
!Templates and parameters
The first idea for extension is that -- other than displaying content -- popups most often provide menu's in the form of lists. Consider a MainMenu with a number of buttons each of which are to display a popup. Currently you would have to wrap every menu item with a popup macro call like so...
{{{
<<popup buttonName tiddlerForPopupContents>>
}}}
This could in gereral be much improved if instead of a fixed contentTiddler, one could pass parameters to a template like so:
{{{
<<popup buttonName templateForPopupContents tiddler:SomeTiddler params:"%title% %modified%">>
}}}
This way, one could pass the {{{title}}} and {{{modified date}}} of {{{SomeTiddler}}} to {{{templateForPopupContents}}} and use the same template for a number of popups. I would want to implement it such that if no {{{tiddler}}} were defined the {{{buttonName}}} is being used as the tiddler from which to get the values, e.g. button is called 'Blog' and we want to pass the title of the corresponding tiddler, thus 'Blog', to the template for the popup... which might contain something like a list macro call or simply {{{<<tagging $1>>}}}.
!Using one macro call for a number of popups
As Mans suggests [[here|http://groups.google.com/group/tiddlywiki/msg/2d064c670e7971a3]] it might be good if one could wrap the whole menu in one popup call, using a recursive template to generate the contents for each popup.

For example, you might have 5 main items in your mainmenu and you want to wrap them in one popup macro call and have the popups rendered depending on those buttons and their corresponding tiddlers. Here's how I would do it...
{{{
<<popup
    template:'myMenuTemplate'
    params:'%title% %modified%'
    class:'menubutton'
    prefix:'»'
    menu:'\
        item1Name;item1Tiddler;item1CustomTemplate;item1CustomClass;item1CustomPrefix ++\
        item2Name ++\
        item3Name;item3Tiddler;item3CustomTemplate  ++\
        item4Name;;;item4CustomClass;item4CustomPrefix \
'>>
}}}
First of all, don't be confused by the backslashes at the end of some lines. They are simply part of the javascript language that allow you to continue strings or statements on the next line. Essentially, items are separated by {{{++}}} and item options via semi-colon.

Here's the meaning of those parameters as I see them:
| !Parameter | !Meaning |
|{{{template}}}|the template to be used for the popup contents of each popup|
|{{{params}}}|the corresponding tiddler macro params that one wishes to pass to the template|
|{{{class}}}|a css class suffix applied to the button and popup<br>- thus {{{MyClass}}} would result in {{{btnMyClass}}} and {{{popMyClass}}}|
|{{{prefix}}}|a prefix to prepend to each menu button<br>- wrapped in a container with a classname of {{{prefix}}}<br>- could be a jQuery statement<br>- e.g. $({{{'<img src="someimg.png" alt=""/>'}}}).appendTo(button)<br>|
|{{{menu}}}|the menu buttons|

As for each menu button / popup one could define...
| !Option | !Description | !Required | !Default value |
|itemName|the name for the button| oh yes | / |
|itemTiddler|the tiddler from which to fetch parameters| no |{{{itemName}}}|
|itemCustomTemplate|the template to be used for the rendered popup of this item<br>- a mere dash ({{{-}}}) would indicate that this is to be rendered as a simple tiddlyLink wirthout opening any popup| no |{{{template}}}|
|itemCustomClass|the class assigned to the button<br>- by default overwrites {{{class}}} from above<br>- using a prefix like {{{+className}}} it would add the class rather than substituted.it| no |{{{class}}}|
|itemCustomPrefix|the prefix used for a button| no |{{{prefix}}}|
Note that, whenever any of the options is not defined the default is being used.
!Using a template tiddler
Instead of adding too much complexity to a macro call, the following syntax might be a lot better...
{{{<<popup config:MainMenuConfig>>}}}
...in combination with a config tiddler like so.

tiddler: ''~MainMenuConfig''
{{{
!OPTIONS
template:MainMenuConfig##TEMPLATE
params:%title%
class:menubutton
prefix:»
!ITEMS
item1Name;item1Tiddler;item1CustomTemplate;item1CustomClass;item1CustomPrefix
item2Name
item3Name;item3Tiddler;item3CustomTemplate
item4Name;;;item4CustomClass;item4CustomPrefix
!TEMPLATE
<<tagging $1>>
!END
}}}
/***
|''Name''|CodePlugin|
|''Author''|[[Tobias Beer|http://tobibeer.tiddlyspace.com]]|
|''Description''|shows or runs a (commented) code block|
|''Documentation''|http://tobibeer.tiddlyspace.com/#Code|
|''Version''|0.3.1 (2013-09-09)|
|''~CoreVersion''|2.5.2|
|''License''|Creative Commons 3.0|
|''Source''|https://raw.github.com/tobibeer/TiddlyWikiPlugins/master/plugins/CodePlugin.min.js|
***/
// /%
config.macros.code={lingo:{err:"No Code!",errDetails:"No contents found at '%0'!"},at:"##Code",show:"<html><pre>\n%0\n</pre></html>",handler:function(e,t,n,r,i,s){var o,u=story.findContainingTiddler(e),a=i.parseParams("anon",null,true),f=getParam(a,"run",""),l=getParam(a,"at","");o=f?f:l?l:(u?u.getAttribute("tiddler"):"")+this.at;f=f||n.contains("run");code=store.getTiddlerText(o);if(!code){createTiddlyError(e,this.lingo.err,this.lingo.errDetails.format([o]))}else{code=code.replace(/^(\*\*\*\/)|^(\%\/)/,"");if(code.substr(0,3)=="{{{"&&code.substr(code.length-3)=="}}}")code=code.substr(3,code.length-6);code=jQuery.trim(code);if(f){wikify(code,e)}else{wikify(this.show.format([code.htmlEncode()]),e)}}}}
//%/
URL: https://plus.google.com/109308865556494599029/posts/HmSBWkoBX4R
Video: http://www.youtube.com/watch?v=jduxruwB5K4
!2010-10-14
in reply to ''@jermolene'' and ''@pmario'':
Good to know that these things are part of TiddlyWeb and even somewhat present in TiddlyHoster ...only just not yet available, well exposed or accessible in TiddlySpace.
!2010-10-14
!A (sligthly modified version of) the original post
[[As dicussed here...|http://groups.google.com/group/tiddlywikidev/browse_frm/thread/519c4d4c8e64a291#]]

If possible at all, I believe it were highly beneficial if there were a distinction between:
{{{public/private}}} vs. {{{read/write}}}

Actually, all four of possible combinations might yield in some form of new tiddler...

| !Access | !Priviledges / Tiddler Creation |
|{{{public & read}}}|basic access, allows you to create a "note tiddler" in (one of) your space(s) named likewise |
|{{{public & write}}}|same as above only that you can create a "note tiddler" or "talk tiddler" in your own space tagged {{{@source}}} with an ability to notify the space owner / members|
|{{{private & read}}}|a new {{{protected}}} mode that allowed an "owner" to show private space contents to other members, yet not for those members to be provided with write priviledges + the notification ability from {{{public & write}}}|
|{{{private & write}}}|a "core member" to a space ...someone an "owner" has given the highest of priviledges, which is to publish and otherwise manage space contents|

There might even be a further {{{protected}}} priviledge, distinguishing {{{admins}}} from {{{editors}}} ...meaning: those that design and develop a space from those that maintain and provide its contents, thus

{{{public/protected/private}}} & {{{read/write}}}

I would certainly understand if this overly stretched TiddlyWeb's current design tenets.

!On notifications
At one point "having a look at all spaces" to gather a collection of relevant tiddlers might just not be a viable option. So, some kind of a notification queue should eventually be part of TiddlyWeb / TiddlySpace ...in the case it isn't already. Such noticifations would be interesting with respect to TiddlySpace users but also with respect to individual spaces. 

On the other hand someone else recently asked for a more fundamental separation of the idea of a user from that of a space. One reason might be to not require of all users that are granted (read) access to (private) contents of some space to necessarily have a space that goes by their name.
For getting started on TiddlySpace have a look at the @GettingStarted space.
/***
|Name|ListFiltrPlugin|
|Description|Allows to easily filter simple and complex lists|
|Documentation|http://listfiltr.tiddlyspace.com|
|Author|[[Tobias Beer|http://tobibeer.tiddlyspace.com]]|
|Version|1.7.4 (2013-11-07)|
|~CoreVersion|2.6.5|
|License|Creative Commons 3.0|
|Source|https://raw.github.com/tobibeer/TiddlyWikiPlugins/master/plugins/ListFiltrPlugin.min.js|
***/
// /%
function placeholderIsSupported(){var e=document.createElement("input");return"placeholder"in e}(function(e){var t=config.macros.listfiltr={InputPlaceholder:"filter list",InputLabel:"Filter list:",InputTooltip:"enter a search term to filter the list",defaultPreserve:".st-bullet, .annotation",wait:500,minInput:2,or:" ",h:"h1,h2,h3,h4,h5,h6",index:"li,dd,dt,td,th,div",remove:"lf-h lf-hide lf-found lf-keep lf-section",ignore:".lf-found,br,.pseudo-ol-li,.linkified",keepOuter:"b,em,strong,blockquote",keep:[".lf-keep.lf-h",".lf-found.lf-h",".lf-found .lf-h:not(%0)",".lf-section.lf-h",".lf-section .lf-h","thead:not(.lf-h) .lf-h","tr.lf-keep td.lf-h","tr.lf-keep th.lf-h","tr.lf-keep td > .lf-h","tr.lf-keep th > .lf-h","dt.lf-keep .lf-h","dd.lf-keep .lf-h"].join(","),dontKeepInsideFound:["tr.lf-h","div.lf-found li.lf-h:not(div.lf-found li.lf-found li.lf-h)","td.lf-found tr.lf-h","td.lf-found li.lf-h","td.lf-found dt.lf-h","td.lf-found dd.lf-h",".sliderPanel.lf-found li.lf-h",".sliderPanel.lf-found ul.lf-h"].join(","),showOnFilter:[".sliderPanel"].join(","),hideOnEmpty:[".sliderPanel"].join(","),timer:0,handler:function(n,r,i,s,o,u){var a,f,l,c,h=[],p,d=o.parseParams("anon",null,true),v=getParam(d,"appendTo",this.appendTo),m=getParam(d,"preserve",this.defaultPreserve);if(v){c=e(n).closest(".tiddler");n=e(v,c).first()[0]||n}c=e(n).children().last();while(c.is("br"))c=c.prev();if(c.is("span, div"))c=c.contents();c.wrapAll('<div class="lf-list"/>');c=c.closest(".lf-list");if(e.fn.outline)e("ol:not(ol li > ol)",c).outline();t.finalKeep=t.keep;t.keepOuter.split(",").map(function(e){h.push("> "+e);t.finalKeep+=", > "+e+".lf-preserve.lf-h"});e(m+(h.length?","+h.join(","):""),c).addClass("lf-preserve");t.textToParagraph(c);f=e("<div class=lf-search/>").insertBefore(c);p=placeholderIsSupported()?t.InputPlaceholder:"";if(!p){e("<span class=lf-label/>").html(t.InputLabel).appendTo(f)}a=e('<input type="search"/>').attr({title:t.InputTooltip,placeholder:p}).appendTo(f);a.bind("keyup search",function(){var n=e(this);clearTimeout(t.timer);t.timer=setTimeout(function(){t.filter(n);return true},t.wait)})},filter:function(n){var r,i,s,o,u,a=t.index+",span,"+t.h,f=n.val(),l=n.closest(".lf-search").next(),c=n.closest(".st-tree"),h=config.macros.simpletree;if(f.length>t.minInput){l.addClass("lf-filtered");if(h&&c.length&&!c.is(".st-all")){h.toggleAll(c);c.addClass("lf-tree")}}else{l.removeClass("lf-filtered");if(h&&c.length&&c.is(".st-all.lf-tree")){h.toggleAll(c)}c.removeClass("lf-tree")}e("*",l).removeClass(t.remove);e(".highlight",l).each(function(){var t=e(this),n=t.parent();if(t.is("pre, code")){t.removeClass("highlight")}else{t.contents().unwrap();n[0].normalize()}});if(f.length<t.minInput){e(t.hideOnEmpty,l).hide()}else{e(t.showOnFilter,l).show();t.highlight(e.trim(f.toLowerCase()),l);e(a,l).not(t.ignore).each(function(){var n=1,r,o,u,a,f,l,c,h,p,d,v=e(this);i=v.is(".highlight");if(!i)i=v.is("li, dt, dd")?t.checkLi(v):e(".highlight",v).length;if(i){t.mark(v,true);d=v.parentsUntil(".lf-list").last();if(d.is(t.keepOuter)){t.mark(d,true);s=t.keepHeading(d,true)}d=v.closest(t.h);if(d.length)d.nextUntil(t.h).addClass("lf-keep lf-section");else t.keepHeading(v);d=v.closest("dt");if(d.length){t.mark(d);t.mark(d.nextUntil("dt","dd"))}d=v.closest("dd");if(d.length){t.mark(d.prevAll("dt:first"))}d=v.closest("td, th");if(d.length){h=t.mark(v.closest("table"));u=d.is("th")&&!d.prev().length;p=d.closest("tr");t.mark(p,u);a=t.maxCols(h);r=t.numCols(p);if(r<a){l=p.prev("tr");do{t.mark(l,u);l=t.numCols(l)<=r?l.prev("tr"):0}while(l.length)}f=p.next("tr");while(f.length){if(r==a&&t.numCols(f)<r||r<a&&t.numCols(f)<=r){t.mark(f,u);f=f.next("tr")}else{f=0}}if(d.closest("thead").length){v.prevAll().each(function(){o=e(this).attr("colspan");n+=o?parseInt(o):1});h.find("tbody tr").each(function(){var r=0;e("td, th",this).each(function(){var i=e(this);o=i.attr("colspan");r+=o?parseInt(o):1;if(r>=n){t.mark(i,true);t.mark(i.closest("tr"));return false}})})}}if(v.is(".listTitle")&&v.parent().hasClass("timeline"))t.mark(e("> li",v.parent()));t.mark(v.closest("li").parent().find("> .listTitle"))}else{v.addClass("lf-h");if(v.is("td, th")&&v.closest("tbody").length){v.closest("tr").not(".lf-found, .lf-keep").addClass("lf-h")}}});e(".highlight",l).parentsUntil(l).removeClass("lf-h");e("ol, ul, dl, table, .lf-preserve",l).each(function(){var n=e(this);if(e(".highlight",n).length)t.mark(n);else n.addClass("lf-h")});e(t.h,l).not(".lf-found").each(function(){var n=e(this),r=true,i=n.nextUntil(t.h);i.each(function(){el=e(this);if(el.is(".lf-keep, .lf-found, .lf-section")){r=false;return r}});if(r)i.removeClass("lf-keep lf-preserve").addClass("lf-h")});e(t.finalKeep.format(t.dontKeepInsideFound),l).removeClass("lf-h");e(".lf-h:not(.lf-preserve .lf-h)",l).addClass("lf-hide")}return true},highlight:function(n,r){e("*",r).highlight(n);e(".externalLink, .tiddlyLink",r).each(function(){var r=e(this),i=(r.attr("tiddlyLink")||r.attr("href")).replace(/\/\/\:/mg,"_").toLowerCase();n.split(t.or).map(function(t){if(t&&i.indexOf(t)>-1&&!e(".highlight",r).length){r.contents().wrap('<span class="highlight"/>')}})})},keepHeading:function(e,n){n=n?e:e.parentsUntil(".lf-list").last();h=n.prev();if(!h.is(t.h))h=n.prevUntil(t.h).last().prev();if(h.is(t.h)){t.mark(h)}},mark:function(e,n){e.not(t.ignore).removeClass("lf-keep lf-h").not(".highlight").addClass(n?"lf-found":"lf-keep");return e},textToParagraph:function(n){n.find(":not(iframe)").addBack().contents().filter(functi