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
/*{{{*/
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]];}

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

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

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

#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 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}

.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:0em 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 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

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

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

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 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 0em;}
.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 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 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 0em 14em;}

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

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

.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:0em 0.25em; padding:0em 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:0px 3px 0px 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 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

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

.sparkline {line-height:1em;}
.sparktick {outline:0;}

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

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 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 use a logographic writing system and 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;}

.htmlarea .toolbarHA table {border:1px solid ButtonFace; margin:0em 0em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none ! important;}
#displayArea {margin: 1em 1em 0em 1em;}
/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
noscript {display:none;}
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></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>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler'></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'></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>>
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
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Working with browsers"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: nowrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"format":"Plugin","category":"Scientific and mathematical notation","description":"This is an adaptation of Jeremy Ruston's TiddlyWiki (version 2.0.2) that is suitable for writing scientific notes (e.g. research notes, lecture notes, projects, homework, ...). TiddlyWiki is an amazing JavaScript program that lets you read, edit, save and share infomation conveniently in a single html file using a familiar browser even without an internet connection. ASciencePad extends this by integrating a what-you-see-is-what-you-get editor where one can easily type mathematical formulas (displayed with MathML) and produce 2D cartesian, parametric and polar graphs (displayed with SVG). The HTMLArea editor was originally developed by www.interactivetools.com, now maintained by Mihai Bazon at www.dynarch.com, and the plugins that provide the math extensions were developed by Peter Jipsen and David Lippman. See AsciiMath and AsciiSvg for a brief description of the additional scripts that enable the display and WYSIWYG editing of math formulas and graphs.","twversion":"2.0.2","link":"http://math.chapman.edu/~jipsen/asciencepad/asciencepad.html","author":"Peter Jipsen"}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Plugin","category":"Formatting and viewing text","description":"This is an adaptation of Jeremy Ruston's TiddlyWiki (version 2.0.2) that is suitable for writing scientific notes (e.g. research notes, lecture notes, projects, homework, ...). TiddlyWiki is an amazing JavaScript program that lets you read, edit, save and share infomation conveniently in a single html file using a familiar browser even without an internet connection. ASciencePad extends this by integrating a what-you-see-is-what-you-get editor where one can easily type mathematical formulas (displayed with MathML) and produce 2D cartesian, parametric and polar graphs (displayed with SVG). The HTMLArea editor was originally developed by www.interactivetools.com, now maintained by Mihai Bazon at www.dynarch.com, and the plugins that provide the math extensions were developed by Peter Jipsen and David Lippman. See AsciiMath and AsciiSvg for a brief description of the additional scripts that enable the display and WYSIWYG editing of math formulas and graphs.","twversion":"2.0.2","link":"http://math.chapman.edu/~jipsen/asciencepad/asciencepad.html","author":"Peter Jipsen"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Ocat","link":"http://oldcat.googlegroups.com/web/AccordionEffect.html","format":"Plugin","description":"This is the new version of AccordionEffect. I use a small CSS tweak plus a plugin written by BramChen to perform this more interesting AccordionEffect. The sliders expand one at a time. Every time you click a different slider bar, the last expanded one will collapse first, then the new one expands.","category":"Menus and sliders","twversion":"--"}</data>
!!!Add your option in the right order

