Welcome to TiddlyWiki created by Jeremy Ruston, Copyright © 2007 UnaMesa Association
<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
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]];}
.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}
#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}
.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}
.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}
.tiddler .defaultCommand {font-weight:bold;}
.shadow .title {color:[[ColorPalette::TertiaryDark]];}
.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}
.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}
.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}
.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}
.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; width:90%; 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 need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none ! important;}
#displayArea {margin: 1em 1em 0em 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>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<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 [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></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
This article suggests a model for a ~RESTful API usable in a browser without using AJAX and that manage a suffix to request a particular content-type.
This model is implemented has a generic extension to Google Engine webapp. See it in action in ~TiddlyWiki context at [[TiddlyHome|http://TiddlyHome.appspot.com]]
! Resource
The typical [[URI|http://en.wikipedia.org/wiki/URI]] of a resource is :
{{{
{type}s{id}[.{format}]
}}}
like in {{{/tiddlywikis/HowTo.html}}}.
To obtain the list of all resources of a type simply :
{{{
{type}s
}}}
! Membership relation
When the resource is linked to an other resource, especially to explain membership, the URI becomes :
{{{
{parent_type}s{parent_id}{children_type}s{children_id}
}}}
(ex: {{{/tiddlywikis/HowTo/tiddlers/Upload}}} ).
! Basic functions on resource
In RESTful API, the [[CRUD|http:/http://en.wikipedia.org/wiki/CRUD_(acronym)]] basic functions on a persistent resource can be accessed using HTTP methods :
|!HTTP Method|!Function|
|{{{GET {uri_id}}}}|Read {resource_id} |
|{{{PUT {uri_id}}}}|Create or Update {resource_id} |
|{{{DELETE {uri_id}}}}|Delete {resource_id}|
|{{{POST {a_form}}}}|Ask service to Create, Update or Delete some resource using {a_form} |
! API to manage a resource
|!API call|!Application function called|
|{{{GET {type}s}}}|Type.list()|
|{{{GET {type}{id}[.{format}]}}}|id.display[_in_{format}]()|
|~|404|
|{{{PUT {type}s{id}}}}|id.put()|
|{{{DELETE {type}s{id}}}}|id.delete()|
|{{{POST {type}s}}}|Type.create_or_update()|
! ~RESTful extensions for browser
Since methods PUT and DELETE can't easily be activated in a browser (except using AJAX). The query_string part of the URL is used to simulate PUT or DELETE.
On server, the Handler first changes the query_string in the corresponding method :
|! URL with query_string |! API Call |
|{{{GET {type}s{id}?delete}}} |{{{DELETE {type}s{id}}}} |
|{{{GET {type}s{id}?put}}} |{{{PUT {type}s{id}}}} |
|{{{GET {type}s?new}}} |{{{GET {type}s}}} - with an attribut in_form = True |
|{{{GET {type}s{id}?edit}}} |{{{GET {type}s{id}}}} - with an attribut in_form = True |
! Specifying Content-type
To easily specify the content-type required, a suffix is added to the resource like : {{{.html}}}, {{{.xml}}}, {{{.txt}}} {{{.js}}} ...
! Return codes
Finally HTTP Status are used in response to HTTP request. Their normalised meaning are used, sometimes with some restrictive sense in the API context.
|!HTTP Code|!HTTP status message |!API Meaning|
| 200 |OK |Ok |
| 201 |Created |New entity created |
| 400 |Bad Request|The URL can't be processed (Type doesn't exist, bad format requested ...) |
| 401 |Unauthorized|The logged user is not authorized to execute this action|
| 403 |Forbidden|Action is not allowed|
| 404 |Not Found|Resource doesn't exist|
| 405 |Method not allowed|This resource doesn't allow this method (operation)|
| 406 |Not acceptable||
* ''User'' is an extension of Google User with a //username//
* ''User'' owns ''Namespaces''
* ''User'' owns ''Tiddlywikis''
* ''Namespace'' owns ''Tiddlers''
* ''~TiddlyWiki'', in a ''Namespace'', references ''Tiddlers''
Some rules :
* only the owner of an entity (''~TiddlyWiki'', ''Namespace'', ''Tiddler'') can edit it
* a ''Namespace'' (or a ''~TiddlyWiki'') can be //private//.
* only the owner of a private ''Namespace'' (or a ''Tiddlywiki'') can see it
Just as a proof of concept, an iTW is available at http://tiddlyhome.appspot.com/BidiX/tiddlywikis/iTW . The full ~TiddlyWiki is available (in Safari) at http://tiddlyhome.appspot.com/BidiX/tiddlywikis/iTW.html.
[[TiddlyHome|http://tiddlyhome2.bidix.info]] is a hosting service for [[TiddlyWiki|http://www.tiddlywiki.com]]
To learn more on ~TiddlyWiki the starting point is the [[TiddlyWiki site|http://www.tiddlywiki.com]] maintained by [[JeremyRuston|http://www.tiddlywiki.com/#JeremyRuston]] the creator of ~TiddlyWiki.
Then [[TiddlyHome|http://tiddlyhome2.bidix.info]] could become the online home for your ~TiddlyWikis.
! Getting started
# [[Login|http://tiddlyhome2.bidix.info/BidiX/namespaces/TiddlyHome/tiddlers/Login.html]] with your Google account
# [[Create an empty TiddlyWiki]]
# If you already have a ~TiddlyWiki, [[Upload your TiddlyWiki from your local disk]]
# Now you can [[access your TiddlyWiki online|Access your TiddlyWiki online]]
# [[Access it online|Access your TiddlyWiki online]] and [[edit|Tiddler uploaded once it is edited]]
# [[Download to edit in local]]. You will be able [[to Upload it later]]
! To learn more
But there are a lot of other functionalities that you will be able to use when you need them
* Share tiddlers between several ~TiddlyWikis
* Create namespaces to host your Tiddlers
* Publish a blog or an article you have edited in ~TiddlyWiki
* etc.
To be guided, feel free to ask [[BidiX|http://tiddlyhome2.bidix.info/BidiX]].
! Welcome to ~TiddlyHome 2.0 ^^Beta^^
[[TiddlyHome 2.0|/]] is an early alpha Google ~AppEngine hosting service for [[TiddlyWiki|http://www.tiddlywiki.com/]] users.
! Guided tour
*Use [[/BidiX/tiddlywikis|/BidiX/tiddlywikis]] and [[/BidiX/namespaces|/BidiX/namespaces]] to explore
*Use [[/comments|http://tiddlyhome.appspot.com/comments]] to leave comment
* But please [[login|/login]] and try
* ... and stay tuned !
! Your own ~TiddlyWiki at [[TiddlyHome 2.0|/]]
# a google account is required
# [[login|/login]] and set a username for ~TiddlyHome2
# create a new ~TiddlyWiki at {{{/{YourName}/tiddlywikis }}} page
# Optionally, from the new tiddlywiki page, you can Upload a local ~TiddlyWiki
! How it works
!!!! environment
~TiddlyHome2 is a [[Google App Engine|http://code.google.com/appengine/]] application where :
* user authentication is done by Google Account
* authorization and protection are manage by user
* content (tiddlers) are saved in Google Datastore
* conform to the [[TiddlyWiki|http://www.tiddlywiki.com/]] single file paradigm
!!!! The data model:
* User owns Namespaces
* User owns Tiddlywikis
* Namespace owns Tiddlers
* [[TiddlyWiki|http://www.tiddlywiki.com/]], in a Namespace, references Tiddlers
!!!! ~RESTFull Api
* see [[TiddlyHome Restful API|http://tiddlyhome2.bidix.info/BidiX/namespaces/TiddlyHome/tiddlers/TiddlyHome%20Restful%20API.html]] for details
* Then [[TiddlyHome 2.0|/]] could be easily called from an other application
! Welcome to ~TiddlyHome 2.0 ^^Beta^^
[[TiddlyHome 2.0|/]] is an early alpha Google ~AppEngine hosting service for [[TiddlyWiki|http://www.tiddlywiki.com/]] users where :
* tiddlers are store in Datastore
* users are managed by Google Account
! The data model:
* User owns Namespaces
* User owns Tiddlywikis
* Namespace owns Tiddlers
* [[TiddlyWiki|http://www.tiddlywiki.com/]], in a Namespace, references Tiddlers
! ~RESTFul API:
Two basic URL templates:
* /{user_id}/namespaces/{namespace_id}/tiddlers/{tiddler_id}[.suffix]
* /{user_id}/tiddlywikis/{tiddlywiki_id}[.suffix]
! Command:
* /storeTiddler : update a tiddler with [[UploadTiddlerPlugin|http://bidix.appspot.com/BidiX/namespaces/TiddlyHome/tiddlers/UploadTiddlerPlugin]]
* /{user_id}/tiddlywikis/{tiddlywiki_id}?upload : upload a Tiddlywiki file into {tiddlywiki_id}
! Experiment:
* iTW - a ~TiddlyWiki for iPhone available [[/BidiX/tiddlywikis/iTW.html|/BidiX/tiddlywikis/iTW.html]]
! Sandbox:
*Use [[/BidiX/namespaces|/BidiX/namespaces/]] and [[/BidiX/tiddlywikis|/BidiX/tiddlywikis]] to explore
*Use [[/comments|http://tiddlyhome.appspot.com/comments]] to leave comment
* But please login and play with it
* ... and stay tuned !
!Basic
UserName : <<option txtUserName>>
UploadUserName : <<option txtUploadUserName>>
UploadFilename : <<option txtUploadFilename>>
UploadTiddlerStoreUrl : <<option txtUploadTiddlerStoreUrl>>
UploadTiddler: <<option chkUploadTiddler>>
see also AdvancedOptions and [[Tweaks]]
! Welcome to ~TiddlyHome 2.0 ^^Beta^^
[[TiddlyHome 2.0|/]] is an early alpha Google ~AppEngine hosting service for [[TiddlyWiki|http://www.tiddlywiki.com/]] users where :
* tiddlers are store in Datastore
* users are managed by Google Account
! The data model:
* User owns Namespaces
* User owns Tiddlywikis
* Namespace owns Tiddlers
* [[TiddlyWiki|http://www.tiddlywiki.com/]], in a Namespace, references Tiddlers
! ~RESTFul API:
Two basic URL templates:
* /{user_id}/namespaces/{namespace_id}/tiddlers/{tiddler_id}[.suffix]
* /{user_id}/tiddlywikis/{tiddlywiki_id}[.suffix]
! Command:
* /storeTiddler : update a tiddler with [[UploadTiddlerPlugin|http://bidix.appspot.com/BidiX/namespaces/TiddlyHome/tiddlers/UploadTiddlerPlugin]]
* /{user_id}/tiddlywikis/{tiddlywiki_id}?upload : upload a Tiddlywiki file into {tiddlywiki_id}
! Experiment:
* iTW - a ~TiddlyWiki for iPhone available [[/BidiX/tiddlywikis/iTW.html|/BidiX/tiddlywikis/iTW.html]]
! Sandbox:
*Use [[/BidiX/namespaces|/BidiX/namespaces/]] and [[/BidiX/tiddlywikis|/BidiX/tiddlywikis]] to explore
*Use [[/comments|http://tiddlyhome.appspot.com/comments]] to leave comment
* But please login and play with it
* ... and stay tuned !
# --not logged user can't see Tiddlywikis--
# --username of a Tiddler must be a string. When a tiddlywiki is uploaded, the modifier should not change.--
# --Error when unlogged user try to edit a Namespace--
# --Error when a not logged user try to delete--
# --a tiddler edit add a new key of this tiddler in tiddlywiki.tiddlers--
# --if a . (dot) in tiddler title or Tiddlywiki name or Namespace name (in url) the dispatcher is unable to handle (it tries a format)--
# if <tiddlywiki_id>.tiddlers isn't clean (some tiddlers don't exist anymore). Format .html is in error
# <tiddler>.modified could be a string => <tiddlywiki>.xml bugs.
# Bad request when tiddler has a '/' in title
# --Bug in Firefox with external links ????--
Following this [[model|http://tiddlyhome.bidix.info/BidiX/namespaces/TiddlyHome/tiddlers/A%20Model%20for%20a%20RESTful%20API.html]] above the [[TiddlyHome1|http://tiddlyhome2.bidix.info/]] API.
! URI Resources
!! User
* {{{{username}}}}<br>Display the resource {{{{username}}}}
!! Namespace
* {{{{username}/namespaces}}}<br>Namespace container owns by {username}.
* {{{{username}/namespaces{namespace_id}}}} <br>{namespace_id} owns by {username}.
!! Tiddler
* {{{{username}/namespaces{namespace_id}/tiddlers}}} <br>Tiddler container in {namespace_id} owns by {username}.
* {{{{username}/namespaces{namespace_id}/tiddlers{tiddler_id}}}} <br>{tiddler_id} in {namespace_id} owns by {username}.
!! Tiddlywiki
* {{{{username}/tiddlywikis}}}<br>Tiddlywiki container own by {username}.
* {{{{username}/tiddlywikis{tiddlywiki_id}}}} <br>{tiddlywiki_id} owns by {username}.
! Requests to ~TiddlyHome Service
Actually {{{PUT}}} is not implemented.
For now requested content-type (HTTP Request header) are not interpreted. All responses, except when specified, are in {{{Content-type: text/html}}}.
Return code conform to [[model|http://bidix.appspot.com/BidiX/namespaces/TiddlyHome/tiddlers/A%20Model%20for%20a%20RESTful%20API]].
!! User
* {{{GET {username}}}} <br>Return username and mail address.//Need more developments.//
* {{{GET www.google.com/accounts/ServiceLogin?...}}} <br>For now available only from a browser. Redirect to the current page once the login (or logout) is done.
!! Namespace
* {{{GET {username}/namespaces}}} <br>List of Namespace own by {username}.
* {{{POST {username}/namespaces}}} <br>Create or update namespace with these attributes :
**name
**access: 'on' | '/%%/'
**owner_name:
**previous_name: if different from name, previous name is deleted.
**return_url: response redirect to this url
* {{{GET {username}/namespaces?new}}} <br>Return a form that submit a {{{POST {username}/namespaces}}}. This form is empty.
* {{{GET {username}/namespaces{namespace_id}}}} <br>return an HTML page for {namespace_id} details.
* {{{GET {username}/namespaces{namespace_id}?edit}}} <br>Return a form that submit a {{{POST {username}/namespaces}}}. This form is filled with {namespace_id} details.
* {{{DELETE {username}/namespaces{namespace_id}}}} <br>{{{GET {username}/namespaces{namespace_id}?delete}}} <br>Delete {namespace_id}.
!! Tiddlywiki
* {{{GET {username}/tiddlywikis}}} <br>List of Tiddlywiki own by {username}.
* {{{POST {username}/tiddlywikis}}} <br>Create or update tiddlywiki with these attributes :
**name
**namespace_name
**access: 'on' | '/%%/'
**title
**subtitle
**{tiddler_title}: 'on' | '/%%/' (for each tiddler in {namespace_name})
**previous_name: if different from name, previous name is deleted.
**return_url: response redirect to this url
* {{{PUT {username}/tiddlywikis{tiddlywiki_id}?put}}} <br>{{{POST {username}/tiddlywikis{tiddlywiki_id}?put}}} <br>//Not documented//
* {{{GET {username}/tiddlywikis?new}}} <br>Return a form that submit a {{{POST {username}/tiddlywikis}}}. This form is empty.
* {{{GET {username}/tiddlywikis{tiddlywiki_id}}}} <br>return an HTML page for {tiddlywiki_id} details.
* {{{GET {username}/tiddlywikis{tiddlywiki_id}.html}}} <br>return a [[TiddlyWiki|http://www.tiddlywiki.com/]] page for {tiddlywiki_id}.
* {{{GET {username}/tiddlywikis{tiddlywiki_id}.xml}}} <br>return a xml page in RSS format for {tiddlywiki_id}.
* {{{GET {username}/tiddlywikis{tiddlywiki_id}?edit}}} <br>Return a form that submit a {{{POST {username}/tiddlywikis}}}. This form is filled with {tiddlywiki_id} details.
* {{{GET {username}/tiddlywikis{tiddlywiki_id}?upload}}} <br>Return a form that upload a [[TiddlyWiki|http://www.tiddlywiki.com/]] a {{{POST {username}/tiddlywikis{tiddlywiki_id}?put}}}.
* {{{DELETE {username}/tiddlywikis{tiddlywiki_id}}}} <br>{{{GET {username}/tiddlywikis{tiddlywiki_id}?delete}}} <br>Delete {tiddlywiki_id}.
!! Tiddler
* {{{GET {username}/namespaces{namespace_id}/tiddlers}}} <br>List of Tiddler in {namespace_id}.
* {{{POST {username}/namespaces{namespace_id}/tiddlers}}} <br>Create or update a tiddler with these attributes :
**title
**tags
**text
**html: wikified text
**previous_title: if different from title, previous title is deleted.
**return_url: response redirect to this url
* {{{GET {username}/namespaces{namespace_id}/tiddlers?new}}} <br>Return a form that submit a {{{POST {username}/namespaces{namespace_id}/tiddlers}}}. This form is empty.
* {{{GET {username}/namespaces{namespace_id}/tiddlers{tiddler_id}.html}}} <br>return an HTML page {tiddler_id} only with html content for publishing (Tiddlyhomes use this for HomePage and HelpPage).
* {{{GET {username}/namespaces{namespace_id}/tiddlers{tiddler_id}.txt}}} <br>return a text/plain page for {tiddler_id} text.
* {{{GET {username}/namespaces{namespace_id}/tiddlers{tiddler_id}.js}}} <br>return a text/plain page for {tiddler_id} text.
* {{{GET {username}/namespaces{namespace_id}/tiddlers{tiddler_id}.tw}}} <br>return a text/plain page for {tiddler_id} in [[TiddlyWiki|http://www.tiddlywiki.com/]] StoreArea format.
* {{{GET {username}/namespaces{namespace_id}/tiddlers{tiddler_id}?edit}}} <br>Return a form that submit a {{{POST {username}/namespaces{namespace_id}/tiddlers}}}. This form is filled with {tiddler_id} details.
* {{{DELETE {username}/namespaces{namespace_id}/tiddlers{tiddler_id}}}} <br>{{{GET {username}/namespaces{namespace_id}/tiddlers{tiddler_id}?delete}}} <br>Delete {tiddler_id}.
/***
|''Name:''|UploadTiddlerPlugin|
|''Description:''|Upload a tiddler and Update a remote TiddlyWiki |
|''Version:''|1.2.2|
|''Date:''|2008-09-13|
|''Source:''|http://tiddlywiki.bidix.info/#UploadTiddlerPlugin|
|''Usage:''|Uses {{{<<uploadOptions>>}}}<br>with those UploadTiddler Options : <br>chkUploadTiddler: <<option chkUploadTiddler>><br>txtUploadTiddlerStoreUrl: <<option txtUploadTiddlerStoreUrl>><br>chkUploadTiddlerFromFile: <<option chkUploadTiddlerFromFile>>|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''[[License]]:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''CoreVersion:''|2.3.0|
***/
//{{{
version.extensions.UploadTiddlerPlugin = {
major: 1, minor: 2, revision: 2,
date: new Date("2008-09-13"),
source: 'http://tiddlywiki.bidix.info/#UploadTiddlerPlugin',
author: 'BidiX (BidiX (at) bidix (dot) info',
coreVersion: '2.3.0'
};
if (!window.bidix) window.bidix = {}; // bidix namespace
bidix.debugMode = false;
bidix.uploadTiddler = {
messages: {
aboutToSaveTiddler: "About to update tiddler '%0'...",
aboutToRemotelySaveTiddler: "About to REMOTELY update tiddler '%0'...",
storeTiddlerNotFound: "Script store tiddler '%0' not found",
tiddlerSaved: "Tiddler '%0' updated in '%1' using '%2' "
},
upload: function(title,tiddler,oldTitle) {
var callback = function(status,params,responseText,url,xhr) {
if (xhr.status == 404) {
alert(bidix.uploadTiddler.messages.storeTiddlerNotFound.format([url]));
return;
}
if ((bidix.debugMode) || (responseText.indexOf("Debug mode") >= 0 )) {
alert(responseText);
if (responseText.indexOf("Debug mode") >= 0 )
responseText = responseText.substring(responseText.indexOf("\n\n")+2);
} else if (responseText.charAt(0) != '0')
alert(responseText);
else
displayMessage(bidix.uploadTiddler.messages.tiddlerSaved.format([params[0], params[1], params[2]]));
store.setDirty(false);
}
if ((config.options['chkUploadTiddler']) &&
((document.location.toString().substr(0,4) == "http") || config.options['chkUploadTiddlerFromFile'])) {
clearMessage();
if (document.location.toString().substr(0,4) != "http")
displayMessage(bidix.uploadTiddler.messages.aboutToRemotelySaveTiddler.format([title]));
else
displayMessage(bidix.uploadTiddler.messages.aboutToSaveTiddler.format([title]));
var ExtTiddler = null;
var html = null;
if (tiddler) {
ExtTiddler = store.getSaver().externalizeTiddler(store,tiddler);
html = wikifyStatic(tiddler.text,null,tiddler).htmlEncode();
}
var form = "title="+encodeURIComponent(title);
form = form + "&tiddler="+(ExtTiddler?encodeURIComponent(ExtTiddler):'');
form = form + "&html="+(html?encodeURIComponent(html):'');
var filename = (config.options['txtUploadFilename']?config.options['txtUploadFilename']:'index.html');
form = form +"&oldTitle="+encodeURIComponent(oldTitle);
form = form +"&fileName="+encodeURIComponent(filename);
form = form +"&backupDir="+encodeURIComponent(config.options['txtUploadBackupDir']);
form = form +"&user="+encodeURIComponent(config.options['txtUploadUserName']);
form = form +"&password="+encodeURIComponent(config.options['pasUploadPassword']);
form = form +"&uploadir="+encodeURIComponent(config.options['txtUploadDir']);
form = form +"&debug="+encodeURIComponent(0);
var storeScript = (config.options.txtUploadTiddlerStoreUrl
? config.options.txtUploadTiddlerStoreUrl : 'storeTiddler.php');
var r = doHttp("POST",storeScript,form+"\n",'application/x-www-form-urlencoded',
config.options['txtUploadUserName'],config.options['pasUploadPassword'],callback,Array(title,filename, storeScript),null);
}
}
}
TiddlyWiki.prototype.saveTiddler_bidix = TiddlyWiki.prototype.saveTiddler;
TiddlyWiki.prototype.saveTiddler = function(oldTitle,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created) {
var tiddler = TiddlyWiki.prototype.saveTiddler_bidix.apply(this,arguments);
var title = (newTitle?newTitle:oldTitle);
if (oldTitle == title)
oldTitle = '';
bidix.uploadTiddler.upload(title, tiddler, oldTitle);
}
TiddlyWiki.prototype.removeTiddler_bidix =TiddlyWiki.prototype.removeTiddler;
TiddlyWiki.prototype.removeTiddler = function(title) {
TiddlyWiki.prototype.removeTiddler_bidix.apply(this,arguments);
bidix.uploadTiddler.upload(title, null);
}
//
// Initializations
//
bidix.initOption = function(name,value) {
if (!config.options[name])
config.options[name] = value;
};
// styleSheet
setStylesheet('.txtUploadTiddlerStoreUrl {width: 22em;}',"uploadTiddlerPluginStyles");
//optionsDesc
merge(config.optionsDesc,{
txtUploadTiddlerStoreUrl: "Url of the UploadTiddlerService script (default: storeTiddler.php)",
chkUploadTiddler: "Do per Tiddler upload using txtUploadTiddlerStoreUrl (default: false)",
chkUploadTiddlerFromFile: "Upload tiddler even if TiddlyWiki is located on local file (default: false)"
});
// Options Initializations
bidix.initOption('txtUploadTiddlerStoreUrl','');
bidix.initOption('chkUploadTiddler','');
bidix.initOption('chkUploadTiddlerFromFile','');
// add options in backstage UploadOptions
if (config.macros.uploadOptions) {
if (config.macros.uploadOptions.options) {
config.macros.uploadOptions.options.push("txtUploadTiddlerStoreUrl","chkUploadTiddler", "chkUploadTiddlerFromFile");
}
}
//}}}
* cgi.escape of tiddler.text in tiddler.displayInStoreArea
* redirectAll of BidiX to TiddlyHome
* title and shadow tiddlers updated in html template from TiddlyWiki entity
* markup blocks updated in html template with corresponding tiddlers
* iTW is working
* extend tiddler title with {{{ {tiddlywiki_name}::}}} to get it private for a tiddlywiki
* html_escape and html_unescape use xml.sax.saxutils library
* Correction de html_unescape: ajout de """
* ?download
* remove logging for each imported tiddler
! 2008-05-30
# Ticket 3
! 2008-05-29
# decode('utf-8') on uploaded file
# some css tweaks
! 2008-05-28
# .txt and .js for tiddler
# Home page in a tiddler
# .html for tiddler
! 2008-05-27
# Access to public tiddlywiki by not logged user bug (Ticket 1)
# Ticket 1 : Access to public tiddlywiki by not logged user bug
# .txt and .js for tiddler
# Home page in a tiddler
# .html for tiddler
# decode('utf-8') on uploaded file
# some css tweaks
# Ticket 3 : Error when unlogged user try to edit a Namespace
#UploadTiddlerPlugin 1.2.0
## Upload a new html field with a rendered format using core wikifyStatic
#Tiddler
## optionnal attribut html
# manage <tiddlywiki_id>.xml
# use tiddler.html for .html tiddler format
# use ~TiddlyWiki format to manage [[TiddlyHome|http://bidix.appspot.com/]] site
## HomePage
## News
## Help
## Feed
# presentation (CSS)
## Traditional ul/li
</tiddlywiki_id>
# Ticket 5 : a tiddler edit add a new key of this tiddler in tiddlywiki.tiddlers
# bug in <tiddlywiki>.xml</tiddlywiki>
# Better Tiddler presentation
# Code refactoring
# Change all urls from /<type>/<type_id> to /<type>s/<type_id>
* redirect permanently /BidiX/tiddlywiki/feed.xml to /BidiX/tiddlywikis/feed.xml
# Refactoring of send_page
# presentation enhancement
# Ticket 6 : if a . (dot) in tiddler title or Tiddlywiki name or Namespace name (in url) the dispatcher is unable to handle (it tries a format)
# install HelpHandler
# Refactoring of send_page
# presentation enhancement
# Ticket 6 : if a . (dot) in tiddler title or Tiddlywiki name or Namespace name (in url) the dispatcher is unable to handle (it tries a format)
# install HelpHandler
# Ticket 2 username of a Tiddler must be a string. When a tiddlywiki is uploaded, the modifier should not change.
# Don't display user's email address if current_user not logged.
# Sort tiddler :
## by Date in <tiddlywiki_id>.xml
## by Title in <tiddlywiki_id> and <namespace_id>
# Modifer is now a String not a User
# When a Namespace is deleted : Tiddlers and TiddlyWikis are deleted
# <tiddlywiki>.xml sorted by modifier
* SiteTitle, SiteSubitle and SiteUrl Shadow tiddlers filled with <tiddlywiki> attributes
* html header filled with <tiddlywiki> attributes
* zzTiddlyHomeTweaks and StoreTiddlerPlugin added to new TiddlyWiki
//{{{
config.options. chkOpenInNewWindow = false;
//}}}