<!--{{{--> <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]];} #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 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 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
<<importTiddlers>>
{{{ changeset: 83:4e9381f267dd tag: tip user: root@dachary.org date: Tue Apr 08 12:47:28 2008 +0000 summary: change strategy to handle POST-SCRIPT because the POST-BODY markup still exists in tw 2.3 and above changeset: 82:cf485fdcffcd user: root@dachary.org date: Tue Apr 08 11:55:27 2008 +0000 summary: release 0.5.2 changeset: 81:e5570f66cb28 user: root@dachary.org date: Tue Apr 08 11:55:04 2008 +0000 summary: mercurial mode changeset: 80:2a02c869b05c user: root@dachary.org date: Tue Apr 08 11:53:58 2008 +0000 summary: POST-SCRIPT in tw-2.3 changeset: 79:dcebcc967e8c user: root@dachary.org date: Sun Apr 06 22:27:44 2008 +0000 summary: housekeeping changeset: 78:7cb04b9486b9 user: root@dachary.org date: Sun Apr 06 22:27:26 2008 +0000 summary: release 0.5.1 because 0.5.0 failed (network failure on rubyforge ?) changeset: 77:5e92b7ebcd70 user: root@dachary.org date: Fri Apr 04 14:17:09 2008 +0000 summary: update plugin name changeset: 76:b1a11d62dce4 user: root@dachary.org date: Fri Apr 04 14:04:08 2008 +0000 summary: upgrade website to tw-2.3 and newer davplugin changeset: 75:fb74e9bc08d4 user: root@dachary.org date: Fri Apr 04 13:42:01 2008 +0000 summary: update documentation changeset: 74:0dc051395239 user: root@dachary.org date: Fri Apr 04 13:36:13 2008 +0000 summary: update documentation for 0.5.0 changeset: 73:dddb2fc4bbca user: root@dachary.org date: Fri Apr 04 13:01:52 2008 +0000 summary: 0.5.0 release ready changeset: 72:7290595266bb user: root@dachary.org date: Fri Apr 04 12:59:23 2008 +0000 summary: documentation for lang support changeset: 71:86e046e659af user: root@dachary.org date: Fri Apr 04 12:52:12 2008 +0000 summary: test file for tw 2.3 changeset: 70:301346066b75 user: root@dachary.org date: Fri Apr 04 10:36:24 2008 +0000 summary: update lang tags changeset: 69:7c7f3d279c28 user: root@dachary.org date: Fri Apr 04 07:11:49 2008 +0000 summary: test tw-2.3 version detection changeset: 68:e635348a3352 user: root@dachary.org date: Thu Apr 03 15:43:32 2008 +0000 summary: generate index.html with website_generate target changeset: 67:dd3534267e3c user: root@dachary.org date: Thu Apr 03 15:36:56 2008 +0000 summary: copy Markup* tiddlers to the corresponding zone in the tiddlywiki changeset: 66:740b082f235a user: loic@dachary.org date: Thu Apr 03 09:29:57 2008 +0000 summary: apt-get install ruby-elisp changeset: 65:47688556400d user: root@dachary.org date: Thu Apr 03 09:29:16 2008 +0000 summary: bump to version 0.5.0 changeset: 64:3544bb17985c user: root@dachary.org date: Thu Apr 03 08:58:43 2008 +0000 summary: fix invalid regexp including { changeset: 63:13476d79f633 user: root@dachary.org date: Thu Apr 03 08:44:20 2008 +0000 summary: update SimonBaird work local copy changeset: 62:dfdfb30ccb97 user: root@dachary.org date: Mon Mar 31 21:08:17 2008 +0000 summary: sync with SimonBaird version : systemServer replaces contentPublisher changeset: 61:73d453e23b5d user: root@dachary.org date: Sun Mar 30 21:29:40 2008 +0000 summary: release information and web site changeset: 60:4177e4981005 user: root@dachary.org date: Sun Mar 30 21:18:27 2008 +0000 summary: remove extra SimonBaird files changeset: 59:6751afe5b8e2 user: root@dachary.org date: Sun Mar 30 20:58:00 2008 +0000 summary: tw 2.3 to 2.9 compatibility changeset: 58:ae33b65eec70 user: loic@dachary.org date: Thu Aug 23 08:27:13 2007 +0000 summary: apt-get install mercurial changeset: 57:e76698c86930 user: loic@dachary.org date: Thu Aug 23 08:27:05 2007 +0000 summary: housekeeping changeset: 56:d37c72580486 user: root@dachary.org date: Tue Jul 31 13:01:15 2007 +0000 summary: submit r4tw patches to Saq and Simon for review changeset: 55:830b78e265e1 user: root@dachary.org date: Tue Jul 31 12:22:17 2007 +0000 summary: svn SimonBaird repository changeset: 54:2ebeba135963 user: loic@dachary.org date: Tue Jul 31 12:16:31 2007 +0000 summary: apt-get install subversion changeset: 53:ee9dd972c4a0 user: root@dachary.org date: Tue Jul 24 13:57:00 2007 +0000 summary: get rid of generated files changeset: 52:180404d89a80 user: loic@dachary.org date: Tue Jul 24 13:55:42 2007 +0000 summary: apt-get install rsync changeset: 51:204669ec790d user: root@dachary.org date: Tue Jul 24 13:53:48 2007 +0000 summary: remove coverage changeset: 50:8b54c966d79d user: loic@dachary.org date: Tue Jul 24 13:51:11 2007 +0000 summary: apt-get install rcov changeset: 49:25afb105a749 user: root@dachary.org date: Tue Jul 24 13:50:09 2007 +0000 summary: fix 2.1 recognition problem changeset: 48:7f071baa6f7e user: root@dachary.org date: Mon Jul 23 16:10:09 2007 +0000 summary: no PAM auth changeset: 47:7cd73c771bfd user: root@dachary.org date: Mon Jul 23 15:56:13 2007 +0000 summary: invite luc.milland@laposte.net changeset: 46:909759621db1 user: loic@dachary.org date: Mon Jul 23 15:51:14 2007 +0000 summary: apt-get install openssh-server changeset: 45:7cdd19be13fc user: root@dachary.org date: Mon Jul 23 14:58:36 2007 +0000 summary: remove temporary files changeset: 44:74731615b9cd user: loic@dachary.org date: Mon Jul 23 14:58:13 2007 +0000 summary: apt-get install sudo changeset: 43:cddc2c771e88 user: loic@dachary.org date: Mon Jul 23 14:56:05 2007 +0000 summary: apt-get install rake changeset: 42:7bf44ccba11e user: loic@dachary.org date: Mon Jul 23 14:42:44 2007 +0000 summary: apt-get install emacs21-nox changeset: 41:ea928f83e078 user: root@dachary.org date: Mon Jul 23 14:42:09 2007 +0000 summary: command history created changeset: 40:0f775ff2e6fe user: loic@dachary.org date: Mon Jul 23 14:38:27 2007 +0000 summary: apt-get install rubygems changeset: 39:5b0d6b85f533 user: root@dachary.org date: Mon Jul 23 14:36:08 2007 +0000 summary: import rubyforge private settings intentionaly made public changeset: 38:7d97e5f6b9c5 user: root@dachary.org date: Mon Jul 23 14:29:56 2007 +0000 summary: link to generated tiddlywikicp home page changeset: 37:e9faf96cb6e2 user: root@dachary.org date: Mon Jul 23 14:27:15 2007 +0000 summary: link to generated tiddlywikicp home page changeset: 36:acf78c0f0c57 user: root@dachary.org date: Mon Jul 23 14:26:36 2007 +0000 summary: do not use stock tiddlywiki home page changeset: 35:b7d341c0d93e parent: 4:924d89ad7a19 parent: 34:dbddfebc9385 user: root@dachary.org date: Mon Jul 23 14:25:23 2007 +0000 summary: pull tiddlywikicp development environment changeset: 34:dbddfebc9385 user: root@dachary.org date: Mon Jul 23 16:21:52 2007 +0200 summary: move to home/www subdir changeset: 33:5b7599029492 user: root@dachary.org date: Sun Jul 22 21:27:19 2007 +0200 summary: add changelog to website changeset: 32:4fe4a301fdfb user: root@dachary.org date: Sun Jul 22 21:18:22 2007 +0200 summary: fix major HTML escaping logic problem changeset: 31:fdcd8116f513 user: root@dachary.org date: Sat Jul 21 19:31:23 2007 +0200 summary: first package published changeset: 30:6225c5fb1bf2 user: root@dachary.org date: Sat Jul 21 18:39:21 2007 +0200 summary: Introduction changeset: 29:ae6e7e676ca3 user: root@dachary.org date: Sat Jul 21 18:33:02 2007 +0200 summary: stub site changeset: 28:c20e9a96ebaa user: root@dachary.org date: Sat Jul 21 18:32:46 2007 +0200 summary: implement ignore backupfiles and SCM files changeset: 27:f97c46f9b77a user: root@dachary.org date: Sat Jul 21 18:13:53 2007 +0200 summary: tiddler2tiddlywiki implementation and tests changeset: 26:409f079da1eb user: root@dachary.org date: Sat Jul 21 18:13:37 2007 +0200 summary: tiddlywiki website changeset: 25:a23a9405c616 user: root@dachary.org date: Sat Jul 21 17:21:19 2007 +0200 summary: complete usage and aliases for tiddler type to file changeset: 24:293b94b6c938 user: root@dachary.org date: Sat Jul 21 16:22:01 2007 +0200 summary: implement --all changeset: 23:f6063aa4247c user: root@dachary.org date: Sat Jul 21 16:17:38 2007 +0200 summary: implement time preservation changeset: 22:1a95e161bde8 user: root@dachary.org date: Sat Jul 21 15:43:46 2007 +0200 summary: do not clear the cache each time read_uri is called changeset: 21:78cbb71abc07 user: root@dachary.org date: Sat Jul 21 15:31:47 2007 +0200 summary: test against argv > 2 is done after expansion changeset: 20:c4a68e334122 user: root@dachary.org date: Sat Jul 21 15:07:23 2007 +0200 summary: use string functions to split url fragments changeset: 19:4a67be41486a user: root@dachary.org date: Sat Jul 21 14:06:11 2007 +0200 summary: first implementation 100% tested changeset: 18:36dfc330051c user: root@dachary.org date: Sat Jul 21 12:25:18 2007 +0200 summary: implement args2from with tests changeset: 17:9fdd8158d09e user: root@dachary.org date: Sat Jul 21 11:00:14 2007 +0200 summary: test helpers are included instead of inherited changeset: 16:3e6d6b581c56 user: root@dachary.org date: Sat Jul 21 10:36:41 2007 +0200 summary: test helpers are included instead of inherited changeset: 15:c34230f8508b user: root@dachary.org date: Sat Jul 21 02:56:45 2007 +0200 summary: 75% tests changeset: 14:671418aee5c3 user: root@dachary.org date: Fri Jul 20 22:59:00 2007 +0200 summary: fix to compile and run test stubs changeset: 13:e7130c15d293 user: root@dachary.org date: Thu Jul 19 23:06:01 2007 +0200 summary: draft implementation changeset: 12:76bfb609451a user: root@dachary.org date: Thu Jul 19 11:54:58 2007 +0200 summary: test puts action changeset: 11:7ba8ec638385 user: root@dachary.org date: Thu Jul 19 11:35:29 2007 +0200 summary: test puts action changeset: 10:6b2ca1329232 user: root@dachary.org date: Thu Jul 19 10:37:28 2007 +0200 summary: upgrade to GPLv3 changeset: 9:508ab2e4b392 user: root@dachary.org date: Thu Jul 19 01:31:17 2007 +0200 summary: options parsing and tiddlywiki predicate changeset: 8:68dd181ffa42 user: root@dachary.org date: Wed Jul 18 21:27:52 2007 +0200 summary: import http://simonbaird.com/r4tw/ changeset: 7:3171d10560d3 user: root@dachary.org date: Wed Jul 18 21:27:23 2007 +0200 summary: define project tiddlywiki_cp changeset: 6:f7bb93667109 user: root@dachary.org date: Wed Jul 18 19:28:02 2007 +0200 summary: import http://simonbaird.com/r4tw/ changeset: 5:5bc877af0761 parent: -1:000000000000 user: root@dachary.org date: Wed Jul 18 18:21:06 2007 +0200 summary: ruby /var/lib/gems/1.8/gems/newgem-0.11.0/bin/newgem -t test::unit tiddlywiki_cp changeset: 4:924d89ad7a19 user: root@dachary.org date: Mon Jul 23 13:35:49 2007 +0000 summary: enable dav_fs changeset: 3:a0699ee4f5f2 user: root@dachary.org date: Mon Jul 23 13:33:45 2007 +0000 summary: DAV Tiddlywiki home page changeset: 2:5790349fdcbf user: loic@dachary.org date: Mon Jul 23 13:33:41 2007 +0000 summary: apt-get install patch changeset: 1:f64648ebc657 user: loic@dachary.org date: Mon Jul 23 13:33:38 2007 +0000 summary: apt-get install apache2 changeset: 0:023c80002a6d user: root@dachary.org date: Mon Jul 23 12:20:46 2007 +0000 summary: initial }}}
/*** |''Name:''|CryptoFunctionsPlugin| |''Description:''|Support for cryptographic functions| ***/ //{{{ if(!version.extensions.CryptoFunctionsPlugin) { version.extensions.CryptoFunctionsPlugin = {installed:true}; //-- //-- Crypto functions and associated conversion routines //-- // Crypto "namespace" function Crypto() {} // Convert a string to an array of big-endian 32-bit words Crypto.strToBe32s = function(str) { var be = Array(); var len = Math.floor(str.length/4); var i, j; for(i=0, j=0; i<len; i++, j+=4) { be[i] = ((str.charCodeAt(j)&0xff) << 24)|((str.charCodeAt(j+1)&0xff) << 16)|((str.charCodeAt(j+2)&0xff) << 8)|(str.charCodeAt(j+3)&0xff); } while (j<str.length) { be[j>>2] |= (str.charCodeAt(j)&0xff)<<(24-(j*8)%32); j++; } return be; }; // Convert an array of big-endian 32-bit words to a string Crypto.be32sToStr = function(be) { var str = ""; for(var i=0;i<be.length*32;i+=8) str += String.fromCharCode((be[i>>5]>>>(24-i%32)) & 0xff); return str; }; // Convert an array of big-endian 32-bit words to a hex string Crypto.be32sToHex = function(be) { var hex = "0123456789ABCDEF"; var str = ""; for(var i=0;i<be.length*4;i++) str += hex.charAt((be[i>>2]>>((3-i%4)*8+4))&0xF) + hex.charAt((be[i>>2]>>((3-i%4)*8))&0xF); return str; }; // Return, in hex, the SHA-1 hash of a string Crypto.hexSha1Str = function(str) { return Crypto.be32sToHex(Crypto.sha1Str(str)); }; // Return the SHA-1 hash of a string Crypto.sha1Str = function(str) { return Crypto.sha1(Crypto.strToBe32s(str),str.length); }; // Calculate the SHA-1 hash of an array of blen bytes of big-endian 32-bit words Crypto.sha1 = function(x,blen) { // Add 32-bit integers, wrapping at 32 bits add32 = function(a,b) { var lsw = (a&0xFFFF)+(b&0xFFFF); var msw = (a>>16)+(b>>16)+(lsw>>16); return (msw<<16)|(lsw&0xFFFF); }; // Add five 32-bit integers, wrapping at 32 bits add32x5 = function(a,b,c,d,e) { var lsw = (a&0xFFFF)+(b&0xFFFF)+(c&0xFFFF)+(d&0xFFFF)+(e&0xFFFF); var msw = (a>>16)+(b>>16)+(c>>16)+(d>>16)+(e>>16)+(lsw>>16); return (msw<<16)|(lsw&0xFFFF); }; // Bitwise rotate left a 32-bit integer by 1 bit rol32 = function(n) { return (n>>>31)|(n<<1); }; var len = blen*8; // Append padding so length in bits is 448 mod 512 x[len>>5] |= 0x80 << (24-len%32); // Append length x[((len+64>>9)<<4)+15] = len; var w = Array(80); var k1 = 0x5A827999; var k2 = 0x6ED9EBA1; var k3 = 0x8F1BBCDC; var k4 = 0xCA62C1D6; var h0 = 0x67452301; var h1 = 0xEFCDAB89; var h2 = 0x98BADCFE; var h3 = 0x10325476; var h4 = 0xC3D2E1F0; for(var i=0;i<x.length;i+=16) { var j,t; var a = h0; var b = h1; var c = h2; var d = h3; var e = h4; for(j = 0;j<16;j++) { w[j] = x[i+j]; t = add32x5(e,(a>>>27)|(a<<5),d^(b&(c^d)),w[j],k1); e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t; } for(j=16;j<20;j++) { w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]); t = add32x5(e,(a>>>27)|(a<<5),d^(b&(c^d)),w[j],k1); e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t; } for(j=20;j<40;j++) { w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]); t = add32x5(e,(a>>>27)|(a<<5),b^c^d,w[j],k2); e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t; } for(j=40;j<60;j++) { w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]); t = add32x5(e,(a>>>27)|(a<<5),(b&c)|(d&(b|c)),w[j],k3); e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t; } for(j=60;j<80;j++) { w[j] = rol32(w[j-3]^w[j-8]^w[j-14]^w[j-16]); t = add32x5(e,(a>>>27)|(a<<5),b^c^d,w[j],k4); e=d; d=c; c=(b>>>2)|(b<<30); b=a; a = t; } h0 = add32(h0,a); h1 = add32(h1,b); h2 = add32(h2,c); h3 = add32(h3,d); h4 = add32(h4,e); } return Array(h0,h1,h2,h3,h4); }; } //}}}
[[Introduction]] [[Usage]]
/*** |''Name:''|DeprecatedFunctionsPlugin| |''Description:''|Support for deprecated functions removed from core| ***/ //{{{ if(!version.extensions.DeprecatedFunctionsPlugin) { version.extensions.DeprecatedFunctionsPlugin = {installed:true}; //-- //-- Deprecated code //-- // @Deprecated: Use createElementAndWikify and this.termRegExp instead config.formatterHelpers.charFormatHelper = function(w) { w.subWikify(createTiddlyElement(w.output,this.element),this.terminator); }; // @Deprecated: Use enclosedTextHelper and this.lookaheadRegExp instead config.formatterHelpers.monospacedByLineHelper = function(w) { var lookaheadRegExp = new RegExp(this.lookahead,"mg"); lookaheadRegExp.lastIndex = w.matchStart; var lookaheadMatch = lookaheadRegExp.exec(w.source); if(lookaheadMatch && lookaheadMatch.index == w.matchStart) { var text = lookaheadMatch[1]; if(config.browser.isIE) text = text.replace(/\n/g,"\r"); createTiddlyElement(w.output,"pre",null,null,text); w.nextMatch = lookaheadRegExp.lastIndex; } }; // @Deprecated: Use <br> or <br /> instead of <<br>> config.macros.br = {}; config.macros.br.handler = function(place) { createTiddlyElement(place,"br"); }; // Find an entry in an array. Returns the array index or null // @Deprecated: Use indexOf instead Array.prototype.find = function(item) { var i = this.indexOf(item); return i == -1 ? null : i; }; // Load a tiddler from an HTML DIV. The caller should make sure to later call Tiddler.changed() // @Deprecated: Use store.getLoader().internalizeTiddler instead Tiddler.prototype.loadFromDiv = function(divRef,title) { return store.getLoader().internalizeTiddler(store,this,title,divRef); }; // Format the text for storage in an HTML DIV // @Deprecated Use store.getSaver().externalizeTiddler instead. Tiddler.prototype.saveToDiv = function() { return store.getSaver().externalizeTiddler(store,this); }; // @Deprecated: Use store.allTiddlersAsHtml() instead function allTiddlersAsHtml() { return store.allTiddlersAsHtml(); } // @Deprecated: Use refreshPageTemplate instead function applyPageTemplate(title) { refreshPageTemplate(title); } // @Deprecated: Use story.displayTiddlers instead function displayTiddlers(srcElement,titles,template,unused1,unused2,animate,unused3) { story.displayTiddlers(srcElement,titles,template,animate); } // @Deprecated: Use story.displayTiddler instead function displayTiddler(srcElement,title,template,unused1,unused2,animate,unused3) { story.displayTiddler(srcElement,title,template,animate); } // @Deprecated: Use functions on right hand side directly instead var createTiddlerPopup = Popup.create; var scrollToTiddlerPopup = Popup.show; var hideTiddlerPopup = Popup.remove; // @Deprecated: Use right hand side directly instead var regexpBackSlashEn = new RegExp("\\\\n","mg"); var regexpBackSlash = new RegExp("\\\\","mg"); var regexpBackSlashEss = new RegExp("\\\\s","mg"); var regexpNewLine = new RegExp("\n","mg"); var regexpCarriageReturn = new RegExp("\r","mg"); } //}}}
a ruby gem (http://rubyforge.org/projects/tiddlywikicp/) providing a library and a command line interface to copy [[tiddlywiki|http://tiddlywiki.com/]] tiddlers to files and vice versa. Installation : gem install tiddlywiki_cp Development is discussed at irc.freenode.net#tiddlywiki This tiddlywiki was created using the following commands: * copy an empty tiddlywiki to a local file {{{ tiddlywiki_cp http://tiddlywiki.com/empty.html website/index.html }}} * copy and install a plugin {{{ tiddlywiki_cp 'http://garden.dachary.org/#WebDavPlugin' website/index.html }}} * copy all tiddlers to a directory {{{ mkdir website/files tiddlywiki_cp -a website/index.html website/files }}} * use regular shell commands to create or update files {{{ ( echo '{{''{' ; RUBYLIB=lib ruby bin/tiddlywiki_cp --help ; echo '}}''}' ) > website/files/Usage.tiddler ( echo '{{''{' ; hg log ; echo '}}''}' ) > website/files/ChangeLog.tiddler }}} * copy all tiddlers in a directory into a tiddlywiki, updating existing ones and adding new ones {{{ cd website ; RUBYLIB=../lib ruby ../bin/tiddlywiki_cp -a files index.html }}} Loic Dachary <mailto:loic@dachary.org>
/*** |''Name:''|LegacyStrikeThroughPlugin| |''Description:''|Support for legacy (pre 2.1) strike through formatting| |''Version:''|1.0.2| |''Date:''|Jul 21, 2006| |''Source:''|http://www.tiddlywiki.com/#LegacyStrikeThroughPlugin| |''Author:''|MartinBudden (mjbudden (at) gmail (dot) com)| |''License:''|[[BSD open source license]]| |''CoreVersion:''|2.1.0| ***/ //{{{ // Ensure that the LegacyStrikeThrough Plugin is only installed once. if(!version.extensions.LegacyStrikeThroughPlugin) { version.extensions.LegacyStrikeThroughPlugin = {installed:true}; config.formatters.push( { name: "legacyStrikeByChar", match: "==", termRegExp: /(==)/mg, element: "strike", handler: config.formatterHelpers.createElementAndWikify }); } //# end of "install only once" //}}}
[[Introduction]] [[Usage]] [[ChangeLog]]
copy tiddlers to files and vice versa
tiddlywiki_cp
/*** |''Name:''|SparklinePlugin| |''Description:''|Sparklines macro| ***/ //{{{ if(!version.extensions.SparklinePlugin) { version.extensions.SparklinePlugin = {installed:true}; //-- //-- Sparklines //-- config.macros.sparkline = {}; config.macros.sparkline.handler = function(place,macroName,params) { var data = []; var min = 0; var max = 0; var v; for(var t=0; t<params.length; t++) { v = parseInt(params[t]); if(v < min) min = v; if(v > max) max = v; data.push(v); } if(data.length < 1) return; var box = createTiddlyElement(place,"span",null,"sparkline",String.fromCharCode(160)); box.title = data.join(","); var w = box.offsetWidth; var h = box.offsetHeight; box.style.paddingRight = (data.length * 2 - w) + "px"; box.style.position = "relative"; for(var d=0; d<data.length; d++) { var tick = document.createElement("img"); tick.border = 0; tick.className = "sparktick"; tick.style.position = "absolute"; tick.src = "data:image/gif,GIF89a%01%00%01%00%91%FF%00%FF%FF%FF%00%00%00%C0%C0%C0%00%00%00!%F9%04%01%00%00%02%00%2C%00%00%00%00%01%00%01%00%40%02%02T%01%00%3B"; tick.style.left = d*2 + "px"; tick.style.width = "2px"; v = Math.floor(((data[d] - min)/(max-min)) * h); tick.style.top = (h-v) + "px"; tick.style.height = v + "px"; box.appendChild(tick); } }; } //}}}
{{{ Usage: tiddlywiki_cp [options] FROM [FROM ...] TO|- -r, --[no-]recursive recurse into directories and tiddlywikies -t, --[no-]times preserve modification time -a, --all implies -rt -i, --include REGEX all files,directories or tiddlers must match regex. If specified multiple times, must match at least one of the regex. Includes are tested after excludes. --exclude REGEX all files,directories or tiddlers must NOT match regex. If specified multiple times, exclude if matches at least one of the regex. Includes are tested after excludes. -v, --[no-]verbose run verbosely -n, --[no-]dry-run show what would have been transferred --version show version --help show command usage Examples: mkdir /tmp/a ; tiddlywiki_cp -a http://tiddlywiki.com/index.html /tmp/a copies index.html tiddlers in separate files and preserve times. For each tiddler, a .div file contains the meta information. The files are named after their content: /tmp/a/HelloThere.tiddler /tmp/a/HelloThere.tiddler.div /tmp/a/Plugin.js /tmp/a/Plugin.js.div /tmp/a/OwnStyle.css /tmp/a/OwnStyle.css.div ... tiddlywiki_cp 'http://tiddlylab.bidix.info/#WebDAVSavingPlugin' tiddlywiki.html copies the WebDAVSavingPlugin tiddler in the existing tiddlywiki.html tiddlywiki_cp http://tiddlywiki.com/index.html /tmp/i.html copies to a local file tiddlywiki_cp -t myplugin.js tiddlywiki.html copies the tiddler in the existing tiddlywiki.html tiddlywiki and use file system modification time tiddlywiki_cp 'http://tiddlylab.bidix.info/#WebDAVSavingPlugin' WebDAVSavingPlugin.js get a local copy of the WebDAVSavingPlugin tiddler mkdir A ; tiddlywiki_cp -a --include 'WebDAV' --include 'RSS' 'http://tiddlylab.bidix.info/' A copy all tiddlers with WebDAV or RSS in the url mkdir A ; tiddlywiki_cp -a --exclude 'SEX' 'http://tiddlylab.bidix.info/' A copy all tiddlers except those with SEX in the url tiddlywiki_cp -a A B C tiddlywiki.html copy all tiddlers found in the A B and C directories to tiddlywiki.html MarkupPreHead, MarkupPostHead, MarkupPreBody, MarkupPostBody tiddlers: When copying to a tiddlywiki file, the content of these tiddlers are copied to the corresponding HTML zones. translations, i18n, l10n, linguo: If a translation plugin such as the one found at http://trac.tiddlywiki.org/wiki/Translations is present, the tiddlywiki to which tiddlers are copied will have its lang and xml:lang attributes updated. Saving the tiddlywiki manually does the same. }}}
/*** |''Name:''|WebDavPlugin| |''Description:''|Allows a TiddlyWiki to be saved to a WebDav server| |''Author:''|Saq Imtiaz ( lewcid@gmail.com )| |''Co-author:''|Loic Dachary| |''Source:''|http://tw.lewcid.org/#WebDavPlugin| |''Code Repository:''|http://tw.lewcid.org/svn/plugins| |''Version:''|1.0| |''Date:''|17/11/2007| |''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]| |''~CoreVersion:''|2.2.3| ***/ // /% //!BEGIN-PLUGIN-CODE DAV = { run : function(type,u,data,cb,params,headers){ var callback = function(status,params,responseText,url,xhr) { url = url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1); if(params.length){ params.shift().apply(this,[status,params,responseText,url,xhr]); } }; params = params||[]; params.unshift(cb); var r = doHttp.apply(this,[type,u,data,null,null,null,callback,params,headers]); if (typeof r == "string") alert(r); return r; }, get : function(url,cb,params){ return DAV.run("GET",url,null,cb,params,null); }, put : function(url,cb,params,data) { return DAV.run("PUT",url,data,cb,params,null); }, move : function(url,cb,params,destination) { return DAV.run("MOVE",url,null,cb,params,{"Destination":destination,"Overwrite":"T"}); }, copy : function(url,cb,params,destination) { return DAV.run("COPY",url,null,cb,params,{"Destination":destination,"Overwrite":"T","Depth":0}); }, propfind : function(url,cb,params,prop,depth){ // !!! var xml = '<?xml version="1.0" encoding="UTF-8" ?>' + '<D:propfind xmlns:D="DAV:">' + '<D:prop>'+ '<D:'+prop+'/>'+ '</D:prop>'+ '</D:propfind>'; return DAV.run("PROPFIND",url,xml,cb,params,{"Content-type":"text/xml","Depth":depth?depth:0}); }, makeDir : function(url,cb,params){ return DAV.run("MKCOL",url,null,cb,params,null); }, options : function(url,cb,params){ return DAV.run("OPTIONS",url,null,cb,params,null); }, safeput : function(url,cb,params,data){ firstcb = function(status,p,responseText,u,xhr){ if(status) DAV.move(u,cb,p,u.replace("-davsavingtemp","")); else cb.apply(firstcb,arguments); }; return DAV.put(url+"-davsavingtemp",firstcb,params,data); } }; config.DavSaver = { defaultFileName : 'index.html', messages : { startSaveMessage : 'saving to server...', endSaveMessage : 'TiddlyWiki successfuly saved to server', overwriteNewerPrompt : 'The remote file has changed since you last loaded or saved it.\nDo you wish to overwrite it?', getModDateError : "Could not get last modified date", raceError: "Save failed because the remote file is newer than the one you are trying to save" }, errors:{ raceconflict : 'The save failed because your file is out of date', getlastmodified : 'The save was aborted because the last modified date of the file could not be retrieved', davenabled : 'The server does not support WebDav', saverss : 'There was an error saving the rss file, the save was aborted', saveempty: 'There was an error saving the empty file, the save was aborted', savemain : 'Save failed! There was an error saving the main TW file', savebackup: 'Save failed! There was an error creating a backup file', makebackupdir: 'Save failed! The backup directory could not be created' }, timestamp: new Date().toGMTString(), orig_saveChanges: saveChanges, saver : null }; DavSaver = function(){ this.Q = []; this.reset = function(){ config.DavSaver.saver = null; }; this.runQ = function(){ if(this.Q.length){ this.Q.shift().apply(this,arguments); } else this.reset(); }; this.posDiv = null; this.original = null; this.getOriginalPath = function(){ var p = document.location.toString(); p = convertUriToUTF8(p,config.options.txtFileSystemCharSet); var argPos = p.indexOf("?"); if(argPos != -1) p = p.substr(0,argPos); var hashPos = p.indexOf("#"); if(hashPos != -1) p = p.substr(0,hashPos); if (p.charAt(p.length-1) == "/") p = p + config.DavSaver.defaultFileName; return p; }; this.originalPath = this.getOriginalPath(); this.backupPath = null; this.emptyPath = null; this.rssPath = null; this.throwError = function(er){ clearMessage(); this.reset(); alert(config.DavSaver.errors[er]); //clear message, reset and delete }; }; DavSaver.prototype.getOriginal = function(){ var callback = function(status,params,original,url,xhr) { var that = params[0]; if(status){ var p = that.posDiv = locateStoreArea(original); if(!p || (p[0] == -1) || (p[1] == -1)) { alert(config.messages.invalidFileError.format([url])); return; } that.original = original; that.runQ(); } else that.throwError('getOriginal'); }; DAV.get(this.originalPath,callback,[this]); }; DavSaver.prototype.checkRace = function(){ var callback = function(status,params,responseText,url,xhr){ var that = params[0]; if(status){ var lastmod = responseText.match(/<(\w*?):getlastmodified>(.*?)<\/\1:getlastmodified>/)[2]; if(Date.parse(lastmod) > Date.parse(config.DavSaver.timestamp)){ if (confirm(config.DavSaver.messages.overwriteNewerPrompt)) that.runQ(); else that.throwError('raceconflict'); } else that.runQ(); } else that.throwError('getlastmodified'); }; DAV.propfind(this.originalPath,callback,[this],"getlastmodified",0); }; DavSaver.prototype.isDavEnabled = function(){ var callback = function(status,params,responseText,url,xhr){ that = params[0]; if(status && !! xhr.getResponseHeader("DAV")){ that.runQ(); } else that.throwError('davenabled'); }; DAV.options(this.originalPath,callback,[this]); }; DavSaver.prototype.saveRss = function(){ var callback = function(status,params,responseText,url,xhr){ var that = params[0]; if(status){ displayMessage(config.messages.rssSaved,that.rssPath); that.runQ(); } else that.throwError('saverss'); }; var u = this.originalPath; var rssPath = this.rssPath = u.substr(0,u.lastIndexOf(".")) + ".xml"; DAV.safeput(rssPath,callback,[this],convertUnicodeToUTF8(generateRss())); }; DavSaver.prototype.saveEmpty = function(){ var callback = function(status,params,responseText,url,xhr){ var that = params[0]; if(status){ displayMessage(config.messages.emptySaved,that.emptyPath); that.runQ(); } else that.throwError('saveempty'); }; var u = this.originalPath; var emptyPath,p; if((p = u.lastIndexOf("/")) != -1) emptyPath = u.substr(0,p) + "/empty.html"; else emptyPath = u + ".empty.html"; this.emptyPath = emptyPath; var empty = this.original.substr(0,this.posDiv[0] + startSaveArea.length) + this.original.substr(this.posDiv[1]); DAV.safeput(emptyPath,callback,[this],empty); }; DavSaver.prototype.saveMain = function(){ var callback = function(status,params,responseText,url,xhr){ var that = params[0]; if(status){ config.DavSaver.timestamp = xhr.getResponseHeader('Date'); displayMessage(config.messages.mainSaved,that.originalPath); store.setDirty(false); that.runQ(); } else that.throwError('savemain'); }; var revised = updateOriginal(this.original,this.posDiv); DAV.safeput(this.originalPath,callback,[this],revised); }; DavSaver.prototype.saveBackup = function(){ var callback = function(status,params,responseText,url,xhr){ var that = params[0]; if(status){ clearMessage(); displayMessage(config.messages.backupSaved,that.backupPath); that.runQ(); } else that.throwError('savebackup'); }; var backupPath = this.backupPath = getBackupPath(this.originalPath); DAV.copy(this.originalPath,callback,[this],this.backupPath); }; DavSaver.prototype.makeBackupDir = function(){ var callback = function(status,params,responseText,url,xhr){ var that = params[0]; if(status) that.runQ(); else that.throwError('makebackupdir'); }; var u = getBackupPath(this.originalPath); var backupDirPath = u.substr(0,u.lastIndexOf("/")); DAV.makeDir(backupDirPath,callback,[this]); }; DavSaver.prototype.save = function(onlyIfDirty,tiddlers){ if(onlyIfDirty && !store.isDirty()) return; clearMessage(); displayMessage(config.DavSaver.messages.startSaveMessage); var Q = this.Q =[]; Q.push(this.isDavEnabled); Q.push(this.getOriginal); Q.push(this.checkRace); if (config.options.chkSaveBackups){ if (config.options.txtBackupFolder!='') Q.push(this.makeBackupDir); Q.push(this.saveBackup); } Q.push(this.saveMain); if (config.options.chkGenerateAnRssFeed) Q.push(this.saveRss); if (config.options.chkSaveEmptyTemplate) Q.push(this.saveEmpty); //Q.push(this.reset); this.runQ(); }; window.saveChanges = function(onlyIfDirty,tiddlers) { var c = config.DavSaver; if (document.location.protocol.toString() == "http:"){ var saver = c.saver = new DavSaver(); saver.save(onlyIfDirty,tiddlers); } else return c.orig_saveChanges(onlyIfDirty,tiddlers); }; //!END-PLUGIN-CODE // %/