<option>Daniel Baird
<option>Dawn Ahukanna
<option>Doug Compton
@@color:#c06;<option>Duh! Your Option@@
<option>Eric Shulman (~TiddlyTools)
<<options>>
<<option chkSortTags>> Sort byTags
<<option chkHoldSearches>> Hold search results
<<option chkSearchTitles>> Search in tiddler titles
<<option chkSearchText>> Search in tiddler text
<<option chkSearchTags>> Search in tiddler tags
<<option chkSearchFields>> Search in tiddler data fields
<<option chkSearchShadows>> Search in shadow tiddlers
<<option chkSearchTitlesFirst>> Search results show title matches first
<<option chkSearchList>> Search results show list of matching tiddlers
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Aids for website visitors"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: nowrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Formatting and viewing text","description":"Define macros for abbreviations and other \"aliases\", and then embed them in the rest of your tiddler content to quickly insert common terms, phrases and links without a lot of repetitive typing."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Clint Checketts","format":"Macro","twversion":"--","category":"Searching and indexing tiddlers","description":"Shows all tags except those you specify in the macro.","link":"http://tiddlystyles.com"}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Other","description":"Alternating colors for the items in tabbed lists in the right hand sidebar.","category":"Colors","twversion":"--","author":"Joeraii","link":"http://www.cs.utexas.edu/~joeraii/siglet/"}</data>
<<formTiddler NewPluginTemplateInput>><data>{"author":"Saq Imtiaz (Lewcid)","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","twversion":"2.0","category":"Popups","description":"Inline annotations for tiddler text."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"George Brackett","link":"http://luceatlux.net/macros/answer","format":"Macro","twversion":"1.2","category":"Aids for website visitors","description":"Displays answers and feedback for online questions."}</data>
*[[Colors]]
*[[Themes]]
*[[Toggling page elements]]
*[[Other style changes]]
*[[Formatting and viewing text]]
*[[Icons, smileys]]
<<formTiddler NewPluginTemplate>><data>{"author":"Jack Parke (Jack's)","link":"http://jackparke.googlepages.com/jtw.html","format":"Plugin","twversion":"--","description":"The archive plugin allows you to store tiddler text outside of the tiddlywiki file. Typically you would tag bulky tiddlers or those with infrequently needed content as \"Archive\" and these would then be archived as separate html files in the sub folder called \"archive\".","category":"Saving and reviewing changes"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Bram Chen (~PrinceTW)","link":"http://ptw.sourceforge.net/ptwe.html#Plugins","format":"Plugin","category":"Time and calendars","description":"Timeline archived monthly.","twversion":"2.0.11"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","category":"Aids for website visitors","twversion":"2.1","description":"Store binary files as base64-encoded tiddlers with fallback links for separate local and/or remote file storage. Store or link binary files (such as jpg, gif, pdf or even mp3) within your TiddlyWiki document and then use them as images or links from within your tiddler content. Binary file content can be stored in three different locations:<br>1. embedded in the attachment tiddler (encoded as base64)<br>2. on your filesystem (a 'local link' path/filename)<br>3. on a web server (a 'remote link' URL)<br>The plugin creates an \"attachment tiddler\" for each file you attach. Regardless of where you store the binary content, your document can refer to the attachment tiddler rather than using a direct file or URL reference in your embedded image or external links, so that changing document locations will not require updating numerous tiddlers or copying files from one system to another."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Conal Elliott","link":"http://journal.conal.net/#%5B%5Bsite%20map%5D%5D","format":"Plugin","twversion":"--","category":"Images and presentations","description":"An audio player."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Auto-corrects a list of mistyped or misspelled words. The list of words can be in any tiddler tagged with autoCorrectWords.","twversion":"2.x","category":"Formatting and viewing text","format":"Plugin","author":"Simon Baird (~MonkeyPirate)","link":"http://mptw2.tiddlyspot.com/#Plugins"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Automatically open the last 5 tiddlers when TW loads. The number of tiddlers opened can be specifed by the user. //[Note from Dave: I put this in this category assuming its main purpose is for bloggers - ?]//","twversion":"2.x","category":"Aids for website visitors","format":"Plugin","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","author":"Saq Imtiaz (Lewcid)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"--","category":"Saving and reviewing changes","description":"Enable/disable auto-refresh of selected content to force/prevent re-rendering when tiddler changes occur."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Tagging","description":"Automatically tag tiddlers with their creation date, modification date, author, etc. and/or scan and tag the tiddler with any tags that are embedded in the content."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Automatically adds brackets to nonwikiwords on saving a tiddler.","category":"Links","twversion":"2.1.0","format":"Plugin","author":"Laurence Man","link":"http://weave.tiddlyspot.com"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Behind the scenes","description":"--"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Alan Hecht","link":"http://www.personal.psu.edu/ach12/tiddlywiki/extensions.htm","format":"Macro","twversion":"Not compliant with 2.0","category":"Saving and reviewing changes","description":"This Batch Processing Utility (BPU) allows you to select a group of tiddlers by title, tag, author, or date and perform an action on the entire group (open, edit, add/remove a tag, delete, etc.). Other features include renaming a tag across all the tiddlers that use it and importing/exporting tiddlers via copy/paste."}</data>
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Behind the scenes"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@white-space: nowrap;{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"description":"Make the formatters more flexible: <br>* Allows white-space before the block formatters<br>* Allows more than 4 dashes to make an HR<br>* Handles number lists pasted from the web - these have \" 1.\" etc. at the start of each line and this changes that into a level 1 ordered list.<br>* Allows a leading dash as an unordered list (only 1 level though to avoid clash with HR rule","category":"Formatting and viewing text","twversion":"2.0.0 or higher","format":"Plugin","author":"Julian Knight","link":"http://knighjm.googlepages.com/knightnet-default-tw.html#PlugIn-Knightnet"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Replacement for the core timeline macro, with more options and features.","twversion":"2.x","category":"Time and calendars","format":"Plugin","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","author":"Saq Imtiaz (Lewcid)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Bradley Meck (~PeachTW)","link":"http://bradleymeck.tiddlyspot.com","format":"Plugin","twversion":"--","description":"--","category":"Working with other codes and formats"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Theme","twversion":"2.1","category":"Themes","description":"Alternative stylesheet theme: black/blue-gray/gray backgrounds w/light text."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"FND","link":"http://devpad.tiddlyspot.com","format":"Macro","twversion":"2.1","description":"Macro for collapsing/expanding block elements' height on click.","category":"Toggling page elements"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Anshul Nigham","link":"http://www.anshul.info/blogwiki.html","format":"Plugin","category":"Aids for website visitors","twversion":"2.1.3","description":"Posts the most recently edited tiddlers when the TiddlyWiki is opened, similar to a blog. (Adapted from an earlier plugin by ClintChecketts)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Simon Baird (~MonkeyPirate)","twversion":"2.x","category":"Working with websites, incl IFrames","description":"Provides a quick way to create a pretty link to a TiddlySpot, LiveJournal, Xanga or MySpace site.","format":"Plugin","link":"http://conflation.org/#BlogUserPlugin"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Toolbar button for bookmarks services.","category":"Working with websites, incl IFrames","twversion":"2.2","author":"Bram Chen (~PrinceTW)","link":"http://ptw.sourceforge.net/ptwe.html#Plugins","format":"Plugin"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Paulo Soares","link":"http://www.math.ist.utl.pt/~psoares/addons.html#Plugins","format":"Plugin","twversion":"2.1.0","category":"Formatting and viewing text","description":"This plugin lets you create custom numbered environments that can be decorated through CSS. [Note from Dave: what he's trying to say is that you can create all kinds of cool boxes around your text. See the various examples he gives and you will be convinced]"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Jack Parke (Jack's)","link":"http://jackparke.googlepages.com/jtw.html","format":"Plugin","twversion":"--","category":"Searching and indexing tiddlers","description":"This plugin creates an area at the top of the tiddler area that displays \"breadcrumbs\" of where you've been. This is especially useful forTWs using SinglePageMode by Eric Schulman. Original author Alan Hecht."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Bram Chen (~PrinceTW)","link":"http://ptw.sourceforge.net/ptwe.html#Plugins","format":"Plugin","twversion":"2.1.0","category":"Searching and indexing tiddlers","description":"Author: Alan Hecht (with 2.0 update from 'jack' and revisions by Bram Chen)."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Show a list of tiddlers viewed during this session. Also defines \"back\" (previousTiddler) toolbar button and macro.","category":"Searching and indexing tiddlers","twversion":"2.1","author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Supplemental CSS adjusts font colors for use with dark backgrounds.","category":"Colors","twversion":"2.1","format":"Other","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
{{scroll{
<<forEachTiddler
 where
'tiddler.tags.containsAny(["excludeLists","excludeSearch"])'
write
 '"|"+(index+1)+"|[["+tiddler.title+"]] |@@color:#c06;&raquo;@@ |("+tiddler.tags+")|\n"'
>>
}}}
<<formTiddler NewPluginTemplate>><data>{"author":"Unknown","link":"http://fire.atspace.org/","format":"Macro","twversion":"--","category":"Calculators","description":"A calculator!"}</data>
<<formTiddler NewPluginTemplate>><data>{"twversion":"2.1","category":"Time and calendars","description":"Monthly and yearly calendars.","link":"http://www.tiddlytools.com","author":"Steve Rumsby"}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Macro","author":"Bradley Meck (~PeachTW)","link":"http://bradleymeck.tiddlyspot.com","twversion":"--","category":"Working with keyboards","description":"Makes an easy way to capture a key and stop the browser from doing its default action."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"ccTiddly","link":"http://cctiddly.sourceforge.net/","format":"Other","twversion":"--","category":"Uploading TiddlyWikis to a server","description":"ccTiddly is a tiddly adaptation based on PHP and MySQL to store tiddlers. This is a server side adaptation which allow its user to change their TiddlyWiki over HTTP. It is also possible to generate a standalone version with this!"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Forms and databases","description":"Add checkboxes to your tiddler content."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"--","category":"Forms and databases","description":"Demonstration using CheckboxPlugin to create simple tag-based daily checklist."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"A skinnable, sizeable analog clock.","category":"Time and calendars","format":"Plugin","link":"http://mptw2.tiddlyspot.com/#Plugins","author":"Simon Baird (~MonkeyPirate)","twversion":"--"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Closes the tiddler if you click new tiddler then cancel. Default behaviour is to leave it open.","category":"Tiddler manipulation","twversion":"--","format":"Plugin","link":"http://mptw.tiddlyspot.com/#systemConfig%20%5B%5BMore%20Plugins%5D%5D","author":"Simon Baird (~MonkeyPirate)"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"--","category":"Menus and sliders","description":"Embed a 'close' link floating in upper right corner of slider. closes current slider panel."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","twversion":"2.1","format":"Plugin","description":"Show/hide content of a tiddler while leaving tiddler title visible.","category":"Tiddler manipulation"}</data>
<<formTiddler NewPluginTemplate>><data>{"category":"Menus and sliders","author":"Unknown","link":"http://du180.n77.queensu.ca/TW/ToC.html","format":"Other","twversion":"--","description":"Seems to be a series of tables of contents, different ways of handling a table of contents."}</data>
Background: #fff
Foreground: #000
PrimaryPale: #ddaaff
PrimaryLight: #bb3333
PrimaryMid: #550099
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #8844aa
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
<<forEachTiddler 
where 
'tiddler.tags.contains("list") && tiddler.data("category") == "Colors"'
sortBy
'tiddler.title'
write 
'"|vertical-align:top;@@{{large{[["
+tiddler.title
+"]]}}}@@<br>{{bold{Format:}}}  "
+tiddler.data("format")
+"<br>{{bold{Author:}}}  "
+tiddler.data("author")
+"<br>{{bold{Link:}}}  "
+"[[here|"
+tiddler.data("link")
+"]] <br>{{bold{For TW version:}}}  "
+tiddler.data("twversion")
+"|vertical-align:top;{{bold{Description:}}}<br>"
+tiddler.data("description")
+"|\n"'
>>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","category":"Tables","format":"Plugin","twversion":"2.1","description":"Calculate values from table cells in a column. ALPHA - DO NOT DISTRIBUTE - USE AT YOUR OWN RISK."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Probably works badly if you have tags containing commas. :-)","category":"Tagging","author":"Simon Baird (~MonkeyPirate)","link":"http://mptw2.tiddlyspot.com/#Plugins","format":"Plugin","twversion":"--"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"--","category":"Aids for website visitors","description":"Form to enter feedback/comments that are automatically added to tiddler content."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"2.1","category":"Uncategorized tools","description":"TidIDE: show color-coded differences between two selected tiddlers."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Jack Parke (Jack's)","link":"http://jackparke.googlepages.com/jtw.html","format":"Macro","twversion":"--","description":"This plugin allows you to store TiddlyWiki options in a tiddler. This means the options are part of the store and are not shared among TiddlyWiki files. The options are also more robust and persist when cookies are loaded.","category":"Behind the scenes"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Simon Baird (~MonkeyPirate)","link":"http://mptw.tiddlyspot.com/#systemConfig%20%5B%5BMore%20Plugins%5D%5D","format":"Plugin","twversion":"--","category":"Behind the scenes","description":"Simon Baird's favorite tweaks, having to do with online user experimentation, tabs, and the text that appears upon creating a new tiddler."}</data>
<<formTiddler NewPluginTemplate>><data>{"link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)","category":"Working with browsers","description":"Review/add/delete option cookies and save current option values to CookieJar tiddler for 'sticky' settings.","twversion":"2.1"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Uncategorized tools","description":"Quickly create a copy of any existing tiddler."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Bram Chen (~PrinceTW)","link":"http://ptw.sourceforge.net/ptwe.html#Plugins","format":"Script","twversion":"--","category":"Working with other codes and formats","description":"Covert Unicode to UTF8 for Markup* chunks."}</data>
<<formTiddler NewPluginTemplate>><data>{"twversion":"2.2.4 only","category":"Behind the scenes","description":"This tiddler contains some quick tweaks and modifications to TW core functions to provide minor changes in standard features or behavior. It is hoped that some of these tweaks may be incorporated into later versions of the TW core, so that these adjustements will be available without needing these add-on definitions.","format":"Plugin","author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"small overrides to TW core functions - FOR TW 2.1.3 OR EARLIER.","twversion":"2.1.3 or earlier","category":"Behind the scenes","format":"Plugin","author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Martin Budden","link":"http://www.martinswiki.com","format":"Plugin","twversion":"2.1.0","category":"Non-English languages","description":"Extension of TiddlyWiki syntax to support Creole text formatting."}</data>
<<formTiddler NewPluginTemplate>><data>{"category":"Tiddler manipulation","description":"Custom Hover Dates lets you change the hover text for tiddler titles to a custom format. For instance, you can customize the hover text so that minutes and seconds are excluded from the last modified date. For example, hover over any tiddler title on this page to see the modified date without the hours and minutes.","twversion":"2.0 compatible","format":"Plugin","link":"http://www.personal.psu.edu/ach12/tiddlywiki/extensions.htm","author":"Alan Hecht"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Bob Denny (Red Mt. Vista)","link":"http://ptw.sourceforge.net/ptwe.html#Plugins","format":"Plugin","twversion":"2.0.11, 2.1.0","description":"HTTP support including field encoding and post for forms. Loosely patterned after ~.BidiX.Ajax.","category":"Forms and databases"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Bob Denny (Red Mt. Vista)","link":"http://solo.dc3.com/tw/#%5B%5BMy%20Plugins%5D%5D","format":"Plugin","twversion":"2.1.x","category":"Images and presentations","description":"This plugin implements a lightbox widget for TiddlyWiki. Via Javascript, you can display any HTML div in the lightbox, or use \"canned\" divs for displaying HTML message in a box or an alert with icon. The lightbox is closed by either clicking the X-icon or anywhere outside the lightbox. Only one lightbox can be active at a time. See the usage section below."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Working with other codes and formats","description":"Set DOM element IDs, add/remove classes and/or reposition rendered elements."}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Theme","twversion":"--","category":"Themes","link":"http://ptw.sourceforge.net/ptwe.html#Plugins","author":"Bram Chen (~PrinceTW)","description":"A dark blue theme from the Prince himself."}</data>
/***
|''Name:''|DataTiddlerPlugin|
|''Version:''|1.0.6 (2006-08-26)|
|''Source:''|http://tiddlywiki.abego-software.de/#DataTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license]]|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|
!Description
Enhance your tiddlers with structured data (such as strings, booleans, numbers, or even arrays and compound objects) that can be easily accessed and modified through named fields (in JavaScript code).

Such tiddler data can be used in various applications. E.g. you may create tables that collect data from various tiddlers. 

''//Example: "Table with all December Expenses"//''
{{{
<<forEachTiddler
    where
        'tiddler.tags.contains("expense") && tiddler.data("month") == "Dec"'
    write
        '"|[["+tiddler.title+"]]|"+tiddler.data("descr")+"| "+tiddler.data("amount")+"|\n"'
>>
}}}
//(This assumes that expenses are stored in tiddlers tagged with "expense".)//
<<forEachTiddler
    where
        'tiddler.tags.contains("expense") && tiddler.data("month") == "Dec"'
    write
        '"|[["+tiddler.title+"]]|"+tiddler.data("descr")+"| "+tiddler.data("amount")+"|\n"'
>>
For other examples see DataTiddlerExamples.




''Access and Modify Tiddler Data''

You can "attach" data to every tiddler by assigning a JavaScript value (such as a string, boolean, number, or even arrays and compound objects) to named fields. 

These values can be accessed and modified through the following Tiddler methods:
|!Method|!Example|!Description|
|{{{data(field)}}}|{{{t.data("age")}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined {{{undefined}}} is returned.|
|{{{data(field,defaultValue)}}}|{{{t.data("isVIP",false)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined the defaultValue is returned.|
|{{{data()}}}|{{{t.data()}}}|Returns the data object of the tiddler, with a property for every field. The properties of the returned data object may only be read and not be modified. To modify the data use DataTiddler.setData(...) or the corresponding Tiddler method.|
|{{{setData(field,value)}}}|{{{t.setData("age",42)}}}|Sets the value of the given data field of the tiddler to the value. When the value is {{{undefined}}} the field is removed.|
|{{{setData(field,value,defaultValue)}}}|{{{t.setData("isVIP",flag,false)}}}|Sets the value of the given data field of the tiddler to the value. When the value is equal to the defaultValue no value is set (and the field is removed).|

Alternatively you may use the following functions to access and modify the data. In this case the tiddler argument is either a tiddler or the name of a tiddler.
|!Method|!Description|
|{{{DataTiddler.getData(tiddler,field)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined {{{undefined}}} is returned.|
|{{{DataTiddler.getData(tiddler,field,defaultValue)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined the defaultValue is returned.|
|{{{DataTiddler.getDataObject(tiddler)}}}|Returns the data object of the tiddler, with a property for every field. The properties of the returned data object may only be read and not be modified. To modify the data use DataTiddler.setData(...) or the corresponding Tiddler method.|
|{{{DataTiddler.setData(tiddler,field,value)}}}|Sets the value of the given data field of the tiddler to the value. When the value is {{{undefined}}} the field is removed.|
|{{{DataTiddler.setData(tiddler,field,value,defaultValue)}}}|Sets the value of the given data field of the tiddler to the value. When the value is equal to the defaultValue no value is set (and the field is removed).|
//(For details on the various functions see the detailed comments in the source code.)//


''Data Representation in a Tiddler''

The data of a tiddler is stored as plain text in the tiddler's content/text, inside a "data" section that is framed by a {{{<data>...</data>}}} block. Inside the data section the information is stored in the [[JSON format|http://www.crockford.com/JSON/index.html]]. 

//''Data Section Example:''//
{{{
<data>{"isVIP":true,"user":"John Brown","age":34}</data>
}}}

The data section is not displayed when viewing the tiddler (see also "The showData Macro").

Beside the data section a tiddler may have all kind of other content.

Typically you will not access the data section text directly but use the methods given above. Nevertheless you may retrieve the text of the data section's content through the {{{DataTiddler.getDataText(tiddler)}}} function.


''Saving Changes''

The "setData" methods respect the "ForceMinorUpdate" and "AutoSave" configuration values. I.e. when "ForceMinorUpdate" is true changing a value using setData will not affect the "modifier" and "modified" attributes. With "AutoSave" set to true every setData will directly save the changes after a setData.


''Notifications''

No notifications are sent when a tiddler's data value is changed through the "setData" methods. 

''Escape Data Section''
In case that you want to use the text {{{<data>}}} or {{{</data>}}} in a tiddler text you must prefix the text with a tilde ('~'). Otherwise it may be wrongly considered as the data section. The tiddler text {{{~<data>}}} is displayed as {{{<data>}}}.


''The showData Macro''

By default the data of a tiddler (that is stored in the {{{<data>...</data>}}} section of the tiddler) is not displayed. If you want to display this data you may used the {{{<<showData ...>>}}} macro:

''Syntax:'' 
|>|{{{<<}}}''showData '' [''JSON''] [//tiddlerName//] {{{>>}}}|
|''JSON''|By default the data is rendered as a table with a "Name" and "Value" column. When defining ''JSON'' the data is rendered in JSON format|
|//tiddlerName//|Defines the tiddler holding the data to be displayed. When no tiddler is given the tiddler containing the showData macro is used. When the tiddler name contains spaces you must quote the name (or use the {{{[[...]]}}} syntax.)|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|


!Revision history
* v1.0.6 (2006-08-26) 
** Removed misleading comment
* v1.0.5 (2006-02-27) (Internal Release Only)
** Internal
*** Make "JSLint" conform
* v1.0.4 (2006-02-05)
** Bugfix: showData fails in TiddlyWiki 2.0
* v1.0.3 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.2 (2005-12-22)
** Enhancements:
*** Handle texts "<data>" or "</data>" more robust when used in a tiddler text or as a field value.
*** Improved (JSON) error messages.
** Bugs fixed: 
*** References are not updated when using the DataTiddler.
*** Changes to compound objects are not always saved.
*** "~</data>" is not rendered correctly (expected "</data>")
* v1.0.1 (2005-12-13)
** Features: 
*** The showData macro supports an optional "tiddlername" argument to specify the tiddler containing the data to be displayed
** Bugs fixed: 
*** A script immediately following a data section is deleted when the data is changed. (Thanks to GeoffS for reporting.)
* v1.0.0 (2005-12-12)
** initial version

!Code
***/
//{{{
//============================================================================
//============================================================================
//                           DataTiddlerPlugin
//============================================================================
//============================================================================

// Ensure that the DataTiddler Plugin is only installed once.
//
if (!version.extensions.DataTiddlerPlugin) {



version.extensions.DataTiddlerPlugin = {
    major: 1, minor: 0, revision: 6,
    date: new Date(2006, 7, 26), 
    type: 'plugin',
    source: "http://tiddlywiki.abego-software.de/#DataTiddlerPlugin"
};

// For backward compatibility with v1.2.x
//
if (!window.story) window.story=window; 
if (!TiddlyWiki.prototype.getTiddler) {
	TiddlyWiki.prototype.getTiddler = function(title) { 
		var t = this.tiddlers[title]; 
		return (t !== undefined && t instanceof Tiddler) ? t : null; 
	};
}

//============================================================================
// DataTiddler Class
//============================================================================

// ---------------------------------------------------------------------------
// Configurations and constants 
// ---------------------------------------------------------------------------

function DataTiddler() {
}

DataTiddler = {
    // Function to stringify a JavaScript value, producing the text for the data section content.
    // (Must match the implementation of DataTiddler.parse.)
    //
    stringify : null,
    

    // Function to parse the text for the data section content, producing a JavaScript value.
    // (Must match the implementation of DataTiddler.stringify.)
    //
    parse : null
};

// Ensure access for IE
window.DataTiddler = DataTiddler;

// ---------------------------------------------------------------------------
// Data Accessor and Mutator
// ---------------------------------------------------------------------------


// Returns the value of the given data field of the tiddler.
// When no such field is defined or its value is undefined
// the defaultValue is returned.
// 
// @param tiddler either a tiddler name or a tiddler
//
DataTiddler.getData = function(tiddler, field, defaultValue) {
    var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
    if (!(t instanceof Tiddler)) {
        throw "Tiddler expected. Got "+tiddler;
    }

    return DataTiddler.getTiddlerDataValue(t, field, defaultValue);
};


// Sets the value of the given data field of the tiddler to
// the value. When the value is equal to the defaultValue
// no value is set (and the field is removed)
//
// Changing data of a tiddler will not trigger notifications.
// 
// @param tiddler either a tiddler name or a tiddler
//
DataTiddler.setData = function(tiddler, field, value, defaultValue) {
    var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
    if (!(t instanceof Tiddler)) {
        throw "Tiddler expected. Got "+tiddler+ "("+t+")";
    }

    DataTiddler.setTiddlerDataValue(t, field, value, defaultValue);
};


// Returns the data object of the tiddler, with a property for every field.
//
// The properties of the returned data object may only be read and
// not be modified. To modify the data use DataTiddler.setData(...) 
// or the corresponding Tiddler method.
//
// If no data section is defined a new (empty) object is returned.
//
// @param tiddler either a tiddler name or a Tiddler
//
DataTiddler.getDataObject = function(tiddler) {
    var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
    if (!(t instanceof Tiddler)) {
        throw "Tiddler expected. Got "+tiddler;
    }

    return DataTiddler.getTiddlerDataObject(t);
};

// Returns the text of the content of the data section of the tiddler.
//
// When no data section is defined for the tiddler null is returned 
//
// @param tiddler either a tiddler name or a Tiddler
// @return [may be null]
//
DataTiddler.getDataText = function(tiddler) {
    var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
    if (!(t instanceof Tiddler)) {
        throw "Tiddler expected. Got "+tiddler;
    }

    return DataTiddler.readDataSectionText(t);
};


// ---------------------------------------------------------------------------
// Internal helper methods (must not be used by code from outside this plugin)
// ---------------------------------------------------------------------------

// Internal.
//
// The original JSONError is not very user friendly, 
// especially it does not define a toString() method
// Therefore we extend it here.
//
DataTiddler.extendJSONError = function(ex) {
	if (ex.name == 'JSONError') {
        ex.toString = function() {
			return ex.name + ": "+ex.message+" ("+ex.text+")";
		};
	}
	return ex;
};

// Internal.
//
// @param t a Tiddler
//
DataTiddler.getTiddlerDataObject = function(t) {
    if (t.dataObject === undefined) {
        var data = DataTiddler.readData(t);
        t.dataObject = (data) ? data : {};
    }
    
    return t.dataObject;
};


// Internal.
//
// @param tiddler a Tiddler
//
DataTiddler.getTiddlerDataValue = function(tiddler, field, defaultValue) {
    var value = DataTiddler.getTiddlerDataObject(tiddler)[field];
    return (value === undefined) ? defaultValue : value;
};


// Internal.
//
// @param tiddler a Tiddler
//
DataTiddler.setTiddlerDataValue = function(tiddler, field, value, defaultValue) {
    var data = DataTiddler.getTiddlerDataObject(tiddler);
    var oldValue = data[field];
	
    if (value == defaultValue) {
        if (oldValue !== undefined) {
            delete data[field];
            DataTiddler.save(tiddler);
        }
        return;
    }
    data[field] = value;
    DataTiddler.save(tiddler);
};

// Internal.
//
// Reads the data section from the tiddler's content and returns its text
// (as a String).
//
// Returns null when no data is defined.
//
// @param tiddler a Tiddler
// @return [may be null]
//
DataTiddler.readDataSectionText = function(tiddler) {
    var matches = DataTiddler.getDataTiddlerMatches(tiddler);
    if (matches === null || !matches[2]) {
        return null;
    }
    return matches[2];
};

// Internal.
//
// Reads the data section from the tiddler's content and returns it
// (as an internalized object).
//
// Returns null when no data is defined.
//
// @param tiddler a Tiddler
// @return [may be null]
//
DataTiddler.readData = function(tiddler) {
    var text = DataTiddler.readDataSectionText(tiddler);
	try {
	    return text ? DataTiddler.parse(text) : null;
	} catch(ex) {
		throw DataTiddler.extendJSONError(ex);
	}
};

// Internal.
// 
// Returns the serialized text of the data of the given tiddler, as it
// should be stored in the data section.
//
// @param tiddler a Tiddler
//
DataTiddler.getDataTextOfTiddler = function(tiddler) {
    var data = DataTiddler.getTiddlerDataObject(tiddler);
    return DataTiddler.stringify(data);
};


// Internal.
// 
DataTiddler.indexOfNonEscapedText = function(s, subString, startIndex) {
	var index = s.indexOf(subString, startIndex);
	while ((index > 0) && (s[index-1] == '~')) { 
		index = s.indexOf(subString, index+1);
	}
	return index;
};

// Internal.
//
DataTiddler.getDataSectionInfo = function(text) {
	// Special care must be taken to handle "<data>" and "</data>" texts inside
	// a data section. 
	// Also take care not to use an escaped <data> (i.e. "~<data>") as the start 
	// of a data section. (Same for </data>)

    // NOTE: we are explicitly searching for a data section that contains a JSON
    // string, i.e. framed with braces. This way we are little bit more robust in
    // case the tiddler contains unescaped texts "<data>" or "</data>". This must
    // be changed when using a different stringifier.

	var startTagText = "<data>{";
	var endTagText = "}</data>";

	var startPos = 0;

	// Find the first not escaped "<data>".
	var startDataTagIndex = DataTiddler.indexOfNonEscapedText(text, startTagText, 0);
	if (startDataTagIndex < 0) {
		return null;
	}

	// Find the *last* not escaped "</data>".
	var endDataTagIndex = text.indexOf(endTagText, startDataTagIndex);
	if (endDataTagIndex < 0) {
		return null;
	}
	var nextEndDataTagIndex;
	while ((nextEndDataTagIndex = text.indexOf(endTagText, endDataTagIndex+1)) >= 0) {
		endDataTagIndex = nextEndDataTagIndex;
	}

	return {
		prefixEnd: startDataTagIndex, 
		dataStart: startDataTagIndex+(startTagText.length)-1, 
		dataEnd: endDataTagIndex, 
		suffixStart: endDataTagIndex+(endTagText.length)
	};
};

// Internal.
// 
// Returns the "matches" of a content of a DataTiddler on the
// "data" regular expression. Return null when no data is defined
// in the tiddler content.
//
// Group 1: text before data section (prefix)
// Group 2: content of data section
// Group 3: text behind data section (suffix)
//
// @param tiddler a Tiddler
// @return [may be null] null when the tiddler contains no data section, otherwise see above.
//
DataTiddler.getDataTiddlerMatches = function(tiddler) {
	var text = tiddler.text;
	var info = DataTiddler.getDataSectionInfo(text);
	if (!info) {
		return null;
	}

	var prefix = text.substr(0,info.prefixEnd);
	var data = text.substr(info.dataStart, info.dataEnd-info.dataStart+1);
	var suffix = text.substr(info.suffixStart);
	
	return [text, prefix, data, suffix];
};


// Internal.
//
// Saves the data in a <data> block of the given tiddler (as a minor change). 
//
// The "chkAutoSave" and "chkForceMinorUpdate" options are respected. 
// I.e. the TiddlyWiki *file* is only saved when AutoSave is on.
//
// Notifications are not send. 
//
// This method should only be called when the data really has changed. 
//
// @param tiddler
//             the tiddler to be saved.
//
DataTiddler.save = function(tiddler) {

    var matches = DataTiddler.getDataTiddlerMatches(tiddler);

    var prefix;
    var suffix;
    if (matches === null) {
        prefix = tiddler.text;
        suffix = "";
    } else {
        prefix = matches[1];
        suffix = matches[3];
    }

    var dataText = DataTiddler.getDataTextOfTiddler(tiddler);
    var newText = 
            (dataText !== null) 
                ? prefix + "<data>" + dataText + "</data>" + suffix
                : prefix + suffix;
    if (newText != tiddler.text) {
        // make the change in the tiddlers text
        
        // ... see DataTiddler.MyTiddlerChangedFunction
        tiddler.isDataTiddlerChange = true;
        
        // ... do the action change
        tiddler.set(
                tiddler.title,
                newText,
                config.options.txtUserName, 
                config.options.chkForceMinorUpdate? undefined : new Date(),
                tiddler.tags);

        // ... see DataTiddler.MyTiddlerChangedFunction
        delete tiddler.isDataTiddlerChange;

        // Mark the store as dirty.
        store.dirty = true;
 
        // AutoSave if option is selected
        if(config.options.chkAutoSave) {
           saveChanges();
        }
    }
};

// Internal.
//
DataTiddler.MyTiddlerChangedFunction = function() {
    // Remove the data object from the tiddler when the tiddler is changed
    // by code other than DataTiddler code. 
    //
    // This is necessary since the data object is just a "cached version" 
    // of the data defined in the data section of the tiddler and the 
    // "external" change may have changed the content of the data section.
    // Thus we are not sure if the data object reflects the data section 
    // contents. 
    // 
    // By deleting the data object we ensure that the data object is 
    // reconstructed the next time it is needed, with the data defined by
    // the data section in the tiddler's text.
    
    // To indicate that a change is a "DataTiddler change" a temporary
    // property "isDataTiddlerChange" is added to the tiddler.
    if (this.dataObject && !this.isDataTiddlerChange) {
        delete this.dataObject;
    }
    
    // call the original code.
	DataTiddler.originalTiddlerChangedFunction.apply(this, arguments);
};


//============================================================================
// Formatters
//============================================================================

// This formatter ensures that "~<data>" is rendered as "<data>". This is used to 
// escape the "<data>" of a data section, just in case someone really wants to use
// "<data>" as a text in a tiddler and not start a data section.
//
// Same for </data>.
//
config.formatters.push( {
    name: "data-escape",
    match: "~<\\/?data>",

    handler: function(w) {
            w.outputText(w.output,w.matchStart + 1,w.nextMatch);
    }
} );


// This formatter ensures that <data>...</data> sections are not rendered.
//
config.formatters.push( {
    name: "data",
    match: "<data>",

    handler: function(w) {
		var info = DataTiddler.getDataSectionInfo(w.source);
		if (info && info.prefixEnd == w.matchStart) {
            w.nextMatch = info.suffixStart;
		} else {
			w.outputText(w.output,w.matchStart,w.nextMatch);
		}
    }
} );


//============================================================================
// Tiddler Class Extension
//============================================================================

// "Hijack" the changed method ---------------------------------------------------

DataTiddler.originalTiddlerChangedFunction = Tiddler.prototype.changed;
Tiddler.prototype.changed = DataTiddler.MyTiddlerChangedFunction;

// Define accessor methods -------------------------------------------------------

// Returns the value of the given data field of the tiddler. When no such field 
// is defined or its value is undefined the defaultValue is returned.
//
// When field is undefined (or null) the data object is returned. (See 
// DataTiddler.getDataObject.)
//
// @param field [may be null, undefined]
// @param defaultValue [may be null, undefined]
// @return [may be null, undefined]
//
Tiddler.prototype.data = function(field, defaultValue) {
    return (field) 
         ? DataTiddler.getTiddlerDataValue(this, field, defaultValue)
         : DataTiddler.getTiddlerDataObject(this);
};

// Sets the value of the given data field of the tiddler to the value. When the 
// value is equal to the defaultValue no value is set (and the field is removed).
//
// @param value [may be null, undefined]
// @param defaultValue [may be null, undefined]
//
Tiddler.prototype.setData = function(field, value, defaultValue) {
    DataTiddler.setTiddlerDataValue(this, field, value, defaultValue);
};


//============================================================================
// showData Macro
//============================================================================

config.macros.showData = {
     // Standard Properties
     label: "showData",
     prompt: "Display the values stored in the data section of the tiddler"
};

config.macros.showData.handler = function(place,macroName,params) {
    // --- Parsing ------------------------------------------

    var i = 0; // index running over the params
    // Parse the optional "JSON"
    var showInJSONFormat = false;
    if ((i < params.length) && params[i] == "JSON") {
        i++;
        showInJSONFormat = true;
    }
    
    var tiddlerName = story.findContainingTiddler(place).id.substr(7);
    if (i < params.length) {
        tiddlerName = params[i];
        i++;
    }

    // --- Processing ------------------------------------------
    try {
        if (showInJSONFormat) {
            this.renderDataInJSONFormat(place, tiddlerName);
        } else {
            this.renderDataAsTable(place, tiddlerName);
        }
    } catch (e) {
        this.createErrorElement(place, e);
    }
};

config.macros.showData.renderDataInJSONFormat = function(place,tiddlerName) {
    var text = DataTiddler.getDataText(tiddlerName);
    if (text) {
        createTiddlyElement(place,"pre",null,null,text);
    }
};

config.macros.showData.renderDataAsTable = function(place,tiddlerName) {
    var text = "|!Name|!Value|\n";
    var data = DataTiddler.getDataObject(tiddlerName);
    if (data) {
        for (var i in data) {
            var value = data[i];
            text += "|"+i+"|"+DataTiddler.stringify(value)+"|\n";
        }
    }
    
    wikify(text, place);
};


// Internal.
//
// Creates an element that holds an error message
// 
config.macros.showData.createErrorElement = function(place, exception) {
    var message = (exception.description) ? exception.description : exception.toString();
    return createTiddlyElement(place,"span",null,"showDataError","<<showData ...>>: "+message);
};

// ---------------------------------------------------------------------------
// Stylesheet Extensions (may be overridden by local StyleSheet)
// ---------------------------------------------------------------------------
//
setStylesheet(
    ".showDataError{color: #ffffff;background-color: #880000;}",
    "showData");


} // of "install only once"
// Used Globals (for JSLint) ==============

// ... TiddlyWiki Core
/*global 	createTiddlyElement, saveChanges, store, story, wikify */
// ... DataTiddler
/*global 	DataTiddler */
// ... JSON
/*global 	JSON */
			

/***
!JSON Code, used to serialize the data
***/
/*
Copyright (c) 2005 JSON.org

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The Software shall be used for Good, not Evil.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/

/*
    The global object JSON contains two methods.

    JSON.stringify(value) takes a JavaScript value and produces a JSON text.
    The value must not be cyclical.

    JSON.parse(text) takes a JSON text and produces a JavaScript value. It will
    throw a 'JSONError' exception if there is an error.
*/
var JSON = {
    copyright: '(c)2005 JSON.org',
    license: 'http://www.crockford.com/JSON/license.html',
/*
    Stringify a JavaScript value, producing a JSON text.
*/
    stringify: function (v) {
        var a = [];

/*
    Emit a string.
*/
        function e(s) {
            a[a.length] = s;
        }

/*
    Convert a value.
*/
        function g(x) {
            var c, i, l, v;

            switch (typeof x) {
            case 'object':
                if (x) {
                    if (x instanceof Array) {
                        e('[');
                        l = a.length;
                        for (i = 0; i < x.length; i += 1) {
                            v = x[i];
                            if (typeof v != 'undefined' &&
                                    typeof v != 'function') {
                                if (l < a.length) {
                                    e(',');
                                }
                                g(v);
                            }
                        }
                        e(']');
                        return;
                    } else if (typeof x.toString != 'undefined') {
                        e('{');
                        l = a.length;
                        for (i in x) {
                            v = x[i];
                            if (x.hasOwnProperty(i) &&
                                    typeof v != 'undefined' &&
                                    typeof v != 'function') {
                                if (l < a.length) {
                                    e(',');
                                }
                                g(i);
                                e(':');
                                g(v);
                            }
                        }
                        return e('}');
                    }
                }
                e('null');
                return;
            case 'number':
                e(isFinite(x) ? +x : 'null');
                return;
            case 'string':
                l = x.length;
                e('"');
                for (i = 0; i < l; i += 1) {
                    c = x.charAt(i);
                    if (c >= ' ') {
                        if (c == '\\' || c == '"') {
                            e('\\');
                        }
                        e(c);
                    } else {
                        switch (c) {
                            case '\b':
                                e('\\b');
                                break;
                            case '\f':
                                e('\\f');
                                break;
                            case '\n':
                                e('\\n');
                                break;
                            case '\r':
                                e('\\r');
                                break;
                            case '\t':
                                e('\\t');
                                break;
                            default:
                                c = c.charCodeAt();
                                e('\\u00' + Math.floor(c / 16).toString(16) +
                                    (c % 16).toString(16));
                        }
                    }
                }
                e('"');
                return;
            case 'boolean':
                e(String(x));
                return;
            default:
                e('null');
                return;
            }
        }
        g(v);
        return a.join('');
    },
/*
    Parse a JSON text, producing a JavaScript value.
*/
    parse: function (text) {
        var p = /^\s*(([,:{}\[\]])|"(\\.|[^\x00-\x1f"\\])*"|-?\d+(\.\d*)?([eE][+-]?\d+)?|true|false|null)\s*/,
            token,
            operator;

        function error(m, t) {
            throw {
                name: 'JSONError',
                message: m,
                text: t || operator || token
            };
        }

        function next(b) {
            if (b && b != operator) {
                error("Expected '" + b + "'");
            }
            if (text) {
                var t = p.exec(text);
                if (t) {
                    if (t[2]) {
                        token = null;
                        operator = t[2];
                    } else {
                        operator = null;
                        try {
                            token = eval(t[1]);
                        } catch (e) {
                            error("Bad token", t[1]);
                        }
                    }
                    text = text.substring(t[0].length);
                } else {
                    error("Unrecognized token", text);
                }
            } else {
                token = operator = undefined;
            }
        }


        function val() {
            var k, o;
            switch (operator) {
            case '{':
                next('{');
                o = {};
                if (operator != '}') {
                    for (;;) {
                        if (operator || typeof token != 'string') {
                            error("Missing key");
                        }
                        k = token;
                        next();
                        next(':');
                        o[k] = val();
                        if (operator != ',') {
                            break;
                        }
                        next(',');
                    }
                }
                next('}');
                return o;
            case '[':
                next('[');
                o = [];
                if (operator != ']') {
                    for (;;) {
                        o.push(val());
                        if (operator != ',') {
                            break;
                        }
                        next(',');
                    }
                }
                next(']');
                return o;
            default:
                if (operator !== null) {
                    error("Missing value");
                }
                k = token;
                next();
                return k;
            }
        }
        next();
        return val();
    }
};

/***
!Setup the data serialization
***/

DataTiddler.format = "JSON";
DataTiddler.stringify = JSON.stringify;
DataTiddler.parse = JSON.parse;

//}}}

<<formTiddler NewPluginTemplate>><data>{"author":"Udo Borkowski (Abego)","link":"http://tiddlywiki.abego-software.de/#Plugins","format":"Plugin","category":"Forms and databases"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Plugin","twversion":"2.1","category":"Time and calendars","description":"Formatted dates plus popup menu with 'journal' link, changes and (optional) reminders. This plugin provides a general approach to embedding dates and date-based links/menus within tiddler content. This plugin display formatted dates, for the specified year, month, day using number values or mathematical expressions such as (Y+1) or (D+30). Optionally, you can create a link from the formatted output to a 'dated tiddler' for quick blogging or create a popup menu that includes the dated tiddler link plus links to changes made on that date as well as links to any pending reminders for the coming 31 days (if theRemindersPlugin is installed). This plugin also provides a public API for easily incorporating formatted date output (with or without the links/popups) into other plugins, such as calendar generators, etc."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"This macro will insert a table of contents reflecting the headings that are used in a tiddler and will be automatically updated when you make changes. Each item in the table of contents can be clicked on to jump to that heading. It can be used either inside of select tiddlers or inside a system wide template.","author":"Doug Compton","link":"http://www.zagware.com/tw/plugins.html#DcTableOfContentsPlugin","category":"Navigating within a tiddler","format":"Plugin","twversion":"--"}</data>
[[Welcome to the TiddlyVault]]
<<formTiddler NewPluginTemplate>><data>{"author":"Jack Parke (Jack's)","link":"http://jackparke.googlepages.com/jtw.html","format":"Macro","twversion":"--","category":"Formatting and viewing text","description":"Allow definitions of glossary terms to be easily visible via mouseover."}</data>
<<formTiddler NewPluginTemplateInput>><data>{"author":"Saq Imtiaz (Lewcid)","link":"http://lewcid.org/tiddlywiki-bookmarklets/","format":"Bookmarklet","twversion":"2.0","category":"Tagging","description":"Deletes all tiddlers with the specified tag."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"An adaptation of DeleteDoneTasks (Simon Baird) by Ido Magal.","link":"http://ido-xp.tiddlyspot.com/","author":"Ido Magal","format":"Plugin","twversion":"2.1.0","category":"Tagging"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Embed a del.icio.us \"play tagger\" next to mp3 URLs embedded in tiddler content","format":"Plugin","author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","twversion":"2.1","category":"Images and presentations"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Jack Parke (Jack's)","link":"http://jackparke.googlepages.com/jtw.html","format":"Plugin","category":"Tagging","description":"Allows easy 'del.icio.us'-like tagging in the EditTemplate by showing all tags as a list of link-buttons.","twversion":"--"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Daniel Baird","link":"http://danielbaird.com/tiddlywinks/","format":"Other","twversion":"--","category":"Games","description":"Roll the dice and see what turns up."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Martin Budden","link":"http://www.martinswiki.com","format":"Plugin","twversion":"2.1","description":"Allows you to disable TiddlyWiki's automatic linking of WikiWords.","category":"Formatting and viewing text"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"This plugin allows you to disable TiddlyWiki's automatic WikiWord linking behavior, so that WikiWords embedded in tiddler content will be rendered as regular text, instead of being automatically converted to tiddler links. To create a tiddler link when automatic linking is disabled, you must enclose the link text within {{{[[...]]}}}.","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)","format":"Plugin","twversion":"2.1","category":"Formatting and viewing text"}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Plugin","author":"Daniel Baird","twversion":"2.1x","category":"Tagging","description":"Make the tag chooser ignore tags that are themselves tagged with 'excludeLists'.","link":"http://discerningtags.tiddlyspot.com/"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"--","category":"Searching and indexing tiddlers","description":"Onclick script that opens ALL tiddler in the document.  Can be slow if document is large."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Displays similar to the popular BreadCrumbsPlugin by AlanHecht, this plugin instead keeps a list of currently open tiddlers.","category":"Searching and indexing tiddlers","twversion":"--","format":"Plugin","author":"Walt Woods","link":"http://oregonstate.edu/~woodswa/tiddlywikiplugs.html"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Greg Walker","link":"http://gwsyzygy.googlepages.com/creator.html","format":"Plugin","twversion":"--","category":"Formatting and viewing text","description":"A macro for displaying glyphs according to the tags on a particular tiddler. Glyphs are defined in DisplayTiddlerGlyphData and don't have to be just a glyph (graphic character). They can be any wiki content, including images, text, buttons, popups, etc."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Creates a button which allows you to backup your TiddlyWiki on demand.","category":"Saving and reviewing changes","twversion":"--","format":"Macro","link":"http://jackparke.googlepages.com/jtw.html","author":"Jack Parke (Jack's)"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"A script to download a TiddlyWiki in one click.","category":"Working with websites, incl IFrames","twversion":"--","format":"Script","author":"BidiX","link":"http://tiddlywiki.bidix.info/#%5B%5BExtension%20directory%5D%5D"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Simon Baird (~MonkeyPirate)","link":"http://mptw2.tiddlyspot.com/#Plugins","format":"Plugin","twversion":"--","category":"Tagging","description":"--"}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Macro","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","category":"Tagging","description":"Dropdown version of core tagging macro.","twversion":"2.07","author":"Saq Imtiaz (Lewcid)"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Dropdown version of core tags macro.","category":"Tagging","twversion":"2.07","format":"Macro","link":"http://tw.lewcid.org/#%5B%5BExtensions%20Overview%5D%5D","author":"Saq Imtiaz (Lewcid)"}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Plugin","author":"Yann Perrin","link":"http://yann.perrin.googlepages.com/twkd.html","twversion":"2.x","category":"Formatting and viewing text","description":"Create custom text formatting menus available in the edit mode of your tiddler."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"The slice command allows you to create microcontent tiddlers from bigger ones. It turns selected text into a new independent tiddler, and replace it in the original tiddler with a reference to the newly created tiddler.","category":"Tiddler manipulation","twversion":"2.x","format":"Plugin","link":"http://yann.perrin.googlepages.com/twkd.html","author":"Yann Perrin"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Using the E.A.S.E. plugin, easyTongue allows you to mark selection as being from the chosen language. (if you open his tiddler into edit mode you can see that you can switch from English to French and back. ","category":"Non-English languages","twversion":"2.x","format":"Plugin","author":"Yann Perrin","link":"http://yann.perrin.googlepages.com/twkd.html"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Macro debugging. Echo will echo back all params passed to it, including each parameter's #, type, value, and literal value (unwikified). Useful for debugging exactly what is getting passed to a macro.","category":"Behind the scenes","twversion":"--","format":"Macro","link":"http://gwsyzygy.googlepages.com/creator.html","author":"Greg Walker"}</data>
<<formTiddler NewPluginTemplate>><data>{"format":"Theme","description":"Alternative stylesheet theme: dark blue sunset photo background.","category":"Themes","twversion":"2.1","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Extend core edit macro for use in ViewTemplates or direct embedding in tiddler content.<br><br>Normally, when you edit a tiddler, any changes you make are only saved (or discarded) when you press the \"done\" (or \"cancel\") command in the tiddler editor's toolbar. However, when in a 'view mode' context, these command items are not available, and so cannot be used to trigger the 'save/discard' handling once you have decided that your input activities are complete. Instead, you will be automatically prompted to save/discard your changes (if any) as soon as you move away from a text edit field or multi-line text area. Alternatively, pressing ENTER while in an edit field will save your input, while pressing ESCAPE will abandon your input (after prompting for confirmation).","twversion":"2.1","format":"Plugin","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)","category":"Forms and databases"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Listbox fields for ~TiddlyWiki.","category":"Forms and databases","author":"? (VisualTW)","link":"http://visualtw.ouvaton.org/VisualTW.html","format":"Macro","twversion":"2.2.x"}</data>
<!--{{{-->
<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div class="editLabel">&ensp;</div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>
<div class='editor' macro='edit text'></div>
<!--}}}-->
<<formTiddler NewPluginTemplate>><data>{"description":"Embed an 'edit' link in tiddler content to invoke edit on any specified tiddler title.","author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","twversion":"2.1","format":"Plugin","category":"Tiddler manipulation"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Alan Hecht","link":"http://www.personal.psu.edu/ach12/tiddlywiki/extensions.htm","format":"Macro","twversion":"2.0 compliant","category":"Aids for website visitors","description":"Email lets you list a \"email\" address without displaying it as readable text. This helps prevent your email address from being harvested by search engines and other web crawlers that read your page's contents. Using email, you type in the words \"at\" and \"dot\" instead of the punctuation symbols and add spaces inbetween words to disguise your address. However, email will display your email address in a web browser so that humans can read it. And email turns the address into a hyperlink that can be clicked to send you an instant email."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Unknown","link":"http://fire.atspace.org/","format":"Macro","twversion":"--","category":"Working with files and programs","description":"Sends an e-mail, I'm assuming."}</data>
<<formTiddler NewPluginTemplateInput>><data>{"description":"Enables editing on an online TiddlyWiki without the need to reload. Also disables animations, and enables backstage functionalities.","category":"Uploading TiddlyWikis to a server","format":"Bookmarklet","twversion":"2.0","author":"Saq Imtiaz (Lewcid)","link":"http://lewcid.org/tiddlywiki-bookmarklets/"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Encrypted fields for TiddlyWiki","twversion":"2.2.x","category":"Forms and databases","format":"Plugin","link":"http://visualtw.ouvaton.org/VisualTW.html","author":"? (VisualTW)"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Excludes any tiddlers from timeline that have been tagged with excludeTimeline.","author":"Soloport","link":"http://soloport.tiddlyspot.com/#ExcludeTimelinePlugin","format":"Plugin","twversion":"--","category":"Searching and indexing tiddlers"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Jon Scully","link":"http://soloport.tiddlyspot.com/#ExcludeTimelinePlugin","description":"Provide an 'expand' button in edit mode that increases the textarea by 10 rows per click.","twversion":"2.1.2","category":"Tiddler manipulation","format":"Plugin"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"2.1","category":"Menus and sliders","description":"Simulateously expand/collapse all nested sliders in a tiddler (or ID'd DOM element)."}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"Select and extract tiddlers from your TiddlyWiki documents and save them to a local file. When many people edit copies of the same TiddlyWiki document, the ability to easily copy and share these changes so they can then be redistributed to the entire group is very important. This ability is also very useful when moving your own tiddlers from document to document (e.g., when upgrading to the latest version ofTiddlyWiki, or 'pre-loading' your favorite stylesheets into a new 'empty' TiddlyWiki document.)","category":"Working with multiple TiddlyWikis","twversion":"2.1","format":"Plugin","link":"http://www.tiddlytools.com","author":"Eric Shulman (~TiddlyTools)"}</data>
<<formTiddler NewPluginTemplate>><data>{"description":"This plugin lets you export tiddlers into dfwiki pages of a moodle 1.6.X with the nwiki module installed.","category":"Working with websites, incl IFrames","twversion":"2.1.2","format":"Plugin","author":"Oriol Nieto , Alejandro Moreno, Dídac Calventus & Ludo (Marc Alier)","link":"http://moodle.tiddlyspot.com/"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Simon Baird (~MonkeyPirate)","link":"http://mptw.tiddlyspot.com/#systemConfig%20%5B%5BMore%20Plugins%5D%5D","format":"Plugin","twversion":"2.2.1","category":"Tagging","description":"Adds a New tiddler button in the tag drop down"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Eric Shulman (~TiddlyTools)","link":"http://www.tiddlytools.com","format":"Script","twversion":"--","category":"Aids for website visitors","description":"Select and display FAQ tiddlers from a droplist, sorted by date."}</data>
<<formTiddler NewPluginTemplate>><data>{"category":"Aids for website visitors","description":"FAQ List lets you compile a list of Frequently Asked Questions and present them in a cascading style for the viewer. Each question is turned into a link that will toggle the view of the answer text. The list can be compiled either from all tiddlers containing a certain tag or from a single tiddler that contains all the needed questions and answers. A pre- 'version 2.0' version is also available.","twversion":"2.0","format":"Plugin","link":"http://www.personal.psu.edu/ach12/tiddlywiki/extensions.htm","author":"Alan Hecht"}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"Alan Hecht","link":"http://www.personal.psu.edu/ach12/tiddlywiki/extensions.htm","format":"Plugin","twversion":"2.0 compatible","category":"Icons","description":"Favicon allows you to stipulate the location of a webpage icon (also known as a favorite icon or favicon) for your TiddlyWiki. The location of the icon is absolute (meaning that you need to give the full URL path, including the \"http:\"). This allows you to use any favicon icon that exists on the Web -- even if it is on a totally different server."}</data>
<<formTiddler NewPluginTemplate>><data>{"author":"? (VisualTW)","lin