Background: #fff Foreground: #000 PrimaryPale: #8cf PrimaryLight: #18f PrimaryMid: #04b PrimaryDark: #014 SecondaryPale: #ffc SecondaryLight: #fe8 SecondaryMid: #db4 SecondaryDark: #841 TertiaryPale: #eee TertiaryLight: #ccc TertiaryMid: #999 TertiaryDark: #666 Error: #f88
<!--{{{--> <div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div> <div class='title' macro='view title'></div> <div class='editor' macro='edit title'></div> <div macro='annotations'></div> <div class='editor' macro='edit text'></div> <div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div> <!--}}}-->
When getting started, you may want to: * Set your username for signing your edits: <<option txtUserName>> * Change the page [[title|SiteTitle]] (now "<<tiddler SiteTitle>>") and [[subtitle|SiteSubtitle]] (now "<<tiddler SiteSubtitle>>"); they also set the browser tab title * Create a tiddler where your content "starts" ** Use the button on the sidebar or [[link|My first tiddler]] it here, follow the link, edit, and click "done" ** It will be shown in the Timeline (usually on the right), but you may want to link it in the MainMenu (usually on the left) ** and/or make it open when the ~TiddlyWiki is opened by editing the list of [[DefaultTiddlers]] (separate links with spaces or linebreaks) * Save your ~TiddlyWiki ** Although "download saving" works in any browser, it's not that convenient, so you'll probably want to use [[a dedicated saver|https://classic.tiddlywiki.com/#%5B%5BSetting up saving%5D%5D]]
<<importTiddlers>>
<!--{{{--> <link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' /> <!--}}}-->
These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser Your username for signing your edits. Write it as a [[WikiWord]] (eg [[JoeBloggs]]) <<option txtUserName>> <<option chkSaveBackups>> [[SaveBackups]] <<option chkAutoSave>> [[AutoSave]] <<option chkRegExpSearch>> [[RegExpSearch]] <<option chkCaseSensitiveSearch>> [[CaseSensitiveSearch]] <<option chkAnimate>> [[EnableAnimations]] ---- Also see [[AdvancedOptions]]
<!--{{{--> <div class='header' role='banner'> <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' role='navigation' refresh='content' tiddler='MainMenu'></div> <div id='sidebar'> <div id='sidebarOptions' role='navigation' refresh='content' tiddler='SideBarOptions'></div> <div id='sidebarTabs' role='complementary' refresh='content' force='true' tiddler='SideBarTabs'></div> </div> <div id='displayArea' role='main'> <div id='messageArea'></div> <div id='tiddlerDisplay'></div> </div> <!--}}}-->
/*{{{*/ body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];} a {color:[[ColorPalette::PrimaryMid]];} a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];} a img {border:0;} h1, h2, h3, h4, h5, h6 { color: [[ColorPalette::SecondaryDark]]; } h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];} h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];} .txtOptionInput {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];} .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: -moz-linear-gradient(to bottom, [[ColorPalette::PrimaryLight]], [[ColorPalette::PrimaryMid]]); background: linear-gradient(to bottom, [[ColorPalette::PrimaryLight]], [[ColorPalette::PrimaryMid]]); } .header a:hover {background:transparent;} .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::Foreground]]; background:[[ColorPalette::Background]]; 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 {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]]; } .wizard__title { color:[[ColorPalette::PrimaryDark]]; border:none; } .wizard__subtitle { color:[[ColorPalette::Foreground]]; border:none; } .wizardStep { background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]]; } .wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];} .wizardFooter {background:[[ColorPalette::PrimaryPale]];} .wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];} .wizardFooter .status a { color: [[ColorPalette::PrimaryPale]]; } .wizard .button { color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid; border-color:[[ColorPalette::SecondaryDark]]; } .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 { background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; box-shadow: 1px 2px 5px [[ColorPalette::TertiaryMid]]; } .messageToolbar__button { color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none; } .messageToolbar__button_withIcon { background:inherit; } .messageToolbar__button_withIcon:active { background:inherit; border:none; } .tw-icon line { stroke: [[ColorPalette::TertiaryDark]]; } .messageToolbar__button:hover .tw-icon line { stroke: [[ColorPalette::Foreground]]; } .popup { background: [[ColorPalette::Background]]; color: [[ColorPalette::TertiaryDark]]; box-shadow: 1px 2px 5px [[ColorPalette::TertiaryMid]]; } .popup li a, .popup li a:visited, .popup li a:hover, .popup li a:active { color:[[ColorPalette::Foreground]]; border: none; } .popup li a:hover { background:[[ColorPalette::SecondaryLight]]; } .popup li a:active { background:[[ColorPalette::SecondaryPale]]; } .popup li.disabled { color:[[ColorPalette::TertiaryMid]]; } .popupHighlight {color:[[ColorPalette::Foreground]];} .popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;} .listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];} .popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];} .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: 2px solid [[ColorPalette::TertiaryPale]]; } .selected .tagging, .selected .tagged { border: 2px solid [[ColorPalette::TertiaryLight]]; } .tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];} .tagging .button, .tagged .button { border:none; } .footer {color:[[ColorPalette::TertiaryLight]];} .selected .footer {color:[[ColorPalette::TertiaryMid]];} .error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];} .warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];} .lowlight {background:[[ColorPalette::TertiaryLight]];} .zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];} .imageLink, #displayArea .imageLink {background:transparent;} .annotation { background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; } .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 th, .viewer thead td, .twtable th, .twtable thead td { background: [[ColorPalette::SecondaryMid]]; color: [[ColorPalette::Background]]; } .viewer td, .viewer tr, .twtable td, .twtable tr { border: 1px solid [[ColorPalette::TertiaryLight]]; } .twtable caption { color: [[ColorPalette::TertiaryMid]]; } .viewer pre {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]]; background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];} .editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%; background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];} .editorFooter {color:[[ColorPalette::TertiaryMid]];} .readOnly {background:[[ColorPalette::TertiaryPale]];} #backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];} #backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;} #backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; } #backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];} #backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;} #backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;} #backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];} .backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];} .backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];} #backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:alpha(opacity=60);} /*}}}*/
/*{{{*/ body { font-size:.75em; font-family:arial,helvetica,sans-serif; margin:0; padding:0; } * html .tiddler {height:1%;} 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;} 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; border-width: 1px; } #contentWrapper .chkOptionInput {border:0;} .indent {margin-left:3em;} .outdent {margin-left:3em; text-indent:-3em;} code.escaped {white-space:nowrap;} a {text-decoration:none;} .externalLink {text-decoration:underline;} .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;} .headerShadow {position:relative; padding:3em 0 1em 1em; left:-1px; top:-1px;} .headerForeground {position:absolute; padding:3em 0 1em 1em; left:0; top:0;} .siteTitle {font-size:3em;} .siteSubtitle {font-size:1.2em;} #mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;} #sidebar {position:absolute; right:3px; width:16em; font-size:.9em;} #sidebarOptions {padding-top:0.3em;} #sidebarOptions a {margin:0 0.2em; padding:0.2em 0.3em; display:block;} #sidebarOptions input {margin:0.4em 0.5em;} #sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;} #sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;} #sidebarOptions .sliderPanel input {margin:0 0 0.3em 0;} #sidebarTabs .tabContents {width:15em; overflow:hidden;} .wizard { padding:0.1em 2em 0; } .wizard__title { font-size:2em; } .wizard__subtitle { font-size:1.2em; } .wizard__title, .wizard__subtitle { font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em; } .wizardStep { padding:1em; } .wizardFooter { padding: 0.8em 0; } .wizardFooter .status { display: inline-block; line-height: 1.5; padding: 0.3em 1em; } .wizardFooter .button { margin:0.5em 0 0; font-size:1.2em; padding:0.2em 0.5em; } #messageArea { position:fixed; top:2em; right:0; margin:0.5em; padding:0.7em 1em; z-index:2000; } .messageToolbar { text-align:right; padding:0.2em 0; } .messageToolbar__button { text-decoration:underline; } .messageToolbar__button_withIcon { display: inline-block; } .tw-icon { height: 1em; width: 1em; } /* width for IE */ .tw-icon line { stroke-width: 1; stroke-linecap: round; } .messageArea__text a { text-decoration:underline; } .popup {position:absolute; z-index:300; font-size:.9em; padding:0.3em 0; list-style:none; margin:0;} .popup .popupMessage, .popup li.disabled, .popup li a { padding: 0.3em 0.7em; } .popup li a {display:block; font-weight:normal; cursor:pointer;} .popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0;} .listBreak {font-size:1px; line-height:1px;} .listBreak div {margin:2px 0;} .tiddlerPopupButton {padding:0.2em;} .popupTiddler {position: absolute; z-index:300; padding:1em; margin:0;} .tabset {padding:1em 0 0 0.5em;} .tab {display: inline-block; white-space: nowrap; position: relative; bottom: -0.7px; margin: 0 0.25em 0 0; padding:0.2em;} .tabContents {padding:0.5em;} .tabContents ul, .tabContents ol {margin:0; padding:0;} .txtMainTab .tabContents li {list-style:none;} .tabContents li.listLink { margin-left:.75em;} #contentWrapper {display:block;} #splashScreen {display:none;} #displayArea {margin:1em 17em 0 14em;} .toolbar {text-align:right; font-size:.9em;} .tiddler { padding: 1em; } .title { font-size: 1.6em; font-weight: bold; } .subtitle { font-size: 1.1em; } .missing .viewer, .missing .title { font-style: italic; } .missing .subtitle { display: none; } .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;} .tagged li, .tagging li { margin: 0.3em 0; } .tagClear {clear:both;} .footer {font-size:.9em;} .footer li {display:inline;} .annotation { padding: 0.5em 0.8em; margin: 0.5em 1px; } .viewer {line-height:1.4em; padding-top:0.5em;} .viewer .button {margin:0 0.25em; padding:0 0.25em;} .viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;} .viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;} .viewer table, table.twtable { border-collapse: collapse; margin: 0.8em 0; } .viewer th, .viewer td, .viewer tr, .viewer caption, .twtable th, .twtable td, .twtable tr, .twtable caption { padding: 0.2em 0.4em; } .twtable caption { font-size: 0.9em; } table.listView { margin: 0.8em 1.0em; } table.listView th, table.listView td, table.listView tr { text-align: left; } .listView > thead { position: sticky; top: 0; } * html .viewer pre {width:99%; padding:0 0 1em 0;} .viewer pre {padding:0.5em; overflow:auto;} pre, code { font-family: monospace, monospace; font-size: 1em; } .viewer pre, .viewer code { line-height: 1.4em; } .editor {font-size:1.1em; line-height:1.4em;} .editor input, .editor textarea {display:block; width:100%; box-sizing: border-box; font:inherit;} .editorFooter {padding:0.25em 0; font-size:.9em;} .editorFooter .button {padding-top:0; padding-bottom:0;} .fieldsetFix {border:0; padding:0; margin:1px 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;} #backstageToolbar {position:relative;} #backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em;} #backstageButton {display:none; position:absolute; z-index:175; top:0; right:0;} #backstageButton a {padding: 0.3em 0.5em; display: inline-block;} #backstage {position:relative; width:100%; z-index:50;} #backstagePanel { display:none; z-index:100; position:absolute; width:90%; margin:0 5%; } .backstagePanelFooter {padding-top:0.2em; float:right;} .backstagePanelFooter a {padding:0.2em 0.4em;} #backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;} .whenBackstage {display:none;} .backstageVisible .whenBackstage {display:block;} /*}}}*/
/*** StyleSheet for use when a translation requires any css style changes. This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes. ***/ /*{{{*/ body {font-size:0.8em;} #sidebarOptions {font-size:1.05em;} #sidebarOptions a {font-style:normal;} #sidebarOptions .sliderPanel {font-size:0.95em;} .subtitle {font-size:0.8em;} .viewer table.listView {font-size:0.95em;} /*}}}*/
/*{{{*/ @media print { #mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea { display: none !important; } #displayArea { margin: 1em 1em 0em; } } /*}}}*/
<!--{{{--> <div class='toolbar' role='navigation' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div> <div class='title' macro='view title'></div> <div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div> <div class='tagging' macro='tagging'></div> <div class='tagged' macro='tags'></div> <div class='viewer' macro='view text wikified'></div> <div class='tagClear'></div> <!--}}}-->
[[Tiddlyhost|https://tiddlyhost.com]] is a hosting service for ~TiddlyWiki.
no
/*** |Name |ThostUploadPlugin | |Description |Support saving to Tiddlyhost.com | |Version |1.0.1 | |Date |March 06, 2021 | |Source |https://github.com/tiddlyhost/tiddlyhost-com/tree/main/rails/tw_content/plugins | |Author |BidiX, Simon Baird, Yakov Litvin | |License |BSD open source license | |~CoreVersion |2.9.2 | ***/ //{{{ version.extensions.ThostUploadPlugin = { major: 1, minor: 0, revision: 1 }; // // Environment // if (!window.bidix) window.bidix = {}; // To change these defaults, create a tiddler named "ThostOptions" with tag // "systemConfig" and the following content: // window.bidix = { "editModeAlways": false, "uploadButtonAlways": false }; // Set false if you want the chkHttpReadOnly cookie to decide whether to // render in read-only mode or edit mode when you're not logged in or when // the site is being viewed by others. Default true. if (!("editModeAlways" in bidix)) { bidix.editModeAlways = true; } // Set false to hide the "upload to tiddlyhost" button when you're not logged // in or when the site is being viewed by others. Default true. if (!("uploadButtonAlways" in bidix)) { bidix.uploadButtonAlways = true; } // For debugging. Default false. if (!("debugMode" in bidix)) { bidix.debugMode = false; } // // Upload Macro // config.macros.thostUpload = { handler: function(place,macroName,params) { createTiddlyButton(place, "save to tiddlyhost", "save this TiddlyWiki to a site on Tiddlyhost.com", this.action, null, null, this.accessKey); }, action: function(params) { var siteName = config.options.txtThostSiteName.trim(); if (!siteName) { alert("Tiddlyhost site name is missing!"); clearMessage(); } else { bidix.thostUpload.uploadChanges('https://' + siteName + '.tiddlyhost.com'); } return false; } }; // // Upload functions // if (!bidix.thostUpload) bidix.thostUpload = {}; if (!bidix.thostUpload.messages) bidix.thostUpload.messages = { invalidFileError: "The original file '%0' does not appear to be a valid TiddlyWiki", mainSaved: "Main TiddlyWiki file uploaded", mainFailed: "Failed to upload main TiddlyWiki file. Your changes have not been saved", loadOriginalHttpPostError: "Can't get original file", aboutToSaveOnHttpPost: 'About to upload on %0 ...', storePhpNotFound: "The store script '%0' was not found." }; bidix.thostUpload.uploadChanges = function(storeUrl) { var callback = function(status, uploadParams, original, url, xhr) { if (!status) { displayMessage(bidix.thostUpload.messages.loadOriginalHttpPostError); return; } if (bidix.debugMode) { alert(original.substr(0,500)+"\n..."); } var posDiv = locateStoreArea(original); if ((posDiv[0] == -1) || (posDiv[1] == -1)) { alert(config.messages.invalidFileError.format([localPath])); return; } bidix.thostUpload.uploadMain(uploadParams, original, posDiv); }; clearMessage(); // get original var uploadParams = [storeUrl]; var originalPath = document.location.toString(); var dest = 'index.html'; displayMessage(bidix.thostUpload.messages.aboutToSaveOnHttpPost.format([dest])); if (bidix.debugMode) { alert("about to execute Http - GET on "+originalPath); } var r = doHttp("GET", originalPath, null, null, null, null, callback, uploadParams, null); if (typeof r == "string") { displayMessage(r); } return r; }; bidix.thostUpload.uploadMain = function(uploadParams, original, posDiv) { var callback = function(status, params, responseText, url, xhr) { if (status) { displayMessage(bidix.thostUpload.messages.mainSaved); store.setDirty(false); } else { alert(bidix.thostUpload.messages.mainFailed); displayMessage(bidix.thostUpload.messages.mainFailed); } }; var revised = updateOriginal(original, posDiv); bidix.thostUpload.httpUpload(uploadParams, revised, callback, uploadParams); }; bidix.thostUpload.httpUpload = function(uploadParams, data, callback, params) { var localCallback = function(status, params, responseText, url, xhr) { if (xhr.status == 404) { alert(bidix.thostUpload.messages.storePhpNotFound.format([url])); } var saveNotOk = responseText.charAt(0) != '0'; if (bidix.debugMode || saveNotOk) { alert(responseText); } if (saveNotOk) { status = null; } callback(status, params, responseText, url, xhr); }; // do httpUpload var boundary = "---------------------------"+"AaB03x"; var uploadFormName = "UploadPlugin"; // compose headers data var sheader = ""; sheader += "--" + boundary + "\r\nContent-disposition: form-data; name=\""; sheader += uploadFormName +"\"\r\n\r\n"; sheader += "backupDir=x" + ";user=x" + ";password=x" + ";uploaddir=x"; if (bidix.debugMode) { sheader += ";debug=1"; } sheader += ";;\r\n"; sheader += "\r\n" + "--" + boundary + "\r\n"; sheader += "Content-disposition: form-data; name=\"userfile\"; filename=\"index.html\"\r\n"; sheader += "Content-Type: text/html;charset=UTF-8" + "\r\n"; sheader += "Content-Length: " + data.length + "\r\n\r\n"; // compose trailer data var strailer = ""; strailer = "\r\n--" + boundary + "--\r\n"; data = sheader + data + strailer; if (bidix.debugMode) { alert("about to execute Http - POST on " + uploadParams[0]+ "\n with \n" + data.substr(0,500) + " ... "); } var r = doHttp("POST", uploadParams[0], data, "multipart/form-data; ;charset=UTF-8; boundary=" + boundary, 'x','x', localCallback, params, null); if (typeof r == "string") { displayMessage(r); } return r; }; // a fix for versions before 2.9.2 (updateOriginal used conversions irrelevant for Tiddlyhost) convertUnicodeToFileFormat = function(s) { return s }; // // Site config // bidix.initOption = function(name,value) { if (!config.options[name]) { config.options[name] = value; } }; merge(config.optionsDesc, { txtThostSiteName: "Site name for uploads to Tiddlyhost.com", }); bidix.initOption('txtThostSiteName','tothecore'); // // Tiddlyhost stuff // bidix.ownerLoggedIn = (config.shadowTiddlers.TiddlyHostIsLoggedIn && config.shadowTiddlers.TiddlyHostIsLoggedIn == "yes") if (bidix.editModeAlways || bidix.ownerLoggedIn) { // If user is logged in to Tiddlyhost and viewing their own site then // we disregard the original value of the chkHttpReadOnly cookie config.options.chkHttpReadOnly = false // window.readOnly gets set before plugins are loaded, so we need to // set it here to make sure TW is editable, unlike window.showBackstage // which is set after window.readOnly = false } if (bidix.uploadButtonAlways || bidix.ownerLoggedIn) { // Add the 'save to tiddlyhost' button after the regular save button config.shadowTiddlers.SideBarOptions = config.shadowTiddlers.SideBarOptions .replace(/(<<saveChanges>>)/,"$1<<thostUpload>>"); } //}}}