Welcome to TiddlyWiki created by Jeremy Ruston; Copyright © 2004-2007 Jeremy Ruston, Copyright © 2007-2011 UnaMesa Association
|Name|~TiddlyFolio|
| Description|Tool to help you manage your passwords and other confidential information; saves data in encrypted form|
| Version|1.1 *** Requires ~FireFox plugin ~TiddlyFox ***|
| Date|<<today>>|
| Source|http://tiddlyfolio.tiddlyspot.com|
| Author|Eats Wombats|
| Email|eatswombats (at) wombatdiet (dot) net|
| License|http://creativecommons.org/licenses/by-sa/3.0/|
''Core:'' Tiddlywiki <<version>> http://www.tiddlywiki.com
''Theme:'' ~K2Blog 1.0 http://tiddlythemes.com/#K2Blog (down on 15 Jan 2013)
To make all tiddlers visible in the Timeline change [[TabTimeline]] and remove
"firstDay:20130117 excludeOnly:Plugins excludeTag:hide"
''Tiddlers and Plugins used:''
* DeprecatedFunctionsPlugin 1.0 needed for BetterTimelineMacro (now available here: http://tiddlyspace.com/bags/freestyle-sandbox_public/tiddlers/BetterTimelineMacro)
* [[Basic Formatting]]
* [[Document Formatting]]
* LoremIpsum (wiki text demo; name corrected from ~LorumIpsum. Cicero)
ELS
* AdvancedOptionsPlugin 1.2
* AttachFilePlugin 4.0 to embed images in tiddlers, plus AttachFilePluginInfo
* AttachFileMIMETypes as above
* CheckboxToggleTag 1.3.6 to alternate between two tags, depending on checkbox status
* ConfirmExitPlugin 2.0 to ensure unsaved edits are saved
* DisableWikiLinksPlugin 1.6 prevents highlighting of "[[CamelCase|http://en.wikipedia.org/wiki/CamelCase]]" ~WikiWords as wiki page links, in particular on the Passwords tiddler
* HTMLFormattingPlugin 2.4.1 to enable use of HTML as well as wiki text
* InlineJavascriptPlugin 1.9.6 plus InlineJavascriptPluginInfo 1.9.6
* OpenTaggedTiddlers 2.0
* SinglePageModePlugin 2.9.7 to keep only one tiddler at a time open (like a web page; configurable), plus SinglePageModePluginInfo 2.9.6
* TaggedTemplateTweak 1.6.1 used to provide Encrypt checkbox for new tiddlers, plus TaggedTemplateTweakInfo
UB
* ForEachTiddlerPlugin 1.08 UB macro used for listing tiddlers with tags
SB/DB
* InstantTimestampPlugin 1.0.10a SB to enable embedded timestamps
* LessBackupsPlugin 3.0.1a SB reduces the number of backup files
* NewMeansNewPlugin 1.1.1a SB to enable creation of numbered new items
* RenameTagsPlugin 3.0a SB to facilitate renaming tags also tagging other tiddlers
* TspotSetupPlugin 1.0 SB/DB
MB
* LegacyStrikeThroughPlugin 1.02 (incorporated in ~TiddlyWiki 2.2.5) keep?
~BidiX
* PasswordOptionPlugin 1.02
* UploadPlugin 4.1.4
LP
* TiddlerEncryptionPlugin 3.2.2 to encrypt and decrypt tiddlers
''Macros used:''
* BetterTimelineMacro 0.5 beta SI to exclude irrelevant tiddlers from Timeline
* ForEachTiddlerMacro 1.08 part of plugin
* ToggleSideBarMacro 2.0 SI turn sidebar display on/off (source: http://svn.tiddlywiki.org/Trunk/contributors/SaqImtiaz/plugins/ToggleSideBarMacro/ToggleSideBarMacro.js)
Thanks to all who whose contributions I have made use of: Jeremy Ruston, the Bairds of a Feather, Bidix, Udo Borkowski, Cicero, Saq Imtiaz, Martin Budden, Lyall Pearce and special thanks to Eric Shulman. Apologies to anyone I've missed.
''Customizations You May Wish To Make''
*To adjust the number of backups made when you save changes: Select "All" in the Sidebar, then ''~LessBackupsPlugin'', and edit as required.
*Likewise, the date format for timestamps can be changed by editing the ''~InstantTimeStamp'' plugin. Date format information [[here|http://tiddlywiki.com/#DateFormatString]].
!Version History
1.0 17 Jan 2011 for TW 2.6.2
1.1 17 Jan 2013 for TW 2.7.0 (core and some plugins updated)
[[TiddlyFolio: To Do]]
!"What You See Is What You Get" Editing
[img[WYSIWYG demo|WYSIWYGdemo.gif]]
There are several options for adding [[WYSIWYG|http://en.wikipedia.org/wiki/WYSIWYG]] editing capability (see example above) to a ~TiddlyWiki file. [[Xinha|http://xinha.webfactional.com/]], [[FCKeditor|http://www.fckeditor.net/download]], and [[TinyMCE|http://tinymce.moxiecode.com/]] are among the most popular. There's even an editor to enable wysiwyg editing of mathematical equations: [[ASciencePad|http://math.chapman.edu/~jipsen/asciencepad/]].
Here are instructions for adding ~FCKeditor to your ~TiddlyFolio: [[WYSIWYG Instructions]].
If you wish to use [[TiddlySpot|http://www.tiddlyspot.com]] (see [[Online Access]]) WYSIWYG editing is not recommended as the requisite additional files cannot be installed there. No such problem exists with [[Fastmail]].
{{menubox{
{{big{You can extend the abilities of ~TiddlyWiki to further customize your content to suit your needs, simply by adding extra tiddlers to your document.}}}
}}}
!!templates
tiddlers containing HTML syntax (with some special extensions) to define the overall layout of page elements as well as the "view" and "edit" layouts for each tiddler. Default ("shadow") template tiddlers:<br>PageTemplate, ViewTemplate, EditTemplate
!!stylesheets
tiddlers containing CSS syntax that overlays and/or supplements the default core CSS class definitions and styles. Default ("shadow") stylesheet tiddlers: StyleSheetLayout, StyleSheetColors, StyleSheetPrint, StyleSheetLocale, StyleSheet
!!plugins
tiddlers containing javascript program code that can be used to add new variables/functions or redefine ~TiddlyWiki's existing core variables/functions. By convention, plugin tiddlers titles usually end with "Plugin", but can be named however you like.
/***
|Name|AdvancedOptionsPlugin|
|Source|http://www.TiddlyTools.com/#AdvancedOptionsPlugin|
|Documentation|http://www.TiddlyTools.com/#AdvancedOptionsPlugin|
|Version|1.2.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.3|
|Type|plugin|
|Description|automatically add plugin-defined options to the [[AdvancedOptions]] shadow tiddler|
!!!!!Usage
<<<
At document startup, this plugin examines each tiddler tagged with <<tag systemConfig>> and looks for a tiddler slice named "Options" whose value refers to a tiddler section (or separate tiddler) that contains an 'advanced options control panel' for configuring that plugin's features and behavior. For each plugin that contains an "Options" slice, a tabbed entry is automatically created in the [[AdvancedOptions]] shadow tiddler to display that plugin's control panel.
As an optional fallback for backward-compatibility with plugin tiddlers that do not define the "Options" slice, this plugin will also look for a section heading named "Configuration" within those tiddlers, so that older plugins that define this section can automatically have their settings added to the [[AdvancedOptions]] tiddler without requiring the "Options" slice to be added.
This plugin also extends the standard {{{<<option>>}}} macro syntax so you can directly set the internal value of a boolean or text option, without displaying a corresponding checkbox or input field control simply by appending {{{=value}}} syntax to the end of the option ID parameter:
{{{
<<option "txtSomeOption=some text">>
<<option chkSomeOtherOption=true>> OR <<option chkSomeOtherOption=false>>
}}}
Example: {{{<<option chkAnimate=false>>}}}
<<<
!!!!!Configuration
<<<
<<option chkAdvancedOptions>> automatically add plugin-defined options to the [[AdvancedOptions]] shadow tiddler
<<option chkAdvancedOptionsBackstage>> automatically add plugin-defined options to Backstage menu
<<option chkAdvancedOptionsFallback>> use <<option txtAdvancedOptionsFallback>> section as a fallback for plugins that don't define an ~AdvancedOptions slice
//note: these settings only take effect after reloading the document//
<<<
!!!!!Revisions
<<<
2009.07.23 [1.2.0] added support for enhanced {{{<<option id=value>>}}} 'direct assignment' syntax
2008.05.09 [1.1.0] add "options" panel to backstage
2008.04.08 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.AdvancedOptionsPlugin= {major: 1, minor: 2, revision: 0, date: new Date(2009,7,23)};
if (config.options.chkAdvancedOptions===undefined)
config.options.chkAdvancedOptions=true;
if (config.options.chkAdvancedOptionsBackstage===undefined)
config.options.chkAdvancedOptionsBackstage=true;
if (config.options.chkAdvancedOptionsFallback===undefined)
config.options.chkAdvancedOptionsFallback=true;
if (config.options.txtAdvancedOptionsFallback===undefined)
config.options.txtAdvancedOptionsFallback="Configuration";
if (config.optionsDesc) config.optionsDesc.chkAdvancedOptions=
"automatically add plugin-defined options to [[AdvancedOptions]]";
//}}}
//{{{
var items=[];
var fmt="[[%0 ]] [[view options for %0]] [[%1]]\n";
var section=config.options.txtAdvancedOptionsFallback;
var plugins=store.getTaggedTiddlers("systemConfig");
for (var p=0; p<plugins.length; p++) {
var tid=plugins[p].title;
var settings=store.getTiddlerSlice(tid,"Options");
if (!settings && config.options.chkAdvancedOptionsFallback && store.getTiddlerText(tid+"##"+section))
settings="##"+section; // fallback handling for older plugins
if (settings&&settings.length) {
if (settings.substr(0,2)=="##") settings=tid+settings;
items.push(fmt.format([tid,settings]));
}
}
if (items.length) config.shadowTiddlers.PluginOptions=
"!![[Plugin-defined options|PluginManager]]\n>@@text-align:left;<<tabs '' \n"+items.join(' ')+">>@@";
if (config.options.chkAdvancedOptions)
config.shadowTiddlers.AdvancedOptions+="{{smallform{{{wrap{<<tiddler PluginOptions>>}}}}}}";
//}}}
//{{{
// // add "options" backstage task
if (config.tasks && config.options.chkAdvancedOptionsBackstage) { // for TW2.2b3 or above
config.tasks.options = {
text: "options",
tooltip: "manage plugin-defined option settings",
content: "{{smallform{{{groupbox{{{wrap{<<tiddler PluginOptions>>}}}}}}\n{{groupbox small {<<options>>}}}}}}"
}
config.backstageTasks.splice(config.backstageTasks.indexOf("plugins")+1,0,"options");
}
//}}}
//{{{
config.macros.option.AOPsave_handler=config.macros.option.handler;
config.macros.option.handler=function(place,macroName,params,wikifier,paramString,tiddler) {
var parts=params[0].split('=');
if (parts.length==1) return this.AOPsave_handler.apply(this,arguments);
var id=parts[0]; var val=(id.substr(0,3)=='txt')?parts[1]:(parts[1]=='true');
config.options[id]=val;
}
//}}}
|!Card Issuer |American Express|
|!Card # |1234-5678-90|
|!Name ||
|!Start date ||
|!Exp ||
|!Card verification nr ||
|!Call if lost/stolen ||
|!Billing address ||
|!Notes |Edit this and other cards with your own data|
text/plain
.txt .text .js .vbs .asp .cgi .pl
----
text/html
.htm .html .hta .htx .mht
----
text/comma-separated-values
.csv
----
text/javascript
.js
----
text/css
.css
----
text/xml
.xml .xsl .xslt
----
image/gif
.gif
----
image/jpeg
.jpg .jpe .jpeg
----
image/png
.png
----
image/bmp
.bmp
----
image/tiff
.tif .tiff
----
audio/basic
.au .snd
----
audio/wav
.wav
----
audio/x-pn-realaudio
.ra .rm .ram
----
audio/x-midi
.mid .midi
----
audio/mp3
.mp3
----
audio/m3u
.m3u
----
video/x-ms-asf
.asf
----
video/avi
.avi
----
video/mpeg
.mpg .mpeg
----
video/quicktime
.qt .mov .qtvr
----
application/pdf
.pdf
----
application/rtf
.rtf
----
application/postscript
.ai .eps .ps
----
application/wordperfect
.wpd
----
application/mswrite
.wri
----
application/msexcel
.xls .xls3 .xls4 .xls5 .xlw
----
application/msword
.doc
----
application/mspowerpoint
.ppt .pps
----
application/x-director
.swa
----
application/x-shockwave-flash
.swf
----
application/x-zip-compressed
.zip
----
application/x-gzip
.gz
----
application/x-rar-compressed
.rar
----
application/octet-stream
.com .exe .dll .ocx
----
application/java-archive
.jar
[[AttachFilePlugin]] reads binary data from locally-stored files (e.g., images, PDFs, mp3's, etc.) and converts it to base64-encoded text that is stored in tiddlers tagged with<<tag attachment>>. [[AttachFilePluginFormatters]] allows you to use those tiddlers in place of the external path/file references that are normally part of the image and external links wiki syntax.
[[FileDropPlugin]] and [[FileDropPluginConfig]] allow you to quickly create attachment tiddlers simply by dragging files directly from your system's desktop folder display and dropping it onto an open TiddlyWiki document. Text files are automatically created as simple tiddlers, while binary files are automatically encoded and attached.
/***
|Name|AttachFilePlugin|
|Source|http://www.TiddlyTools.com/#AttachFilePlugin|
|Documentation|http://www.TiddlyTools.com/#AttachFilePluginInfo|
|Version|4.0.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires|AttachFilePluginFormatters, AttachFileMIMETypes|
|Description|Store binary files as base64-encoded tiddlers with fallback links for separate local and/or remote file storage|
Store or link binary files (such as jpg, gif, pdf or even mp3) within your TiddlyWiki document and then use them as images or links from within your tiddler content.
> Important note: As of version 3.6.0, in order to //render// images and other binary attachments created with this plugin, you must also install [[AttachFilePluginFormatters]], which extends the behavior of the TiddlyWiki core formatters for embedded images ({{{[img[tooltip|image]]}}}), linked embedded images ({{{[img[tooltip|image][link]]}}}), and external/"pretty" links ({{{[[label|link]]}}}), so that these formatter will process references to attachment tiddlers as if a normal file reference had been provided. |
!!!!!Documentation
>see [[AttachFilePluginInfo]]
!!!!!Inline interface (live)
>see [[AttachFile]] (shadow tiddler)
><<tiddler AttachFile>>
!!!!!Revisions
<<<
2009.06.04 [4.0.0] changed attachment storage format to use //sections// instead of embedded substring markers.
|please see [[AttachFilePluginInfo]] for additional revision details|
2005.07.20 [1.0.0] Initial Release
<<<
!!!!!Code
***/
// // version
//{{{
version.extensions.AttachFilePlugin= {major: 4, minor: 0, revision: 0, date: new Date(2009,6,4)};
// shadow tiddler
config.shadowTiddlers.AttachFile="<<attach inline>>";
// add 'attach' backstage task (insert before built-in 'importTask')
if (config.tasks) { // for TW2.2b or above
config.tasks.attachTask = {
text: "attach",
tooltip: "Attach a binary file as a tiddler",
content: "<<attach inline>>"
}
config.backstageTasks.splice(config.backstageTasks.indexOf("importTask"),0,"attachTask");
}
config.macros.attach = {
// // lingo
//{{{
label: "attach file",
tooltip: "Attach a file to this document",
linkTooltip: "Attachment: ",
typeList: "AttachFileMIMETypes",
titlePrompt: " enter tiddler title...",
MIMEPrompt: "<option value=''>select MIME type...</option><option value='editlist'>[edit list...]</option>",
localPrompt: " enter local path/filename...",
URLPrompt: " enter remote URL...",
tiddlerErr: "Please enter a tiddler title",
sourceErr: "Please enter a source path/filename",
storageErr: "Please select a storage method: embedded, local or remote",
MIMEErr: "Unrecognized file format. Please select a MIME type",
localErr: "Please enter a local path/filename",
URLErr: "Please enter a remote URL",
fileErr: "Invalid path/file or file not found",
tiddlerFormat: '!usage\n{{{%0}}}\n%0\n!notes\n%1\n!type\n%2\n!file\n%3\n!url\n%4\n!data\n%5\n',
//}}}
// // macro definition
//{{{
handler:
function(place,macroName,params) {
if (params && !params[0])
{ createTiddlyButton(place,this.label,this.tooltip,this.toggleAttachPanel); return; }
var id=params.shift();
this.createAttachPanel(place,id+"_attachPanel",params);
document.getElementById(id+"_attachPanel").style.position="static";
document.getElementById(id+"_attachPanel").style.display="block";
},
//}}}
//{{{
createAttachPanel:
function(place,panel_id,params) {
if (!panel_id || !panel_id.length) var panel_id="_attachPanel";
// remove existing panel (if any)
var panel=document.getElementById(panel_id); if (panel) panel.parentNode.removeChild(panel);
// set styles for this panel
setStylesheet(this.css,"attachPanel");
// create new panel
var title=""; if (params && params[0]) title=params.shift();
var types=this.MIMEPrompt+this.formatListOptions(store.getTiddlerText(this.typeList)); // get MIME types
panel=createTiddlyElement(place,"span",panel_id,"attachPanel",null);
var html=this.html.replace(/%id%/g,panel_id);
html=html.replace(/%title%/g,title);
html=html.replace(/%disabled%/g,title.length?"disabled":"");
html=html.replace(/%IEdisabled%/g,config.browser.isIE?"disabled":"");
html=html.replace(/%types%/g,types);
panel.innerHTML=html;
if (config.browser.isGecko) { // FF3 FIXUP
document.getElementById("attachSource").style.display="none";
document.getElementById("attachFixPanel").style.display="block";
}
return panel;
},
//}}}
//{{{
toggleAttachPanel:
function (e) {
if (!e) var e = window.event;
var parent=resolveTarget(e).parentNode;
var panel = document.getElementById("_attachPanel");
if (panel==undefined || panel.parentNode!=parent)
panel=config.macros.attach.createAttachPanel(parent,"_attachPanel");
var isOpen = panel.style.display=="block";
if(config.options.chkAnimate)
anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,"none"));
else
panel.style.display = isOpen ? "none" : "block" ;
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
return(false);
},
//}}}
//{{{
formatListOptions:
function(text) {
if (!text || !text.trim().length) return "";
// get MIME list content from text
var parts=text.split("\n----\n");
var out="";
for (var p=0; p<parts.length; p++) {
var lines=parts[p].split("\n");
var label=lines.shift(); // 1st line=display text
var value=lines.shift(); // 2nd line=item value
out +='<option value="%1">%0</option>'.format([label,value]);
}
return out;
},
//}}}
// // interface definition
//{{{
css:
".attachPanel { display: none; position:absolute; z-index:10; width:35em; right:105%; top:0em;\
background-color: #eee; color:#000; font-size: 8pt; line-height:110%;\
border:1px solid black; border-bottom-width: 3px; border-right-width: 3px;\
padding: 0.5em; margin:0em; -moz-border-radius:1em;-webkit-border-radius:1em; text-align:left }\
.attachPanel form { display:inline;border:0;padding:0;margin:0; }\
.attachPanel select { width:99%;margin:0px;font-size:8pt;line-height:110%;}\
.attachPanel input { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%}\
.attachPanel textarea { width:98%;margin:0px;height:2em;font-size:8pt;line-height:110%}\
.attachPanel table { width:100%;border:0;margin:0;padding:0;color:inherit; }\
.attachPanel tbody, .attachPanel tr, .attachPanel td { border:0;margin:0;padding:0;color:#000; }\
.attachPanel .box { border:1px solid black; padding:.3em; margin:.3em 0px; background:#f8f8f8; \
-moz-border-radius:5px;-webkit-border-radius:5px; }\
.attachPanel .chk { width:auto;border:0; }\
.attachPanel .btn { width:auto; }\
.attachPanel .btn2 { width:49%; }\
",
//}}}
//{{{
html:
'<form>\
attach from source file\
<input type="file" id="attachSource" name="source" size="56"\
onChange="config.macros.attach.onChangeSource(this)">\
<div id="attachFixPanel" style="display:none"><!-- FF3 FIXUP -->\
<input type="text" id="attachFixSource" style="width:90%"\
title="Enter a path/file to attach"\
onChange="config.macros.attach.onChangeSource(this);">\
<input type="button" style="width:7%" value="..."\
title="Enter a path/file to attach"\
onClick="config.macros.attach.askForFilename(document.getElementById(\'attachFixSource\'));">\
</div><!--end FF3 FIXUP-->\
<div class="box">\
<table style="border:0"><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\
embed data <input type=checkbox class=chk name="useData" %IEdisabled% \
onclick="if (!this.form.MIMEType.value.length)\
this.form.MIMEType.selectedIndex=this.checked?1:0; "> \
</td><td style="border:0">\
<select size=1 name="MIMEType" \
onchange="this.title=this.value; if (this.value==\'editlist\')\
{ this.selectedIndex=this.form.useData.checked?1:0; story.displayTiddler(null,config.macros.attach.typeList,2); return; }">\
<option value=""></option>\
%types%\
</select>\
</td></tr><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\
local link <input type=checkbox class=chk name="useLocal"\
onclick="this.form.local.value=this.form.local.defaultValue=this.checked?config.macros.attach.localPrompt:\'\';"> \
</td><td style="border:0">\
<input type=text name="local" size=15 autocomplete=off value=""\
onchange="this.form.useLocal.checked=this.value.length" \
onkeyup="this.form.useLocal.checked=this.value.length" \
onfocus="if (!this.value.length) this.value=config.macros.attach.localPrompt; this.select()">\
</td></tr><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\
remote link <input type=checkbox class=chk name="useURL"\
onclick="this.form.URL.value=this.form.URL.defaultValue=this.checked?config.macros.attach.URLPrompt:\'\';\"> \
</td><td style="border:0">\
<input type=text name="URL" size=15 autocomplete=off value=""\
onfocus="if (!this.value.length) this.value=config.macros.attach.URLPrompt; this.select()"\
onchange="this.form.useURL.checked=this.value.length;"\
onkeyup="this.form.useURL.checked=this.value.length;">\
</td></tr></table>\
</div>\
<table style="border:0"><tr style="border:0"><td style="border:0;text-align:right;vertical-align:top;width:1%;white-space:nowrap">\
notes \
</td><td style="border:0" colspan=2>\
<textarea name="notes" style="width:98%;height:3.5em;margin-bottom:2px"></textarea>\
</td><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\
attach as \
</td><td style="border:0" colspan=2>\
<input type=text name="tiddlertitle" size=15 autocomplete=off value="%title%"\
onkeyup="if (!this.value.length) { this.value=config.macros.attach.titlePrompt; this.select(); }"\
onfocus="if (!this.value.length) this.value=config.macros.attach.titlePrompt; this.select()" %disabled%>\
</td></tr></tr><tr style="border:0"><td style="border:0;text-align:right;width:1%;white-space:nowrap">\
add tags \
</td><td style="border:0">\
<input type=text name="tags" size=15 autocomplete=off value="" onfocus="this.select()">\
</td><td style="width:40%;text-align:right;border:0">\
<input type=button class=btn2 value="attach"\
onclick="config.macros.attach.onClickAttach(this)"><!--\
--><input type=button class=btn2 value="close"\
onclick="var panel=document.getElementById(\'%id%\'); if (panel) panel.parentNode.removeChild(panel);">\
</td></tr></table>\
</form>',
//}}}
// // control processing
//{{{
onChangeSource:
function(here) {
var form=here.form;
var list=form.MIMEType;
var theFilename = here.value;
var theExtension = theFilename.substr(theFilename.lastIndexOf('.')).toLowerCase();
// if theFilename is in current document folder, remove path prefix and use relative reference
var h=document.location.href; folder=getLocalPath(decodeURIComponent(h.substr(0,h.lastIndexOf("/")+1)));
if (theFilename.substr(0,folder.length)==folder) theFilename='./'+theFilename.substr(folder.length);
else theFilename='file:///'+theFilename; // otherwise, use absolute reference
theFilename=theFilename.replace(/\\/g,"/"); // fixup: change \ to /
form.useLocal.checked = true;
form.local.value = theFilename;
form.useData.checked = !form.useData.disabled;
list.selectedIndex=1;
for (var i=0; i<list.options.length; i++) // find matching MIME type
if (list.options[i].value.indexOf(theExtension)!=-1) { list.selectedIndex = i; break; }
if (!form.tiddlertitle.disabled)
form.tiddlertitle.value=theFilename.substr(theFilename.lastIndexOf('/')+1); // get tiddlername from filename
},
//}}}
//{{{
onClickAttach:
function (here) {
clearMessage();
// get input values
var form=here.form;
var src=form.source; if (config.browser.isGecko) src=document.getElementById("attachFixSource");
src=src.value!=src.defaultValue?src.value:"";
var when=(new Date()).formatString(config.macros.timeline.dateFormat);
var title=form.tiddlertitle.value;
var local = form.local.value!=form.local.defaultValue?form.local.value:"";
var url = form.URL.value!=form.URL.defaultValue?form.URL.value:"";
var notes = form.notes.value;
var tags = "attachment excludeMissing "+form.tags.value;
var useData=form.useData.checked;
var useLocal=form.useLocal.checked;
var useURL=form.useURL.checked;
var mimetype = form.MIMEType.value.length?form.MIMEType.options[form.MIMEType.selectedIndex].text:"";
// validate checkboxes and get filename
if (useData) {
if (src.length) { if (!theLocation) var theLocation=src; }
else { alert(this.sourceErr); src.focus(); return false; }
}
if (useLocal) {
if (local.length) { if (!theLocation) var theLocation = local; }
else { alert(this.localErr); form.local.focus(); return false; }
}
if (useURL) {
if (url.length) { if (!theLocation) var theLocation = url; }
else { alert(this.URLErr); form.URL.focus(); return false; }
}
if (!(useData||useLocal||useURL))
{ form.useData.focus(); alert(this.storageErr); return false; }
if (!theLocation)
{ src.focus(); alert(this.sourceErr); return false; }
if (!title || !title.trim().length || title==this.titlePrompt)
{ form.tiddlertitle.focus(); alert(this.tiddlerErr); return false; }
// if not already selected, determine MIME type based on filename extension (if any)
if (useData && !mimetype.length && theLocation.lastIndexOf('.')!=-1) {
var theExt = theLocation.substr(theLocation.lastIndexOf('.')).toLowerCase();
var theList=form.MIMEType;
for (var i=0; i<theList.options.length; i++)
if (theList.options[i].value.indexOf(theExt)!=-1)
{ var mimetype=theList.options[i].text; theList.selectedIndex=i; break; }
}
// attach the file
return this.createAttachmentTiddler(src, when, notes, tags, title,
useData, useLocal, useURL, local, url, mimetype);
},
getMIMEType:
function(src,def) {
var ext = src.substr(src.lastIndexOf('.')).toLowerCase();
var list=store.getTiddlerText(this.typeList);
if (!list || !list.trim().length) return def;
// get MIME list content from tiddler
var parts=list.split("\n----\n");
for (var p=0; p<parts.length; p++) {
var lines=parts[p].split("\n");
var mime=lines.shift(); // 1st line=MIME type
var match=lines.shift(); // 2nd line=matching extensions
if (match.indexOf(ext)!=-1) return mime;
}
return def;
},
createAttachmentTiddler:
function (src, when, notes, tags, title, useData, useLocal, useURL, local, url, mimetype, noshow) {
if (useData) { // encode the data
if (!mimetype.length) {
alert(this.MIMEErr);
form.MIMEType.selectedIndex=1; form.MIMEType.focus();
return false;
}
var d = this.readFile(src); if (!d) { return false; }
displayMessage('encoding '+src);
var encoded = this.encodeBase64(d);
displayMessage('file size='+d.length+' bytes, encoded size='+encoded.length+' bytes');
}
var usage=(mimetype.substr(0,5)=="image"?'[img[%0]]':'[[%0|%0]]').format([title]);
var theText=this.tiddlerFormat.format([
usage, notes.length?notes:'//none//', mimetype,
useLocal?local.replace(/\\/g,'/'):'', useURL?url:'',
useData?('data:'+mimetype+';base64,'+encoded):'' ]);
store.saveTiddler(title,title,theText,config.options.txtUserName,new Date(),tags);
var panel=document.getElementById("attachPanel"); if (panel) panel.style.display="none";
if (!noshow) { story.displayTiddler(null,title); story.refreshTiddler(title,null,true); }
displayMessage('attached "'+title+'"');
return true;
},
//}}}
// // base64 conversion
//{{{
encodeBase64:
function (d) {
if (!d) return null;
// encode as base64
var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var out="";
var chr1,chr2,chr3="";
var enc1,enc2,enc3,enc4="";
for (var count=0,i=0; i<d.length; ) {
chr1=d.charCodeAt(i++);
chr2=d.charCodeAt(i++);
chr3=d.charCodeAt(i++);
enc1=chr1 >> 2;
enc2=((chr1 & 3) << 4) | (chr2 >> 4);
enc3=((chr2 & 15) << 2) | (chr3 >> 6);
enc4=chr3 & 63;
if (isNaN(chr2)) enc3=enc4=64;
else if (isNaN(chr3)) enc4=64;
out+=keyStr.charAt(enc1)+keyStr.charAt(enc2)+keyStr.charAt(enc3)+keyStr.charAt(enc4);
chr1=chr2=chr3=enc1=enc2=enc3=enc4="";
}
return out;
},
decodeBase64: function(input) {
var out="";
var chr1,chr2,chr3;
var enc1,enc2,enc3,enc4;
var i = 0;
// remove all characters that are not A-Z, a-z, 0-9, +, /, or =
input=input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
do {
enc1=keyStr.indexOf(input.charAt(i++));
enc2=keyStr.indexOf(input.charAt(i++));
enc3=keyStr.indexOf(input.charAt(i++));
enc4=keyStr.indexOf(input.charAt(i++));
chr1=(enc1 << 2) | (enc2 >> 4);
chr2=((enc2 & 15) << 4) | (enc3 >> 2);
chr3=((enc3 & 3) << 6) | enc4;
out=out+String.fromCharCode(chr1);
if (enc3!=64) out=out+String.fromCharCode(chr2);
if (enc4!=64) out=out+String.fromCharCode(chr3);
} while (i<input.length);
return out;
},
//}}}
// // I/O functions
//{{{
readFile: // read local BINARY file data
function(filePath) {
if(!window.Components) { return null; }
try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); }
catch(e) { alert("access denied: "+filePath); return null; }
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
try { file.initWithPath(filePath); } catch(e) { alert("cannot read file - invalid path: "+filePath); return null; }
if (!file.exists()) { alert("cannot read file - not found: "+filePath); return null; }
var inputStream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream);
inputStream.init(file, 0x01, 00004, null);
var bInputStream = Components.classes["@mozilla.org/binaryinputstream;1"].createInstance(Components.interfaces.nsIBinaryInputStream);
bInputStream.setInputStream(inputStream);
return(bInputStream.readBytes(inputStream.available()));
},
//}}}
//{{{
writeFile:
function(filepath,data) {
// TBD: decode base64 and write BINARY data to specified local path/filename
return(false);
},
//}}}
//{{{
askForFilename: // for FF3 fixup
function(target) {
var msg=config.messages.selectFile;
if (target && target.title) msg=target.title; // use target field tooltip (if any) as dialog prompt text
// get local path for current document
var path=getLocalPath(document.location.href);
var p=path.lastIndexOf("/"); if (p==-1) p=path.lastIndexOf("\\"); // Unix or Windows
if (p!=-1) path=path.substr(0,p+1); // remove filename, leave trailing slash
var file=""
var result=window.mozAskForFilename(msg,path,file,true); // FF3 FIXUP ONLY
if (target && result.length) // set target field and trigger handling
{ target.value=result; target.onchange(); }
return result;
}
};
//}}}
//{{{
if (window.mozAskForFilename===undefined) { // also defined by CoreTweaks (for ticket #604)
window.mozAskForFilename=function(msg,path,file,mustExist) {
if(!window.Components) return false;
try {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
var nsIFilePicker = window.Components.interfaces.nsIFilePicker;
var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
picker.init(window, msg, mustExist?nsIFilePicker.modeOpen:nsIFilePicker.modeSave);
var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
thispath.initWithPath(path);
picker.displayDirectory=thispath;
picker.defaultExtension='';
picker.defaultString=file;
picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);
if (picker.show()!=nsIFilePicker.returnCancel)
var result=picker.file.persistentDescriptor;
}
catch(ex) { displayMessage(ex.toString()); }
return result;
}
}
//}}}
/***
|Name|AttachFilePluginFormatters|
|Source|http://www.TiddlyTools.com/#AttachFilePluginFormatters|
|Version|4.0.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1.3|
|Type|plugin|
|Description|run-time library for displaying attachment tiddlers|
Runtime processing for //rendering// attachment tiddlers created by [[AttachFilePlugin]]. Attachment tiddlers are tagged with<<tag attachment>>and contain binary file content (e.g., jpg, gif, pdf, mp3, etc.) that has been stored directly as base64 text-encoded data or can be loaded from external files stored on a local filesystem or remote web server. Note: after creating new attachment tiddlers, you can remove [[AttachFilePlugin]], as long as you retain //this// tiddler (so that images can be rendered later on).
!!!!!Formatters
<<<
This plugin extends the behavior of the following TiddlyWiki core "wikify()" formatters:
* embedded images: {{{[img[tooltip|image]]}}}
* linked embedded images: {{{[img[tooltip|image][link]]}}}
* external/"pretty" links: {{{[[label|link]]}}}
''Please refer to AttachFilePlugin (source: http://www.TiddlyTools.com/#AttachFilePlugin) for additional information.''
<<<
!!!!!Revisions
<<<
2009.10.10 [4.0.1] in fileExists(), check for IE to avoid hanging Chrome during startup
2009.06.04 [4.0.0] changed attachment storage format to use //sections// instead of embedded substring markers.
2008.01.08 [*.*.*] plugin size reduction: documentation moved to ...Info
2007.12.04 [*.*.*] update for TW2.3.0: replaced deprecated core functions, regexps, and macros
2007.10.29 [3.7.0] more code reduction: removed upload handling from AttachFilePlugin (saves ~7K!)
2007.10.28 [3.6.0] removed duplicate formatter code from AttachFilePlugin (saves ~10K!) and updated documentation accordingly. This plugin ([[AttachFilePluginFormatters]]) is now //''required''// in order to display attached images/binary files within tiddler content.
2006.05.20 [3.4.0] through 2007.03.01 [3.5.3] sync with AttachFilePlugin
2006.05.13 [3.2.0] created from AttachFilePlugin v3.2.0
<<<
!!!!!Code
***/
// // version
//{{{
version.extensions.AttachFilePluginFormatters= {major: 4, minor: 0, revision: 1, date: new Date(2009,10,10)};
//}}}
//{{{
if (config.macros.attach==undefined) config.macros.attach= { };
//}}}
//{{{
if (config.macros.attach.isAttachment==undefined) config.macros.attach.isAttachment=function (title) {
var tiddler = store.getTiddler(title);
if (tiddler==undefined || tiddler.tags==undefined) return false;
return (tiddler.tags.indexOf("attachment")!=-1);
}
//}}}
//{{{
// test for local file existence - returns true/false without visible error display
if (config.macros.attach.fileExists==undefined) config.macros.attach.fileExists=function(f) {
if(window.Components) { // MOZ
try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); }
catch(e) { return false; } // security access denied
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
try { file.initWithPath(f); }
catch(e) { return false; } // invalid directory
return file.exists();
}
else if (config.browser.isIE) { // IE
var fso = new ActiveXObject("Scripting.FileSystemObject");
return fso.FileExists(f);
}
else return true; // other browsers: assume file exists
}
//}}}
//{{{
if (config.macros.attach.getAttachment==undefined) config.macros.attach.getAttachment=function(title) {
// extract embedded data, local and remote links (if any)
var text=store.getTiddlerText(title,'');
var embedded=store.getTiddlerText(title+'##data','').trim();
var locallink=store.getTiddlerText(title+'##file','').trim();
var remotelink=store.getTiddlerText(title+'##url','').trim();
// backward-compatibility for older attachments (pre 4.0.0)
var startmarker="---BEGIN_DATA---\n";
var endmarker="\n---END_DATA---";
var pos=0; var endpos=0;
if ((pos=text.indexOf(startmarker))!=-1 && (endpos=text.indexOf(endmarker))!=-1)
embedded="data:"+(text.substring(pos+startmarker.length,endpos)).replace(/\n/g,'');
if ((pos=text.indexOf("/%LOCAL_LINK%/"))!=-1)
locallink=text.substring(text.indexOf("|",pos)+1,text.indexOf("]]",pos));
if ((pos=text.indexOf("/%REMOTE_LINK%/"))!=-1)
remotelink=text.substring(text.indexOf("|",pos)+1,text.indexOf("]]",pos));
// if there is a data: URI defined (not supported by IE)
if (embedded.length && !config.browser.isIE) return embedded;
// document is being served remotely... use remote URL (if any) (avoids security alert)
if (remotelink.length && document.location.protocol!="file:")
return remotelink;
// local link only... return link without checking file existence (avoids security alert)
if (locallink.length && !remotelink.length)
return locallink;
// local link, check for file exist... use local link if found
if (locallink.length) {
locallink=locallink.replace(/^\.[\/\\]/,''); // strip leading './' or '.\' (if any)
if (this.fileExists(getLocalPath(locallink))) return locallink;
// maybe local link is relative... add path from current document and try again
var pathPrefix=document.location.href; // get current document path and trim off filename
var slashpos=pathPrefix.lastIndexOf("/"); if (slashpos==-1) slashpos=pathPrefix.lastIndexOf("\\");
if (slashpos!=-1 && slashpos!=pathPrefix.length-1) pathPrefix=pathPrefix.substr(0,slashpos+1);
if (this.fileExists(getLocalPath(pathPrefix+locallink))) return locallink;
}
// no embedded data, no local (or not found), fallback to remote URL (if any)
if (remotelink.length) return remotelink;
// attachment URL doesn't resolve, just return input as is
return title;
}
//}}}
//{{{
if (config.macros.attach.init_formatters==undefined) config.macros.attach.init_formatters=function() {
if (this.initialized) return;
// find the formatter for "image" and replace the handler
for (var i=0; i<config.formatters.length && config.formatters[i].name!="image"; i++);
if (i<config.formatters.length) config.formatters[i].handler=function(w) {
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) // Simple bracketted link
{
var e = w.output;
if(lookaheadMatch[5])
{
var link = lookaheadMatch[5];
// ELS -------------
var external=config.formatterHelpers.isExternalLink(link);
if (external)
{
if (config.macros.attach.isAttachment(link))
{
e = createExternalLink(w.output,link);
e.href=config.macros.attach.getAttachment(link);
e.title = config.macros.attach.linkTooltip + link;
}
else
e = createExternalLink(w.output,link);
}
else
e = createTiddlyLink(w.output,link,false,null,w.isStatic);
// ELS -------------
addClass(e,"imageLink");
}
var img = createTiddlyElement(e,"img");
if(lookaheadMatch[1])
img.align = "left";
else if(lookaheadMatch[2])
img.align = "right";
if(lookaheadMatch[3])
img.title = lookaheadMatch[3];
img.src = lookaheadMatch[4];
// ELS -------------
if (config.macros.attach.isAttachment(lookaheadMatch[4]))
img.src=config.macros.attach.getAttachment(lookaheadMatch[4]);
// ELS -------------
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
//}}}
//{{{
// find the formatter for "prettyLink" and replace the handler
for (var i=0; i<config.formatters.length && config.formatters[i].name!="prettyLink"; i++);
if (i<config.formatters.length) {
config.formatters[i].handler=function(w) {
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var e;
var text = lookaheadMatch[1];
if(lookaheadMatch[3]) {
// Pretty bracketted link
var link = lookaheadMatch[3];
if (config.macros.attach.isAttachment(link)) {
e = createExternalLink(w.output,link);
e.href=config.macros.attach.getAttachment(link);
e.title=config.macros.attach.linkTooltip+link;
}
else e = (!lookaheadMatch[2] && config.formatterHelpers.isExternalLink(link))
? createExternalLink(w.output,link)
: createTiddlyLink(w.output,link,false,null,w.isStatic);
} else {
e = createTiddlyLink(w.output,text,false,null,w.isStatic);
}
createTiddlyText(e,text);
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
} // if "prettyLink" formatter found
this.initialized=true;
}
//}}}
//{{{
config.macros.attach.init_formatters(); // load time init
//}}}
//{{{
if (TiddlyWiki.prototype.coreGetRecursiveTiddlerText==undefined) {
TiddlyWiki.prototype.coreGetRecursiveTiddlerText = TiddlyWiki.prototype.getRecursiveTiddlerText;
TiddlyWiki.prototype.getRecursiveTiddlerText = function(title,defaultText,depth) {
return config.macros.attach.isAttachment(title)?
config.macros.attach.getAttachment(title):this.coreGetRecursiveTiddlerText.apply(this,arguments);
}
}
//}}}
/***
|Name|AttachFilePluginInfo|
|Source|http://www.TiddlyTools.com/#AttachFilePlugin|
|Documentation|http://www.TiddlyTools.com/#AttachFilePluginInfo|
|Version|4.0.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|Documentation for AttachFilePlugin|
Store or link binary files (such as jpg, gif, pdf or even mp3) within your TiddlyWiki document and then use them as images or links from within your tiddler content.
!!!!!Inline interface (live)
>see [[AttachFile]] (shadow tiddler)
><<tiddler AttachFile>>
!!!!!Syntax
<<<
''To display the attach file control panel, simply view the [[AttachFile]] shadow tiddler that is automatically created by the plugin, and contains an instance of the inline control panel.''. Or, you can write:
{{{
<<attach inline>>
}}}
in any tiddler to display the control panel embedded within that tiddler. Note: you can actually use any unique identifier in place of the "inline" keyword. Each unique id creates a separate instance of the controls. If the same ID is used in more than one tiddler, then the control panel is automatically moved to the most recently rendered location. Or, you can write:
{{{
<<attach>>
}}}
(with no ID parameter) in SidebarOptions. This adds a command link that opens the controls as a floating panel, positioned directly to the left of the sidebar.
<<<
!!!!!Usage
<<<
Binary file content can be stored in three different locations:
#embedded in the attachment tiddler (encoded as base64)
#on your filesystem (a 'local link' path/filename)
#on a web server (a 'remote link' URL)
The plugin creates an "attachment tiddler" for each file you attach. Regardless of where you store the binary content, your document can refer to the attachment tiddler rather than using a direct file or URL reference in your embedded image or external links, so that changing document locations will not require updating numerous tiddlers or copying files from one system to another.
> Important note: As of version 3.6.0, in order to //render// images and other binary attachments created with this plugin, you must also install [[AttachFilePluginFormatters]], which extends the behavior of the TiddlyWiki core formatters for embedded images ({{{[img[tooltip|image]]}}}), linked embedded images ({{{[img[tooltip|image][link]]}}}), and external/"pretty" links ({{{[[label|link]]}}}), so that these formatter will process references to attachment tiddlers as if a normal file reference had been provided. |
When you attach a file, a tiddler (tagged with<<tag attachment>>) is generated (using the source filename as the tiddler's title). The tiddler contains //''base64 text-encoded binary data''//, surrounded by {{{/%...%/}}} comment markers (so they are not visible when viewing the tiddler). The tiddler also includes summary details about the file: when it was attached, by whom, etc. and, if the attachment is an image file (jpg, gif, or png), the image is automatically displayed below the summary information.
>Note: although you can edit an attachment tiddler, ''don't change any of the encoded content below the attachment header'', as it has been prepared for use in the rest of your document, and even changing a single character can make the attachment unusable. //If needed, you ''can'' edit the header information or even the MIME type declaration in the attachment data, but be very careful not to change any of the base64-encoded binary data.//
Unfortunately, embedding just a few moderately-sized binary files using base64 text-encoding can dramatically increase the size of your document. To avoid this problem, you can create attachment tiddlers that define external local filesystem (file://) and/or remote web server (http://) 'reference' links, without embedding the binary data directly in the tiddler (i.e., uncheck "embed data" in the 'control panel').
These links provide an alternative source for the binary data: if embedded data is not found (or you are running on Internet Explorer, which does not currently support using embedded data), then the plugin tries the local filesystem reference. If a local file is not found, then the remote reference (if any) is used. This "fallback" approach also lets you 'virtualize' the external links in your document, so that you can access very large binary content such as PDFs, MP3's, and even *video* files, by using just a 'remote reference link' without embedding any data or downloading huge files to your hard disk.
Of course, when you //do// download an attached file, the local copy will be used instead of accessing a remote server each time, thereby saving bandwidth and allowing you to 'go mobile' without having to edit any tiddlers to alter the link locations...
<<<
!!!!!Syntax / Examples
<<<
To embed attached files as images or link to them from other tiddlers, use the standard ~TiddlyWiki image syntax ({{{[img[tooltip|filename]]}}}), linked image syntax ({{{[img[tooltip|filename][tiddlername]]}}}) , or "external link" syntax ({{{[[text|URL]]}}}), replacing the filename or URL that is normally entered with the title of an attachment tiddler.
embedded image data:
>{{{[img[Meow|AttachFileSample]]}}}
>[img[Meow|AttachFileSample]]
embedded image data with link to larger remote image:
>{{{[img[click for larger view|AttachFileSample][AttachFileSample2]]}}}
>[img[click for larger view|AttachFileSample][AttachFileSample2]]
'external' link to embedded image data:
>{{{[[click to view attachment|AttachFileSample]]}}}
>[[click to view attachment|AttachFileSample]]
'external' link to remote image:
>{{{[[click to view attachment|AttachFileSample2]]}}}
>[[click to view attachment|AttachFileSample2]]
regular ~TiddlyWiki links to attachment tiddlers:
>{{{[[AttachFileSample]]}}} [[AttachFileSample]]
>{{{[[AttachFileSample2]]}}} [[AttachFileSample2]]
<<<
!!!!!Defining MIME types
<<<
When you select a source file, a ''[[MIME|http://en.wikipedia.org/wiki/MIME]]'' file type is automatically suggested, based on filename extension. The AttachFileMIMETypes tiddler defines the list of MIME types that will be recognized by the plugin. Each MIME type definition consists of exactly two lines of text: the official MIME type designator (e.g., "text/plain", "image/gif", etc.), and a space-separated list of file extensions associated with that type. List entries are separated by "----" (horizontal rules).
<<<
!!!!!Known Limitations
<<<
Internet Explorer does not support the data: URI scheme, and cannot use the //embedded// data to render images or links. However, you can still use the local/remote link definitions to create file attachments that are stored externally. In addition, while it is relatively easy to read local //text// files, reading binary files is not directly supported by IE's FileSystemObject (FSO) methods, and other file I/O techniques are subject to security barriers or require additional MS proprietary technologies (like ASP or VB) that make implementation more difficult. As a result, you cannot //create// new attachment tiddlers using IE.
<<<
!!!!!Installation
<<<
Import (or copy/paste) the following tiddlers into your document:
* [[AttachFilePlugin]] (tagged with <<tag systemConfig>>)
* [[AttachFilePluginFormatters]] ("runtime distribution library") (tagged with <<tag systemConfig>>)
* [[AttachFileSample]] and [[AttachFileSample2]] //(tagged with <<tag attachment>>)//
* [[AttachFileMIMETypes]] //(defines binary file types)//
> Important note: As of version 3.6.0, in order to //render// images and other binary attachments created with this plugin, you must also install [[AttachFilePluginFormatters]], which extends the behavior of the TiddlyWiki core formatters for embedded images ({{{[img[tooltip|image]]}}}), linked embedded images ({{{[img[tooltip|image][link]]}}}), and external/"pretty" links ({{{[[label|link]]}}}), so that these formatter will process references to attachment tiddlers as if a normal file reference had been provided. |
<<<
!!!!!Revisions
<<<
2009.06.04 4.0.0 changed attachment storage format to use //sections// instead of embedded substring markers.
2008.07.21 3.9.0 Fixup for FireFox 3: use HTML with separate text+button control instead of type='file' control
2008.05.12 3.8.1 automatically add 'attach' task to backstage (moved from BackstageTweaks)
2008.04.09 3.8.0 in onChangeSource(), if source matches current document folder, use relative reference for local link. Also, disable 'embed' when using IE (which //still// doesn't support data: URI)
2008.04.07 3.7.3 fixed typo in HTML for 'local file link' so that clicking in input field doesn't erase current path/file (if any)
2008.04.07 3.7.2 auto-create AttachFile shadow tiddler for inline interface
2008.01.08 [*.*.*] plugin size reduction: documentation moved to ...Info
2007.12.04 [*.*.*] update for TW2.3.0: replaced deprecated core functions, regexps, and macros
2007.12.03 3.7.1 in createAttachmentTiddler(), added optional "noshow" flag to suppress display of newly created tiddlers.
2007.10.29 3.7.0 code reduction: removed support for built-in upload to server... on-line hosting of binary attachments is left to the document author, who can upload/host files using 3rd-party web-based services (e.g. www.flickr.com, ) or stand-alone applications (e.g., FTP).
2007.10.28 3.6.0 code reduction: removed duplicate definition of image and prettyLink formatters. Rendering of attachment tiddlers now //requires// installation of AttachFilePluginFormatters
2007.03.01 3.5.3 use apply() to invoke hijacked function
2007.02.25 3.5.2 in hijack of "prettyLink", fix version check for TW2.2 compatibility (prevent incorrect use of fallback handler)
2007.01.09 3.5.1 onClickAttach() refactored to create separate createAttachmentTiddler() API for use with FileDropPluginHandlers
2006.11.30 3.5.0 in getAttachment(), for local references, add check for file existence and fallback to remote URL if local file not found. Added fileExists() to encapsulate FF vs. IE local file test function (IE FSO object code is TBD).
2006.11.29 3.4.8 in hijack for PrettyLink, 'simple bracketed link' opens tiddler instead of external link to attachment
2006.11.29 3.4.7 in readFile(), added try..catch around initWithPath() to handle invalid/non-existent paths better.
2006.11.09 3.4.6 REAL FIX for TWv2.1.3: incorporate new TW2.1.3 core "prettyLink" formatter regexp handling logic and check for version < 2.1.3 with fallback to old plugin code. Also, cleanup table layout in HTML (added "border:0" directly to table elements to override stylesheet)
2006.11.08 3.4.5 TEMPORARY FIX for TWv2.1.3: disable hijack of wikiLink formatter due to changes in core wikiLink regexp definition. //Links to attachments are broken, but you can still use {{{[img[TiddlerName]]}}} to render attachments as images, as well as {{{background:url('[[TiddlerName]]')}}} in CSS declarations for background images.//
2006.09.10 3.4.4 update formatters for 2.1 compatibility (use this.lookaheadRegExp instead of temp variable)
2006.07.24 3.4.3 in prettyLink formatter, added check for isShadowTiddler() to fix problem where shadow links became external links.
2006.07.13 3.4.2 in getAttachment(), fixed stripping of newlines so data: used in CSS will work
2006.05.21 3.4.1 in getAttachment(), fixed substring() to extract data: URI (was losing last character, which broken rendering of SOME images)
2006.05.20 3.4.0 hijack core getRecursiveTiddlerText() to support rendering attachments in stylesheets (e.g. {{{url([[AttachFileSample]])}}})
2006.05.20 3.3.6 add "description" feature to easily include notes in attachment tiddler (you can always edit to add them later... but...)
2006.05.19 3.3.5 add "attach as" feature to change default name for attachment tiddlers. Also, new optional param to specify tiddler name (disables editing)
2006.05.16 3.3.0 completed XMLHttpRequest handling for GET or POST to configurable server scripts
2006.05.13 3.2.0 added interface for upload feature. Major rewrite of code for clean object definitions. Major improvements in UI interaction and validation.
2006.05.09 3.1.1 add wikifer support for using attachments in links from "linked image" syntax: {{{[img[tip|attachment1][attachment2]]}}}
2006.05.09 3.1.0 lots of code changes: new options for attachments that use embedded data and/or links to external files (local or remote)
2006.05.03 3.0.2 added {{{/%...%/}}} comments around attachment data to hide it when viewing attachment tiddler.
2006.02.05 3.0.1 wrapped wikifier hijacks in initAttachmentFormatters() function to eliminate globals and avoid FireFox 1.5.0.1 crash bug when referencing globals
2005.12.27 3.0.0 Update for TW2.0. Automatically add 'excludeMissing' tag to attachments
2005.12.16 2.2.0 Dynamically create/remove attachPanel as needed to ensure only one instance of interface elements exists, even if there are multiple instances of macro embedding.
2005.11.20 2.1.0 added wikifier handler extensions for "image" and "prettyLink" to render tiddler attachments
2005.11.09 2.0.0 begin port from old ELS Design adaptation based on ~TW1.2.33
2005.07.20 1.0.0 Initial release (as adaptation)
<<<
[img[baby.jpg]]
According to one study 88% of lost wallets with baby photos in them are returned. More [[here|http://www.google.com/search?ie=UTF-8&oe=UTF-8&sourceid=navclient&gfns=1&q=baby+photograph+wallet+return]].
Use the AttachFile plugin to add your own photo (named baby.jpg) to the wiki, replacing this one.
Delete the text in this tiddler (except the first line). Rename it if you wish.
<<tiddler SetTiddlerBackground with: #3371A3 #FFF Encrypt(TiddlyFolio) title>>
|!Format|!Markup|!Example|
|Bold|{{{''Bold''}}} (2 single quotes)|''Bold''|
|Italic|{{{//Italic//}}}|//Italic//|
|Bold Italic|{{{''//Bold Italic//''}}}|''//Bold Italic//''|
|Underlined|{{{__Underline__}}}(2 underscores)|__Underlined__|
|Strikethough|{{{--Strikethrough--}}}<br />{{{--}}} replaced {{{==}}} for Stikethrough in TiddlyWiki 2.1|--Strikethrough--|
|Superscript|{{{Text^^Superscript^^}}}|Text^^Superscript^^|
|Subscript|{{{Text~~Subscript~~}}}|Text~~Subscript~~|
|Monospaced text|<html><code>{{{Monospaced}}}</code></html>|{{{Monospaced}}}|
|Monospaced multiline block|Put <html><code>{{{</code></html> and <html><code>}}}</code></html> on their own lines|<html><pre>{{{<br/>Monospaced<br/>Multi-line<br/>Block<br/>}}}</pre></html>|
|Highlight|{{{@@Highlight@@}}}|@@Highlight@@|
|Color|{{{@@color(green):green text@@}}}|@@color(green):green text@@ |
|~|{{{@@bgcolor(green):text@@}}}|@@bgcolor(green):text@@ |
|~|{{{@@bgcolor(#3399ff):text@@}}}|@@bgcolor(#3399ff):text@@|
|~|{{{@@bgcolor(#39f):text@@}}}|@@bgcolor(#39f):text@@|
|CSS Extended Highlights|{{{@@some css;Highlight@@}}}<br />For backwards compatibility, the following highlight syntax is also accepted:<br />{{{@@bgcolor(#ff0000):color(#ffffff):red coloured@@}}}|@@background-color:#ff0000;color:#ffffff;red coloured@@<br /><<slider AtEg ./atEg 'Extended example ...'>>|
|Custom CSS Class|<html><code>{{wrappingClass{Text that is now accentuated}}}</code></html><br />By default, the text is placed in a <span>. To use a <div> instead, insert a line break before the text (after the single {)<br />In the CSS:<br />{{{.wrappingClass {color: red;} }}}|Add .wrappingClass to StyleSheet|
|Any HTML|{{{<html><span>any</span><br />}}}<br />{{{<b>valid</b> <em>xhtml</em></html>}}}|<html><span>any</span><br /><b>valid</b> <em>xhtml</em></html>|
/***
|Name|BetterTimelineMacro|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#BetterTimelineMacro|
|Version|0.5 beta|
|Requires|~TW2.x|
!!!Description:
A replacement for the core timeline macro that offers more features:
*list tiddlers with only specfic tag
*exclude tiddlers with a particular tag
*limit entries to any number of days, for example one week
*specify a start date for the timeline, only tiddlers after that date will be listed.
!!!Installation:
Copy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.
!!!Syntax:
{{{<<timeline better:true>>}}}
''the param better:true enables the advanced features, without it you will get the old timeline behaviour.''
additonal params:
(use only the ones you want)
{{{<<timeline better:true onlyTag:Tag1 excludeTag:Tag2 sortBy:modified/created firstDay:YYYYMMDD maxDays:7 maxEntries:30>>}}}
Note: Use this to replace the contents of the ShadowTiddler TabTimeline -- EW
''explanation of syntax:''
onlyTag: only tiddlers with this tag will be listed. Default is to list all tiddlers.
excludeTag: tiddlers with this tag will not be listed.
sortBy: sort tiddlers by date modified or date created. Possible values are modified or created.
firstDay: useful for starting timeline from a specific date. Example: 20060701 for 1st of July, 2006
maxDays: limits timeline to include only tiddlers from the specified number of days. If you use a value of 7 for example, only tiddlers from the last 7 days will be listed.
maxEntries: limit the total number of entries in the timeline.
!!!History:
*28-07-06: ver 0.5 beta, first release
!!!Code
***/
//{{{
// Return the tiddlers as a sorted array
TiddlyWiki.prototype.getTiddlers = function(field,excludeTag,includeTag)
{
var results = [];
this.forEachTiddler(function(title,tiddler)
{
if(excludeTag == undefined || tiddler.tags.find(excludeTag) == null)
if(includeTag == undefined || tiddler.tags.find(includeTag)!=null)
results.push(tiddler);
});
if(field)
results.sort(function (a,b) {if(a[field] == b[field]) return(0); else return (a[field] < b[field]) ? -1 : +1; });
return results;
}
//this function by Udo
function getParam(params, name, defaultValue)
{
if (!params)
return defaultValue;
var p = params[0][name];
return p ? p[0] : defaultValue;
}
window.old_timeline_handler= config.macros.timeline.handler;
config.macros.timeline.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
var args = paramString.parseParams("list",null,true);
var betterMode = getParam(args, "better", "false");
if (betterMode == 'true')
{
var sortBy = getParam(args,"sortBy","modified");
var excludeTag = getParam(args,"excludeTag",undefined);
var includeTag = getParam(args,"onlyTag",undefined);
var tiddlers = store.getTiddlers(sortBy,excludeTag,includeTag);
var firstDayParam = getParam(args,"firstDay",undefined);
var firstDay = (firstDayParam!=undefined)? firstDayParam: "00010101";
var lastDay = "";
var field= sortBy;
var maxDaysParam = getParam(args,"maxDays",undefined);
var maxDays = (maxDaysParam!=undefined)? maxDaysParam*24*60*60*1000: (new Date()).getTime() ;
var maxEntries = getParam(args,"maxEntries",undefined);
var last = (maxEntries!=undefined) ? tiddlers.length-Math.min(tiddlers.length,parseInt(maxEntries)) : 0;
for(var t=tiddlers.length-1; t>=last; t--)
{
var tiddler = tiddlers[t];
var theDay = tiddler[field].convertToLocalYYYYMMDDHHMM().substr(0,8);
if ((theDay>=firstDay)&& (tiddler[field].getTime()> (new Date()).getTime() - maxDays))
{
if(theDay != lastDay)
{
var theDateList = document.createElement("ul");
place.appendChild(theDateList);
createTiddlyElement(theDateList,"li",null,"listTitle",tiddler[field].formatString(this.dateFormat));
lastDay = theDay;
}
var theDateListItem = createTiddlyElement(theDateList,"li",null,"listLink",null);
theDateListItem.appendChild(createTiddlyLink(place,tiddler.title,true));
}
}
}
else
{
window.old_timeline_handler.apply(this,arguments);
}
}
//}}}
By default ~TiddlyFolio uses the [[K2Blog|http://tiddlythemes.com/#K2Blog]] theme from [[TiddlyThemes|http://tiddlythemes.com]].
You may change the theme as follows:
1. Move the mouse to the top right corner of the main window of your web browser
2. click on the word ''Backstage'' when it appears.
3. Select ''import''
4. Specify the type of server: Choose "file"
5. Enter the URL of the theme you wish to use,
>preceded if you are importing to a ~TiddlySpot wiki by ''/proxy/'' (//e.g.//:
{{{
/proxy/http://tiddlythemes.com/empties/Kubrick.html
}}}
6. Click ''open''. Select the workspace name: default.
7. Click ''open'', then ''Allow'' if you are prompted by your browser for permission.
8. Check the box in the top row to select all the tiddlers and click ''import''.
9. Click ''OK'', then ''done'' and then close the the backstage area.
If you are working with local file on your PC you may select ''save changes''^^1^^ in the Sidebar to update it. If you are working with a web site you'll need to ''Save to the web''. The latter will require you to have entered a username (= the site name) in the Sidebar and a password. You may download the file to your PC by clicking on ''download'' in the control panel (see the [[Welcome to TiddlySpot]] tiddler).
^^1^^If you use a Mac: Safari needs a [[Java browser plugin|http://tiddlywiki.com/#TiddlySaver]] to be able to save ~TiddlyWikis locally.
!''Note''
The Wikipedia-like [[TiddlyPedia|http://tiddlythemes.com/#TiddlyPedia]] theme from [[TiddlyThemes|http://tiddlythemes.com]] requires some files in addition to the sunflower image in wiki.png:
* [[bullet.gif]]
* [[headbg.jpg]]
* [[external.png]]
Copies of these are embedded in this ~TiddlyFolio. If you wish to use the ~TiddlyPedia them just save copies of these files, along with wiki.png into your ~TiddlyFolio directory (click on the links above, right click on the image and "Save As") on your PC. These files will be installed automatically on [[TiddlySpot|http://www.tiddlyspot.com]] if the ~TiddlyPedia theme is installed from [[TiddlyThemes|http://tiddlythemes.com]].
If you use ~TiddlyPedia or any theme without a top menu edit the [[MainMenu]] and comment out the Sidebar on/off menu option as indicated in the comments.
2013-0-17 v1.1
TW updated to 2.7.0;
minor plugin updates; TiddlerEncryptionPlugin to 3.3.2
Update: ~TiddlySaver.jar applet if you use it (see TiddlySaver)
2011-01-17 v1.0
TW updated to 2.6.2; miscellaneous plugins updated
TiddlySaver (tiddler, not applet) added
[[Baby photo]] added, with baby.jpg
[[Tips]] updated
2010-04-14 v0.99
TW updated to 2.6.0; miscellaneous plugins updated
~SentinelCardProtection URL address upated
2008-10-13 v0.98a
excludeWikiWords tag used for Wallet items
2008-10-10 v0.98
TiddlerEncryptionPlugin updated to 3.2
ToolbarCommands edited to add decrypt entry
DataViewTemplate edited to use ToolbarCommands
2008-10-05 v0.97
HTMLFormattingPlugin updated to 2.3 (info tiddler updated)
TiddlerEncryptionPlugin updated to 3.1.1; <html>See <a href="http://groups.google.com/group/TiddlyWiki/browse_thread/thread/6bfcc951a7741444">this note</a></html>
~SaveOnExitPlugin replaced with ConfirmExitPlugin v2.0
TaggedTemplateTweak updated to v1.4.1
UploadPlugin updated to v4.1.4
2008-08-19
TiddlerEncryptionPlugin updated to 3.1; v0.96
2008-08-08
TW Core updated to 2.4.1
Numerous plugins updated (listed in [[About]]; some renamed)
DeprecatedFunctionsPlugin added; required for BetterTimelineMacro
2007-10-20
TW Core updated to 2.2.6
Troubleshooting note from Lyall Pearce added to [[EncryptDecrypt]]
LoadRemoteFileThroughProxy Plugin added
[[Debit Card]] added
[[Wallet]] updated to enable addition of debit cards
[[Instructions]] revised
[[Change The Theme]] revised with instructions for ~TiddlyPedia
[[MainMenu]] revised (edit if using ~TiddlyPedia theme)
[[Emergency]] updated with company name and policy exp date
2007-10-21
[[ID Card]] added for frequent flyer and other membership cards
[[List Items]] display updated
/%
!info
|Name|CheckboxToggleTag|
|Source|http://www.TiddlyTools.com/#CheckboxToggleTag|
|Version|1.3.6|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|transclusion|
|Description|toggle between two tag values using an HTML checkbox (no plugins)|
Usage:
<<<
{{{
in tiddler content:
<<tiddler CheckboxToggleTag with: tag1 tag2 TiddlerName>> label
in ViewTemplate or EditTemplate:
<span macro='CheckboxToggleTag with: tag1 tag2 TiddlerName'></span> label
}}}
where:
*''tag1'' is the tag to use when the checkbox is set
*''tag2'' //(optional)// is the tag to use when the checkbox is cleared (default=remove ''tag1'')
*''~TiddlerName'' //(optional)// is the tiddler to be tagged (default=current tiddler)
*''label'' //(optional)// is any text you want to display next to the checkbox
//note: to specify a ''~TiddlerName'' while omitting ''tag2'', use {{{""}}} (empty quotes) as a placeholder for ''tag2''//
<<<
Examples:
<<<
{{{
<<tiddler CheckboxToggleTag with: sometag>> set/clear 'sometag'
<<tiddler CheckboxToggleTag with: tagA tagB>> toggle tagA (checked) and tagB (unchecked)
}}}
<<tiddler CheckboxToggleTag with: sometag>> set/clear 'sometag'
<<tiddler CheckboxToggleTag with: tagA tagB>> toggle tagA (checked) and tagB (unchecked)
<<<
Notes:
<<<
*Clicking a checkbox immediately changes the corresponding tag value in the tiddler. This can, in some cases, trigger additional 'side-effect' processing, such as refreshing of page elements, or autosaving of the document (if that option is enabled).
*If you are currently editing the tiddler being tagged, any //unsaved// changes you have made to the contents of the ''tags'' input field will be discarded when the checkbox is clicked.
<<<
!end info
!show
<html><input type="checkbox" onclick="
store.suspendNotifications();
var tid=this.getAttribute('tid');
var ontag=this.getAttribute('onTag');
var offtag=this.getAttribute('offTag');
if (ontag && ontag.length) store.setTiddlerTag(tid,this.checked,ontag);
if (offtag && offtag.length) store.setTiddlerTag(tid,!this.checked,offtag);
store.resumeNotifications();
store.notify(tid,true);
var here=story.findContainingTiddler(this);
if (here) { /* refresh current tiddler */
var title=here.getAttribute('tiddler');
var template=story.chooseTemplateForTiddler(title,story.isDirty(title)?2:1);
story.refreshTiddler(title,template,true);
}
return false;
"><nowiki></html><<tiddler {{
var tid="$3";
if (tid=="$"+"3") {
var here=story.findContainingTiddler(place);
if (here) tid=here.getAttribute('tiddler');
}
if (store.tiddlerExists(tid)) {
var c=place.lastChild.firstChild;
c.setAttribute('onTag','$1');
c.setAttribute('offTag','$2'!='$'+'2'&&'$2'!='undefined'?'$2':'');
c.setAttribute('tid',tid);
c.checked=store.getTiddler(tid).isTagged(c.getAttribute('onTag'));
}
'';}}>>
!end show
%/<<tiddler {{'CheckboxToggleTag##'+('$1'=='$'+'1'?'info':'show')}} with: [[$1]] [[$2]] [[$3]]>>
//{{{
config.options.chkSinglePageMode = true; // display one tiddler at a time
config.options.chkAnimate = false; // disable animations
//}}}
/***
|Name|ConfirmExitPlugin|
|Source|http://www.TiddlyTools.com/#ConfirmExitPlugin|
|Version|2.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|window.confirmExit|
|Options|##Configuration|
|Description|extra safety when exiting with unsaved changes|
For extra "data safety" when exiting from a TiddlyWiki document, this plugin prompts you to ''//save any tiddlers that are still being actively edited//''. The plugin then provides an additional option to ''//save the entire TiddlyWiki document//'' before continuing. Finally, if you do not choose to save the file and there are still unsaved tiddler changes, the standard TiddlyWiki warning message is then displayed as usual, with options to ''//stay on the current page or exit and lose all changes.//''
!!!!!Configuration
<<<
<<option chkAlwaysConfirmExit>> ''//always//'' confirm before exiting (even if no unsaved changes)
<<option chkSaveOnExit>> show save-before-exiting confirmation messages (if unsaved changes)
<<<
!!!!!Revisions
<<<
2008.09.05 2.2.0 renamed plugin ConfirmExitPlugin to better reflect general functionality
2008.09.05 2.1.0 added "always confirm exit" option {{{<<option chkAlwaysConfirmExit>>}}}
2008.04.03 2.0.0 completely re-written to provide checks for active tiddler editors and more consistent warning messages
2007.03.01 1.0.2 use apply() to invoke hijacked core function
2006.08.23 1.0.1 Re-released. Note default is now to NOT enable second message. (i.e., standard behavior)
2006.02.24 1.0.0 Initial release. Replaces ConfirmExitPlugin, which is now included in the TW core functionality.
<<<
!!!!!Code
***/
//{{{
version.extensions.ConfirmExitPlugin= {major: 2, minor: 2, revision: 0, date: new Date(2008,9,5)};
if (config.options.chkAlwaysConfirmExit===undefined) config.options.chkAlwaysConfirmExit=true;
if (config.options.chkSaveOnExit===undefined) config.options.chkSaveOnExit=false;
config.messages.activeEditorWarning=
"Are you sure you want to navigate away from this page?"
+"\n\n--------------------------------\n\n"
+"'%0' is currently being edited."
+"\n\n--------------------------------\n\n"
+"Press OK to save this tiddler, or Cancel to skip this tiddler and continue.";
config.messages.unsavedChangesWarning=
"Are you sure you want to navigate away from this page?"
+"\n\n--------------------------------\n\n"
+"There are unsaved changes in this TiddlyWiki document."
+"\n\n--------------------------------\n\n"
+"Press OK to save the document, or Cancel to continue without saving.";
// for browsers that support onBeforeUnload event handling
window.saveOnExit_coreConfirmExit=window.confirmExit;
window.confirmExit=function() {
// call core handler (to invoke other hijacked 'on exit' code, e.g., [[StorySaverPlugin]])
window.saveOnExit_coreConfirmExit.apply(this,arguments);
// check for tiddlers being edited and offer chance to save/close each
if (config.options.chkSaveOnExit) story.forEachTiddler(function(tid,elem) {
if (elem.getAttribute("dirty")!="true") return;
if (!confirm(config.messages.activeEditorWarning.format([tid]))) return;
story.saveTiddler(tid);
story.closeTiddler(tid);
});
// check for unsaved changes
if(store && store.isDirty && store.isDirty()) {
if (config.options.chkSaveOnExit && confirm(config.messages.unsavedChangesWarning))
saveChanges(); // save the file
else
return config.messages.confirmExit; // 'unsaved changes' confirmation message
} else if (config.options.chkAlwaysConfirmExit)
return config.messages.confirmExit_nochanges||""; // 'no changes' confirmation message
}
// for older browsers that only support onUnload event handling
window.checkUnsavedChanges=function() { if(window.hadConfirmExit === false) window.confirmExit(); }
//}}}
|!Card Issuer ||
|!Card # ||
|!Name ||
|!Start date ||
|!Exp ||
|!Card verification nr ||
|!Call if lost / stolen ||
|!Billing address ||
|!Notes ||
<!--{{{-->
<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>
<span macro='tiddler CheckboxToggleTag with: Encrypt(TiddlyFolio) Unencrypted'></span><span><html><b>Encrypt</b></html></span>
<span macro="tiddler BackgroundColors title"></span>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
|!Card Issuer ||
|!Card # ||
|!Name ||
|!Start date ||
|!Exp ||
|!Card verification nr ||
|!Sort Code ||
|!Account nr ||
|!Call if lost / stolen ||
|!Billing address ||
|!Notes ||
/***
|''Name''|DeprecatedFunctionsPlugin|
|''Description''|Provides support for functions removed from the TiddlyWiki core|
|''Version''|1.0.0|
|''Status''|stable|
|''Source''|http://www.tiddlywiki.com/plugins.html#DeprecatedFunctionsPlugin|
|''~CodeRepository:''|http://svn.tiddlywiki.org/Trunk/association/plugins/DeprecatedFunctionsPlugin/DeprecatedFunctionsPlugin.js |
|''License''|[[BSD open source license]]|
|''~CoreVersion''|2.3.0|
|''Feedback''|[[TiddlyWiki community|http://groups.google.com/group/TiddlyWiki]] |
|''Keywords''|legacySupport|
!Code
***/
//{{{
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");
}
//}}}
|!Card Issuer ||
|!Card # ||
|!Name ||
|!Start date ||
|!Exp ||
|!Card verification nr ||
|!Call if lost/stolen ||
|!Billing address ||
|!Notes ||
TiddlyWiki FireFox TiddlyFolio TiddlyTools TiddlyTech HowTo $1
/***
|Name|DisableWikiLinksPlugin|
|Source|http://www.TiddlyTools.com/#DisableWikiLinksPlugin|
|Version|1.6.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Tiddler.prototype.autoLinkWikiWords, 'wikiLink' formatter|
|Options|##Configuration|
|Description|selectively disable TiddlyWiki's automatic ~WikiWord linking behavior|
This plugin allows you to disable TiddlyWiki's automatic ~WikiWord linking behavior, so that WikiWords embedded in tiddler content will be rendered as regular text, instead of being automatically converted to tiddler links. To create a tiddler link when automatic linking is disabled, you must enclose the link text within {{{[[...]]}}}.
!!!!!Usage
<<<
You can block automatic WikiWord linking behavior for any specific tiddler by ''tagging it with<<tag excludeWikiWords>>'' (see configuration below) or, check a plugin option to disable automatic WikiWord links to non-existing tiddler titles, while still linking WikiWords that correspond to existing tiddlers titles or shadow tiddler titles. You can also block specific selected WikiWords from being automatically linked by listing them in [[DisableWikiLinksList]] (see configuration below), separated by whitespace. This tiddler is optional and, when present, causes the listed words to always be excluded, even if automatic linking of other WikiWords is being permitted.
Note: WikiWords contained in default ''shadow'' tiddlers will be automatically linked unless you select an additional checkbox option lets you disable these automatic links as well, though this is not recommended, since it can make it more difficult to access some TiddlyWiki standard default content (such as AdvancedOptions or SideBarTabs)
<<<
!!!!!Configuration
<<<
<<option chkDisableWikiLinks>> Disable ALL automatic WikiWord tiddler links
<<option chkAllowLinksFromShadowTiddlers>> ... except for WikiWords //contained in// shadow tiddlers
<<option chkDisableNonExistingWikiLinks>> Disable automatic WikiWord links for non-existing tiddlers
Disable automatic WikiWord links for words listed in: <<option txtDisableWikiLinksList>>
Disable automatic WikiWord links for tiddlers tagged with: <<option txtDisableWikiLinksTag>>
<<<
!!!!!Revisions
<<<
2008.07.22 [1.6.0] hijack tiddler changed() method to filter disabled wiki words from internal links[] array (so they won't appear in the missing tiddlers list)
2007.06.09 [1.5.0] added configurable txtDisableWikiLinksTag (default value: "excludeWikiWords") to allows selective disabling of automatic WikiWord links for any tiddler tagged with that value.
2006.12.31 [1.4.0] in formatter, test for chkDisableNonExistingWikiLinks
2006.12.09 [1.3.0] in formatter, test for excluded wiki words specified in DisableWikiLinksList
2006.12.09 [1.2.2] fix logic in autoLinkWikiWords() (was allowing links TO shadow tiddlers, even when chkDisableWikiLinks is TRUE).
2006.12.09 [1.2.1] revised logic for handling links in shadow content
2006.12.08 [1.2.0] added hijack of Tiddler.prototype.autoLinkWikiWords so regular (non-bracketed) WikiWords won't be added to the missing list
2006.05.24 [1.1.0] added option to NOT bypass automatic wikiword links when displaying default shadow content (default is to auto-link shadow content)
2006.02.05 [1.0.1] wrapped wikifier hijack in init function to eliminate globals and avoid FireFox 1.5.0.1 crash bug when referencing globals
2005.12.09 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.disableWikiLinks= {major: 1, minor: 6, revision: 0, date: new Date(2008,7,22)};
if (config.options.chkDisableNonExistingWikiLinks==undefined) config.options.chkDisableNonExistingWikiLinks= false;
if (config.options.chkDisableWikiLinks==undefined) config.options.chkDisableWikiLinks=false;
if (config.options.txtDisableWikiLinksList==undefined) config.options.txtDisableWikiLinksList="DisableWikiLinksList";
if (config.options.chkAllowLinksFromShadowTiddlers==undefined) config.options.chkAllowLinksFromShadowTiddlers=true;
if (config.options.txtDisableWikiLinksTag==undefined) config.options.txtDisableWikiLinksTag="excludeWikiWords";
// find the formatter for wikiLink and replace handler with 'pass-thru' rendering
initDisableWikiLinksFormatter();
function initDisableWikiLinksFormatter() {
for (var i=0; i<config.formatters.length && config.formatters[i].name!="wikiLink"; i++);
config.formatters[i].coreHandler=config.formatters[i].handler;
config.formatters[i].handler=function(w) {
// supress any leading "~" (if present)
var skip=(w.matchText.substr(0,1)==config.textPrimitives.unWikiLink)?1:0;
var title=w.matchText.substr(skip);
var exists=store.tiddlerExists(title);
var inShadow=w.tiddler && store.isShadowTiddler(w.tiddler.title);
// check for excluded Tiddler
if (w.tiddler && w.tiddler.isTagged(config.options.txtDisableWikiLinksTag))
{ w.outputText(w.output,w.matchStart+skip,w.nextMatch); return; }
// check for specific excluded wiki words
var t=store.getTiddlerText(config.options.txtDisableWikiLinksList);
if (t && t.length && t.indexOf(w.matchText)!=-1)
{ w.outputText(w.output,w.matchStart+skip,w.nextMatch); return; }
// if not disabling links from shadows (default setting)
if (config.options.chkAllowLinksFromShadowTiddlers && inShadow)
return this.coreHandler(w);
// check for non-existing non-shadow tiddler
if (config.options.chkDisableNonExistingWikiLinks && !exists)
{ w.outputText(w.output,w.matchStart+skip,w.nextMatch); return; }
// if not enabled, just do standard WikiWord link formatting
if (!config.options.chkDisableWikiLinks)
return this.coreHandler(w);
// just return text without linking
w.outputText(w.output,w.matchStart+skip,w.nextMatch)
}
}
Tiddler.prototype.coreAutoLinkWikiWords = Tiddler.prototype.autoLinkWikiWords;
Tiddler.prototype.autoLinkWikiWords = function()
{
// if all automatic links are not disabled, just return results from core function
if (!config.options.chkDisableWikiLinks)
return this.coreAutoLinkWikiWords.apply(this,arguments);
return false;
}
Tiddler.prototype.disableWikiLinks_changed = Tiddler.prototype.changed;
Tiddler.prototype.changed = function()
{
this.disableWikiLinks_changed.apply(this,arguments);
// remove excluded wiki words from links array
var t=store.getTiddlerText(config.options.txtDisableWikiLinksList,"").readBracketedList();
if (t.length) for (var i=0; i<t.length; i++)
if (this.links.contains(t[i]))
this.links.splice(this.links.indexOf(t[i]),1);
};
//}}}
|!Format|!Markup|!Example|
|''Headings''|{{{!!Heading 2}}}<<br>>{{{!!!Heading 3}}}<<br>>{{{!!!!Heading 4}}}<<br>>{{{!!!!!Heading 5}}}<<br>><<br>>Usually avoid Heading1 as Tiddler titles are nominally Heading1.|<html><h2>Heading 2</h2><h3>Heading 3</h3><h4>Heading 4</h4><h5>Heading 5</h5></html>|
|''Lists''|{{{*Bulleted list}}}|<html><ul><li>Bulleted List</li></ul></html>|
|~|{{{#Numbered list}}}|<html><ol><li>Numbered List</li></ol></html>|
|~|Definition list<<br>>{{{;Term}}}<<br>>{{{:definition}}}|<html><dl><dt>Term</dt><dd>definition</dd></dl></html>|
|~|Lists can be mixed and nested<<br>>{{{*}}}Bullet<<br>>{{{*#}}}Number<<br>>{{{*#;}}}Item<<br>>{{{*#:}}}Definition|<html><ul><li>Bullet<ol><li>Numbered<dl><dt></dt>Item<dd>Definition</dd></dl></li></ol></li></ul></html>|
|''Block quotes''|{{{>Blockquote}}}<<br>>{{{>>Nested quote}}}|<html><blockquote>Blockquote<blockquote>Nested<br/> quote</blockquote></blockquote></html>|
|~|{{{<<<}}}<<br>>{{{multi-line}}}<<br>>{{{blockquote}}}<<br>>{{{<<<}}}|<html><blockquote>multi-line<br/>blockquote</blockquote></html>|
|''Horizontal Rule''|{{{----}}} (4 dashes on a line of their own)|<html><hr></html>|
|''Links''|Any {{{WikiWord}}} creates a link to a tiddler (whether it exists or not).<<br>>Note that a WikiWord has to start with a capital letter and have a further mix of upper and lower case.|[[WikiWord]]|
|~|Manual link<<br>>{{{[[Table of Contents]]}}} (Especially for tiddlers with spaces in their titles)|[[Table of Contents]]|
|~|{{{[[Pretty Link|Link]]}}}|[[Pretty Link|Link]]|
|~|Automatic external link {{{http://www.tiddlywiki.com}}}|http://www.tiddlywiki.com|
|~|Pretty external link<<br>>{{{[[My Home Page|http://www.tiddlywiki.com]]}}}|[[My Home Page|http://www.tiddlywiki.com]]|
|~|OS Folder link<<br>>Windows Share: {{{file://///server/share}}}<<br>>Windows Local: {{{file:///c:/folder/file}}}<<br>>Un*x Local File: {{{file://folder/file}}}<<br>>Relative File: {{{[[folder/file]]}}}|file://///server/share <<br>>file:///c:/folder/file <<br>>file://folder/file <<br>> [[folder/file]]|
|''Images''|{{{[img[favicon.ico]]}}}<<br>>Note that image files are always external to the TW file|[img[http://www.tiddlywiki.com/favicon.ico]]|
|~|Right aligned<<br>>{{{[>img[favicon.ico]]}}}|[>img[http://www.tiddlywiki.com/favicon.ico]]|
|~|Left aligned<<br>>{{{[<img[favicon.ico]]}}}|[<img[http://www.tiddlywiki.com/favicon.ico]]|
|''Image Links''|{{{[img[fav.ico][TiddlerName]]}}}|[img[http://www.tiddlywiki.com/favicon.ico][TiddlerName]]|
|~|{{{[img[fav.ico][Alias|TiddlerName]]}}}|[img[http://www.tiddlywiki.com/favicon.ico][Alias|TiddlerName]]|
|~|{{{[img[fav.ico][http://www.aa.com]]}}}|[img[http://www.tiddlywiki.com/favicon.ico][http://www.tiddlywiki.com]]|
|~|>|also see ''Links'' and ''Images'' sections in this table|
|''Inline''<<br>>''Comments''|{{{Not shown: /% hidden comment %/}}}<<br>>Text between the markers will not be shown|Not shown:/% hidden text %/|
Single point of contact details if your wallet has been lost or stolen
(//e.g.// ''[[Credit Card Sentinel|http://www.sentinelcardprotection.com]]''):
[>img[emergency info|emergencyinfo.gif]]
|!Company ||
|!Emergency Tel. ||
|!Customer Services Tel. ||
|!URL | |
|!Email | |
|!Policy Number ||
|!Exp ||
|!Note ||
Click [[here|Wallet Report]] to generate a Wallet Contents Report (a file called c:\mywallet.txt will be created; you must be able to write to this location. Otherwise print or cut and paste from a list of [[Wallet Contents]].
Update / delete the following as needed:
[[Drug Allergies]]
[[Medical Insurance]]
[[Other Medical]]
[[Organ Donor]]
[[Next of Kin]]
----
The purpose of the special [[Unencrypted]] / [[Encrypt(TiddlyFolio)]]^^1^^ tiddler is to facilitate collectively renaming the tags on all other tiddlers tagged with either of these values
* Encrypted(~TiddlyFolio)
* Unencrypted
to interchange these tags and to control thereby whether tiddlers are saved in encrypted or decrypted form.
^^1^^The current name of the special tiddler is shown above in bold text.
!Default: No Encryption
> Existing items //already// tagged ''[[Unencrypted]]'' are //not// encrypted by default. These include the [[Passwords]] and [[Wallet]] tiddlers and those items tagged ''Wallet''.
>
> ''New Items'' created using the main menu are also not encrypted, they are simply labeled (tagged) ''Unencrypted''. They are flagged for encryption (tagged ''Encrypt(~TiddlyFolio)'') if you check the "Encrypt" box on each tiddler.
>
> New tiddlers, created using the Sidebar, are untagged (never encrypted). To add an an encryption checkbox to a tiddler tag it with the word "Data".
!''To Save Tiddlers In''
* ''Encrypted form:'' rename the [[Unencrypted]] tiddler to ''Encrypt(~TiddlyFolio)''.
* ''Decrypted form:'' change the name of the ''Encrypt(~TiddlyFolio)'' tiddler back to ''[[Unencrypted]]''
//You may also remove or change tags of individual tiddlers by editing the tags or by checking or unchecking the "Encrypt" checkbox as appropriate.//
Then click @@color(blue):save changes@@ in the Sidebar.
!Note on Searching
Encrypted tiddlers are not searchable. They are decrypted only on display and are then searchable. To temporarily decrypt all tiddlers so that they may be searched use this button:
> <<EncryptionDecryptAll>>
Tiddlers will still be saved in encrypted form if tagged accordingly.
!Changing Password
To change password click on this button:
> <<EncryptionChangePassword>>
!Troubleshooting Note
//From: Lyall Pearce, author of the ~TiddlerEncryptionPlugin used by ~TiddlyFolio//
There is one opportunity for problems with the plugin, if you create a new tiddler for encryption, and you have not previously decrypted any tiddlers for that group, and you get the password wrong, on entry (compared to existing tiddlers of the same encryption group), the next time you open the ~TiddlyWiki, you will be unable to open one or the other. If you manage to figure out what the password was, the easiest method is to edit the 'bogus' tiddler (simply ignoring the password requests), remove the encryption tag, save, reload the tiddly, re-edit the tiddler, re-add the encryption tag and enter the correct password. Of course, if you can't figure out what the password was, you simply have to edit the encrypted tiddler and delete it.
An alternative to [[TiddlySpot|www.tiddlyspot.com]] is to use online storage accessible with a [[webDAV|http://en.wikipedia.org/wiki/WebDAV]] or [[FTP|http://en.wikipedia.org/wiki/Ftp]] client. You may save to ~WebDAV storage using this: [[WebDAVSavingPlugin|http://tiddlywiki.bidix.info/#WebDAVSavingPlugin]].
[[Fastmail|www.fastmail.fm]] is an excellent email service provider whose paid email accounts come with file storage that can be used to host web sites (plural, both public and private) and online file storage, both public and private. Fastmail supports webDAV, FTP and FTPS (but not SFTP, yet) and has recommended use of ~TiddlyWiki for publishing [[personal home pages|http://blog.fastmail.fm/2007/03/02/publish-a-home-page-easily-with-tiddywiki/]].
If you sign up with Fastmail please use [[this link|http://www.fastmail.fm/mail/?STKI=21000]].
Note: FTP(S) is [[recommended with Vista|http://blog.fastmail.fm/2007/07/10/easy-access-to-ftp-with-vista/]] (not webDAV).
//~~(Part of the [[ForEachTiddlerPlugin]])~~//
Create customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.
''Syntax:''
|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|
|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|
|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|
|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|
|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|
|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]] is used.|
|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|
|>|~~Syntax : Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|
''Using JavaScript''
To give you a lot of flexibility the [[ForEachTiddlerMacro]] uses JavaScript in its arguments. Even if you are not that familiar with JavaScript you may find forEachTiddler useful. Just have a look at the various ready-to-use [[ForEachTiddlerExamples|http://tiddlywiki.abego-software.de/#ForEachTiddlerExamples]] and adapt them to your needs.
''The Elements of the Macro''
The arguments of the ForEachTiddlerMacro consist of multiple parts, each of them being optional.
<<slider chkFETInClause [[inClause]] "inClause" "inClause">>
<<slider chkFETWhereClause [[whereClause]] "whereClause" "whereClause">>
<<slider chkFETSortClause [[sortClause]] "sortClause" "sortClause">>
<<slider chkFETScriptClause [[scriptClause]] "scriptClause" "scriptClause">>
<<slider chkFETActions [[Action Specification]] "Action Specification" "Action Specification">>
''Using Macros and ">" inside the forEachTiddler Macro''
You may use other macro calls into the expression, especially in the actionParameters. To avoid that the {{{>>}}} of such a macro call is misinterpreted as the end of the {{{<<forEachTiddler...>>}}} macro you must escape the {{{>>}}} of the inner macro with {{{$))}}} E.g. if you want to use {{{<<tiddler ...>>}}} inside the {{{forEachTiddler}}} macro you have to write {{{<<tiddler ...$))}}}.
In addition it is necessary to escape single {{{>}}} with the text {{{$)}}}.
''Using {{{<<tiddler ... with: ...>>}}} to re-use ForEachTiddler definitions''
Sometimes you may want to use a certain ForEachTiddler definition in slight variations. E.g. you may want to list either the tiddlers tagged with "ToDo" and in the other case with "Done". To do so you may use "Tiddler parameters". Here an example:
Replace the variable part of the ForEachTiddler definition with $1 ($2,... $9 are supported). E.g. you may create the tiddler "ListTaggedTiddlers" like this
{{{
<<forEachTiddler
where
'tiddler.tags.contains("$1")'
>>
}}}
Now you can use the ListTaggedTiddlers for various specific tags, using the {{{<<tiddler ...>>}}} macro:
{{{
<<tiddler ListTaggedTiddlers with: "systemConfig">>
}}}
{{{
<<tiddler ListTaggedTiddlers with: "Plugin">>
}}}
See also [[ForEachTiddlerExamples|http://tiddlywiki.abego-software.de/#ForEachTiddlerExamples]].
/***
|''Name:''|ForEachTiddlerPlugin|
|''Version:''|1.0.8 (2007-04-12)|
|''Source:''|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''Copyright:''|© 2005-2007 [[abego Software|http://www.abego-software.de]]|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|
!Description
Create customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.
''Syntax:''
|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|
|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|
|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|
|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and {{{context}}}.|
|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|
|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]] is used.|
|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|
|>|~~Syntax : Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|
See details see [[ForEachTiddlerMacro]] and [[ForEachTiddlerExamples|http://tiddlywiki.abego-software.de/#ForEachTiddlerExamples]].
!Revision history
* v1.0.8 (2007-04-12)
** Adapted to latest TiddlyWiki 2.2 Beta importTiddlyWiki API (introduced with changeset 2004). TiddlyWiki 2.2 Beta builds prior to changeset 2004 are no longer supported (but TiddlyWiki 2.1 and earlier, of cause)
* v1.0.7 (2007-03-28)
** Also support "pre" formatted TiddlyWikis (introduced with TW 2.2) (when using "in" clause to work on external tiddlers)
* v1.0.6 (2006-09-16)
** Context provides "viewerTiddler", i.e. the tiddler used to view the macro. Most times this is equal to the "inTiddler", but when using the "tiddler" macro both may be different.
** Support "begin", "end" and "none" expressions in "write" action
* v1.0.5 (2006-02-05)
** Pass tiddler containing the macro with wikify, context object also holds reference to tiddler containing the macro ("inTiddler"). Thanks to SimonBaird.
** Support Firefox 1.5.0.1
** Internal
*** Make "JSLint" conform
*** "Only install once"
* v1.0.4 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.3 (2005-12-22)
** Features:
*** Write output to a file supports multi-byte environments (Thanks to Bram Chen)
*** Provide API to access the forEachTiddler functionality directly through JavaScript (see getTiddlers and performMacro)
** Enhancements:
*** Improved error messages on InternetExplorer.
* v1.0.2 (2005-12-10)
** Features:
*** context object also holds reference to store (TiddlyWiki)
** Fixed Bugs:
*** ForEachTiddler 1.0.1 has broken support on win32 Opera 8.51 (Thanks to BrunoSabin for reporting)
* v1.0.1 (2005-12-08)
** Features:
*** Access tiddlers stored in separated TiddlyWikis through the "in" option. I.e. you are no longer limited to only work on the "current TiddlyWiki".
*** Write output to an external file using the "toFile" option of the "write" action. With this option you may write your customized tiddler exports.
*** Use the "script" section to define "helper" JavaScript functions etc. to be used in the various JavaScript expressions (whereClause, sortClause, action arguments,...).
*** Access and store context information for the current forEachTiddler invocation (through the build-in "context" object) .
*** Improved script evaluation (for where/sort clause and write scripts).
* v1.0.0 (2005-11-20)
** initial version
!Code
***/
//{{{
//============================================================================
//============================================================================
// ForEachTiddlerPlugin
//============================================================================
//============================================================================
// Only install once
if (!version.extensions.ForEachTiddlerPlugin) {
if (!window.abego) window.abego = {};
version.extensions.ForEachTiddlerPlugin = {
major: 1, minor: 0, revision: 8,
date: new Date(2007,3,12),
source: "http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin",
licence: "[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",
copyright: "Copyright (c) abego Software GmbH, 2005-2007 (www.abego-software.de)"
};
// For backward compatibility with TW 1.2.x
//
if (!TiddlyWiki.prototype.forEachTiddler) {
TiddlyWiki.prototype.forEachTiddler = function(callback) {
for(var t in this.tiddlers) {
callback.call(this,t,this.tiddlers[t]);
}
};
}
//============================================================================
// forEachTiddler Macro
//============================================================================
version.extensions.forEachTiddler = {
major: 1, minor: 0, revision: 8, date: new Date(2007,3,12), provider: "http://tiddlywiki.abego-software.de"};
// ---------------------------------------------------------------------------
// Configurations and constants
// ---------------------------------------------------------------------------
config.macros.forEachTiddler = {
// Standard Properties
label: "forEachTiddler",
prompt: "Perform actions on a (sorted) selection of tiddlers",
// actions
actions: {
addToList: {},
write: {}
}
};
// ---------------------------------------------------------------------------
// The forEachTiddler Macro Handler
// ---------------------------------------------------------------------------
config.macros.forEachTiddler.getContainingTiddler = function(e) {
while(e && !hasClass(e,"tiddler"))
e = e.parentNode;
var title = e ? e.getAttribute("tiddler") : null;
return title ? store.getTiddler(title) : null;
};
config.macros.forEachTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
// config.macros.forEachTiddler.traceMacroCall(place,macroName,params,wikifier,paramString,tiddler);
if (!tiddler) tiddler = config.macros.forEachTiddler.getContainingTiddler(place);
// --- Parsing ------------------------------------------
var i = 0; // index running over the params
// Parse the "in" clause
var tiddlyWikiPath = undefined;
if ((i < params.length) && params[i] == "in") {
i++;
if (i >= params.length) {
this.handleError(place, "TiddlyWiki path expected behind 'in'.");
return;
}
tiddlyWikiPath = this.paramEncode((i < params.length) ? params[i] : "");
i++;
}
// Parse the where clause
var whereClause ="true";
if ((i < params.length) && params[i] == "where") {
i++;
whereClause = this.paramEncode((i < params.length) ? params[i] : "");
i++;
}
// Parse the sort stuff
var sortClause = null;
var sortAscending = true;
if ((i < params.length) && params[i] == "sortBy") {
i++;
if (i >= params.length) {
this.handleError(place, "sortClause missing behind 'sortBy'.");
return;
}
sortClause = this.paramEncode(params[i]);
i++;
if ((i < params.length) && (params[i] == "ascending" || params[i] == "descending")) {
sortAscending = params[i] == "ascending";
i++;
}
}
// Parse the script
var scriptText = null;
if ((i < params.length) && params[i] == "script") {
i++;
scriptText = this.paramEncode((i < params.length) ? params[i] : "");
i++;
}
// Parse the action.
// When we are already at the end use the default action
var actionName = "addToList";
if (i < params.length) {
if (!config.macros.forEachTiddler.actions[params[i]]) {
this.handleError(place, "Unknown action '"+params[i]+"'.");
return;
} else {
actionName = params[i];
i++;
}
}
// Get the action parameter
// (the parsing is done inside the individual action implementation.)
var actionParameter = params.slice(i);
// --- Processing ------------------------------------------
try {
this.performMacro({
place: place,
inTiddler: tiddler,
whereClause: whereClause,
sortClause: sortClause,
sortAscending: sortAscending,
actionName: actionName,
actionParameter: actionParameter,
scriptText: scriptText,
tiddlyWikiPath: tiddlyWikiPath});
} catch (e) {
this.handleError(place, e);
}
};
// Returns an object with properties "tiddlers" and "context".
// tiddlers holds the (sorted) tiddlers selected by the parameter,
// context the context of the execution of the macro.
//
// The action is not yet performed.
//
// @parameter see performMacro
//
config.macros.forEachTiddler.getTiddlersAndContext = function(parameter) {
var context = config.macros.forEachTiddler.createContext(parameter.place, parameter.whereClause, parameter.sortClause, parameter.sortAscending, parameter.actionName, parameter.actionParameter, parameter.scriptText, parameter.tiddlyWikiPath, parameter.inTiddler);
var tiddlyWiki = parameter.tiddlyWikiPath ? this.loadTiddlyWiki(parameter.tiddlyWikiPath) : store;
context["tiddlyWiki"] = tiddlyWiki;
// Get the tiddlers, as defined by the whereClause
var tiddlers = this.findTiddlers(parameter.whereClause, context, tiddlyWiki);
context["tiddlers"] = tiddlers;
// Sort the tiddlers, when sorting is required.
if (parameter.sortClause) {
this.sortTiddlers(tiddlers, parameter.sortClause, parameter.sortAscending, context);
}
return {tiddlers: tiddlers, context: context};
};
// Returns the (sorted) tiddlers selected by the parameter.
//
// The action is not yet performed.
//
// @parameter see performMacro
//
config.macros.forEachTiddler.getTiddlers = function(parameter) {
return this.getTiddlersAndContext(parameter).tiddlers;
};
// Performs the macros with the given parameter.
//
// @param parameter holds the parameter of the macro as separate properties.
// The following properties are supported:
//
// place
// whereClause
// sortClause
// sortAscending
// actionName
// actionParameter
// scriptText
// tiddlyWikiPath
//
// All properties are optional.
// For most actions the place property must be defined.
//
config.macros.forEachTiddler.performMacro = function(parameter) {
var tiddlersAndContext = this.getTiddlersAndContext(parameter);
// Perform the action
var actionName = parameter.actionName ? parameter.actionName : "addToList";
var action = config.macros.forEachTiddler.actions[actionName];
if (!action) {
this.handleError(parameter.place, "Unknown action '"+actionName+"'.");
return;
}
var actionHandler = action.handler;
actionHandler(parameter.place, tiddlersAndContext.tiddlers, parameter.actionParameter, tiddlersAndContext.context);
};
// ---------------------------------------------------------------------------
// The actions
// ---------------------------------------------------------------------------
// Internal.
//
// --- The addToList Action -----------------------------------------------
//
config.macros.forEachTiddler.actions.addToList.handler = function(place, tiddlers, parameter, context) {
// Parse the parameter
var p = 0;
// Check for extra parameters
if (parameter.length > p) {
config.macros.forEachTiddler.createExtraParameterErrorElement(place, "addToList", parameter, p);
return;
}
// Perform the action.
var list = document.createElement("ul");
place.appendChild(list);
for (var i = 0; i < tiddlers.length; i++) {
var tiddler = tiddlers[i];
var listItem = document.createElement("li");
list.appendChild(listItem);
createTiddlyLink(listItem, tiddler.title, true);
}
};
abego.parseNamedParameter = function(name, parameter, i) {
var beginExpression = null;
if ((i < parameter.length) && parameter[i] == name) {
i++;
if (i >= parameter.length) {
throw "Missing text behind '%0'".format([name]);
}
return config.macros.forEachTiddler.paramEncode(parameter[i]);
}
return null;
}
// Internal.
//
// --- The write Action ---------------------------------------------------
//
config.macros.forEachTiddler.actions.write.handler = function(place, tiddlers, parameter, context) {
// Parse the parameter
var p = 0;
if (p >= parameter.length) {
this.handleError(place, "Missing expression behind 'write'.");
return;
}
var textExpression = config.macros.forEachTiddler.paramEncode(parameter[p]);
p++;
// Parse the "begin" option
var beginExpression = abego.parseNamedParameter("begin", parameter, p);
if (beginExpression !== null)
p += 2;
var endExpression = abego.parseNamedParameter("end", parameter, p);
if (endExpression !== null)
p += 2;
var noneExpression = abego.parseNamedParameter("none", parameter, p);
if (noneExpression !== null)
p += 2;
// Parse the "toFile" option
var filename = null;
var lineSeparator = undefined;
if ((p < parameter.length) && parameter[p] == "toFile") {
p++;
if (p >= parameter.length) {
this.handleError(place, "Filename expected behind 'toFile' of 'write' action.");
return;
}
filename = config.macros.forEachTiddler.getLocalPath(config.macros.forEachTiddler.paramEncode(parameter[p]));
p++;
if ((p < parameter.length) && parameter[p] == "withLineSeparator") {
p++;
if (p >= parameter.length) {
this.handleError(place, "Line separator text expected behind 'withLineSeparator' of 'write' action.");
return;
}
lineSeparator = config.macros.forEachTiddler.paramEncode(parameter[p]);
p++;
}
}
// Check for extra parameters
if (parameter.length > p) {
config.macros.forEachTiddler.createExtraParameterErrorElement(place, "write", parameter, p);
return;
}
// Perform the action.
var func = config.macros.forEachTiddler.getEvalTiddlerFunction(textExpression, context);
var count = tiddlers.length;
var text = "";
if (count > 0 && beginExpression)
text += config.macros.forEachTiddler.getEvalTiddlerFunction(beginExpression, context)(undefined, context, count, undefined);
for (var i = 0; i < count; i++) {
var tiddler = tiddlers[i];
text += func(tiddler, context, count, i);
}
if (count > 0 && endExpression)
text += config.macros.forEachTiddler.getEvalTiddlerFunction(endExpression, context)(undefined, context, count, undefined);
if (count == 0 && noneExpression)
text += config.macros.forEachTiddler.getEvalTiddlerFunction(noneExpression, context)(undefined, context, count, undefined);
if (filename) {
if (lineSeparator !== undefined) {
lineSeparator = lineSeparator.replace(/\\n/mg, "\n").replace(/\\r/mg, "\r");
text = text.replace(/\n/mg,lineSeparator);
}
saveFile(filename, convertUnicodeToUTF8(text));
} else {
var wrapper = createTiddlyElement(place, "span");
wikify(text, wrapper, null/* highlightRegExp */, context.inTiddler);
}
};
// ---------------------------------------------------------------------------
// Helpers
// ---------------------------------------------------------------------------
// Internal.
//
config.macros.forEachTiddler.createContext = function(placeParam, whereClauseParam, sortClauseParam, sortAscendingParam, actionNameParam, actionParameterParam, scriptText, tiddlyWikiPathParam, inTiddlerParam) {
return {
place : placeParam,
whereClause : whereClauseParam,
sortClause : sortClauseParam,
sortAscending : sortAscendingParam,
script : scriptText,
actionName : actionNameParam,
actionParameter : actionParameterParam,
tiddlyWikiPath : tiddlyWikiPathParam,
inTiddler : inTiddlerParam, // the tiddler containing the <<forEachTiddler ...>> macro call.
viewerTiddler : config.macros.forEachTiddler.getContainingTiddler(placeParam) // the tiddler showing the forEachTiddler result
};
};
// Internal.
//
// Returns a TiddlyWiki with the tiddlers loaded from the TiddlyWiki of
// the given path.
//
config.macros.forEachTiddler.loadTiddlyWiki = function(path, idPrefix) {
if (!idPrefix) {
idPrefix = "store";
}
var lenPrefix = idPrefix.length;
// Read the content of the given file
var content = loadFile(this.getLocalPath(path));
if(content === null) {
throw "TiddlyWiki '"+path+"' not found.";
}
var tiddlyWiki = new TiddlyWiki();
// Starting with TW 2.2 there is a helper function to import the tiddlers
if (tiddlyWiki.importTiddlyWiki) {
if (!tiddlyWiki.importTiddlyWiki(content))
throw "File '"+path+"' is not a TiddlyWiki.";
tiddlyWiki.dirty = false;
return tiddlyWiki;
}
// The legacy code, for TW < 2.2
// Locate the storeArea div's
var posOpeningDiv = content.indexOf(startSaveArea);
var posClosingDiv = content.lastIndexOf(endSaveArea);
if((posOpeningDiv == -1) || (posClosingDiv == -1)) {
throw "File '"+path+"' is not a TiddlyWiki.";
}
var storageText = content.substr(posOpeningDiv + startSaveArea.length, posClosingDiv);
// Create a "div" element that contains the storage text
var myStorageDiv = document.createElement("div");
myStorageDiv.innerHTML = storageText;
myStorageDiv.normalize();
// Create all tiddlers in a new TiddlyWiki
// (following code is modified copy of TiddlyWiki.prototype.loadFromDiv)
var store = myStorageDiv.childNodes;
for(var t = 0; t < store.length; t++) {
var e = store[t];
var title = null;
if(e.getAttribute)
title = e.getAttribute("tiddler");
if(!title && e.id && e.id.substr(0,lenPrefix) == idPrefix)
title = e.id.substr(lenPrefix);
if(title && title !== "") {
var tiddler = tiddlyWiki.createTiddler(title);
tiddler.loadFromDiv(e,title);
}
}
tiddlyWiki.dirty = false;
return tiddlyWiki;
};
// Internal.
//
// Returns a function that has a function body returning the given javaScriptExpression.
// The function has the parameters:
//
// (tiddler, context, count, index)
//
config.macros.forEachTiddler.getEvalTiddlerFunction = function (javaScriptExpression, context) {
var script = context["script"];
var functionText = "var theFunction = function(tiddler, context, count, index) { return "+javaScriptExpression+"}";
var fullText = (script ? script+";" : "")+functionText+";theFunction;";
return eval(fullText);
};
// Internal.
//
config.macros.forEachTiddler.findTiddlers = function(whereClause, context, tiddlyWiki) {
var result = [];
var func = config.macros.forEachTiddler.getEvalTiddlerFunction(whereClause, context);
tiddlyWiki.forEachTiddler(function(title,tiddler) {
if (func(tiddler, context, undefined, undefined)) {
result.push(tiddler);
}
});
return result;
};
// Internal.
//
config.macros.forEachTiddler.createExtraParameterErrorElement = function(place, actionName, parameter, firstUnusedIndex) {
var message = "Extra parameter behind '"+actionName+"':";
for (var i = firstUnusedIndex; i < parameter.length; i++) {
message += " "+parameter[i];
}
this.handleError(place, message);
};
// Internal.
//
config.macros.forEachTiddler.sortAscending = function(tiddlerA, tiddlerB) {
var result =
(tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue)
? 0
: (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
? -1
: +1;
return result;
};
// Internal.
//
config.macros.forEachTiddler.sortDescending = function(tiddlerA, tiddlerB) {
var result =
(tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue)
? 0
: (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
? +1
: -1;
return result;
};
// Internal.
//
config.macros.forEachTiddler.sortTiddlers = function(tiddlers, sortClause, ascending, context) {
// To avoid evaluating the sortClause whenever two items are compared
// we pre-calculate the sortValue for every item in the array and store it in a
// temporary property ("forEachTiddlerSortValue") of the tiddlers.
var func = config.macros.forEachTiddler.getEvalTiddlerFunction(sortClause, context);
var count = tiddlers.length;
var i;
for (i = 0; i < count; i++) {
var tiddler = tiddlers[i];
tiddler.forEachTiddlerSortValue = func(tiddler,context, undefined, undefined);
}
// Do the sorting
tiddlers.sort(ascending ? this.sortAscending : this.sortDescending);
// Delete the temporary property that holds the sortValue.
for (i = 0; i < tiddlers.length; i++) {
delete tiddlers[i].forEachTiddlerSortValue;
}
};
// Internal.
//
config.macros.forEachTiddler.trace = function(message) {
displayMessage(message);
};
// Internal.
//
config.macros.forEachTiddler.traceMacroCall = function(place,macroName,params) {
var message ="<<"+macroName;
for (var i = 0; i < params.length; i++) {
message += " "+params[i];
}
message += ">>";
displayMessage(message);
};
// Internal.
//
// Creates an element that holds an error message
//
config.macros.forEachTiddler.createErrorElement = function(place, exception) {
var message = (exception.description) ? exception.description : exception.toString();
return createTiddlyElement(place,"span",null,"forEachTiddlerError","<<forEachTiddler ...>>: "+message);
};
// Internal.
//
// @param place [may be null]
//
config.macros.forEachTiddler.handleError = function(place, exception) {
if (place) {
this.createErrorElement(place, exception);
} else {
throw exception;
}
};
// Internal.
//
// Encodes the given string.
//
// Replaces
// "$))" to ">>"
// "$)" to ">"
//
config.macros.forEachTiddler.paramEncode = function(s) {
var reGTGT = new RegExp("\\$\\)\\)","mg");
var reGT = new RegExp("\\$\\)","mg");
return s.replace(reGTGT, ">>").replace(reGT, ">");
};
// Internal.
//
// Returns the given original path (that is a file path, starting with "file:")
// as a path to a local file, in the systems native file format.
//
// Location information in the originalPath (i.e. the "#" and stuff following)
// is stripped.
//
config.macros.forEachTiddler.getLocalPath = function(originalPath) {
// Remove any location part of the URL
var hashPos = originalPath.indexOf("#");
if(hashPos != -1)
originalPath = originalPath.substr(0,hashPos);
// Convert to a native file format assuming
// "file:///x:/path/path/path..." - pc local file --> "x:\path\path\path..."
// "file://///server/share/path/path/path..." - FireFox pc network file --> "\\server\share\path\path\path..."
// "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."
// "file://server/share/path/path/path..." - pc network file --> "\\server\share\path\path\path..."
var localPath;
if(originalPath.charAt(9) == ":") // pc local file
localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\\");
else if(originalPath.indexOf("file://///") === 0) // FireFox pc network file
localPath = "\\\\" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\\");
else if(originalPath.indexOf("file:///") === 0) // mac/unix local file
localPath = unescape(originalPath.substr(7));
else if(originalPath.indexOf("file:/") === 0) // mac/unix local file
localPath = unescape(originalPath.substr(5));
else // pc network file
localPath = "\\\\" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\\");
return localPath;
};
// ---------------------------------------------------------------------------
// Stylesheet Extensions (may be overridden by local StyleSheet)
// ---------------------------------------------------------------------------
//
setStylesheet(
".forEachTiddlerError{color: #ffffff;background-color: #880000;}",
"forEachTiddler");
//============================================================================
// End of forEachTiddler Macro
//============================================================================
//============================================================================
// String.startsWith Function
//============================================================================
//
// Returns true if the string starts with the given prefix, false otherwise.
//
version.extensions["String.startsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.startsWith = function(prefix) {
var n = prefix.length;
return (this.length >= n) && (this.slice(0, n) == prefix);
};
//============================================================================
// String.endsWith Function
//============================================================================
//
// Returns true if the string ends with the given suffix, false otherwise.
//
version.extensions["String.endsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.endsWith = function(suffix) {
var n = suffix.length;
return (this.length >= n) && (this.right(n) == suffix);
};
//============================================================================
// String.contains Function
//============================================================================
//
// Returns true when the string contains the given substring, false otherwise.
//
version.extensions["String.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.contains = function(substring) {
return this.indexOf(substring) >= 0;
};
//============================================================================
// Array.indexOf Function
//============================================================================
//
// Returns the index of the first occurance of the given item in the array or
// -1 when no such item exists.
//
// @param item [may be null]
//
version.extensions["Array.indexOf"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.indexOf = function(item) {
for (var i = 0; i < this.length; i++) {
if (this[i] == item) {
return i;
}
}
return -1;
};
//============================================================================
// Array.contains Function
//============================================================================
//
// Returns true when the array contains the given item, otherwise false.
//
// @param item [may be null]
//
version.extensions["Array.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.contains = function(item) {
return (this.indexOf(item) >= 0);
};
//============================================================================
// Array.containsAny Function
//============================================================================
//
// Returns true when the array contains at least one of the elements
// of the item. Otherwise (or when items contains no elements) false is returned.
//
version.extensions["Array.containsAny"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.containsAny = function(items) {
for(var i = 0; i < items.length; i++) {
if (this.contains(items[i])) {
return true;
}
}
return false;
};
//============================================================================
// Array.containsAll Function
//============================================================================
//
// Returns true when the array contains all the items, otherwise false.
//
// When items is null false is returned (even if the array contains a null).
//
// @param items [may be null]
//
version.extensions["Array.containsAll"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.containsAll = function(items) {
for(var i = 0; i < items.length; i++) {
if (!this.contains(items[i])) {
return false;
}
}
return true;
};
} // of "install only once"
// Used Globals (for JSLint) ==============
// ... DOM
/*global document */
// ... TiddlyWiki Core
/*global convertUnicodeToUTF8, createTiddlyElement, createTiddlyLink,
displayMessage, endSaveArea, hasClass, loadFile, saveFile,
startSaveArea, store, wikify */
//}}}
/***
!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.
Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
***/
>A strong password is one that is at least eight characters, includes a random combination of letters, numbers, and symbols. ([[Sources|https://www.google.com/search?q=%22a+strong+password+is+one+that+is%22&oq=%22a+strong+password+is+one+that+is%22&sourceid=chrome&ie=UTF-8]])
A strong password is usually hard to remember. You could improve your chances of remembering by creating a password using a substitution table like this:
<html><pre>{{{<br/><b>Substitution Table</b><br/>
''a'' VS ''b'' CP ''c'' rm
''d'' GR ''e'' 7D ''f'' Nu
''g'' zM ''h'' 4& ''i'' pH
''j'' qk ''k'' sb ''l'' +J
''m'' %$ ''n'' dU ''o'' t5
''p'' KW ''q'' 6F ''r'' ne
''s'' Z? ''t'' gQ ''u'' Ay
''v'' =Y ''w'' 2x ''x'' c!
''y'' vX ''z'' TL
<br/></pre></html>
If you can remember "folio" //e.g.//, you can derive the password ''Nut5+~JpHt5''. Such a table would need to be kept secure, of course. Even better would be to use an [[random password generator|http://www.goodpassword.com/index.htm]] and a secure and convenient means of recording passwords, like TiddlyFolio.
You can find more on password strength [[here|http://en.wikipedia.org/wiki/Password_strength]] and test the strength of a prospective password with this [[online check|http://www.microsoft.com/protect/yourself/password/checker.mspx]].
/***
|Name|HTMLFormattingPlugin|
|Source|http://www.TiddlyTools.com/#HTMLFormattingPlugin|
|Documentation|http://www.TiddlyTools.com/#HTMLFormattingPluginInfo|
|Version|2.4.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|embed wiki syntax formatting inside of HTML content|
The ~HTMLFormatting plugin allows you to ''mix wiki-style formatting syntax within HTML formatted content'' by extending the action of the standard TiddlyWiki formatting handler.
!!!!!Documentation
>see [[HTMLFormattingPluginInfo]]
!!!!!Configuration
<<<
Use {{{<hide linebreaks>}}} within HTML content to wiki-style rendering of line breaks. To //always// omit all line breaks from the rendered output, you can set this option:
><<option chkHTMLHideLinebreaks>> ignore all line breaks
which can also be 'hard coded' into your document by adding the following to a tiddler, tagged with <<tag systemConfig>>
>{{{config.options.chkHTMLHideLinebreaks=true;}}}
<<<
!!!!!Revisions
<<<
2010.05.07 2.4.1 added chkHTMLHideLinebreaks option
| see [[HTMLFormattingPluginInfo]] for additional revision details |
2005.06.26 1.0.0 Initial Release (as code adaptation - pre-dates TiddlyWiki plugin architecture!!)
<<<
!!!!!Code
***/
//{{{
version.extensions.HTMLFormattingPlugin= {major: 2, minor: 4, revision: 1, date: new Date(2010,5,7)};
// find the formatter for HTML and replace the handler
initHTMLFormatter();
function initHTMLFormatter()
{
for (var i=0; i<config.formatters.length && config.formatters[i].name!="html"; i++);
if (i<config.formatters.length) config.formatters[i].handler=function(w) {
if (!this.lookaheadRegExp) // fixup for TW2.0.x
this.lookaheadRegExp = new RegExp(this.lookahead,"mg");
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var html=lookaheadMatch[1];
// if <nowiki> is present, just let browser handle it!
if (html.indexOf('<nowiki>')!=-1)
createTiddlyElement(w.output,"span").innerHTML=html;
else {
// if <hide linebreaks> is present, or chkHTMLHideLinebreaks is set
// suppress wiki-style literal handling of newlines
if (config.options.chkHTMLHideLinebreaks||(html.indexOf('<hide linebreaks>')!=-1))
html=html.replace(/\n/g,' ');
// remove all \r's added by IE textarea and mask newlines and macro brackets
html=html.replace(/\r/g,'').replace(/\n/g,'\\n').replace(/<</g,'%%(').replace(/>>/g,')%%');
// create span, let browser parse HTML
var e=createTiddlyElement(w.output,"span"); e.innerHTML=html;
// then re-render text nodes as wiki-formatted content
wikifyTextNodes(e,w);
}
w.nextMatch = this.lookaheadRegExp.lastIndex; // continue parsing
}
}
}
// wikify #text nodes that remain after HTML content is processed (pre-order recursion)
function wikifyTextNodes(theNode,w)
{
function unmask(s) { return s.replace(/\%%\(/g,'<<').replace(/\)\%%/g,'>>').replace(/\\n/g,'\n'); }
switch (theNode.nodeName.toLowerCase()) {
case 'style': case 'option': case 'select':
theNode.innerHTML=unmask(theNode.innerHTML);
break;
case 'textarea':
theNode.value=unmask(theNode.value);
break;
case '#text':
var txt=unmask(theNode.nodeValue);
var newNode=createTiddlyElement(null,"span");
theNode.parentNode.replaceChild(newNode,theNode);
wikify(txt,newNode,highlightHack,w.tiddler);
break;
default:
for (var i=0;i<theNode.childNodes.length;i++)
wikifyTextNodes(theNode.childNodes.item(i),w); // recursion
break;
}
}
//}}}
|Name|HTMLFormattingPluginInfo|
|Source|http://www.TiddlyTools.com/#HTMLFormattingPlugin|
|Documentation|http://www.TiddlyTools.com/#HTMLFormattingPluginInfo|
|Version|2.4.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Description|documentation for HTMLFormattingPlugin|
The ~HTMLFormatting plugin allows you to freely ''mix wiki-style formatting syntax within HTML formatted content'' by extending the action of the standard TiddlyWiki formatting handler.
!!!!!Usage
<<<
The shorthand Wiki-style formatting syntax of ~TiddlyWiki is very convenient and enables most content to be reasonably well presented. However, there are times when tried-and-true HTML formatting syntax allows more more precise control of the content display.
When a tiddler is about to be displayed, ~TiddlyWiki looks for tiddler content contained within {{{<html>}}} and {{{</html>}}} markers. When present, the TiddlyWiki core simply passes this content directly to the browser's internal "rendering engine" to process as ~HTML-formatted content. However, TiddlyWiki does not also process the HTML source content for any embedded wiki-formatting syntax it may contain. This means that while you can use HTML formatted content, you cannot mix wiki-formatted content within the HTML formatting.
This plugin extends the TiddlyWiki core processing so that, after the HTML formatting has been processed, all the pieces of text occuring within the HTML block are then processed one piece at a time, so that normal wiki-style formatting can be applied to the individual text pieces.
Note: To bypass this extended processing for a specific section of HTML content, embed ''{{{<nowiki>}}}'' //anywhere// inside the {{{<html>...</html>}}} delimiters, and wiki formatting will not be applied to that content.
<<<
!!!!!Line breaks
<<<
One major difference between Wiki formatting and HTML formatting is how "line breaks" are processed. Wiki formatting treats all line breaks as literal content to be displayed //as-is//. However, because HTML normally ignores line breaks and actually processes them as simple "word separators" instead, many people who write HTML include extra line breaks in their documents, just to make the "source code" easier to read.
Even though you can use HTML tags within your tiddler content, the default treatment for line breaks still follows the Wiki-style rule (i.e., all new lines are displayed as-is). When adding HTML content to a tiddler (especially if you cut-and-paste it from another web page), you should take care to avoid adding extra line breaks to the text.
If removing all the extra line breaks from your HTML content would be a big hassle, you can quickly //override the default Wiki-style line break rule// so that the line breaks use the standard HTML rules, by placing ''{{{<hide linebreaks>}}}'' //anywhere// within the HTML content. This automatically converts all line breaks to spaces before rendering the content, so that the literal line breaks will be processed as simple word-breaks instead.
Alternatively, if you //always// want to omit all line breaks from the rendered output, you can set this option:
><<option chkHTMLHideLinebreaks>> ignore all line breaks
which can also be 'hard coded' into your document by adding the following to a tiddler, tagged with <<tag systemConfig>>
>{{{config.options.chkHTMLHideLinebreaks=true;}}}
Note: this does //not// alter the actual tiddler content that is stored in the document, just the manner in which it is displayed. Any line breaks contained in the tiddler will still be there when you edit its content. Also, to include a literal line break when the ''<{{{hide linebreaks}}}>'' tag is present, you will need to use a ''<{{{br}}}>'' or ''<{{{p}}}>'' HTML tag instead of simply typing a line break.
<<<
!!!!!How it works
<<<
The TW core support for HTML does not let you put ANY wiki-style syntax (including TW macros) *inside* the {{{<html>...</html>}}} block. Everything between {{{<html>}}} and {{{</html>}}} is handed to the browser for processing and that is it.
However, not all wiki syntax can be safely passed through the browser's parser. Specifically, any TW macros inside the HTML will get 'eaten' by the browser since the macro brackets, {{{<<...>>}}} use the "<" and ">" that normally delimit the HTML/XML syntax recognized by the browser's parser.
Similarly, you can't use InlineJavascript within the HTML because the {{{<script>...</script>}}} syntax will also be consumed by the browser and there will be nothing left to process afterward. Note: unfortunately, even though the browser removes the {{{<script>...</script>}}} sequence, it doesn't actually execute the embedded javascript code that it removes, so any scripts contained inside of <html> blocks in TW are currently being ignored. :-(
As a work-around to allow TW *macros* (but not inline scripts) to exist inside of <html> formatted blocks of content, the plugin first converts the {{{<<}}} and {{{>>}}} into "%%(" and ")%%", making them "indigestible" so they can pass unchanged through the belly of the beast (the browser's HTML parser).
After the browser has done its job, the wiki syntax sequences (including the "undigested" macros) are contained in #text nodes in the browser-generated DOM elements. The plugin then recursively locates and processes each #text node, converts the %%( and )%% back into {{{<<}}} and {{{>>}}}, passes the result to wikify() for further rendering of the wiki-formatted syntax into a containing SPAN that replaces the previous #text node. At the end of this process, none of the encoded %%( and )%% sequences remain in the rendered tiddler output.
<<<
!!!!!Revisions
<<<
2010.05.07 2.4.1 added chkHTMLHideLinebreaks option
2009.01.05 2.4.0 in wikifyTextNodes(), pass w.highlightRegExp and w.tiddler to wikify() so that search term highlighting and tiddler-relative macro processing will work
2008.10.02 2.3.0 added use of {{{<nowiki>}}} marker to bypass all wikification inside a specific HTML block
2008.09.19 2.2.0 in wikifyTextNodes(), don't wikify the contents of STYLE nodes (thanks to MorrisGray for bug report)
2008.04.26 [*.*.*] plugin size reduction: more documentation moved to HTMLFormattingInfo
2008.01.08 [*.*.*] plugin size reduction: documentation moved to HTMLFormattingInfo
2007.12.04 [*.*.*] update for TW2.3.0: replaced deprecated core functions, regexps, and macros
2007.06.14 2.1.5 in formatter, removed call to e.normalize(). Creates an INFINITE RECURSION error in Safari!!!!
2006.09.10 2.1.4 update formatter for 2.1 compatibility (use this.lookaheadRegExp instead of temp variable)
2006.05.28 2.1.3 in wikifyTextNodes(), decode the *value* of TEXTAREA nodes, but don't wikify() its children. (thanks to "ayj" for bug report)
2006.02.19 2.1.2 in wikifyTextNodes(), put SPAN element into tiddler DOM (replacing text node), BEFORE wikifying the text content. This ensures that the 'place' passed to any macros is correctly defined when the macro is evaluated, so that calls to story.findContainingTiddler(place) will work as expected. (Thanks for bug report from GeoffSlocock)
2006.02.05 2.1.1 wrapped wikifier hijack in init function to eliminate globals and avoid FireFox 1.5.0.1 crash bug when referencing globals
2005.12.01 2.1.0 don't wikify #TEXT nodes inside SELECT and TEXTAREA elements
2005.11.06 2.0.1 code cleanup
2005.10.31 2.0.0 replaced hijack wikify() with hijack config.formatters["html"] and simplified recursive WikifyTextNodes() code
2005.10.09 1.0.2 combined documentation and code into a single tiddler
2005.08.05 1.0.1 moved HTML and CSS definitions into plugin code instead of using separate tiddlers
2005.07.26 1.0.1 Re-released as a plugin. Added <{{{html}}}>...</{{{nohtml}}}> and <{{{hide newlines}}}> handling
2005.06.26 1.0.0 Initial Release (as code adaptation - pre-dates TiddlyWiki plugin architecture!!)
<<<
<<tiddler ToggleReadOnly>> (make this wiki read only)
[img[tooltip|keys.gif]]
<html><font size=4><b>W</b></font></html>elcome. ''TiddlyFolio'' is a free //electronic wallet// for storing your passwords and other confidential information in encrypted form. Use it for
*recording information you prefer not to store online (//e.g.//, on a USB drive, PC, PDA, or phone). (Yes, you //can// make an online backup at your discretion -- easily).
*making a secure offline copy of online passwords (//e.g.//, an export of those in [[LastPass|https://lastpass.com/f?210316]]).
You are welcome to copy it and share it.
It's contained in a single HTML document and is an example of a ''[[TiddlyWiki|http://www.tiddlywiki.com]]'', a collection of diminutive wiki pages (or "tiddlers").
Ever lost your wallet or had it stolen? Could you, right now, without looking, make a detailed list of everything that’s in it so that you could make a loss report, cancel your credit cards and begin getting replacements for everything you need? Could you do it //in seconds//? With TiddlyFolio you can.
Click [[here|Wallet Contents]] for a quick demonstration with dummy records (unencrypted; no password needed) and [[here|http://www.wired.com/gadgetlab/2012/11/ff-mat-honan-password-hacker/all/]] for reasons why you might prefer to store at least some passwords offline.
<html><font size=2>
<<slider starthereslider StartHere "Start Here">>
</font>
Right click <a href="http://tiddlyfolio.tiddlyspot.com/download">here</a></html> to download your own copy.
<<slider ownerslider Owner "If Found Please Return:">>
|!Card Issuer ||
|!ID # ||
|!Name ||
|!Start date ||
|!Exp ||
|!Address ||
|!Notes ||
/***
|Name|InlineJavascriptPlugin|
|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|
|Documentation|http://www.TiddlyTools.com/#InlineJavascriptPluginInfo|
|Version|1.9.6|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|Insert Javascript executable code directly into your tiddler content.|
''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.
!!!!!Documentation
>see [[InlineJavascriptPluginInfo]]
!!!!!Revisions
<<<
2010.12.15 1.9.6 allow (but ignore) type="..." syntax
|please see [[InlineJavascriptPluginInfo]] for additional revision details|
2005.11.08 1.0.0 initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.InlineJavascriptPlugin= {major: 1, minor: 9, revision: 6, date: new Date(2010,12,15)};
config.formatters.push( {
name: "inlineJavascript",
match: "\\<script",
lookahead: "\\<script(?: type=\\\"[^\\\"]*\\\")?(?: src=\\\"([^\\\"]*)\\\")?(?: label=\\\"([^\\\"]*)\\\")?(?: title=\\\"([^\\\"]*)\\\")?(?: key=\\\"([^\\\"]*)\\\")?( show)?\\>((?:.|\\n)*?)\\</script\\>",
handler: function(w) {
var lookaheadRegExp = new RegExp(this.lookahead,"mg");
lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var src=lookaheadMatch[1];
var label=lookaheadMatch[2];
var tip=lookaheadMatch[3];
var key=lookaheadMatch[4];
var show=lookaheadMatch[5];
var code=lookaheadMatch[6];
if (src) { // external script library
var script = document.createElement("script"); script.src = src;
document.body.appendChild(script); document.body.removeChild(script);
}
if (code) { // inline code
if (show) // display source in tiddler
wikify("{{{\n"+lookaheadMatch[0]+"\n}}}\n",w.output);
if (label) { // create 'onclick' command link
var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",wikifyPlainText(label));
var fixup=code.replace(/document.write\s*\(/gi,'place.bufferedHTML+=(');
link.code="function _out(place,tiddler){"+fixup+"\n};_out(this,this.tiddler);"
link.tiddler=w.tiddler;
link.onclick=function(){
this.bufferedHTML="";
try{ var r=eval(this.code);
if(this.bufferedHTML.length || (typeof(r)==="string")&&r.length)
var s=this.parentNode.insertBefore(document.createElement("span"),this.nextSibling);
if(this.bufferedHTML.length)
s.innerHTML=this.bufferedHTML;
if((typeof(r)==="string")&&r.length) {
wikify(r,s,null,this.tiddler);
return false;
} else return r!==undefined?r:false;
} catch(e){alert(e.description||e.toString());return false;}
};
link.setAttribute("title",tip||"");
var URIcode='javascript:void(eval(decodeURIComponent(%22(function(){try{';
URIcode+=encodeURIComponent(encodeURIComponent(code.replace(/\n/g,' ')));
URIcode+='}catch(e){alert(e.description||e.toString())}})()%22)))';
link.setAttribute("href",URIcode);
link.style.cursor="pointer";
if (key) link.accessKey=key.substr(0,1); // single character only
}
else { // run script immediately
var fixup=code.replace(/document.write\s*\(/gi,'place.innerHTML+=(');
var c="function _out(place,tiddler){"+fixup+"\n};_out(w.output,w.tiddler);";
try { var out=eval(c); }
catch(e) { out=e.description?e.description:e.toString(); }
if (out && out.length) wikify(out,w.output,w.highlightRegExp,w.tiddler);
}
}
w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
}
}
} )
//}}}
// // Backward-compatibility for TW2.1.x and earlier
//{{{
if (typeof(wikifyPlainText)=="undefined") window.wikifyPlainText=function(text,limit,tiddler) {
if(limit > 0) text = text.substr(0,limit);
var wikifier = new Wikifier(text,formatter,null,tiddler);
return wikifier.wikifyPlain();
}
//}}}
// // GLOBAL FUNCTION: $(...) -- 'shorthand' convenience syntax for document.getElementById()
//{{{
if (typeof($)=='undefined') { function $(id) { return document.getElementById(id.replace(/^#/,'')); } }
//}}}
/***
|Name|InlineJavascriptPluginInfo|
|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|
|Documentation|http://www.TiddlyTools.com/#InlineJavascriptPluginInfo|
|Version|1.9.6|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Description|Documentation for InlineJavascriptPlugin|
''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.
!!!!!Usage
<<<
This plugin adds wiki syntax for surrounding tiddler content with {{{<script>}}} and {{{</script>}}} markers, so that it can be recognized as embedded javascript code. When a tiddler is rendered, the plugin automatically invokes any embedded scripts, which can be used to construct and return dynamically-generated output that is inserted into the tiddler content.
{{{
<script type="..." src="..." label="..." title="..." key="..." show>
/* javascript code goes here... */
</script>
}}}
All parameters are //optional//. When the ''show'' keyword is used, the plugin will also include the script source code in the output that it displays in the tiddler. This is helpful when creating examples for documentation purposes (such as used in this tiddler!)
__''Deferred execution from an 'onClick' link''__
<script label="click here" title="mouseover tooltip text" key="X" show>
/* javascript code goes here... */
alert('you clicked on the link!');
</script>
By including a {{{label="..."}}} parameter in the initial {{{<script>}}} marker, the plugin will create a link to an 'onclick' script that will only be executed when that specific link is clicked, rather than running the script each time the tiddler is rendered. You may also include a {{{title="..."}}} parameter to specify the 'tooltip' text that will appear whenever the mouse is moved over the onClick link text, and a {{{key="X"}}} parameter to specify an //access key// (which must be a //single// letter or numeric digit only).
__''Loading scripts from external source files''__
<script src="URL" show>
/* optional javascript code goes here... */
</script>You can also load javascript directly from an external source URL, by including a src="..." parameter in the initial {{{<script>}}} marker (e.g., {{{<script src="demo.js"></script>}}}). This is particularly useful when incorporating third-party javascript libraries for use in custom extensions and plugins. The 'foreign' javascript code remains isolated in a separate file that can be easily replaced whenever an updated library file becomes available.
In addition to loading the javascript from the external file, you can also use this feature to invoke javascript code contained within the {{{<script>...</script>}}} markers. This code is invoked //after// the external script file has been processed, and can make immediate use of the functions and/or global variables defined by the external script file.
>Note: To ensure that your javascript functions are always available when needed, you should load the libraries from a tiddler that is rendered as soon as your TiddlyWiki document is opened, such as MainMenu. For example: put your {{{<script src="..."></script>}}} syntax into a separate 'library' tiddler (e.g., LoadScripts), and then add {{{<<tiddler LoadScripts>>}}} to MainMenu so that the library is loaded before any other tiddlers that rely upon the functions it defines.
>
>Normally, loading external javascript in this way does not produce any direct output, and should not have any impact on the appearance of your MainMenu. However, if your LoadScripts tiddler contains notes or other visible content, you can suppress this output by using 'inline CSS' in the MainMenu, like this: {{{@@display:none;<<tiddler LoadScripts>>@@}}}
<<<
!!!!!Creating dynamic tiddler content and accessing the ~TiddlyWiki DOM
<<<
An important difference between TiddlyWiki inline scripting and conventional embedded javascript techniques for web pages is the method used to produce output that is dynamically inserted into the document: in a typical web document, you use the {{{document.write()}}} (or {{{document.writeln()}}}) function to output text sequences (often containing HTML tags) that are then rendered when the entire document is first loaded into the browser window.
However, in a ~TiddlyWiki document, tiddlers (and other DOM elements) are created, deleted, and rendered "on-the-fly", so writing directly to the global 'document' object does not produce the results you want (i.e., replacing the embedded script within the tiddler content), and instead will //completely replace the entire ~TiddlyWiki document in your browser window (which is clearly not a good thing!)//. In order to allow scripts to use {{{document.write()}}}, the plugin automatically converts and buffers all HTML output so it can be safely inserted into your tiddler content, immediately following the script.
''Note that {{{document.write()}}} can only be used to output "pure HTML" syntax. To produce //wiki-formatted// output, your script should instead return a text value containing the desired wiki-syntax content'', which will then be automatically rendered immediately following the script. If returning a text value is not sufficient for your needs, the plugin also provides an automatically-defined variable, 'place', that gives the script code ''direct access to the //containing DOM element//'' into which the tiddler output is being rendered. You can use this variable to ''perform direct DOM manipulations'' that can, for example:
* generate wiki-formatted output using {{{wikify("...content...",place)}}}
* vary the script's actions based upon the DOM element in which it is embedded
* access 'tiddler-relative' DOM information using {{{story.findContainingTiddler(place)}}}
Note:
''When using an 'onclick' script, the 'place' element actually refers to the onclick //link text// itself, instead of the containing DOM element.'' This permits you to directly reference or modify the link text to reflect any 'stateful' conditions that might set by the script. To refer to the containing DOM element from within an 'onclick' script, you can use "place.parentNode" instead.
<<<
!!!!!Instant "bookmarklets"
<<<
You can also use an 'onclick' link to define a "bookmarklet": a small piece of javascript that can be ''invoked directly from the browser without having to be defined within the current document.'' This allows you to create 'stand-alone' commands that can be applied to virtually ANY TiddlyWiki document... even remotely-hosted documents that have been written by others!! To create a bookmarklet, simply define an 'onclick' script and then grab the resulting link text and drag-and-drop it onto your browser's toolbar (or right-click and use the 'bookmark this link' command to add it to the browser's menu).
Notes:
*When writing scripts intended for use as bookmarklets, due to the ~URI-encoding required by the browser, ''you cannot not use ANY double-quotes (") within the bookmarklet script code.''
*All comments embedded in the bookmarklet script must ''use the fully-delimited {{{/* ... */}}} comment syntax,'' rather than the shorter {{{//}}} comment syntax.
*Most importantly, because bookmarklets are invoked directly from the browser interface and are not embedded within the TiddlyWiki document, there is NO containing 'place' DOM element surrounding the script. As a result, ''you cannot use a bookmarklet to generate dynamic output in your document,'' and using {{{document.write()}}} or returning wiki-syntax text or making reference to the 'place' DOM element will halt the script and report a "Reference Error" when that bookmarklet is invoked.
Please see [[InstantBookmarklets]] for many examples of 'onclick' scripts that can also be used as bookmarklets.
<<<
!!!!!Special reserved function name
<<<
The plugin 'wraps' all inline javascript code inside a function, {{{_out()}}}, so that any return value you provide can be correctly handled by the plugin and inserted into the tiddler. To avoid unpredictable results (and possibly fatal execution errors), this function should never be redefined or called from ''within'' your script code.
<<<
!!!!!$(...) 'shorthand' function
<<<
As described by Dustin Diaz [[here|http://www.dustindiaz.com/top-ten-javascript/]], the plugin defines a 'shorthand' function that allows you to write:
{{{
$(id)
}}}
in place of the normal standard javascript syntax:
{{{
document.getElementById(id)
}}}
This function is provided merely as a convenience for javascript coders that may be familiar with this abbreviation, in order to allow them to save a few bytes when writing their own inline script code.
<<<
!!!!!Examples
<<<
simple dynamic output:
><script show>
document.write("The current date/time is: "+(new Date())+"<br>");
return "link to current user: [["+config.options.txtUserName+"]]\n";
</script>
dynamic output using 'place' to get size information for current tiddler:
><script show>
if (!window.story) window.story=window;
var title=story.findContainingTiddler(place).getAttribute("tiddler");
var size=store.getTiddlerText(title).length;
return title+" is using "+size+" bytes";
</script>
dynamic output from an 'onclick' script, using {{{document.write()}}} and/or {{{return "..."}}}
><script label="click here" show>
document.write("<br>The current date/time is: "+(new Date())+"<br>");
return "link to current user: [["+config.options.txtUserName+"]]\n";
</script>
creating an 'onclick' button/link that accesses the link text AND the containing tiddler:
><script label="click here" title="clicking this link will show an 'alert' box" key="H" show>
if (!window.story) window.story=window;
var txt=place.firstChild.data;
var tid=story.findContainingTiddler(place).getAttribute('tiddler');
alert('Hello World!\nlinktext='+txt+'\ntiddler='+tid);
</script>
dynamically setting onclick link text based on stateful information:
>{{block{
{{{
<script label="click here">
/* toggle "txtSomething" value */
var on=(config.txtSomething=="ON");
place.innerHTML=on?"enable":"disable";
config.txtSomething=on?"OFF":"ON";
return "\nThe current value is: "+config.txtSomething;
</script><script>
/* initialize onclick link text based on current "txtSomething" value */
var on=(config.txtSomething=="ON");
place.lastChild.previousSibling.innerHTML=on?"disable":"enable";
</script>
}}}
<script label="click here">
/* toggle "txtSomething" value */
var on=(config.txtSomething=="ON");
place.innerHTML=on?"enable":"disable";
config.txtSomething=on?"OFF":"ON";
return "\nThe current value is: "+config.txtSomething;
</script><script>
/* initialize onclick link text based on current "txtSomething" value */
var on=(config.txtSomething=="ON");
place.lastChild.innerHTML=on?"enable":"disable";
</script>
}}}
loading a script from a source url:
>http://www.TiddlyTools.com/demo.js contains:
>>{{{function inlineJavascriptDemo() { alert('Hello from demo.js!!') } }}}
>>{{{displayMessage('InlineJavascriptPlugin: demo.js has been loaded');}}}
>note: When using this example on your local system, you will need to download the external script file from the above URL and install it into the same directory as your document.
>
><script src="demo.js" show>
return "inlineJavascriptDemo() function has been defined"
</script>
><script label="click to invoke inlineJavascriptDemo()" key="D" show>
inlineJavascriptDemo();
</script>
<<<
!!!!!Revisions
<<<
2010.12.15 1.9.6 allow (but ignore) type="..." syntax
2009.04.11 1.9.5 pass current tiddler object into wrapper code so it can be referenced from within 'onclick' scripts
2009.02.26 1.9.4 in $(), handle leading '#' on ID for compatibility with JQuery syntax
2008.06.11 1.9.3 added $(...) function as 'shorthand' for document.getElementById()
2008.03.03 1.9.2 corrected fallback declaration of wikifyPlainText() (fixes Safari "parse error")
2008.02.23 1.9.1 in onclick function, use string instead of array for 'bufferedHTML' (fixes IE errors)
2008.02.21 1.9.0 output from 'onclick' scripts (return value or document.write() calls) are now buffered and rendered into into a span following the script. Also, added default 'return false' handling if no return value provided (prevents HREF from being triggered -- return TRUE to allow HREF to be processed). Thanks to Xavier Verges for suggestion and preliminary code.
2008.02.14 1.8.1 added backward-compatibility for use of wikifyPlainText() in TW2.1.3 and earlier
2008.01.08 [*.*.*] plugin size reduction: documentation moved to ...Info tiddler
2007.12.28 1.8.0 added support for key="X" syntax to specify custom access key definitions
2007.12.15 1.7.0 autogenerate URI encoded HREF on links for onclick scripts. Drag links to browser toolbar to create bookmarklets. IMPORTANT NOTE: place is NOT defined when scripts are used as bookmarklets. In addition, double-quotes will cause syntax errors. Thanks to PaulReiber for debugging and brainstorming.
2007.11.26 1.6.2 when converting "document.write()" function calls in inline code, allow whitespace between "write" and "(" so that "document.write ( foobar )" is properly converted.
2007.11.16 1.6.1 when rendering "onclick scripts", pass label text through wikifyPlainText() to parse any embedded wiki-syntax to enable use of HTML entities or even TW macros to generate dynamic label text.
2007.02.19 1.6.0 added support for title="..." to specify mouseover tooltip when using an onclick (label="...") script
2006.10.16 1.5.2 add newline before closing '}' in 'function out_' wrapper. Fixes error caused when last line of script is a comment.
2006.06.01 1.5.1 when calling wikify() on script return value, pass hightlightRegExp and tiddler params so macros that rely on these values can render properly
2006.04.19 1.5.0 added 'show' parameter to force display of javascript source code in tiddler output
2006.01.05 1.4.0 added support 'onclick' scripts. When label="..." param is present, a button/link is created using the indicated label text, and the script is only executed when the button/link is clicked. 'place' value is set to match the clicked button/link element.
2005.12.13 1.3.1 when catching eval error in IE, e.description contains the error text, instead of e.toString(). Fixed error reporting so IE shows the correct response text. Based on a suggestion by UdoBorkowski
2005.11.09 1.3.0 for 'inline' scripts (i.e., not scripts loaded with src="..."), automatically replace calls to 'document.write()' with 'place.innerHTML+=' so script output is directed into tiddler content. Based on a suggestion by BradleyMeck
2005.11.08 1.2.0 handle loading of javascript from an external URL via src="..." syntax
2005.11.08 1.1.0 pass 'place' param into scripts to provide direct DOM access
2005.11.08 1.0.0 initial release
<<<
/***
|Name:|InstantTimestampPlugin|
|Description:|A handy way to insert timestamps in your tiddler content|
|Version:|1.0.10a|
|Date:|27-Jun-2011|
|Source:|http://mptw.tiddlyspot.com/#InstantTimestampPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Usage
If you enter {ts} in your tiddler content (without the spaces) it will be replaced with a timestamp when you save the tiddler. Full list of formats:
* {ts} or {t} -> timestamp
* {ds} or {d} -> datestamp
* !ts or !t at start of line -> !!timestamp
* !ds or !d at start of line -> !!datestamp
(I added the extra ! since that's how I like it. Remove it from translations below if required)
!!Notes
* Change the timeFormat and dateFormat below to suit your preference.
* See also http://mptw2.tiddlyspot.com/#AutoCorrectPlugin
* You could invent other translations and add them to the translations array below.
***/
//{{{
config.InstantTimestamp = {
// adjust to suit
timeFormat: 'DD/0MM/YY 0hh:0mm',
dateFormat: 'DD/0MM/YY',
translations: [
[/^!ts?$/img, "'!!{{ts{'+now.formatString(config.InstantTimestamp.timeFormat)+'}}}'"],
[/^!ds?$/img, "'!!{{ds{'+now.formatString(config.InstantTimestamp.dateFormat)+'}}}'"],
// thanks Adapted Cat
[/\{ts?\}(?!\}\})/ig,"'{{ts{'+now.formatString(config.InstantTimestamp.timeFormat)+'}}}'"],
[/\{ds?\}(?!\}\})/ig,"'{{ds{'+now.formatString(config.InstantTimestamp.dateFormat)+'}}}'"]
],
excludeTags: [
"noAutoCorrect",
"noTimestamp",
"html",
"CSS",
"css",
"systemConfig",
"systemConfigDisabled",
"zsystemConfig",
"Plugins",
"Plugin",
"plugins",
"plugin",
"javascript",
"code",
"systemTheme",
"systemPalette"
],
excludeTiddlers: [
"StyleSheet",
"StyleSheetLayout",
"StyleSheetColors",
"StyleSheetPrint"
// more?
]
};
TiddlyWiki.prototype.saveTiddler_mptw_instanttimestamp = TiddlyWiki.prototype.saveTiddler;
TiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created) {
tags = tags ? tags : []; // just in case tags is null
tags = (typeof(tags) == "string") ? tags.readBracketedList() : tags;
var conf = config.InstantTimestamp;
if ( !tags.containsAny(conf.excludeTags) && !conf.excludeTiddlers.contains(newTitle) ) {
var now = new Date();
var trans = conf.translations;
for (var i=0;i<trans.length;i++) {
newBody = newBody.replace(trans[i][0], eval(trans[i][1]));
}
}
// TODO: use apply() instead of naming all args?
return this.saveTiddler_mptw_instanttimestamp(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created);
}
// you can override these in StyleSheet
setStylesheet(".ts,.ds { font-style:italic; }","instantTimestampStyles");
//}}}
!''Setup''
If you haven't already done so: download a copy of ~TiddlyFolio. See [[Home]]. Next, install the Firefox plugin [[TiddlyFox|https://addons.mozilla.org/en-us/firefox/addon/tiddlyfox/]] (needed to enable Firefox v.15 and later to write to local storage).
''To Personalise: click on''
* [[GettingStarted]] and edit the title (@@color(blue):~TiddlyFolio@@) and subtitle (@@color(blue):Your Wiki Wallet@@) if you wish to change them.
* [[Owner]] and enter your contact details so that the file / device may be returned to you if found.
* [[Credit Card]] then [[Debit Card]] and enter your name and billing address.
**This enters default values for use when adding card details later.
* [[Emergency]] and enter your [[Credit Card Sentinel|http://www.creditcardsentinel.com]] or similar emergency contact numbers.
* [[Baby photo]] and edit as you wish.
//Optional (you can also do these later) //
* [[Change The Theme]] if you would like to use a different design for your wiki.
** [[BackgroundColors]] to change colors of encrypted tiddler titles if you change theme.
* [[Online Access]] if you wish to maintain a backup copy of your ~TiddlyFolio online.
!''Add a Master Password''
This ''//key//'' will be used to encrypt all your confidential information stored in this file.
* Edit the [[Unencrypted]] tiddler and rename it to ''Encrypt(~TiddlyFolio)''.
* Click on @@color(blue):save changes@@ in the Sidebar, enter the master password when prompted.
**From now on when you open the file you'll be prompted for the password.
**To change the password later click here: <<EncryptionChangePassword "Change password" "new password" "Encrypt(TiddlyFolio)">>
!''//Finally//''
* Read TiddlySaver if you use Safari, Opera or Chrome. You will need to obtain a copy of the ~TiddlySaver Java applet (N.B. not included in ~TiddlyFolio).
TiddlyWiki works well in Google Chrome and Chromium using TiddlySaver.
However, due to Chrome's lack of Java support on Mac OS and Linux, it currently cannot save on those platforms.
That's it.
Now see [[Using TiddlyFolio]]
This ~TiddlyWiki uses embedded images which are displayed when using Firefox but not Internet Explorer. Using Firefox: click on the link below to see them so that you can save local copies. You will need to [[re-attach|AttachFilePlugin]] them with links to the local (or remote) files for them to display with IE.
<<tiddler OpenTaggedTiddlers with: "View images" "image" "sortBy" "reverse">>
We all have<html><font size=3>!Too Many Passwords To Remember!</font></html>
This will change eventually when a single password can log you on securely to many different sites (see [[OpenID|http://en.wikipedia.org/wiki/OpenID]]).
Meanwhile, TiddlyFolio is a free partial solution to the problem of remembering passwords and other confidential or personal information: a secure working document called a //~TiddlyWiki// file.
A ~TiddlyWiki is a web site in a <html><b>single page</b></html>, an [[HTML|http://en.wikipedia.org/wiki/HTML]] file that works on any device with a web browser and which runs [[Javascript|http://en.wikipedia.org/wiki/Java_%28programming_language%29]]. No software installation is required, nor is a web server.
TiddlyFolio is mainly intended for offline use and is an ideal complement to online password tools.
<<<
If you lose your USB stick or other device containing your copy of this ~TiddlyWiki file your passwords ''will not be readable'' without the password used to encrypt them.
!DO NOT LOSE YOUR PASSWORD!
<<<
''Best practice advice:''
1. Use [[Lastpass|https://lastpass.com/f?210316]] for passwords and encrypted notes
2. Use TiddlyFolio for information you prefer never to post online or which you must access when offline.
3. Use a [[Yubico|http://www.yubico.com]] key and a password to secure access to your Lastpass account. (see [[Yubikey|http://wombatdiet.net/2010/01/29/yubikey-gadget-of-the-month/]])
4. Export your [[Lastpass|https://lastpass.com/f?210316]] passwords to a text file and store them encrypted in a TiddlyFolio tiddler.
Next, read the [[Instructions]] or, if you wish, more about the [[Rationale]] for this solution.
/***
|''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"
//}}}
/***
|Name:|LessBackupsPlugin|
|Description:|Intelligently limit the number of backup files you create|
|Version:|3.0.1a|
|Date:|27-Jun-2011|
|Source:|http://mptw.tiddlyspot.com/#LessBackupsPlugin|
|Author:|Simon Baird|
|Email:|simon.baird@gmail.com|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Description
You end up with just backup one per year, per month, per weekday, per hour, minute, and second. So total number won't exceed about 200 or so. Can be reduced by commenting out the seconds/minutes/hours line from modes array
!!Notes
Works in IE and Firefox only. Algorithm by Daniel Baird. IE specific code by by Saq Imtiaz.
***/
//{{{
var MINS = 60 * 1000;
var HOURS = 60 * MINS;
var DAYS = 24 * HOURS;
if (!config.lessBackups) {
config.lessBackups = {
// comment out the ones you don't want or set config.lessBackups.modes in your 'tweaks' plugin
modes: [
["YYYY", 365*DAYS], // one per year for ever
["MMM", 31*DAYS], // one per month
["ddd", 7*DAYS], // one per weekday
//["d0DD", 1*DAYS], // one per day of month
["h0hh", 24*HOURS], // one per hour
["m0mm", 1*HOURS], // one per minute
["s0ss", 1*MINS], // one per second
["latest",0] // always keep last version. (leave this).
]
};
}
window.getSpecialBackupPath = function(backupPath) {
var now = new Date();
var modes = config.lessBackups.modes;
for (var i=0;i<modes.length;i++) {
// the filename we will try
var specialBackupPath = backupPath.replace(/(\.)([0-9]+\.[0-9]+)(\.html)$/,
'$1'+now.formatString(modes[i][0]).toLowerCase()+'$3')
// open the file
try {
if (config.browser.isIE) {
var fsobject = new ActiveXObject("Scripting.FileSystemObject")
var fileExists = fsobject.FileExists(specialBackupPath);
if (fileExists) {
var fileObject = fsobject.GetFile(specialBackupPath);
var modDate = new Date(fileObject.DateLastModified).valueOf();
}
}
else {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath(specialBackupPath);
var fileExists = file.exists();
if (fileExists) {
var modDate = file.lastModifiedTime;
}
}
}
catch(e) {
// give up
return backupPath;
}
// expiry is used to tell if it's an 'old' one. Eg, if the month is June and there is a
// June file on disk that's more than an month old then it must be stale so overwrite
// note that "latest" should be always written because the expiration period is zero (see above)
var expiry = new Date(modDate + modes[i][1]);
if (!fileExists || now > expiry)
return specialBackupPath;
}
}
// hijack the core function
window.getBackupPath_mptw_orig = window.getBackupPath;
window.getBackupPath = function(localPath) {
return getSpecialBackupPath(getBackupPath_mptw_orig(localPath));
}
//}}}
If necessary click ''Decrypt All'' above then [[List Items]] again.
!''Encrypted:'' [>img[encrypted|encrypted.gif]]
<<tiddler ListTaggedTiddlers with: "Encrypt(TiddlyFolio)">>
----
!''Unencrypted:'' [>img[open book|openbook.jpg]]
<<tiddler ListTaggedTiddlers with: "Unencrypted">>
----
!''Untagged:''
<<tiddler ListTaggedTiddlers with "">>
----
!Encrypted / Unecrypted (details):
<<forEachTiddler
where
'tiddler.tags.contains("Data") && ! tiddler.title.contains("TaggedTemplateTweak")'
write
'"<html><B><font size =3>[["+ tiddler.title+ "]]</b></font></html>" + "----\n<<tiddler [["+tiddler.title+"]]$))\n\n"'
>>
<<forEachTiddler
where
'tiddler.tags && tiddler.tags.length'
sortBy
'getSortedTagsText(tiddler)+"###"+tiddler.title'
script
'function getSortedTagsText(tiddler) {var tags = tiddler.tags; if (!tags) return ""; tags.sort(); var result = ""; for (var i = 0; i < tags.length;i++) {result += tags[i]+ " ";} return result;} function getGroupTitle(tiddler, context) {if (!context.lastGroup || context.lastGroup != getSortedTagsText(tiddler)) { context.lastGroup = getSortedTagsText(tiddler); return "* {{{"+(context.lastGroup?context.lastGroup:"no tags")+"}}}\n";} else return "";} '
write
'getGroupTitle(tiddler, context)+"** [[" + tiddler.title+"]]\n"'
>>
<<forEachTiddler
where
'tiddler.tags.contains("$1")'
sortBy
' tiddler.modified'
descending
write
'"* "+tiddler.modified.formatString("YYYY-0MM-0DD")+" [[" +tiddler.title+"]]\n"'
>>
/***
|''Name:''|LoadRemoteFileThroughProxy (previous LoadRemoteFileHijack)|
|''Description:''|When the TiddlyWiki file is located on the web (view over http) the content of [[SiteProxy]] tiddler is added in front of the file url. If [[SiteProxy]] does not exist "/proxy/" is added. |
|''Version:''|1.1.0|
|''Date:''|mar 17, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#LoadRemoteFileHijack|
|''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.2.0|
***/
//{{{
version.extensions.LoadRemoteFileThroughProxy = {
major: 1, minor: 1, revision: 0,
date: new Date("mar 17, 2007"),
source: "http://tiddlywiki.bidix.info/#LoadRemoteFileThroughProxy"};
if (!window.bidix) window.bidix = {}; // bidix namespace
if (!bidix.core) bidix.core = {};
bidix.core.loadRemoteFile = loadRemoteFile;
loadRemoteFile = function(url,callback,params)
{
if ((document.location.toString().substr(0,4) == "http") && (url.substr(0,4) == "http")){
url = store.getTiddlerText("SiteProxy", "/proxy/") + url;
}
return bidix.core.loadRemoteFile(url,callback,params);
}
//}}}
Aenean eros arcu, condimentum nec, dapibus ut, tincidunt sit amet, urna. Quisque viverra, eros sed imperdiet iaculis, est risus facilisis quam, id malesuada arcu nulla luctus urna. Nullam et est. Vestibulum velit sem, faucibus cursus, dapibus vestibulum, pellentesque et, urna. Donec luctus. Donec lectus. Aliquam eget eros facilisis tortor feugiat sollicitudin. Integer lobortis vulputate sapien. Sed iaculis erat ac nunc. Etiam eu enim. Mauris ipsum urna, rhoncus at, bibendum sit amet, euismod eget, dolor. Mauris fermentum quam vitae ligula. Vestibulum in libero feugiat justo dictum consectetuer. Vestibulum euismod purus eget elit. Nunc sed massa porta elit bibendum posuere. Nunc pulvinar justo sit amet odio. In sed est. Phasellus ornare elementum nulla. Nulla ipsum neque, cursus a, viverra a, imperdiet at, enim. Quisque facilisis, diam sed accumsan suscipit, odio arcu hendrerit dolor, quis aliquet massa nulla nec sem.
!heading 1
!!heading 2
!!!heading3
----
<<tag button>>
This is a link to a [[StyleSheet]] tiddler.
> This is a blockquote
> This is a blockquote
> This is a blockquote
|>|>| !This is a header |h
|column1|column2|column3|
|row2| row2 |row2|
|column1|column2|column3|
|row2| row2 |row2|
|column1|column2|column3|
|row2| row2 |row2|
[[Home]]
[[Passwords]]
[[Wallet]]
<<newTiddler "Item Nr. " tag:"Unencrypted" tag:"Data" label:"New Item">>
[[List Items]]
[[Emergency]]
[[Welcome to TiddlySpot]]
<<EncryptionDecryptAll "Decrypt All" "Make all items searchable">>
<<toggleSideBar Sidebar "Show / Hide Sidebar" show>>
/%
If you use a theme without a top menu you should comment out the previous line by moving the /% above up a line
%/
|!Card Issuer ||
|!Card # ||
|!Name ||
|!Start date ||
|!Exp ||
|!Card verification nr ||
|!Call if lost/stolen ||
|!Billing address ||
|!Notes ||
!!!!!__2008.04.22 IMPORTANT NOTICE__
The features previously provided by this plugin have been replaced by [[SaveAsPlugin]] and [[SnapshotPlugin]], which can be imported and installed from http://www.TiddlyTools.com/#SaveAsPlugin and http://www.TiddlyTools.com/#SnapshotPlugin, respectively.
{{small{You will be automatically redirected to [[SaveAsPlugin]] in <<tiddler TimedTiddlerTour with: SaveAsPlugin 10 fold>> seconds}}}
/***
|Name:|NewMeansNewPlugin|
|Description:|If 'New Tiddler' already exists then create 'New Tiddler (1)' and so on|
|Version:|1.1.1a|
|Date:|27-Jun-2011|
|Source:|http://mptw.tiddlyspot.com/empty.html#NewMeansNewPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
!!Note: I think this should be in the core
***/
//{{{
// change this or set config.newMeansNewForJournalsToo it in MptwUuserConfigPlugin
if (config.newMeansNewForJournalsToo == undefined) config.newMeansNewForJournalsToo = true;
String.prototype.getNextFreeName = function() {
numberRegExp = / \(([0-9]+)\)$/;
var match = numberRegExp.exec(this);
if (match) {
var num = parseInt(match[1]) + 1;
return this.replace(numberRegExp," ("+num+")");
}
else {
return this + " (1)";
}
}
config.macros.newTiddler.checkForUnsaved = function(newName) {
var r = false;
story.forEachTiddler(function(title,element) {
if (title == newName)
r = true;
});
return r;
}
config.macros.newTiddler.getName = function(newName) {
while (store.getTiddler(newName) || config.macros.newTiddler.checkForUnsaved(newName))
newName = newName.getNextFreeName();
return newName;
}
config.macros.newTiddler.onClickNewTiddler = function()
{
var title = this.getAttribute("newTitle");
if(this.getAttribute("isJournal") == "true") {
title = new Date().formatString(title.trim());
}
// ---- these three lines should be the only difference between this and the core onClickNewTiddler
if (config.newMeansNewForJournalsToo || this.getAttribute("isJournal") != "true")
title = config.macros.newTiddler.getName(title);
var params = this.getAttribute("params");
var tags = params ? params.split("|") : [];
var focus = this.getAttribute("newFocus");
var template = this.getAttribute("newTemplate");
var customFields = this.getAttribute("customFields");
if(!customFields && !store.isShadowTiddler(title))
customFields = String.encodeHashMap(config.defaultCustomFields);
story.displayTiddler(null,title,template,false,null,null);
var tiddlerElem = story.getTiddler(title);
if(customFields)
story.addCustomFields(tiddlerElem,customFields);
var text = this.getAttribute("newText");
if(typeof text == "string")
story.getTiddlerField(title,"text").value = text.format([title]);
for(var t=0;t<tags.length;t++)
story.setTiddlerTag(title,tags[t],+1);
story.focusTiddler(title,focus);
return false;
};
//}}}
[[Tiddlyspot|http://www.tiddlyspot.com]] is a free wiki hosting, and specifically ~TiddlyWiki-hosting, solution that you can use to save a copy of your ~TiddlyFolio online. Make sure that you sign up for a private wiki, accessible only via a password. Two passwords will then be needed to access your secure information: one to access the wiki and another to decrypt any encrypted information.
!''To Use ~TiddlySpot''
''//Part 1: Sign Up//''
1. Sign up ([[here|http://www.tiddlyspot.com]]), get a wiki site: select standard site. Then, on the home page:
2. Click on ''control panel'' ; enter your username (= your site name) and password.
4. Check this box:
[img[siteisprivate.gif]]
5. Enter your email address and press update. Your site is now ready to use.
''//Part 2: Configure and Upload ~TiddlyFolio//''
1. Download ~TiddlyFolio: <html>Right click <a href="http://tiddlyfolio.tiddlyspot.com/download">here</a></html> and select @@color(blue):Save Link As@@ (//yourwikisite//.html)
2. Find the tiddler named TSpotSetupPlugin and edit the line reading
{{{
config.tiddlyspotSiteId = 'tiddlyfolio';
}}}
3. Change it to the name of your ~TiddlySpot wiki
4. Follow the setup [[Instructions]] for ~TiddlyFolio. Save changes when you have finished.
5. Press ''upload'' in the Sidebar.
Uploading your ~TiddlyFolio to ~TiddlySpot with ''upload'' is how to save a backup copy from now on.
!''Note:''
~TiddlySpot is not suitable if you wish to use WYSIWYG editing. [[Fastmail]] is a better option in this case.
/%
!info
|Name|OpenTaggedTiddlers|
|Source|http://www.TiddlyTools.com/#OpenTaggedTiddlers|
|Version|2.0.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|transclusion|
|Description|create a link to open a set of tagged tiddlers with a single click|
Usage:
<<<
{{{
<<tiddler OpenTaggedTiddlers with: label tagToMatch sortBy reverse close limit>>
}}}
*''label''<br>is the text of the link
*''tagToMatch''<br>is a single tag value to be matched. Note: when MatchTagsPlugin is installed, you can also use a boolean tag expression, enclosed in "..."
*''sortBy'' (optional)<br>a tiddler fieldname, (default="title", use "modified" or "created" for tiddler dates)
*''reverse'' (optional)<br>display order for the tiddlers (i.e., descending vs. ascending)
*''close'' (optional)<br>closes all open tiddlers before opening the tagged tiddlers
*''limit'' (optional)<br>maximum number of tiddlers to be opened
Note: use "" as placeholders when omitting optional parameters
<<<
Example
<<<
{{{<<tiddler OpenTaggedTiddlers##show with: "click me..." sample title reverse "" 3>>}}}
<<tiddler OpenTaggedTiddlers##show with: "click me..." sample title reverse "" 3>>
<<<
!end
!show
<html><nowiki><a href='javascript:;' onclick="
var list=[];
var match='$2';
var sortBy='$3'; if ((sortBy=='$'+'3')||(sortBy=='')) sortBy='title';
var filter='[tag[%0]][sort[%1]]'.format([match,sortBy]);
var tids=store.filterTiddlers(filter);
if ('$4'=='reverse') tids=tids.reverse();
if ('$5'=='close') story.closeAllTiddlers();
var limit=('$6'!='$'+'6')?parseInt('$6'):tids.length;
for (var t=0;t<tids.length && t<limit;t++) list.push(tids[t].title);
if (confirm('Show %0 tiddlers tagged with \x27%1\x27?'.format([tids.length,match]))) {
var here=story.findContainingTiddler(place);
story.displayTiddlers(here,list);
if (here && list.length) { // scroll to top of newly displayed tiddlers
var cmd='window.scrollTo(0,'+(here.offsetTop+here.offsetHeight)+')';
var delay=config.options.chkAnimate?config.animDuration+100:0;
setTimeout(cmd,delay);
}
}
return false;
">$1</a></html>
!end
%/<<tiddler {{var src='OpenTaggedTiddlers'; src+(tiddler&&tiddler.title==src?'##info':'##show')}}
with: [[$1]] [[$2]] [[$3]] [[$4]] [[$5]] [[$6]]>>
!Property of
<<<
''Name:'' Your contact details here (edit [[Owner]]).
''Address'':
''Telephone'':
''Email'':
<<<
If found please email this file to the owner. A reward or charitable donation may be offered for the safe return of the device.
!
<div class='header' macro='gradient vert #FFF #FFF '>
<div class='gradient'>
<div class='titleLine' >
<span class='searchBar' macro='search'></span>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div id='topMenu' refresh='content' tiddler='MainMenu'></div>
</div>
</div>
<div id='bodywrapper'>
<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 id='displayFooter'></div>
</div>
/***
|''Name:''|PasswordOptionPlugin|
|''Description:''|Extends TiddlyWiki options with non encrypted password option.|
|''Version:''|1.0.2|
|''Date:''|Apr 19, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#PasswordOptionPlugin|
|''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.2.0 (Beta 5)|
***/
//{{{
version.extensions.PasswordOptionPlugin = {
major: 1, minor: 0, revision: 2,
date: new Date("Apr 19, 2007"),
source: 'http://tiddlywiki.bidix.info/#PasswordOptionPlugin',
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.2.0 (Beta 5)'
};
config.macros.option.passwordCheckboxLabel = "Save this password on this computer";
config.macros.option.passwordInputType = "password"; // password | text
setStylesheet(".pasOptionInput {width: 11em;}\n","passwordInputTypeStyle");
merge(config.macros.option.types, {
'pas': {
elementType: "input",
valueField: "value",
eventName: "onkeyup",
className: "pasOptionInput",
typeValue: config.macros.option.passwordInputType,
create: function(place,type,opt,className,desc) {
// password field
config.macros.option.genericCreate(place,'pas',opt,className,desc);
// checkbox linked with this password "save this password on this computer"
config.macros.option.genericCreate(place,'chk','chk'+opt,className,desc);
// text savePasswordCheckboxLabel
place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));
},
onChange: config.macros.option.genericOnChange
}
});
merge(config.optionHandlers['chk'], {
get: function(name) {
// is there an option linked with this chk ?
var opt = name.substr(3);
if (config.options[opt])
saveOptionCookie(opt);
return config.options[name] ? "true" : "false";
}
});
merge(config.optionHandlers, {
'pas': {
get: function(name) {
if (config.options["chk"+name]) {
return encodeCookie(config.options[name].toString());
} else {
return "";
}
},
set: function(name,value) {config.options[name] = decodeCookie(value);}
}
});
// need to reload options to load passwordOptions
loadOptionsCookie();
/*
if (!config.options['pasPassword'])
config.options['pasPassword'] = '';
merge(config.optionsDesc,{
pasPassword: "Test password"
});
*/
//}}}
[>img[login screens|login.gif]] This "tiddler" (a ~TiddlyWiki note) is for storing your passwords.
As you will see when you click on edit:
Formatting text in a wiki without [[WYSIWYG|http://en.wikipedia.org/wiki/WYSIWYG]] editing can be a little fiddly, so you may prefer to keep your passwords in a simple list, as shown below the table.
See [[Tips]] for advice on formatting.
You may enter ''{/%%/ds}'' or ''{ts}'' to record a date or timestamp when the tiddler is saved.
|!Website|!Username|!Password|!Notes|!Date/Time|
|http://www.amazon.com|||This is a note||
|[[Amazon|http://www.amazon.com]] ||||{{ds{2007-09-18}}}|
|[[Lastpass|https://lastpass.com/f?210316]]|Yr name|A.clue|||
|4 |||||
|5 |||||
!A
* http://www.amazon.com username password
* [[Amazon|http://www.amazon.com]] username password; note
----
<html><font size=3>!Why This Solution</font></html>
I have hundreds of passwords and the number grows inexorably.
Over the years I have looked many software solutions for recording passwords and storing them in a safely encrypted form, and I have used a few. You can find some reviews and a list of some well known ones [[here|http://password-management-software-review.toptenreviews.com/]].
I last used [[TK8 Password Safe|http://www.tk8.com/safe.asp]] from [[TK8|http://www.tk8.com]]. The poor review on the site above is undeserved in my opinion. It's an excellent program and the small company behind it, located in Estonia, is highly responsive. [[Skype|http://www.skype.com]] originated in Estonia and the country sometimes calls itself E-stonia because it's so wired. Contrary to the implication in the review, support is a non-issue. The name ~TK8 comes from the founder: Tonis Kask - the 8th! You may judge for yourself why free programs are not included in this list. The best of these is [[KeePass Password Safe|http://keepass.info/]]. It's open source and so runs on a variety of operating systems and hardware.
Until recently I didn't use Linux enough to need another password program. Now I do and [[TK8 Password Safe|http://www.tk8.com/safe.asp]] is a Windows-only solution, so it was time for me to change. I wanted something that would store my passwords securely in a form that would allow me to access them
*on any computer (//e.g.//, via a USB stick), including
* computers on which I couldn't install software, and...
* via the web at any time (see [[Online Access]]).
That ruled out [[KeePass Password Safe|http://keepass.info/]] and also [[Roboform|http://www.roboform.com]], which is probably the best of the commercial options, especially if you fill in a lot of web forms (video [[here|http://onemansblog.com/2007/04/01/one-mans-roboform-demonstration-video/]]).
[[TiddlyWiki|http://www.tiddlywiki.com]] is a remarkably useful tool that can be extended and customised in many ways. I have simply taken a copy of [[Tiddlywiki|http://www.tiddlywiki.com]] and made some additions to it, as described in the [[About]] page.
!''Note:''
~TiddlyFolio is intended to be functional with only a single file (this one). However, if a theme requiring additional files is used (see [[Change The Theme]]) or, if a WYSIWYG editor is enabled (see [[Adding WYSIWYG]]), then it will be necessary to ensure that a few additional files are in the ~TiddlyFolio directory on your computer or portable storage device.
!''Update:'' (2013)
I now use [[LastPass|https://lastpass.com/f?210316]] for almost all my passwords, but not all; it's never a good idea to put //all// your eggs in one basket. If [[LastPass|https://lastpass.com/f?210316]] disappeared or ''suffered an outage'' tomorrow I would still have a record of my passwords up to my last download (stored securely in TiddlyFolio).
/***
|Name:|RenameTagsPlugin|
|Description:|Allows you to easily rename or delete tags across multiple tiddlers|
|Version:|3.0a|
|Date:|27-Jun-2011|
|Source:|http://mptw.tiddlyspot.com/#RenameTagsPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License|http://mptw.tiddlyspot.com/#TheBSDLicense|
Rename a tag and you will be prompted to rename it in all its tagged tiddlers.
***/
//{{{
config.renameTags = {
prompts: {
rename: "Rename the tag '%0' to '%1' in %2 tidder%3?",
remove: "Remove the tag '%0' from %1 tidder%2?"
},
removeTag: function(tag,tiddlers) {
store.suspendNotifications();
for (var i=0;i<tiddlers.length;i++) {
store.setTiddlerTag(tiddlers[i].title,false,tag);
}
store.resumeNotifications();
store.notifyAll();
},
renameTag: function(oldTag,newTag,tiddlers) {
store.suspendNotifications();
for (var i=0;i<tiddlers.length;i++) {
store.setTiddlerTag(tiddlers[i].title,false,oldTag); // remove old
store.setTiddlerTag(tiddlers[i].title,true,newTag); // add new
}
store.resumeNotifications();
store.notifyAll();
},
storeMethods: {
saveTiddler_orig_renameTags: TiddlyWiki.prototype.saveTiddler,
saveTiddler: function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created,creator) {
if (title != newTitle) {
var tagged = this.getTaggedTiddlers(title);
if (tagged.length > 0) {
// then we are renaming a tag
if (confirm(config.renameTags.prompts.rename.format([title,newTitle,tagged.length,tagged.length>1?"s":""])))
config.renameTags.renameTag(title,newTitle,tagged);
if (!this.tiddlerExists(title) && newBody == "")
// dont create unwanted tiddler
return null;
}
}
return this.saveTiddler_orig_renameTags(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created,creator);
},
removeTiddler_orig_renameTags: TiddlyWiki.prototype.removeTiddler,
removeTiddler: function(title) {
var tagged = this.getTaggedTiddlers(title);
if (tagged.length > 0)
if (confirm(config.renameTags.prompts.remove.format([title,tagged.length,tagged.length>1?"s":""])))
config.renameTags.removeTag(title,tagged);
return this.removeTiddler_orig_renameTags(title);
}
},
init: function() {
merge(TiddlyWiki.prototype,this.storeMethods);
}
}
config.renameTags.init();
//}}}
/%
|Name|SetTiddlerBackground|
|Source|http://www.TiddlyTools.com/#SetTiddlerBackground|
|Version|1.1.2|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|set tiddler background and font color CSS attributes|
usage:
<<tiddler SetTiddlerBackground with: bgstyle fgstyle matchtag class>>
where:
'bgstyle' and 'fgstyle' (optional, but specify at least one)
are CSS background style attributes (most often color values, e.g., #rgb or #rrggbb)
'matchtag' (optional)
is a tag value that allows selective control of tiddler background/foreground colors
'class' (optional)
is the class of the tiddler element to which the fgstyle/bgstyle will be applied (default is "viewer").
Use "title" to set the background of the tiddler's 'title' area instead of its 'viewer' area.
The bgstyle and fgstyle assignments are only performed if the tiddler has the matching tag (or if no matchtag value is specfied). In addition, to set just the background or the foreground color (but not both), you can use a dash ("-") as a placeholder value for whichever value you do NOT want to set. For example:
<<tiddler SetTiddlerBackground with: #F00 - urgent>>
sets the background color (but NOT the foreground color) to RED for only those tiddlers tagged with "urgent". Also, note that in that instead of using #RGB color definitions, you can also use CSS color keywords (i.e., "red", "yellow", "green") or *any* other valid CSS value that can be applied to the 'background' style attribute. For example, to use a background image for any tiddler tagged with "wallpaper", you can write:
<<tiddler SetTiddlerBackground with: url(images/bg.jpg) - wallpaper>>
You can use this script several times in a row to define a set of tag-to-color mappings, stored in a *single* convenient tiddler... first, create a tiddler (e.g. [[BackgroundColors]]) containing something like this:
<<tiddler SetTiddlerBackground with: red - urgent>>
<<tiddler SetTiddlerBackground with: yellow - active>>
<<tiddler SetTiddlerBackground with: green - done>>
To apply tag-based color mapping to any specific tiddler, just embed:
<<tiddler BackgroundColors>>
directly in that tiddler's content and set the appropriate tag to select the desired background color.
To apply tag-based color mapping to ALL tiddlers in your document without having to embed the <<tiddler BackgroundColors>> macro into each 'colorized' tiddler, add:
<span macro="tiddler BackgroundColors" style="display:none"></span>
in your [[ViewTemplate]]. Then, anytime you want to add another tag-to-color mapping, all you have to do is just edit the [[BackgroundColors]] tiddler and then start tagging the desired tiddlers accordingly.
%/<script>
if ("$1"!="$"+"1" && "$1"!="-") var bg="$1";
if ("$2"!="$"+"2" && "$2"!="-") var fg="$2";
if ("$3"!="$"+"3" && "$3"!="-") var tag="$3";
if ("$4"!="$"+"4" && "$4"!="-") var c="$4"; else var c="viewer";
var here=story.findContainingTiddler(place); if (!here) return;
var tiddler=store.getTiddler(here.getAttribute("tiddler"));
if (tag && (!tiddler||!tiddler.isTagged(tag))) return;
if (c=="tiddler") target=here;
else {
var children=here.getElementsByTagName("*");
for (var i=0; i<children.length; i++)
if (hasClass(children[i],c)) { var target=children[i]; break; }
}
if (!target) return;
if (bg) target.style.background=bg;
if (fg) target.style.color=fg;
</script>
<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<saveChanges>><<tiddler TspotSidebar>><<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>
/***
|Name|SinglePageModePlugin|
|Source|http://www.TiddlyTools.com/#SinglePageModePlugin|
|Documentation|http://www.TiddlyTools.com/#SinglePageModePluginInfo|
|Version|2.9.7|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|Show tiddlers one at a time with automatic permalink, or always open tiddlers at top/bottom of page.|
This plugin allows you to configure TiddlyWiki to navigate more like a traditional multipage web site with only one tiddler displayed at a time.
!!!!!Documentation
>see [[SinglePageModePluginInfo]]
!!!!!Configuration
<<<
<<option chkSinglePageMode>> Display one tiddler at a time
><<option chkSinglePagePermalink>> Automatically permalink current tiddler
><<option chkSinglePageKeepFoldedTiddlers>> Don't close tiddlers that are folded
><<option chkSinglePageKeepEditedTiddlers>> Don't close tiddlers that are being edited
<<option chkTopOfPageMode>> Open tiddlers at the top of the page
<<option chkBottomOfPageMode>> Open tiddlers at the bottom of the page
<<option chkSinglePageAutoScroll>> Automatically scroll tiddler into view (if needed)
Notes:
* The "display one tiddler at a time" option can also be //temporarily// set/reset by including a 'paramifier' in the document URL: {{{#SPM:true}}} or {{{#SPM:false}}}.
* If more than one display mode is selected, 'one at a time' display takes precedence over both 'top' and 'bottom' settings, and if 'one at a time' setting is not used, 'top of page' takes precedence over 'bottom of page'.
* When using Apple's Safari browser, automatically setting the permalink causes an error and is disabled.
<<<
!!!!!Revisions
<<<
2010.11.30 2.9.7 use story.getTiddler()
2008.10.17 2.9.6 changed chkSinglePageAutoScroll default to false
| Please see [[SinglePageModePluginInfo]] for previous revision details |
2005.08.15 1.0.0 Initial Release. Support for BACK/FORWARD buttons adapted from code developed by Clint Checketts.
<<<
!!!!!Code
***/
//{{{
version.extensions.SinglePageModePlugin= {major: 2, minor: 9, revision: 7, date: new Date(2010,11,30)};
//}}}
//{{{
config.paramifiers.SPM = { onstart: function(v) {
config.options.chkSinglePageMode=eval(v);
if (config.options.chkSinglePageMode && config.options.chkSinglePagePermalink && !config.browser.isSafari) {
config.lastURL = window.location.hash;
if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);
}
} };
//}}}
//{{{
if (config.options.chkSinglePageMode==undefined)
config.options.chkSinglePageMode=false;
if (config.options.chkSinglePagePermalink==undefined)
config.options.chkSinglePagePermalink=true;
if (config.options.chkSinglePageKeepFoldedTiddlers==undefined)
config.options.chkSinglePageKeepFoldedTiddlers=false;
if (config.options.chkSinglePageKeepEditedTiddlers==undefined)
config.options.chkSinglePageKeepEditedTiddlers=false;
if (config.options.chkTopOfPageMode==undefined)
config.options.chkTopOfPageMode=false;
if (config.options.chkBottomOfPageMode==undefined)
config.options.chkBottomOfPageMode=false;
if (config.options.chkSinglePageAutoScroll==undefined)
config.options.chkSinglePageAutoScroll=false;
//}}}
//{{{
config.SPMTimer = 0;
config.lastURL = window.location.hash;
function checkLastURL()
{
if (!config.options.chkSinglePageMode)
{ window.clearInterval(config.SPMTimer); config.SPMTimer=0; return; }
if (config.lastURL == window.location.hash) return; // no change in hash
var tids=decodeURIComponent(window.location.hash.substr(1)).readBracketedList();
if (tids.length==1) // permalink (single tiddler in URL)
story.displayTiddler(null,tids[0]);
else { // restore permaview or default view
config.lastURL = window.location.hash;
if (!tids.length) tids=store.getTiddlerText("DefaultTiddlers").readBracketedList();
story.closeAllTiddlers();
story.displayTiddlers(null,tids);
}
}
if (Story.prototype.SPM_coreDisplayTiddler==undefined)
Story.prototype.SPM_coreDisplayTiddler=Story.prototype.displayTiddler;
Story.prototype.displayTiddler = function(srcElement,tiddler,template,animate,slowly)
{
var title=(tiddler instanceof Tiddler)?tiddler.title:tiddler;
var tiddlerElem=story.getTiddler(title); // ==null unless tiddler is already displayed
var opt=config.options;
var single=opt.chkSinglePageMode && !startingUp;
var top=opt.chkTopOfPageMode && !startingUp;
var bottom=opt.chkBottomOfPageMode && !startingUp;
if (single) {
story.forEachTiddler(function(tid,elem) {
// skip current tiddler and, optionally, tiddlers that are folded.
if ( tid==title
|| (opt.chkSinglePageKeepFoldedTiddlers && elem.getAttribute("folded")=="true"))
return;
// if a tiddler is being edited, ask before closing
if (elem.getAttribute("dirty")=="true") {
if (opt.chkSinglePageKeepEditedTiddlers) return;
// if tiddler to be displayed is already shown, then leave active tiddler editor as is
// (occurs when switching between view and edit modes)
if (tiddlerElem) return;
// otherwise, ask for permission
var msg="'"+tid+"' is currently being edited.\n\n";
msg+="Press OK to save and close this tiddler\nor press Cancel to leave it opened";
if (!confirm(msg)) return; else story.saveTiddler(tid);
}
story.closeTiddler(tid);
});
}
else if (top)
arguments[0]=null;
else if (bottom)
arguments[0]="bottom";
if (single && opt.chkSinglePagePermalink && !config.browser.isSafari) {
window.location.hash = encodeURIComponent(String.encodeTiddlyLink(title));
config.lastURL = window.location.hash;
document.title = wikifyPlain("SiteTitle") + " - " + title;
if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);
}
if (tiddlerElem && tiddlerElem.getAttribute("dirty")=="true") { // editing... move tiddler without re-rendering
var isTopTiddler=(tiddlerElem.previousSibling==null);
if (!isTopTiddler && (single || top))
tiddlerElem.parentNode.insertBefore(tiddlerElem,tiddlerElem.parentNode.firstChild);
else if (bottom)
tiddlerElem.parentNode.insertBefore(tiddlerElem,null);
else this.SPM_coreDisplayTiddler.apply(this,arguments); // let CORE render tiddler
} else
this.SPM_coreDisplayTiddler.apply(this,arguments); // let CORE render tiddler
var tiddlerElem=story.getTiddler(title);
if (tiddlerElem&&opt.chkSinglePageAutoScroll) {
// scroll to top of page or top of tiddler
var isTopTiddler=(tiddlerElem.previousSibling==null);
var yPos=isTopTiddler?0:ensureVisible(tiddlerElem);
// if animating, defer scroll until after animation completes
var delay=opt.chkAnimate?config.animDuration+10:0;
setTimeout("window.scrollTo(0,"+yPos+")",delay);
}
}
if (Story.prototype.SPM_coreDisplayTiddlers==undefined)
Story.prototype.SPM_coreDisplayTiddlers=Story.prototype.displayTiddlers;
Story.prototype.displayTiddlers = function() {
// suspend single/top/bottom modes when showing multiple tiddlers
var opt=config.options;
var saveSPM=opt.chkSinglePageMode; opt.chkSinglePageMode=false;
var saveTPM=opt.chkTopOfPageMode; opt.chkTopOfPageMode=false;
var saveBPM=opt.chkBottomOfPageMode; opt.chkBottomOfPageMode=false;
this.SPM_coreDisplayTiddlers.apply(this,arguments);
opt.chkBottomOfPageMode=saveBPM;
opt.chkTopOfPageMode=saveTPM;
opt.chkSinglePageMode=saveSPM;
}
//}}}
/***
|Name|SinglePageModePluginInfo|
|Source|http://www.TiddlyTools.com/#SinglePageModePlugin|
|Documentation|http://www.TiddlyTools.com/#SinglePageModePluginInfo|
|Version|2.9.6|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Description|Documentation for SinglePageModePlugin|
Normally, as you click on the links in TiddlyWiki, more and more tiddlers are displayed on the page. The order of this tiddler display depends upon when and where you have clicked. Some people like this non-linear method of reading the document, while others have reported that when many tiddlers have been opened, it can get somewhat confusing. SinglePageModePlugin allows you to configure TiddlyWiki to navigate more like a traditional multipage web site with only one item displayed at a time.
!!!!!Usage
<<<
When the plugin is enabled, only one tiddler will be displayed at a time and the browser window's titlebar is updated to include the current tiddler title. The browser's location URL is also updated with a 'permalink' for the current tiddler so that it is easier to create a browser 'bookmark' for the current tiddler. Alternatively, even when displaying multiple tiddlers //is// permitted, you can still reduce the potential for confusion by forcing tiddlers to always open at the top (or bottom) of the page instead of being displayed following the tiddler containing the link that was clicked.
<<<
!!!!!Configuration
<<<
<<option chkSinglePageMode>> Display one tiddler at a time
><<option chkSinglePagePermalink>> Automatically permalink current tiddler
><<option chkSinglePageKeepFoldedTiddlers>> Don't close tiddlers that are folded
><<option chkSinglePageKeepEditedTiddlers>> Don't close tiddlers that are being edited
<<option chkTopOfPageMode>> Open tiddlers at the top of the page
<<option chkBottomOfPageMode>> Open tiddlers at the bottom of the page
<<option chkSinglePageAutoScroll>> Automatically scroll tiddler into view (if needed)
Notes:
* {{block{
The "display one tiddler at a time" option can also be //temporarily// set/reset by including a 'paramifier' in the document URL: {{{#SPM:true}}} or {{{#SPM:false}}}. You can also use {{{SPM:expression}}}, where 'expression' is any javascript statement that evaluates to true or false. This allows you to create hard-coded links in other documents that can selectively enable/disable the use of this option based on various programmatic conditions, such as the current username. For example, using
{{{#SPM:config.options.txtUserName!="SomeName"}}}
enables 'one tiddler at a time' display for all users //other than// "~SomeName")}}}
* If more than one display mode is selected, 'one at a time' display takes precedence over both 'top' and 'bottom' settings, and if 'one at a time' setting is not used, 'top of page' takes precedence over 'bottom of page'.
* When using Apple's Safari browser, automatically setting the permalink causes an error and is disabled.
<<<
!!!!!Revisions
<<<
2008.10.17 2.9.6 changed chkSinglePageAutoScroll default to false
2008.06.12 2.9.5 corrected 'scroll to top of page' logic in auto-scroll handling
2008.06.11 2.9.4 added chkSinglePageKeepEditedTiddlers option
2008.06.05 2.9.3 in displayTiddler(), bypass single/top/bottom mode handling if startingUp. Allows multiple tiddlers to be displayed during startup processing (e.g., #story:DefaultTiddlers), even if single/top/bottom mode is enabled.
2008.04.18 2.9.2 in displayTiddler() and checkLastURL(), handling for Unicode in tiddler titles (remove explicit conversion between Unicode and UTF, as this is apparently done automatically by encode/decodeURIComponent, resulting in double-encoding!
2008.04.08 2.9.1 don't automatically add options to AdvancedOptions shadow tiddler
2008.04.02 2.9.0 in displayTiddler(), when single-page mode is in use and a tiddler is being edited, ask for permission to save-and-close that tiddler, instead of just leaving it open.
2008.03.29 2.8.3 in displayTiddler(), get title from tiddler object (if needed). Fixes errors caused when calling function passes a tiddler *object* instead of a tiddler *title*
2008.03.14 2.8.2 in displayTiddler(), if editing specified tiddler, just move it to top/bottom of story *without* re-rendering (prevents discard of partial edits).
2008.03.06 2.8.1 in paramifier handler, start 'checkURL' timer if chkSinglePageMode is enabled
2008.03.06 2.8.0 added option, {{{config.options.chkSinglePageKeepFoldedTiddlers}}}, so folded tiddlers won't be closed when using single-page mode. Also, in checkURL(), if hash is a ''permaview'' (e.g., "#foo bar baz"), then display multiple tiddlers rather than attempting to display "foo bar baz" as a single tiddler
2008.03.05 2.7.0 added support for "SPM:" URL paramifier
2008.03.01 2.6.0 in hijack of displayTiddler(), added 'title' argument to closeAllTiddlers() so that target tiddler isn't closed-and-reopened if it was already displayed. Also, added config.options.chkSinglePageAutoScrolloption to bypass automatic 'scroll into view' logic (note: core still does it's own ensureVisible() handling)
2007.12.22 2.5.3 in checkLastURL(), use decodeURIComponent() instead of decodeURI so that tiddler titles with commas (and/or other punctuation) are correctly handled.
2007.10.26 2.5.2 documentation cleanup
2007.10.08 2.5.1 in displayTiddler(), when using single-page or top-of-page mode, scrollTo(0,0) to ensure that page header is in view.
2007.09.13 2.5.0 for TPM/BPM modes, don't force tiddler to redisplay if already shown. Allows transition between view/edit or collapsed/view templates, without repositioning displayed tiddler.
2007.09.12 2.4.0 added option to disable automatic permalink feature. Also, Safari is now excluded from permalinking action to avoid bug where tiddlers don't display after hash is updated.
2007.03.03 2.3.1 fix typo when adding BPM option to AdvancedOptions (prevented checkbox from appearing)
2007.03.03 2.3.0 added support for BottomOfPageMode (BPM) based on request from DaveGarbutt
2007.02.06 2.2.3 in Story.prototype.displayTiddler(), use convertUnicodeToUTF8() for correct I18N string handling when creating URL hash string from tiddler title (based on bug report from BidiX)
2007.01.08 2.2.2 use apply() to invoke hijacked core functions
2006.07.04 2.2.1 in hijack for displayTiddlers(), suspend TPM as well as SPM so that DefaultTiddlers displays in the correct order.
2006.06.01 2.2.0 added chkTopOfPageMode (TPM) handling
2006.02.04 2.1.1 moved global variable declarations to config.* to avoid FireFox 1.5.0.1 crash bug when assigning to globals
2005.12.27 2.1.0 hijack displayTiddlers() so that SPM can be suspended during startup while displaying the DefaultTiddlers (or #hash list). Also, corrected initialization for undefined SPM flag to "false", so default behavior is to display multiple tiddlers
2005.12.27 2.0.0 Update for TW2.0
2005.11.24 1.1.2 When the back and forward buttons are used, the page now changes to match the URL. Based on code added by Clint Checketts
2005.10.14 1.1.1 permalink creation now calls encodeTiddlyLink() to handle tiddler titles with spaces in them
2005.10.14 1.1.0 added automatic setting of window title and location bar ('auto-permalink'). feature suggestion by David Dickens.
2005.10.09 1.0.1 combined documentation and code in a single tiddler
2005.08.15 1.0.0 Initial Release
<<<
''Your Wiki Wallet ^^v1.1^^ ~~//for Firefox~~+~TiddlyFox''//~~
<<<
[[Introduction]]
[[Instructions]] (configure ~TiddlyFolio)
[[Using TiddlyFolio]]
[[Tips]]
[[About]]
<<<
/***
Inspired by k2
!General
***/
/*{{{*/
body {
background: #EDEDED;
}
#contentWrapper{
background: #fff;
border:1px solid #DDD;
margin: 0 auto;
width: 780px;
padding:0;
}
/*}}}*/
/***
!Links
***/
/*{{{*/
a,
a.tiddlyLink,
a.button,
a.externalLink,
#sidebarOptions .sliderPanel a{
color: #1D65BC;
text-decoration: none;
background: transparent;
border: 0;
}
a:hover,
a.tiddlyLink:hover,
a.button:hover,
a.externalLink:hover,
#sidebarOptions .sliderPanel a:hover
{
border: 0;
color: #1D65BC;
text-decoration: underline;
background:transparent;
}
.button:active {background:#1d65bc; border:0;}
.viewer .button:active, .viewer .marked, .viewer .highlight {
color: #fff !important;
background: #3371a3;
border: 0;
}
/*}}}*/
/***
!Header
***/
/*{{{*/
.gradient {margin-top:20px; background:#3371A3;}
.titleLine{padding: 80px 40px 32px 40px;}
.titleLine a:hover{color:#fff; border-bottom:1px dotted #eee; text-decoration:none;}
.titleLine a{color:#fff; border-bottom:1px dotted #ccc;}
.siteTitle {
font-size: 2.2em;
font-weight: bold;
color:#fff;
}
.siteSubtitle {
font-size: 1.0em;
display: block;
margin: .3em auto 1em;
color:#fff;
}
/*}}}*/
/***
!TopMenu
***/
/*{{{*/
#topMenu br {display:none; }
#topMenu { background: #3371A3; font-size:1em; }
#topMenu { padding:5px 32px; }
#topMenu .button, #topMenu .tiddlyLink {
margin-left:0.1em; margin-right:0.1em;
padding:0.5em;
color:white; font-weight:normal;
}
#topMenu a.button:hover, #topMenu a.tiddlyLink:hover { background:#fff; color:#333; text-decoration:none;}
.searchBar {float:right; font-size:0.9em;}
.searchBar .button {display:block; border:none; color:#ccc;}
.searchBar .button:hover{border:none; color:#eee;}
.searchBar input{
border: 1px inset #1d65bc; background:#dbdee3;
}
.searchBar input:focus {
border: 1px inset #3371a3; background:#fff;
}
/*}}}*/
/***
!Display
***/
/***
!!!Display General
***/
/*{{{*/
#displayArea { margin: 0em 15.7em 0em 1em; }
#displayFooter {
clear: both;
}
#displayFooter {
clear: both;
}
#tiddlerDisplay{padding-top:1em;}
/*}}}*/
/***
!!!Tiddler
***/
/*{{{*/
.tiddler {margin-bottom:1em; padding-bottom:1em;}
.tiddler {padding-left:2em;}
.title {color:#333; font-size:1.8em; border-bottom:1px solid #333; padding-bottom:0.3px;}
.subtitle { font-size:90%; color:#bbb; padding-left:0.25em; margin-top:0.1em; }
.shadow .title {
color: #aaa;
}
h1,h2,h3,h4,h5 { color: #333; background: transparent; padding-bottom:2px; border-bottom: 1px dotted #666; }
* html .viewer pre {
margin-left: 0em;
}
.viewer hr {
border: 0;
border-top: solid 1px #333;
margin: 0 8em;
color: #333;
}
.viewer a.button {color:#000; border:1px solid #1D65BC; font-weight:bold;}
.viewer a.button:hover{color:#fff; background:#3371a3; text-decoration:none;}
.tagClear {clear:none;}
.toolbar .button {color:#bbb; border:none;}
.toolbar .button:hover, .toolbar .highlight, .toolbar .marked, .toolbar a.button:active {background:transparent; color:#111; border:none; text-decoration:underline;}
.tiddler {border-bottom:3px solid #EEF1F3; padding-bottom:2em; padding-top:0em;}
.title {border-bottom:none; margin-right:8em;}
h1,h2,h3,h4,h5 { color: #333; background: transparent; padding-bottom:2px; border-bottom: none; }
.viewer pre, .viewer code {
border: 1px solid #B2B6BE;
background: #EBEEF1;}
.tagging, .tagged {
border: 1px solid #dbdee3;
background-color: #ebeef1;
}
.selected .tagging, .selected .tagged {
background-color: #dbdee3;
border: 1px solid #B2B6BE;
}
.tagging .listTitle, .tagged .listTitle {
color: #bbb;
}
.selected .tagging .listTitle, .selected .tagged .listTitle {
color: #014;
}
.tagging .button:hover, .tagged .button:hover {
border: none; background:transparent; text-decoration:underline; color:#014;
}
.tagged .highlight, .tagged .marked, .tagged a.button:active {text-decoration:underline; background:transparent; color:#014;}
.tagging .button, .tagged .button {
color:#bbb;
}
.selected .tagging .button, .selected .tagged .button {
color:#014;
}
.viewer blockquote {
border-left:7px solid #ebeef1;
}
.viewer table {
border: 1px solid #3371a3;
}
.viewer th, thead td {
background: #3371a3;
border: 1px solid #3371a3;
color: #fff;
}
.viewer td, .viewer tr {
border: 1px solid #3371a3;
}
/*}}}*/
/***
!!!Editor
***/
/*{{{*/
* html .editor textarea, * html .editor input {
width: 98%;
}
.editor input, .editor textarea {
border: 1px solid #1d65bc; background:#ebeef1;
}
.editor {padding-top:0.3em;}
.editor textarea:focus, .editor input:focus {
border: 1px inset #3371a3; background:#fff;
}
/*}}}*/
/***
!Sidebar
***/
/*{{{*/
#sidebar{
position:relative;
float:right;
margin-bottom:1em;
display:inline;
width: 16em;
}
#sidebar .tabSelected, #sidebar .tabSected:hover {
color: #000;
background: #dbdee3;
border-top: solid 1px #B2B6BE;
border-left: solid 1px #B2B6BE;
border-right: solid 1px #B2B6BE;
border-bottom:solid 1px #dbdee3 !important;
padding-bottom:1px;
text-decoration:none;
}
#sidebarOptions, #sidebarTabs {border-left: 1px solid #B2B6BE;}
#sidebarTabs {border-bottom: 1px solid #B2B6BE;}
#sidebar .tabUnselected, #sidebar .tabUnselected:hover {
color: #F0F3F5;
background: #B2B6BE ;
border: solid 1px #B2B6BE ;
padding-bottom:1px;
}
#sidebarTabs .tabContents {border:none; background:#DBDEE3; }
#sidebarTabs .tabContents {border-top:1px solid #B2B6BE;}
#sidebarTabs .tabContents .tabContents {border-left:1px solid #b2b6be;}
#sidebarOptions .sliderPanel {
background: #EBEEF1; border:none;
}
#sidebarOptions input {
border: 1px solid #1d65bc;
}
#sidebarOptions input:hover, #sidebarOptions input:active, #sidebarOptions input:focus {
border: 1px inset #3371a3;
}
#sidebar {background: #EBEEF1 ; right:0;}
#sidebar .button:active, #sidebar .marked, #sidebar .highlight {color:#014; background:transparent;text-decoration:none}
/*}}}*/
/***
!!Popups
***/
/*{{{*/
.popup {
background: #3371a3;
border: 1px solid #333;
}
.popup hr {
color: #333;
background: #333;
border-bottom: 1px;
}
.popup li.disabled {
color: #333;
}
.popup li a, .popup li a:visited {
color: #eee;
border: none;
}
.popup li a:hover {
background: #3371a3;
color: #fff;
border: none;
text-decoration:underline;
}
/*}}}*/
/***
!!Message Area
***/
/*{{{*/
#messageArea {
border: 2px dashed #3371a3;
background: #dbdee3;
color: #fff;
font-size:90%;
}
#messageArea .button {
color: #1d65bc;
background: #ebeef1;
text-decoration:none;
font-weight:bold;
border:none;
}
#messageArea a.button {color:#1d65bc;}
#messageArea .button:hover {text-decoration:underline;}
/*}}}*/
/***
!!Tabs
***/
/*{{{*/
.viewer .tabSelected, .viewer .tabSelected:hover{
color: #014;
background: #eee;
border-left: 1px solid #B2B6BE;
border-top: 1px solid #B2B6BE;
border-right: 1px solid #B2B6BE;
}
.viewer .tabUnselected, .viewer .tabUnselected:hover {
color: #fff;
background: #B2B6BE;
}
. viewer .tabContents {
color: #014;
background: #ebeef1;
border: 1px solid #B2B6BE;
}
/*}}}*/
.blog h2, .blog h3, .blog h4{
margin:0;
padding:0;
border-bottom:none;
}
.blog {margin-left:1.5em;}
.blog .excerpt {
margin:0;
margin-top:0.3em;
padding: 0;
margin-left:1em;
padding-left:1em;
font-size:90%;
border-left:1px solid #ddd;
}
#tiddlerWhatsNew h1, #tiddlerWhatsNew h2 {border-bottom:none;}
div[tags~="RecentUpdates"], div[tags~="lewcidExtension"] {margin-bottom: 2em;}
#topMenu .fontResizer {float:right;}
#topMenu .fontResizer .button{border:1px solid #3371A3;}
#topMenu .fontResizer .button:hover {border:1px solid #fff; color:#3371A3;}
#sidebarTabs .txtMainTab .tiddlyLinkExisting {
font-weight: normal;
font-style: normal;
}
#sidebarTabs .txtMoreTab .tiddlyLinkExisting {
font-weight: bold;
font-style: normal;
}
<<timeline better:true excludeTag:hide sortBy:modified firstDay:20130117 excludeOnly:Plugins>>
|!Markup|!Explanation|
| {{{|}}} |Column Seperator |
| {{{!}}} |Heading (Row or Column) |
| {{{>}}} |Column Span |
| {{{~}}} |Row Span |
| {{{|Left |}}} |Left Align |
| {{{| Right|}}} |Right Align|
| {{{| Center |}}} |Center Align |
| {{{|Caption|c}}} |Table Caption (Can be at top or bottom)|
| {{{|Header|h}}} |Marks the row as being a header row (will be wrapped with a {{{<thead>}}} and so all entries are automatically formatted as per {{{|!}}} cells)|
| {{{|Footer|f}}} |Marks the row as being a footer row (will be wrapped with a {{{<tfoot>}}}, no special formatting is pre-defined for this but can be added to your own CSS)|
| {{{|CSSclass|k}}} |Applies a CSS class to the table to allow additional formatting (NB: only works if no whitespace after the k)|
|>|To have a table with no borders at all. Use {{{|noBorder|k}}} with the CSS (in your StyleSheet tiddler):<br />{{{ .noBorder,.noBorder td,.noBorder th,.noBorder tr{border:0} }}}|
|>|!Sample Table|
|>|{{{|table caption|c}}}<br />{{{|header|header|h}}}<br />{{{|text|more text|}}}<br />{{{|!heading|!heading|}}}<br />{{{|>|colspan|}}}<br />{{{|rowspan|left align |}}}<br />{{{|~| center |}}}<br />{{{|bgcolor(green):green| right|}}}<br />{{{|footer|footer|f}}} |
|>|<<tiddler ./tblShow>>|
!Notes
You can use the custom CSS formatter in combination with headers and lists to allow new lines within the entry. e.g.:
{{{
#{{block{
Bullet 1
Some text in the same bullet
(Note that "block" can be anything, it is the formatters CSS class name)
}}}
# Bullet 2
}}}
#{{block{
Bullet 1
Some text in the same bullet
}}}
# Bullet 2
(Julian Knight, 2006-05-11)
<part atEg hidden>
{{{
This is before the indented text
@@display:block;margin-left:2em;This text will be indented...
...and can even span across several lines...
...or even include blank lines.
@@This is after the indented text
}}}
This is before the indented text
@@display:block;margin-left:2em;This text will be indented...
...and can even span across several lines...
...or even include blank lines.
@@This is after the indented text
</part>
<part tblMarkup hidden>
{{{
|table caption|c
|header|header|h
|text|more text|
|!heading|!heading|
|>|colspan|
|rowspan|left align |
|~| center |
|bgcolor(green):green| right|
|footer|footer|f
}}}
</part>
<part tblShow hidden>
|table caption|c
|header|header|h
|text|more text|
|!heading|!heading|
|>|colspan|
|rowspan|left align |
|~| center |
|bgcolor(green):green| right|
|footer|footer|f
</part>
/***
|Name|TaggedTemplateTweak|
|Source|http://www.TiddlyTools.com/#TaggedTemplateTweak|
|Documentation|http://www.TiddlyTools.com/#TaggedTemplateTweakInfo|
|Version|1.6.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|use alternative ViewTemplate/EditTemplate for specific tiddlers|
This plugin extends the core function, story.chooseTemplateForTiddler(), so that any given tiddler can be viewed and/or edited using alternatives to the standard tiddler templates.
!!!!!Documentation
>see [[TaggedTemplateTweakInfo]]
!!!!!Revisions
<<<
2009.09.02 [1.6.1] apply field-based template (if any) *before* tag-based template
| please see [[TaggedTemplateTweakInfo]] for previous revision details |
2007.06.11 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.TaggedTemplateTweak= {major: 1, minor: 6, revision: 1, date: new Date(2009,9,2)};
if (!config.options.txtTemplateTweakFieldname)
config.options.txtTemplateTweakFieldname='template';
Story.prototype.taggedTemplate_chooseTemplateForTiddler = Story.prototype.chooseTemplateForTiddler
Story.prototype.chooseTemplateForTiddler = function(title,template)
{
// get core template and split into theme and template name
var coreTemplate=this.taggedTemplate_chooseTemplateForTiddler.apply(this,arguments);
var theme=""; var template=coreTemplate;
var parts=template.split(config.textPrimitives.sectionSeparator);
if (parts[1]) { theme=parts[0]; template=parts[1]; }
else theme=config.options.txtTheme||""; // if theme is not specified
theme+=config.textPrimitives.sectionSeparator;
// look for template using title as prefix
if (!store.getTaggedTiddlers(title).length) { // if tiddler is not a tag
if (store.getTiddlerText(theme+title+template))
{ return theme+title+template; } // theme##TitleTemplate
if (store.getTiddlerText(title+template))
{ return title+template; } // TitleTemplate
}
// look for templates using custom field value as prefix
var v=store.getValue(title,config.options.txtTemplateTweakFieldname);
if (store.getTiddlerText(theme+v+template))
{ return theme+v+template; } // theme##valueTemplate
if (store.getTiddlerText(v+template))
{ return v+template; } // valueTemplate
// look for template using tags as prefix
var tiddler=store.getTiddler(title);
if (!tiddler) return coreTemplate; // tiddler doesn't exist... use core result
for (i=0; i<tiddler.tags.length; i++) {
var t=tiddler.tags[i]+template; // add tag prefix to template
var c=t.substr(0,1).toUpperCase()+t.substr(1); // capitalized for WikiWord title
if (store.getTiddlerText(theme+t)) { return theme+t; } // theme##tagTemplate
if (store.getTiddlerText(theme+c)) { return theme+c; } // theme##TagTemplate
if (store.getTiddlerText(t)) { return t; } // tagTemplate
if (store.getTiddlerText(c)) { return c; } // TagTemplate
}
// no match... use core result
return coreTemplate;
}
//}}}
/***
|Name|TaggedTemplateTweakInfo|
|Source|http://www.TiddlyTools.com/#TaggedTemplateTweak|
|Documentation|http://www.TiddlyTools.com/#TaggedTemplateTweakInfo|
|Version|1.6.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|documentation|
|Description|Documentation for TaggedTemplateTweak|
This plugin extends the core function, story.chooseTemplateForTiddler(), so that any given tiddler can be viewed and/or edited using alternatives to the standard tiddler templates. To select alternative templates, a 'template prefix' is determined by using the tiddler's title or matching a tag value or using a value stored in a custom tiddler field.
!!!!!Usage
<<<
The plugin first attempts to use the tiddler's //title// as a prefix added to the standard TiddlyWiki template titles, [[ViewTemplate]] and [[EditTemplate]] (i.e., ''TiddlerNameViewTemplate'' and ''TiddlerNameEditTemplate''). This allows you to associate a custom template with a specific tiddler, without needing to add any special tags or custom field values to that individual tiddler.
You can also define a tiddler's template prefix by using a //custom tiddler field// named 'template'. If no corresponding template was found using the tiddler's title, then the tiddler's 'template' field value, if present, will be used as a prefix (e.g., if template='SomeThing', then [[SomeThingViewTemplate]] will be applied).
*You can redefine the //name// of the custom field used to store the template prefix. For example, to use the name of a TiddlyWeb server-side 'bag' as a prefix (so that tiddlers from separate bags can have different appearances), add the following to a tiddler tagged with<<tag systemConfig>>:
If no template is found using the either the title or 'template' field, then each of the tiddler's tags is tried as a template prefix, until a corresponding template, if any, is found. For example, any tiddlers that are tagged with ''<<tag media>>'' could find alternative templates named [[mediaViewTemplate]] and [[mediaEditTemplate]].
*To permit use of templates that have proper WikiWord tiddler titles (e.g., [[MediaViewTemplate]] and [[MediaEditTemplate]]), the plugin also attempts to use a capitalized form of the tag value (e.g., ''Media'') as a prefix. //This capitalization is for comparison purposes only and will not alter the actual tag values that are stored in the tiddler.//
*If you are applying a systemTheme definition, the plugin also tries prepending the currently selected theme (specified by {{{config.options.txtTheme}}}) plus the 'section separator' (##) to the template name (e.g. ''[[SomeTheme##MediaViewTemplate]]'') so that the alternative template definitions can be contained as //sections// within a single systemTheme tiddler.
{{{
config.options.txtTemplateTweakFieldname='server.bag'; // use TiddlyWeb bag name as prefix
}}}
Lastly, if no alternative template is found at all, the standard [[ViewTemplate]] or [[EditTemplate]] definition as determined by the TiddlyWiki core handler is used.
''To add your own custom templates:''
>First, decide upon a suitable tag keyword to uniquely identify your custom templates and create custom view and/or edit templates using that keyword as a prefix (e.g., "KeywordViewTemplate" and "KeywordEditTemplate"). Then, simply create a tiddler and tag it with your chosen keyword... that's it! As long as the tiddler is tagged with your keyword, it will be displayed using the corresponding alternative templates. If you remove the tag or rename/delete the alternative templates, the tiddler will revert to using the standard viewing and editing templates.
<<<
!!!!!Examples
<<<
|Sample tiddler| tag | view template | edit template |
|[[MediaSample - QuickTime]]| <<tag media>> | [[MediaViewTemplate]] | [[MediaEditTemplate]] |
|[[MediaSample - Windows]]| <<tag media>> | [[MediaViewTemplate]] | [[MediaEditTemplate]] |
|[[CDSample]]| <<tag CD>> | [[CDViewTemplate]] | [[CDEditTemplate]] |
|<<newTiddler label:"create new task..." title:SampleTask tag:task text:"Type some text and then press DONE to view the task controls">> | <<tag task>> | [[TaskViewTemplate]] | [[EditTemplate]] |
//(note: if these samples are not present in your document, please visit// http://www.TiddlyTools.com/ //to view these sample tiddlers on-line)//
<<<
!!!!!Revisions
<<<
2009.09.02 1.6.1 apply field-based template (if any) *before* tag-based template
2009.07.31 1.6.0 added support for using custom field value as prefix
2009.05.04 1.5.2 check for tiddler exist *after* title-as-prefix (allows shadow tiddlers to use custom templates)
2009.01.06 1.5.1 reversed logic so that title-as-prefix takes precedence over tag-matched prefix
2008.12.18 1.5.0 added handling for using tiddler //title// as prefix (e.g., {{{SomeTiddlerViewTemplate}}})
2008.08.29 1.4.1 corrected handling for tiddlers with no matching tagged template when non-default theme is in effect (e.g., use "MyTheme##ViewTemplate").
2008.05.15 1.4.0 support use of *shadow* tagged templates (e.g., [[DiscussionViewTemplate]] created by [[DiscussionPlugin]])
2008.05.10 1.3.0 corrected handling for determining core template when using theme with sections
2008.05.01 1.2.5 added support for tagged templates stored as sections in a theme
2008.04.01 1.2.0 added support for using systemTheme section-based template definitions (requested by Phil Hawksworth)
2008.01.22 [*.*.*] plugin size reduction - documentation moved to [[TaggedTemplateTweakInfo]]
2007.06.23 1.1.0 re-written to use automatic 'tag prefix' search instead of hard coded check for each tag. Allows new custom tags to be used without requiring code changes to this plugin.
2007.06.11 1.0.0 initial release
<<<
/***
|Name|TiddlerEncryptionPlugin|
|Author|Lyall Pearce|
|Source|http://www.Remotely-Helpful.com/TiddlyWiki/TiddlerEncryptionPlugin.html|
|License|[[Creative Commons Attribution-Share Alike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|Version|3.2.2|
|~CoreVersion|2.4.0|
|Requires|None|
|Overrides|store.getSaver().externalizeTiddler(), store.getTiddler() and store.getTiddlerText()|
|Description|Encrypt/Decrypt Tiddlers with a Password key|
!!!!!Usage
<<<
* Tag a tiddler with Encrypt(prompt)
** Consider the 'prompt' something to help you remember the password with. If multiple tiddlers can be encrypted with the same 'prompt' and you will only be asked for the password once.
* Upon save, the Tiddler will be encrypted and the tag replaced with Decrypt(prompt).
** Failure to encrypt (by not entering a password) will leave the tiddler unencrypted and will leave the Encrypt(prompt) tag in place. This means that the next time you save, you will be asked for the password again.
** To have multiple tiddlers use the same password - simply use the same 'prompt'.
** Tiddlers that are encrypted may be automatically tagged 'excludeSearch' as there is no point in searching encrypted data - this is configurable by an option - you still may want to search the titles of encrypted tiddlers
** Tiddlers that are encrypted may be automatically tagged 'excludeLists', if you have them encrypted, you may also want to keep them 'hidden' - this is configurable by an option.
** Automatic removal of excludeLists and excludeSearch tags is performed, if the above two options are set, only if these two tags are the last 2 tags for a tiddler, if they are positioned somewhere else in the tags list, they will be left in place, meaning that the decrypted tiddler will not be searchable and/or will not appear in lists.
** Encrypted tiddlers are stored as displayable hex, to keep things visibly tidy, should you display an encrypted tiddler. There is nothing worse than seeing a pile of gobbledy gook on your screen. Additionally, the encrypted data is easily cut/paste/emailed if displayed in hex form.
* Tiddlers are decrypted only if you click the decrypt button or the decryptAll button, not when you load the TiddlyWiki
** If you don't display a tiddler, you won't have the option to decrypt it (unless you use the {{{<<EncryptionDecryptAll>>}}} macro)
** Tiddlers will re-encrypt automatically on save.
** Decryption of Tiddlers does not make your TiddlyWiki 'dirty' - you will not be asked to save if you leave the page.
* Errors are reported via diagnostic messages.
** Empty passwords, on save, will result in the tiddler being saved unencrypted - this should only occur with new tiddlers, decrypted tiddlers or with tiddlers who have had their 'prompt' tag changed.
** Encrypted tiddlers know if they are decrypted successfully - failure to decrypt a tiddler will ''not'' lose your data.
** Editing of an encrypted (that has not been unencrypted) tiddler will result in loss of that tiddler as the SHA1 checksums will no longer match, upon decryption. To this end, it is best that you do not check the option. You can, however edit an encrypted tiddler tag list - just do ''not'' change the tiddler contents.
** To change the password on a Tiddler, change the Encrypt('prompt') tag to a new prompt value, after decrypting the tiddler.
** You can edit the tags of an encrypted tiddler, so long as you do not edit the text.
** To change the password for all tiddlers of a particular prompt, use the {{{<<EncryptionChangePassword ["button text" ["tooltip text" ["prompt string" ["accessKey"]]]]>>}}} macro.
** To decrypt all tiddlers of a particular "prompt string", use the {{{<<EncryptionDecryptAll ["button text" ["tooltip text" ["prompt string" ["accessKey"]]]]>>}}} macro - this will make tiddlers encrypted with "prompt string" searchable - or prompt for all 'prompt strings', if none is supplied.
<<<
!!!!!Configuration
<<<
Useful Buttons:
<<EncryptionChangePassword>> - Change passwords of encrypted tiddlers.
<<EncryptionDecryptAll>> - Decrypt ALL tiddlers - enables searching contents of encrypted tiddlers.
<<option chkExcludeEncryptedFromSearch>> - If set, Encrypted Tiddlers are excluded from searching by tagging with excludeSearch. If Clear, excludeSearch is not added and it is also removed from existing Encrypted Tiddlers only if it is the last Tag. Searching of Encrypted Tiddlers is only meaningful for the Title and Tags.
<<option chkExcludeEncryptedFromLists>> - If set, Encrypted Tiddlers are excluded from lists by tagging with excludeLists. If Clear, excludeLists is not added and it is also removed from existing Encrypted Tiddlers only if it is the last Tag. Preventing encrypted tiddlers from appearing in lists effectively hides them.
<<option chkShowDecryptButtonInContent>> - If set, Encrypted Tiddlers content is replaced by <<EncryptionDecryptThis>> button. This has consequences, in the current version as, if you edit the tiddler without decrypting it, you lose the contents.
<<<
!!!!!Revision History
<<<
* 3.2.2 - added tiddler.changed() calls whenever plugin changes tiddler content as per recommendations by Udo.
* 3.2.1 - Returned the <<EncryptionDecryptThis>> button as an option.
* 3.2.0 - Ditched the 'Decrypt' button showing up in the tiddler contents if the tiddler is encrypted. It caused too much pain if you edit the tiddler without decrypting it - you lost your data as it was replaced by a Decrypt Macro call! Additionally, a 'decrypt' button will now appear in the toolbar, just before the edit button, if the tiddler is encrypted. This button only appears if using core TiddlyWiki version 2.4 or above.
* 3.1.1 - Obscure bug whereby if an encrypted tiddler was a certain length, it would refuse to decrypt.
* 3.1.0 - When creating a new Encrypt(prompt) tiddler and you have not previously decrypted a tiddler with the same prompt, on save, you will be prompted for the password to encrypt the tiddler. Prior to encrypting, an attempt to decrypt all other tiddlers with the same prompt, is performed. If any tiddler fails to decrypt, the save is aborted - this is so you don't accidentally have 2 (or more!) passwords for the same prompt. Either you enter the correct password, change the prompt string and try re-saving or you cancel (and the tiddler is saved unencrypted).
* 3.0.1 - Allow Enter to be used for password entry, rather than having to press the OK button.
* 3.0.0 - Major revamp internally to support entry of passwords using forms such that passwords are no longer visible on entry. Completely backward compatible with old encrypted tiddlers. No more using the javascript prompt() function.
<<<
!!!!!Additional work
***/
//{{{
version.extensions.TiddlerEncryptionPlugin = {major: 3, minor: 2, revision: 2, date: new Date(2012,05,17)};
// where I cache the passwords - for want of a better place.
config.encryptionPasswords = new Array();
config.encryptionReEnterPasswords = false;
if(config.options.chkExcludeEncryptedFromSearch == undefined) config.options.chkExcludeEncryptedFromSearch = false;
if(config.options.chkExcludeEncryptedFromLists == undefined) config.options.chkExcludeEncryptedFromLists = false;
if(config.options.chkShowDecryptButtonInContent == undefined) config.options.chkShowDecryptButtonInContent = false;
config.macros.EncryptionChangePassword = {};
config.macros.EncryptionChangePassword.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
var theButton = createTiddlyButton(place,
(params[0] && params[0].length > 0) ? params[0] : "Change Passwords",
(params[1] && params[1].length > 0) ? params[1] : "Change Passwords" + (params[2] ? " for prompt "+params[2] : ""),
onClickEncryptionChangePassword,
null,
null,
params[3]);
if(params[2] && params[2].length > 0) {
theButton.setAttribute("promptString", params[2]);
}
};
config.macros.EncryptionDecryptAll = {};
config.macros.EncryptionDecryptAll.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
var theButton = createTiddlyButton(place,
(params[0] && params[0].length > 0) ? params[0] : "Decrypt All",
(params[1] && params[1].length > 0) ? params[1] : "Decrypt All Tiddlers" + ((params[2] && params[2].length > 0) ? " for prompt "+params[2] : " for a given 'prompt string'"),
onClickEncryptionDecryptAll,
null,
null,
params[3]);
if(params[2] && params[2].length > 0) {
theButton.setAttribute("promptString", params[2]);
}
};
config.macros.EncryptionDecryptThis = {};
config.macros.EncryptionDecryptThis.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
var theButton = createTiddlyButton(place,
(params[0] && params[0].length > 0) ? params[0] : "Decrypt",
(params[1] && params[1].length > 0) ? params[1] : "Decrypt this Tiddler",
onClickEncryptionDecryptThis,
null,
null,
params[3]);
if(params[2] && params[2].length > 0) {
theButton.setAttribute("theTiddler", params[2]);
}
};
// toolbar button to decrypt tiddlers.
config.commands.decryptThis = {
text: "decrypt",
tooltip: "Decrypt this tiddler",
isEnabled : function(tiddler) {
// Only show decrypt button if tiddler is tagged as Decrypt(
if(tiddler.tags.join().indexOf('Decrypt(') == -1) {
return false;
} else {
return true;
}
},
handler: function(event, src, title) {
encryptionGetAndDecryptTiddler(title);
return false;
}
};
// core version 2.4 or above get a 'decrypt' button in the toolbar.
if(config.shadowTiddlers && config.shadowTiddlers.ToolbarCommands && config.shadowTiddlers.ToolbarCommands.indexOf('decryptThis') == -1) {
// put our toolbar button in before the edit button.
// won't work if editTiddler is not the default item (prefixed with plus)
config.shadowTiddlers.ToolbarCommands.replace(/\+editTiddler/,'decryptThis +editTiddler');
}
// Called by the EncryptionChangePassword macro/button
// Also invoked by the callback for password entry
function onClickEncryptionChangePassword(eventObject) {
var promptString;
if(!promptString && this.getAttribute) {
promptString = this.getAttribute("promptString");
}
// I do call this function directly
if(!promptString && typeof(eventObject) == "string") {
promptString = eventObject;
}
if(!promptString) {
promptString = prompt("Enter 'prompt string' to change password for:","");
}
if(!promptString) {
return;
}
if(! config.encryptionPasswords[promptString]) {
var changePasswordContext = {changePasswordPromptString: promptString,
callbackFunction: MyChangePasswordPromptCallback_TiddlerEncryptionPlugin};
MyPrompt_TiddlerEncryptionPlugin(promptString,"",changePasswordContext);
return;
// Callback function will re-invoke this function
}
// Decrypt ALL tiddlers for that prompt
onClickEncryptionDecryptAll(promptString);
// Now ditch the cached password, this will force the re-request for the new password, on save.
displayMessage("Save TiddlyWiki to set new password for '"+promptString+"'");
config.encryptionPasswords[promptString] = null;
// mark store as dirty so a save will be requrested.
store.setDirty(true);
autoSaveChanges();
return;
};
// Called by the password entry form when the user clicks 'OK' button.
function MyChangePasswordPromptCallback_TiddlerEncryptionPlugin(context) {
config.encryptionPasswords[context.passwordPrompt] = context.password;
onClickEncryptionChangePassword(context.changePasswordPromptString);
return;
}
// Called by the EncryptionDecryptThis macro/button
function onClickEncryptionDecryptThis() {
var theTiddler = this.getAttribute("theTiddler");
if(!theTiddler) {
return;
}
encryptionGetAndDecryptTiddler(theTiddler);
return;
};
function encryptionGetAndDecryptTiddler(title) {
config.encryptionReEnterPasswords = true;
try {
theTiddler = store.getTiddler(title);
config.encryptionReEnterPasswords = false;
story.refreshAllTiddlers();
} catch (e) {
if(e == "DecryptionFailed") {
displayMessage("Decryption failed");
return;
}
} // catch
return;
};
// called by the EncryptionDecryptAlll macro/button
// Also called by the callback after the user clicks 'OK' button on the password entry form
function onClickEncryptionDecryptAll(eventObject) {
var promptString;
if(!promptString && this.getAttribute) {
promptString = this.getAttribute("promptString");
}
// I do call this function directly
if(!promptString && typeof(eventObject) == "string") {
promptString = eventObject;
}
if(!promptString) {
promptString = "";
}
// Loop through all tiddlers, looking to see if there are any Decrypt(promptString) tagged tiddlers
// If there are, check to see if their password has been cached.
// If not, ask for the first one that is missing, that we find
// the call back function will store that password then invoke this function again,
// which will repeat the whole process. If we find all passwords have been cached
// then we will finally do the decryptAll functionality, which will then
// be able to decrypt all the required tiddlers, without prompting.
// We have to do this whole rigmarole because we are using a 'form' to enter the password
// rather than the 'prompt()' function - which shows the value of the password.
var tagToSearchFor="Decrypt("+promptString;
config.encryptionReEnterPasswords = true;
var promptGenerated = false;
store.forEachTiddler(function(store,tiddler) {
// Note, there is no way to stop the forEachTiddler iterations
if(!promptGenerated && tiddler && tiddler.tags) {
for(var ix=0; ix<tiddler.tags.length && !promptGenerated; ix++) {
if(tiddler.tags[ix].indexOf(tagToSearchFor) == 0) {
var tag = tiddler.tags[ix];
var lastBracket=tag.lastIndexOf(")");
if(lastBracket >= 0) {
// Ok, tagged with Encrypt(passwordPrompt)
// extract the passwordPrompt name
var passwordPromptString=tag.substring(8,lastBracket);
if(!config.encryptionPasswords[passwordPromptString]) {
// no password cached, prompt and cache it, rather than decryptAll
// callback from prompting form will resume decryptAll attempt.
var decryptAllContext = {decryptAllPromptString: promptString,
callbackFunction: MyDecryptAllPromptCallback_TiddlerEncryptionPlugin};
MyPrompt_TiddlerEncryptionPlugin(passwordPromptString,"",decryptAllContext);
promptGenerated = true;
} // if(!config.encryptionPasswords
} // if(lastBracket
} // if(tiddler.tags[ix]..
} // for
} // if
}); // store.forEachTiddler
// If we get here, all passwords have been cached.
if(!promptGenerated) {
config.encryptionReEnterPasswords = false;
// Now do the decrypt all functionality
try {
store.forEachTiddler(function(store,tiddler) {
// Note, there is no way to stop the forEachTiddler iterations
if(tiddler && tiddler.tags) {
for(var ix=0; ix<tiddler.tags.length; ix++) {
if(tiddler.tags[ix].indexOf(tagToSearchFor) == 0) {
try {
CheckTiddlerForDecryption_TiddlerEncryptionPlugin(tiddler);
} catch (e) {
displayMessage("Decryption of '"+tiddler.title+"' failed.");
// throw e;
}
} // if(tiddler.tags
} // for
} // if
}); // store.forEachTiddler
displayMessage("All tiddlers" + (promptString != "" ? " for '"+promptString+"'" : "") + " have been decrypted");
} catch (e) {
if(e == "DecryptionFailed") {
return;
}
} // catch
}
return;
};
function MyDecryptAllPromptCallback_TiddlerEncryptionPlugin(context) {
config.encryptionPasswords[context.passwordPrompt] = context.password;
// restart the decryptAll process again after the user has entered a password.
onClickEncryptionDecryptAll(context.decryptAllPromptString);
return;
}
saveChanges_TiddlerEncryptionPlugin = saveChanges;
saveChanges = function(onlyIfDirty,tiddlers) {
// Loop through all tiddlers, looking to see if there are any Encrypt(string) tagged tiddlers
// If there are, check to see if their password has been cached.
// If not, ask for the first one that is missing, that we find
// the call back function will store that password then invoke this function again,
// which will repeat the whole process. If we find all passwords have been cached
// then we will finally call the original saveChanges() function, which will then
// be able to save the tiddlers.
// We have to do this whole rigmarole because we are using a 'form' to enter the password
// rather than the 'prompt()' function - which shows the value of the password.
config.encryptionReEnterPasswords = true;
var promptGenerated = false;
store.forEachTiddler(function(store,tiddler) {
if(!promptGenerated && tiddler && tiddler.tags) {
for(var ix=0; ix<tiddler.tags.length && !promptGenerated; ix++) {
if(tiddler.tags[ix].indexOf("Encrypt(") == 0) {
var tag = tiddler.tags[ix];
var lastBracket=tag.lastIndexOf(")");
if(lastBracket >= 0) {
// Ok, tagged with Encrypt(passwordPrompt)
// extract the passwordPrompt name
var passwordPrompt=tag.substring(8,lastBracket);
if(!config.encryptionPasswords[passwordPrompt]) {
// no password cached, prompt and cache it, rather than save
var saveContext = {onlyIfDirty: onlyIfDirty,
tiddlers: tiddlers,
callbackFunction: MySavePromptCallback_TiddlerEncryptionPlugin};
MyPrompt_TiddlerEncryptionPlugin(passwordPrompt,"",saveContext);
promptGenerated = true;
} // if(!config.encryptionPasswords
} // if(lastBracket
} // if(tiddler.tags[ix]..
} // for
} // if
}); // store.forEachTiddler
// If we get here, all passwords have been cached.
if(!promptGenerated) {
config.encryptionReEnterPasswords = false;
saveChanges_TiddlerEncryptionPlugin(onlyIfDirty,tiddlers);
}
return;
}
function MySavePromptCallback_TiddlerEncryptionPlugin(context) {
config.encryptionPasswords[context.passwordPrompt] = context.password;
// validate the password entered by attempting to decrypt all tiddlers
// with the same encryption prompt string.
onClickEncryptionDecryptAll(context.passwordPrompt);
// restart the save process again
saveChanges(context.onlyIfDirty, context.tiddlers);
return;
}
store.getSaver().externalizeTiddler_TiddlerEncryptionPlugin = store.getSaver().externalizeTiddler;
store.getSaver().externalizeTiddler = function(store, tiddler) {
// Ok, got the tiddler, track down the passwordPrompt in the tags.
// track down the Encrypt(passwordPrompt) tag
if(tiddler && tiddler.tags) {
for(var g=0; g<tiddler.tags.length; g++) {
var tag = tiddler.tags[g];
if(tag.indexOf("Encrypt(") == 0) {
var lastBracket=tag.lastIndexOf(")");
if(lastBracket >= 0) {
// Ok, tagged with Encrypt(passwordPrompt)
// extract the passwordPrompt name
var passwordPrompt=tag.substring(8,lastBracket);
// Ok, Encrypt this tiddler!
var decryptedSHA1 = Crypto.hexSha1Str(tiddler.text);
var password = GetAndSetPasswordForPrompt_TiddlerEncryptionPlugin(passwordPrompt);
if(password) {
var encryptedText = TEAencrypt(tiddler.text, password);
encryptedText = StringToHext_TiddlerEncryptionPlugin(encryptedText);
tiddler.text = "Encrypted("+decryptedSHA1+")\n"+encryptedText;
// Replace the Tag with the Decrypt() tag
tiddler.tags[g]="Decrypt("+passwordPrompt+")";
// prevent searches on encrypted tiddlers, still nice to search on title though.
if(config.options.chkExcludeEncryptedFromSearch == true) {
tiddler.tags.push("excludeSearch");
}
// prevent lists of encrypted tiddlers
if(config.options.chkExcludeEncryptedFromLists == true) {
tiddler.tags.push("excludeLists");
}
tiddler.changed();
// let the store know it's dirty
store.setDirty(tiddler.title, true);
} else {
// do not encrypt - no password entered
}
break;
} // if (lastBracket...
} // if(tag.indexOf(...
} // for(var g=0;...
} // if(tiddler.tags...
// Then, finally, do the save by calling the function we override.
return store.getSaver().externalizeTiddler_TiddlerEncryptionPlugin(store, tiddler);
};
function CheckTiddlerForDecryption_TiddlerEncryptionPlugin(tiddler) {
if(tiddler && tiddler.tags) {
for(var g=0; g<tiddler.tags.length; g++) {
var tag = tiddler.tags[g];
if(tag.indexOf("Decrypt(") == 0) {
var lastBracket=tag.lastIndexOf(")");
if(lastBracket >= 0) {
if(tiddler.text.substr(0,10) == "Encrypted(") {
var closingSHA1Bracket = tiddler.text.indexOf(")");
var decryptedSHA1 = tiddler.text.substring(10, closingSHA1Bracket);
// Ok, tagged with Decrypt(passwordPrompt)
// extract the passwordPrompt name
var passwordPrompt=tag.substring(8,lastBracket);
// Ok, Decrypt this tiddler!
var decryptedText = tiddler.text.substr(closingSHA1Bracket+2);
decryptedText = HexToString_TiddlerEncryptionPlugin(decryptedText);
// prompt("Decryption request for Tiddler '"+tiddler.title+"'");
var password = GetAndSetPasswordForPromptToDecrypt_TiddlerEncryptionPlugin(passwordPrompt);
if(password) {
decryptedText = TEAdecrypt(decryptedText, password );
var thisDecryptedSHA1 = Crypto.hexSha1Str(decryptedText);
if(decryptedSHA1 == thisDecryptedSHA1) {
tiddler.text = decryptedText;
// Replace the Tag with the Encrypt() tag
tiddler.tags[g]="Encrypt("+passwordPrompt+")";
if(tiddler.tags[tiddler.tags.length-1] == 'excludeLists') {
// Remove exclude lists only if it's the last entry
// as it's automatically put there by encryption
tiddler.tags.length--;
}
if(tiddler.tags[tiddler.tags.length-1] == 'excludeSearch') {
// Remove exclude search only if it's the last entry
// as it's automatically put there by encryption
tiddler.tags.length--;
}
tiddler.changed();
} else {
// Did not decrypt, discard the password from the cache
config.encryptionPasswords[passwordPrompt] = null;
config.encryptionReEnterPasswords = false;
throw "DecryptionFailed";
}
} else {
// no password supplied, dont bother trying to decrypt
config.encryptionReEnterPasswords = false;
throw "DecryptionFailed";
}
} else {
// Tagged as encrypted but not expected format, just leave it unchanged
}
break; // out of for loop
} // if (lastBracket...
} // if(tag.indexOf(...
} // for(var g=0;...
} // if (tiddler && tags)
return tiddler;
};
store.getTiddler_TiddlerEncryptionPlugin = store.getTiddler;
store.getTiddler = function(title) {
var tiddler = store.getTiddler_TiddlerEncryptionPlugin(title);
if(tiddler) { // shadow tiddlers are not expected to be encrypted.
try {
return CheckTiddlerForDecryption_TiddlerEncryptionPlugin(tiddler);
} catch (e) {
if (config.options.chkShowDecryptButtonInContent == true) {
if(e == "DecryptionFailed") {
var tiddler = store.getTiddler("DecryptionFailed");
if(!tiddler) {
tiddler = new Tiddler();
tiddler.set(title,
"<<EncryptionDecryptThis \"Decrypt\" \"Decrypt this tiddler\" \""+title+"\">>",
config.views.wikified.shadowModifier,
version.date,[],version.date);
}
return tiddler;
} // if(e)
}
return(tiddler);
} // catch
} // if(tiddler) {
return null;
};
store.getTiddlerText_TiddlerEncryptionPlugin = store.getTiddlerText;
store.getTiddlerText = function(title,defaultText) {
// Simply retrieve the tiddler, normally, if it requires decryption, it will be decrypted
var decryptedTiddler = store.getTiddler(title);
if(decryptedTiddler) {
return decryptedTiddler.text;
}
//Ok, rather than duplicate all the core code, the above code should fail if we reach here
// let the core code take over.
return store.getTiddlerText_TiddlerEncryptionPlugin(title,defaultText);
};
// Given a prompt, search our cache to see if we have already entered the password.
// Can return null if the user enters nothing.
function MyPrompt_TiddlerEncryptionPlugin(promptString,defaultValue,context) {
if(!context) {
context = {};
}
context.passwordPrompt = promptString;
PasswordPrompt.prompt(MyPromptCallback_TiddlerEncryptionPlugin, context);
return;
}
function MyPromptCallback_TiddlerEncryptionPlugin(context) {
if(context.callbackFunction) {
context.callbackFunction(context);
} else {
config.encryptionPasswords[context.passwordPrompt] = context.password;
story.refreshAllTiddlers(true);
}
return;
}
function GetAndSetPasswordForPrompt_TiddlerEncryptionPlugin(promptString) {
if(!config.encryptionPasswords[promptString]) {
config.encryptionPasswords[promptString] = MyPrompt_TiddlerEncryptionPlugin(promptString, "");
}
return config.encryptionPasswords[promptString]; // may be null, prompt can be cancelled.
}
function GetAndSetPasswordForPromptToDecrypt_TiddlerEncryptionPlugin(promptString) {
if(config.encryptionReEnterPasswords) {
return GetAndSetPasswordForPrompt_TiddlerEncryptionPlugin(promptString);
} else {
return config.encryptionPasswords[promptString];
}
}
// Make the encrypted tiddlies look a little more presentable.
function StringToHext_TiddlerEncryptionPlugin(theString) {
var theResult = "";
for(var i=0; i<theString.length; i++) {
var theHex = theString.charCodeAt(i).toString(16);
if(theHex.length<2) {
theResult += "0"+theHex;
} else {
theResult += theHex;
}
if(i && i % 32 == 0)
theResult += "\n";
}
return theResult;
}
function HexToString_TiddlerEncryptionPlugin(theString) {
var theResult = "";
for(var i=0; i<theString.length; i+=2) {
if(theString.charAt(i) == "\n") {
i--; // cause us to skip over the newline and resume
continue;
}
theResult += String.fromCharCode(parseInt(theString.substr(i, 2),16));
}
return theResult;
}
//
// Heavily leveraged from http://trac.tiddlywiki.org/browser/Trunk/contributors/SaqImtiaz/verticals/Hesperian/PasswordPromptPlugin.js Revision 5635
//
PasswordPrompt ={
prompt : function(callback,context){
if (!context) {
context = {};
}
var box = createTiddlyElement(document.getElementById("contentWrapper"),'div','passwordPromptBox');
box.innerHTML = store.getTiddlerText('PasswordPromptTemplate');
box.style.position = 'absolute';
this.center(box);
document.getElementById('promptDisplayField').value = context.passwordPrompt;
var passwordInputField = document.getElementById('passwordInputField');
passwordInputField.onkeyup = function(ev) {
var e = ev || window.event;
if(e.keyCode == 10 || e.keyCode == 13) { // Enter
PasswordPrompt.submit(callback, context);
}
};
passwordInputField.focus();
document.getElementById('passwordPromptSubmitBtn').onclick = function(){PasswordPrompt.submit(callback,context);};
document.getElementById('passwordPromptCancelBtn').onclick = function(){PasswordPrompt.cancel(callback,context);};
},
center : function(el){
var size = this.getsize(el);
el.style.left = (Math.round(findWindowWidth()/2) - (size.width /2) + findScrollX())+'px';
el.style.top = (Math.round(findWindowHeight()/2) - (size.height /2) + findScrollY())+'px';
},
getsize : function (el){
var x = {};
x.width = el.offsetWidth || el.style.pixelWidth;
x.height = el.offsetHeight || el.style.pixelHeight;
return x;
},
submit : function(cb,context){
context.passwordPrompt = document.getElementById('promptDisplayField').value;
context.password = document.getElementById('passwordInputField').value;
var box = document.getElementById('passwordPromptBox');
box.parentNode.removeChild(box);
cb(context);
return false;
},
cancel : function(cb,context){
var box = document.getElementById('passwordPromptBox');
box.parentNode.removeChild(box);
return false;
},
setStyles : function(){
setStylesheet(
"#passwordPromptBox dd.submit {margin-left:0; font-weight: bold; margin-top:1em;}\n"+
"#passwordPromptBox dd.submit .button {padding:0.5em 1em; border:1px solid #ccc;}\n"+
"#passwordPromptBox dt.heading {margin-bottom:0.5em; font-size:1.2em;}\n"+
"#passwordPromptBox {border:1px solid #ccc;background-color: #eee;padding:1em 2em;}",'passwordPromptStyles');
},
template : '<form action="" onsubmit="return false;" id="passwordPromptForm">\n'+
' <dl>\n'+
' <dt class="heading">Please enter the password:</dt>\n'+
' <dt>Prompt:</dt>\n'+
' <dd><input type="text" readonly id="promptDisplayField" class="display"/></dd>\n'+
' <dt>Password:</dt>\n'+
' <dd><input type="password" tabindex="1" class="input" id="passwordInputField"/></dd>\n'+
' <dd class="submit">\n'+
' <a tabindex="2" href="javascript:;" class="button" id="passwordPromptSubmitBtn">OK</a>\n'+
' <a tabindex="3" href="javascript:;" class="button" id="passwordPromptCancelBtn">Cancel</a>\n'+
' </dd>\n'+
' </dl>\n'+
'</form>',
init : function(){
config.shadowTiddlers.PasswordPromptTemplate = this.template;
this.setStyles();
}
};
PasswordPrompt.init();
// http://www.movable-type.co.uk/scripts/tea-block.html
//
// TEAencrypt: Use Corrected Block TEA to encrypt plaintext using password
// (note plaintext & password must be strings not string objects)
//
// Return encrypted text as string
//
function TEAencrypt(plaintext, password)
{
if (plaintext.length == 0) return(''); // nothing to encrypt
// 'escape' plaintext so chars outside ISO-8859-1 work in single-byte packing, but keep
// spaces as spaces (not '%20') so encrypted text doesn't grow too long (quick & dirty)
var asciitext = escape(plaintext).replace(/%20/g,' ');
var v = strToLongs(asciitext); // convert string to array of longs
if (v.length <= 1) v[1] = 0; // algorithm doesn't work for n<2 so fudge by adding a null
var k = strToLongs(password.slice(0,16)); // simply convert first 16 chars of password as key
var n = v.length;
var z = v[n-1], y = v[0], delta = 0x9E3779B9;
var mx, e, q = Math.floor(6 + 52/n), sum = 0;
while (q-- > 0) { // 6 + 52/n operations gives between 6 & 32 mixes on each word
sum += delta;
e = sum>>>2 & 3;
for (var p = 0; p < n; p++) {
y = v[(p+1)%n];
mx = (z>>>5 ^ y<<2) + (y>>>3 ^ z<<4) ^ (sum^y) + (k[p&3 ^ e] ^ z);
z = v[p] += mx;
}
}
var ciphertext = longsToStr(v);
return escCtrlCh(ciphertext);
}
//
// TEAdecrypt: Use Corrected Block TEA to decrypt ciphertext using password
//
function TEAdecrypt(ciphertext, password)
{
if (ciphertext.length == 0) return('');
var v = strToLongs(unescCtrlCh(ciphertext));
var k = strToLongs(password.slice(0,16));
var n = v.length;
var z = v[n-1], y = v[0], delta = 0x9E3779B9;
var mx, e, q = Math.floor(6 + 52/n), sum = q*delta;
while (sum != 0) {
e = sum>>>2 & 3;
for (var p = n-1; p >= 0; p--) {
z = v[p>0 ? p-1 : n-1];
mx = (z>>>5 ^ y<<2) + (y>>>3 ^ z<<4) ^ (sum^y) + (k[p&3 ^ e] ^ z);
y = v[p] -= mx;
}
sum -= delta;
}
var plaintext = longsToStr(v);
// strip trailing null chars resulting from filling 4-char blocks:
plaintext = plaintext.replace(/\0+$/,'');
return unescape(plaintext);
}
// supporting functions
function strToLongs(s) { // convert string to array of longs, each containing 4 chars
// note chars must be within ISO-8859-1 (with Unicode code-point < 256) to fit 4/long
var l = new Array(Math.ceil(s.length/4));
for (var i=0; i<l.length; i++) {
// note little-endian encoding - endianness is irrelevant as long as
// it is the same in longsToStr()
l[i] = s.charCodeAt(i*4) + (s.charCodeAt(i*4+1)<<8) +
(s.charCodeAt(i*4+2)<<16) + (s.charCodeAt(i*4+3)<<24);
}
return l; // note running off the end of the string generates nulls since
} // bitwise operators treat NaN as 0
function longsToStr(l) { // convert array of longs back to string
var a = new Array(l.length);
for (var i=0; i<l.length; i++) {
a[i] = String.fromCharCode(l[i] & 0xFF, l[i]>>>8 & 0xFF,
l[i]>>>16 & 0xFF, l[i]>>>24 & 0xFF);
}
return a.join(''); // use Array.join() rather than repeated string appends for efficiency
}
function escCtrlCh(str) { // escape control chars etc which might cause problems with encrypted texts
return str.replace(/[\0\t\n\v\f\r\xa0'"!]/g, function(c) { return '!' + c.charCodeAt(0) + '!'; });
}
function unescCtrlCh(str) { // unescape potentially problematic nulls and control characters
return str.replace(/!\d\d?\d?!/g, function(c) { return String.fromCharCode(c.slice(1,-1)); });
}
//}}}
Possible improvements
* Use separate FormTiddler template for credit cards and use OCR font for display of //on card// data, plus a form for data entry. Font sources:
** http://ansuz.sooke.bc.ca/software/ocra.php
** http://ansuz.sooke.bc.ca/software/ocrb.php
* Add credit card validation for entry and update of credit cards:
**http://javascript.internet.com/forms/credit-card-number-validation.html
* Use IncludePlugin to eliminate unnecessary synchronization of images, plugins, etc.?
** currently embedded images supported only by Firefox
* Better Tooltips for MainMenu -- how for {{{[[ entries ]]}}} ?
* Warn if uploading unencrypted tiddlers to ~TiddlySpot
The ~TiddlySaver Java applet (not included) allows ~TiddlyWiki to save changes in a local version (from a file:// URL) of Safari, Opera and other browsers. It is a small file named [["TiddlySaver.jar"|TiddlySaver.jar]] that must be placed in the same directory as your ~TiddlyWiki file. As of August 2008, when an empty ~TiddlyWiki file is downloaded using either Safari or Opera, it is bundled with a copy of the ~TiddlySaver.jar file in a zip file - both files must be in the same directory ''whenever the ~TiddlyWiki file is opened'' in order to work.
[["TiddlySaver.jar"|TiddlySaver.jar]] is signed by [[UnaMesa Association|http://www.unamesa.com/]]. The [[UnaMesa Association|http://www.unamesa.com/]] certificate is signed by the ''Thawte Code Signing CA'' intermediate certificate which is chained to the ''Thawte Premium Server CA'' root certificate. You need to trust this certificate chain to be able to use the applet.
Note that there is currently [[a bug|http://trac.tiddlywiki.org/ticket/172]] that prevents ~TiddlySaver from working if you have specified a backup directory in AdvancedOptions and the directory doesn't exist.
Thanks to Andrew Gregory for the original ~TiddlySaver code, and ~BidiX for arranging all the certificate magic.
<html><font size=3>General</font></html>
* Bookmark your ~TiddlyWiki file or add a link to it to your browser toolbar.
* Check [[LoremIpsum]], [[Basic Formatting]] and [[Document Formatting]] for wiki text formatting examples.
* [[TiddlySnip|http://tiddlysnip.com/#About]] may be a useful extension if your browser is [[Firefox|http://www.getfirefox.com]].
* You can find many links to Tiddlywiki resources at the ~TiddlyWiki home page: [[here|http://www.tiddlywiki.com]]
* Turning the Sidebar off makes editing a tiddler easier
* Adding the tag ~excludeWikiWords to a tiddler will suppress spurious highlighting of words that are not links to other tiddlers; Use a ~ to to turn off highlighting of individual words (see DisableWikiLinksPlugin).
<html><font size=3>Security</font></html>
* You could use different passwords for different tiddlers to give selective access to different sets of passwords / confidential items stored in the same file, but it's probably not a good idea.
* Always verify that you can decrypt your latest ~TiddlyWiki file before purging your old backup files.
**It's a good idea to keep a few recent ones.
* Read some advice on creating [[Good Passwords]]
* Ensure that your browser window with decrypted passwords is not left open while you are away from your computer.
* If you wish: you can store a clue to your password in an unecrypted tiddler, but it shouldn't be recognizable as such.
* See the AdvancedOptions page for the change password button. Clicking this will prompt you for the 'prompt', then the password (if required), decrypt ALL the tiddlers for that prompt then ask you for a new password (twice) - All the tiddlers will be encrypted with the new password on save.
* Make sure you erase any Wallet Report (c:\mywallet.txt) you create on a computer other than your own.
<html><font size=3>Options</font></html>
* You may save your encrypted ~TiddlyWiki file to a private, password-protected web site and access it any time, any where, and at no cost by using [[TiddlySpot|http://www.tiddlyspot.com]], a free ~TiddlyWiki hosting service. If your Password tiddler is encrypted this is quite safe.
*You may also use other online storage of your own.
* [[Dropbox|http://www.dropbox.com]] is an excellent way to keep your TiddlyFolio file synchronized across several computers.
<html><font size=3>Note</font></html>
If you are uncomfortable editing wiki text or html and would just prefer a graphical user interface (like Microsoft Word) here are instructions for [[Adding WYSIWYG]] capability to ~TiddlyFolio.
/%
|Name|ToggleReadOnly|
|Source|http://www.TiddlyTools.com/#ToggleReadOnly|
|Version|1.1.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|enable/disable global read-only state without reloading your document|
%/<<option chkHttpReadOnly>><script>
var chk=place.lastChild;
chk.style.margin=chk.style.padding="0";
chk.title="enable/disable TiddlyWiki editing functions";
chk.checked=readOnly;
chk.coreOnChange=chk.onchange;
chk.onchange=function() {
if (this.coreOnChange) this.coreOnChange();
this.checked=config.options.chkHttpReadOnly;
readOnly=config.options.chkHttpReadOnly;
story.switchTheme(config.options.txtTheme);
};
</script><script label="read-only" title="enable/disable TiddlyWiki editing functions">
place.previousSibling.click(); return false;
</script><script>
var s=place.lastChild.style; s.display="inline"; s.fontWeight="normal";
</script>
/***
|''Name:''|ToggleSideBarMacro|
|''Description:''|Show/hide the sidebar.|
|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|
|''Source:''|http://tw.lewcid.org/#ToggleSideBarMacro|
|''Code Repository:''|http://tw.lewcid.org/svn/plugins|
|''Version:''|2.0|
|''Date:''||
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.2.3|
!Description:
Provides a button for toggling visibility of the SideBar. You can choose whether the SideBar should initially be hidden or displayed.
!Demo
<<toggleSideBar "Toggle Sidebar">>
!Usage:
{{{<<toggleSideBar>>}}} <<toggleSideBar>>
additional options:
{{{<<toggleSideBar label tooltip show/hide>>}}} where:
**label = custom label for the button
**tooltip = custom tooltip for the button
**show/hide = use one or the other, determines whether the sidebar is shown at first or not.<br>(default is to show the sidebar)
You can add it to your tiddler toolbar, your MainMenu, or where you like really.
If you are using a horizontal MainMenu and want the button to be right aligned, put the following in your StyleSheet:
{{{ .HideSideBarButton {float:right;} }}}
!History
*23-07-06: version 1.0: completely rewritten, now works with custom stylesheets too, and easier to customize start behaviour.
*20-07-06: version 0.11
*27-04-06: version 0.1: working.
!Code
***/
// /%
//!BEGIN-PLUGIN-CODE
config.macros.toggleSideBar={};
config.macros.toggleSideBar.settings={
styleHide : "#sidebar { display: none;}n"+"#contentWrapper #displayArea { margin-right: 1em;}n"+"",
styleShow : " ",
arrow1: "\u00AB",
arrow2: "\u00BB"
};
config.macros.toggleSideBar.handler=function (place,macroName,params,wikifier,paramString,tiddler)
{
var tooltip= params[1]||'toggle sidebar';
var mode = (params[2] && params[2]=="hide")? "hide":"show";
var arrow = (mode == "hide")? this.settings.arrow1:this.settings.arrow2;
var label= (params[0]&¶ms[0]!='.')?params[0]+" "+arrow:arrow;
var theBtn = createTiddlyButton(place,label,tooltip,this.onToggleSideBar,"button HideSideBarButton");
if (mode == "hide"){
(document.getElementById("sidebar")).setAttribute("toggle","hide");
setStylesheet(this.settings.styleHide,"ToggleSideBarStyles");
}
};
config.macros.toggleSideBar.onToggleSideBar = function()
{
var sidebar = document.getElementById("sidebar");
var settings = config.macros.toggleSideBar.settings;
if (sidebar.getAttribute("toggle")=='hide'){
setStylesheet(settings.styleShow,"ToggleSideBarStyles");
sidebar.setAttribute("toggle","show");
if(this.firstChild.data)
this.firstChild.data= (this.firstChild.data).replace(settings.arrow1,settings.arrow2);
}
else{
setStylesheet(settings.styleHide,"ToggleSideBarStyles");
sidebar.setAttribute("toggle","hide");
if(this.firstChild.data)
this.firstChild.data= (this.firstChild.data).replace(settings.arrow2,settings.arrow1);
}
return false;
};
setStylesheet(".HideSideBarButton .button {font-weight:bold; padding: 0 5px;}n","ToggleSideBarButtonStyles");
//!END-PLUGIN-CODE
// %/
|~ViewToolbar|closeTiddler closeOthers decryptThis +editTiddler > fields syncing permalink references jump|
|~EditToolbar|+saveTiddler -cancelTiddler deleteTiddler|
/***
Description: Contains the stuff you need to use Tiddlyspot
Note, you also need UploadPlugin, PasswordOptionPlugin and LoadRemoteFileThroughProxy
from http://tiddlywiki.bidix.info for a complete working Tiddlyspot site.
***/
//{{{
// edit this if you are migrating sites or retrofitting an existing TW
config.tiddlyspotSiteId = 'tiddlyfolio';
// make it so you can by default see edit controls via http
config.options.chkHttpReadOnly = false;
window.readOnly = false; // make sure of it (for tw 2.2)
window.showBackstage = true; // show backstage too
// disable autosave in d3
if (window.location.protocol != "file:")
config.options.chkGTDLazyAutoSave = false;
// tweak shadow tiddlers to add upload button, password entry box etc
with (config.shadowTiddlers) {
SiteUrl = 'http://'+config.tiddlyspotSiteId+'.tiddlyspot.com';
SideBarOptions = SideBarOptions.replace(/(<<saveChanges>>)/,"$1<<tiddler TspotSidebar>>");
OptionsPanel = OptionsPanel.replace(/^/,"<<tiddler TspotOptions>>");
DefaultTiddlers = DefaultTiddlers.replace(/^/,"[[WelcomeToTiddlyspot]] ");
MainMenu = MainMenu.replace(/^/,"[[WelcomeToTiddlyspot]] ");
}
// create some shadow tiddler content
merge(config.shadowTiddlers,{
'WelcomeToTiddlyspot':[
"This document is a ~TiddlyWiki from tiddlyspot.com. A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //What now?// @@ Before you can save any changes, you need to enter your password in the form below. Then configure privacy and other site settings at your [[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]] (your control panel username is //" + config.tiddlyspotSiteId + "//).",
"<<tiddler TspotControls>>",
"See also GettingStarted.",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //Working online// @@ You can edit this ~TiddlyWiki right now, and save your changes using the \"save to web\" button in the column on the right.",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// @@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick. You can make changes and save them locally without being connected to the Internet. When you're ready to sync up again, just click \"upload\" and your ~TiddlyWiki will be saved back to tiddlyspot.com.",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //Help!// @@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]]. Also visit [[TiddlyWiki.org|http://tiddlywiki.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help. If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// @@ We hope you like using your tiddlyspot.com site. Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions."
].join("\n"),
'TspotControls':[
"| tiddlyspot password:|<<option pasUploadPassword>>|",
"| site management:|<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . . " + config.tiddlyspotSiteId + ">>//(requires tiddlyspot password)//<br>[[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]], [[download (go offline)|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download]]|",
"| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://faq.tiddlyspot.com/]], [[blog|http://tiddlyspot.blogspot.com/]], email [[support|mailto:support@tiddlyspot.com]] & [[feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|"
].join("\n"),
'TspotSidebar':[
"<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . . " + config.tiddlyspotSiteId + ">><html><a href='http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download' class='button'>download</a></html>"
].join("\n"),
'TspotOptions':[
"tiddlyspot password:",
"<<option pasUploadPassword>>",
""
].join("\n")
});
//}}}
This tiddler helps controls whether tiddlers as a group are saved with encryption on or off. The Encrypt checkbox on new items controls //individually// how they are tagged.
Renaming this tiddler changes the tags on tiddlers tagged with the name of this tiddler.
<<<
|!New name|!Other tiddlers will be|
|Encrypt(TiddlyFolio)|Encrypted|
|Unencrypted|Unencrypted|
<<<
If Encryption is //on// (tiddler name is ''Encrypt(TiddlyFolio)'' see above) but not all tiddlers are encrypted -- because some new unencrypted items have been created (use [[List Items]] to check) -- you may quickly encrypt all of them as follows:
* Decrypt all by renaming this tiddler (to ''Unecrypted''), then
* Re-encrypt all by renaming again (back to ''Encrypt(TiddlyFolio)'')
Click on ''edit'' to rename this tiddler. Press ''save changes'' in the Sidebar to update.
See [[EncryptDecrypt]] for more.
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 19/08/2008 11:28:36 | EatsWombats | [[tiddlyfolio.html|file:///C:/Users/Paul/Desktop/tiddlyfolio.html#ChangeLog]] | [[store.cgi|http://tiddlyfolio.tiddlyspot.com/store.cgi]] | . | [[index.html | http://tiddlyfolio.tiddlyspot.com/index.html]] | . |
| 05/10/2008 17:39:49 | EatsWombats | [[tiddlyfolio.htm|file:///F:/TicklerWiki/tiddlyfolio.htm#UploadLog]] | [[store.cgi|http://tiddlyfolio.tiddlyspot.com/store.cgi]] | . | [[index.html | http://tiddlyfolio.tiddlyspot.com/index.html]] | . |
| 13/10/2008 13:34:33 | EatsWombats | [[tiddlyfolio.htm|file:///F:/TiddlyWiki/tf98/tiddlyfolio.htm#Wallet]] | [[store.cgi|http://tiddlyfolio.tiddlyspot.com/store.cgi]] | . | [[index.html | http://tiddlyfolio.tiddlyspot.com/index.html]] | . | ok |
| 14/04/2010 21:21:45 | EatsWombats | [[tiddlyfolio.htm|file:///I:/TiddlyWiki/tf98/tiddlyfolio.htm#UploadLog]] | [[store.cgi|http://tiddlyfolio.tiddlyspot.com/store.cgi]] | . | [[index.html | http://tiddlyfolio.tiddlyspot.com/index.html]] | . |
| 16/01/2011 14:34:02 | tiddlyfolio | [[tiddlyfolio.html|file:///D:/Paul/TFWiki/262/tiddlyfolio.html#Home]] | [[store.cgi|http://tiddlyfolio.tiddlyspot.com/store.cgi]] | . | [[index.html | http://tiddlyfolio.tiddlyspot.com/index.html]] | . |
| 16/01/2013 16:22:06 | tiddlyfolio | [[tiddlyfolio.html|file:///C:/Users/Paul/TW2013/tiddlyfolio.html]] | [[store.cgi|http://tiddlyfolio.tiddlyspot.com/store.cgi]] | . | [[index.html | http://tiddlyfolio.tiddlyspot.com/index.html]] | . |
/***
|''Name:''|UploadPlugin|
|''Description:''|Save to web a TiddlyWiki|
|''Version:''|4.1.4|
|''Date:''|2008-08-11|
|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|
|''Documentation:''|http://tiddlywiki.bidix.info/#UploadPluginDoc|
|''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.2.0|
|''Requires:''|PasswordOptionPlugin|
***/
//{{{
version.extensions.UploadPlugin = {
major: 4, minor: 1, revision: 4,
date: new Date("2008-08-11"),
source: 'http://tiddlywiki.bidix.info/#UploadPlugin',
author: 'BidiX (BidiX (at) bidix (dot) info',
coreVersion: '2.2.0'
};
//
// Environment
//
if (!window.bidix) window.bidix = {}; // bidix namespace
bidix.debugMode = false; // true to activate both in Plugin and UploadService
//
// Upload Macro
//
config.macros.upload = {
// default values
defaultBackupDir: '', //no backup
defaultStoreScript: "store.php",
defaultToFilename: "index.html",
defaultUploadDir: ".",
authenticateUser: true // UploadService Authenticate User
};
config.macros.upload.label = {
promptOption: "Save and Upload this TiddlyWiki with UploadOptions",
promptParamMacro: "Save and Upload this TiddlyWiki in %0",
saveLabel: "save to web",
saveToDisk: "save to disk",
uploadLabel: "upload"
};
config.macros.upload.messages = {
noStoreUrl: "No store URL in parmeters or options",
usernameOrPasswordMissing: "Username or password missing"
};
config.macros.upload.handler = function(place,macroName,params) {
if (readOnly)
return;
var label;
if (document.location.toString().substr(0,4) == "http")
label = this.label.saveLabel;
else
label = this.label.uploadLabel;
var prompt;
if (params[0]) {
prompt = this.label.promptParamMacro.toString().format([this.destFile(params[0],
(params[1] ? params[1]:bidix.basename(window.location.toString())), params[3])]);
} else {
prompt = this.label.promptOption;
}
createTiddlyButton(place, label, prompt, function() {config.macros.upload.action(params);}, null, null, this.accessKey);
};
config.macros.upload.action = function(params)
{
// for missing macro parameter set value from options
if (!params) params = {};
var storeUrl = params[0] ? params[0] : config.options.txtUploadStoreUrl;
var toFilename = params[1] ? params[1] : config.options.txtUploadFilename;
var backupDir = params[2] ? params[2] : config.options.txtUploadBackupDir;
var uploadDir = params[3] ? params[3] : config.options.txtUploadDir;
var username = params[4] ? params[4] : config.options.txtUploadUserName;
var password = config.options.pasUploadPassword; // for security reason no password as macro parameter
// for still missing parameter set default value
if ((!storeUrl) && (document.location.toString().substr(0,4) == "http"))
storeUrl = bidix.dirname(document.location.toString())+'/'+config.macros.upload.defaultStoreScript;
if (storeUrl.substr(0,4) != "http")
storeUrl = bidix.dirname(document.location.toString()) +'/'+ storeUrl;
if (!toFilename)
toFilename = bidix.basename(window.location.toString());
if (!toFilename)
toFilename = config.macros.upload.defaultToFilename;
if (!uploadDir)
uploadDir = config.macros.upload.defaultUploadDir;
if (!backupDir)
backupDir = config.macros.upload.defaultBackupDir;
// report error if still missing
if (!storeUrl) {
alert(config.macros.upload.messages.noStoreUrl);
clearMessage();
return false;
}
if (config.macros.upload.authenticateUser && (!username || !password)) {
alert(config.macros.upload.messages.usernameOrPasswordMissing);
clearMessage();
return false;
}
bidix.upload.uploadChanges(false,null,storeUrl, toFilename, uploadDir, backupDir, username, password);
return false;
};
config.macros.upload.destFile = function(storeUrl, toFilename, uploadDir)
{
if (!storeUrl)
return null;
var dest = bidix.dirname(storeUrl);
if (uploadDir && uploadDir != '.')
dest = dest + '/' + uploadDir;
dest = dest + '/' + toFilename;
return dest;
};
//
// uploadOptions Macro
//
config.macros.uploadOptions = {
handler: function(place,macroName,params) {
var wizard = new Wizard();
wizard.createWizard(place,this.wizardTitle);
wizard.addStep(this.step1Title,this.step1Html);
var markList = wizard.getElement("markList");
var listWrapper = document.createElement("div");
markList.parentNode.insertBefore(listWrapper,markList);
wizard.setValue("listWrapper",listWrapper);
this.refreshOptions(listWrapper,false);
var uploadCaption;
if (document.location.toString().substr(0,4) == "http")
uploadCaption = config.macros.upload.label.saveLabel;
else
uploadCaption = config.macros.upload.label.uploadLabel;
wizard.setButtons([
{caption: uploadCaption, tooltip: config.macros.upload.label.promptOption,
onClick: config.macros.upload.action},
{caption: this.cancelButton, tooltip: this.cancelButtonPrompt, onClick: this.onCancel}
]);
},
options: [
"txtUploadUserName",
"pasUploadPassword",
"txtUploadStoreUrl",
"txtUploadDir",
"txtUploadFilename",
"txtUploadBackupDir",
"chkUploadLog",
"txtUploadLogMaxLine"
],
refreshOptions: function(listWrapper) {
var opts = [];
for(i=0; i<this.options.length; i++) {
var opt = {};
opts.push();
opt.option = "";
n = this.options[i];
opt.name = n;
opt.lowlight = !config.optionsDesc[n];
opt.description = opt.lowlight ? this.unknownDescription : config.optionsDesc[n];
opts.push(opt);
}
var listview = ListView.create(listWrapper,opts,this.listViewTemplate);
for(n=0; n<opts.length; n++) {
var type = opts[n].name.substr(0,3);
var h = config.macros.option.types[type];
if (h && h.create) {
h.create(opts[n].colElements['option'],type,opts[n].name,opts[n].name,"no");
}
}
},
onCancel: function(e)
{
backstage.switchTab(null);
return false;
},
wizardTitle: "Upload with options",
step1Title: "These options are saved in cookies in your browser",
step1Html: "<input type='hidden' name='markList'></input><br>",
cancelButton: "Cancel",
cancelButtonPrompt: "Cancel prompt",
listViewTemplate: {
columns: [
{name: 'Description', field: 'description', title: "Description", type: 'WikiText'},
{name: 'Option', field: 'option', title: "Option", type: 'String'},
{name: 'Name', field: 'name', title: "Name", type: 'String'}
],
rowClasses: [
{className: 'lowlight', field: 'lowlight'}
]}
};
//
// upload functions
//
if (!bidix.upload) bidix.upload = {};
if (!bidix.upload.messages) bidix.upload.messages = {
//from saving
invalidFileError: "The original file '%0' does not appear to be a valid TiddlyWiki",
backupSaved: "Backup saved",
backupFailed: "Failed to upload backup file",
rssSaved: "RSS feed uploaded",
rssFailed: "Failed to upload RSS feed file",
emptySaved: "Empty template uploaded",
emptyFailed: "Failed to upload empty template file",
mainSaved: "Main TiddlyWiki file uploaded",
mainFailed: "Failed to upload main TiddlyWiki file. Your changes have not been saved",
//specific upload
loadOriginalHttpPostError: "Can't get original file",
aboutToSaveOnHttpPost: 'About to upload on %0 ...',
storePhpNotFound: "The store script '%0' was not found."
};
bidix.upload.uploadChanges = function(onlyIfDirty,tiddlers,storeUrl,toFilename,uploadDir,backupDir,username,password)
{
var callback = function(status,uploadParams,original,url,xhr) {
if (!status) {
displayMessage(bidix.upload.messages.loadOriginalHttpPostError);
return;
}
if (bidix.debugMode)
alert(original.substr(0,500)+"\n...");
// Locate the storeArea div's
var posDiv = locateStoreArea(original);
if((posDiv[0] == -1) || (posDiv[1] == -1)) {
alert(config.messages.invalidFileError.format([localPath]));
return;
}
bidix.upload.uploadRss(uploadParams,original,posDiv);
};
if(onlyIfDirty && !store.isDirty())
return;
clearMessage();
// save on localdisk ?
if (document.location.toString().substr(0,4) == "file") {
var path = document.location.toString();
var localPath = getLocalPath(path);
saveChanges();
}
// get original
var uploadParams = new Array(storeUrl,toFilename,uploadDir,backupDir,username,password);
var originalPath = document.location.toString();
// If url is a directory : add index.html
if (originalPath.charAt(originalPath.length-1) == "/")
originalPath = originalPath + "index.html";
var dest = config.macros.upload.destFile(storeUrl,toFilename,uploadDir);
var log = new bidix.UploadLog();
log.startUpload(storeUrl, dest, uploadDir, backupDir);
displayMessage(bidix.upload.messages.aboutToSaveOnHttpPost.format([dest]));
if (bidix.debugMode)
alert("about to execute Http - GET on "+originalPath);
var r = doHttp("GET",originalPath,null,null,username,password,callback,uploadParams,null);
if (typeof r == "string")
displayMessage(r);
return r;
};
bidix.upload.uploadRss = function(uploadParams,original,posDiv)
{
var callback = function(status,params,responseText,url,xhr) {
if(status) {
var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
displayMessage(bidix.upload.messages.rssSaved,bidix.dirname(url)+'/'+destfile);
bidix.upload.uploadMain(params[0],params[1],params[2]);
} else {
displayMessage(bidix.upload.messages.rssFailed);
}
};
// do uploadRss
if(config.options.chkGenerateAnRssFeed) {
var rssPath = uploadParams[1].substr(0,uploadParams[1].lastIndexOf(".")) + ".xml";
var rssUploadParams = new Array(uploadParams[0],rssPath,uploadParams[2],'',uploadParams[4],uploadParams[5]);
var rssString = generateRss();
// no UnicodeToUTF8 conversion needed when location is "file" !!!
if (document.location.toString().substr(0,4) != "file")
rssString = convertUnicodeToUTF8(rssString);
bidix.upload.httpUpload(rssUploadParams,rssString,callback,Array(uploadParams,original,posDiv));
} else {
bidix.upload.uploadMain(uploadParams,original,posDiv);
}
};
bidix.upload.uploadMain = function(uploadParams,original,posDiv)
{
var callback = function(status,params,responseText,url,xhr) {
var log = new bidix.UploadLog();
if(status) {
// if backupDir specified
if ((params[3]) && (responseText.indexOf("backupfile:") > -1)) {
var backupfile = responseText.substring(responseText.indexOf("backupfile:")+11,responseText.indexOf("\n", responseText.indexOf("backupfile:")));
displayMessage(bidix.upload.messages.backupSaved,bidix.dirname(url)+'/'+backupfile);
}
var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
displayMessage(bidix.upload.messages.mainSaved,bidix.dirname(url)+'/'+destfile);
store.setDirty(false);
log.endUpload("ok");
} else {
alert(bidix.upload.messages.mainFailed);
displayMessage(bidix.upload.messages.mainFailed);
log.endUpload("failed");
}
};
// do uploadMain
var revised = bidix.upload.updateOriginal(original,posDiv);
bidix.upload.httpUpload(uploadParams,revised,callback,uploadParams);
};
bidix.upload.httpUpload = function(uploadParams,data,callback,params)
{
var localCallback = function(status,params,responseText,url,xhr) {
url = (url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1));
if (xhr.status == 404)
alert(bidix.upload.messages.storePhpNotFound.format([url]));
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);
if (responseText.charAt(0) != '0')
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="+uploadParams[3] +
";user=" + uploadParams[4] +
";password=" + uploadParams[5] +
";uploaddir=" + uploadParams[2];
if (bidix.debugMode)
sheader += ";debug=1";
sheader += ";;\r\n";
sheader += "\r\n" + "--" + boundary + "\r\n";
sheader += "Content-disposition: form-data; name=\"userfile\"; filename=\""+uploadParams[1]+"\"\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 = new String();
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,uploadParams[4],uploadParams[5],localCallback,params,null);
if (typeof r == "string")
displayMessage(r);
return r;
};
// same as Saving's updateOriginal but without convertUnicodeToUTF8 calls
bidix.upload.updateOriginal = function(original, posDiv)
{
if (!posDiv)
posDiv = locateStoreArea(original);
if((posDiv[0] == -1) || (posDiv[1] == -1)) {
alert(config.messages.invalidFileError.format([localPath]));
return;
}
var revised = original.substr(0,posDiv[0] + startSaveArea.length) + "\n" +
store.allTiddlersAsHtml() + "\n" +
original.substr(posDiv[1]);
var newSiteTitle = getPageTitle().htmlEncode();
revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");
revised = updateMarkupBlock(revised,"PRE-HEAD","MarkupPreHead");
revised = updateMarkupBlock(revised,"POST-HEAD","MarkupPostHead");
revised = updateMarkupBlock(revised,"PRE-BODY","MarkupPreBody");
revised = updateMarkupBlock(revised,"POST-SCRIPT","MarkupPostBody");
return revised;
};
//
// UploadLog
//
// config.options.chkUploadLog :
// false : no logging
// true : logging
// config.options.txtUploadLogMaxLine :
// -1 : no limit
// 0 : no Log lines but UploadLog is still in place
// n : the last n lines are only kept
// NaN : no limit (-1)
bidix.UploadLog = function() {
if (!config.options.chkUploadLog)
return; // this.tiddler = null
this.tiddler = store.getTiddler("UploadLog");
if (!this.tiddler) {
this.tiddler = new Tiddler();
this.tiddler.title = "UploadLog";
this.tiddler.text = "| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |";
this.tiddler.created = new Date();
this.tiddler.modifier = config.options.txtUserName;
this.tiddler.modified = new Date();
store.addTiddler(this.tiddler);
}
return this;
};
bidix.UploadLog.prototype.addText = function(text) {
if (!this.tiddler)
return;
// retrieve maxLine when we need it
var maxLine = parseInt(config.options.txtUploadLogMaxLine,10);
if (isNaN(maxLine))
maxLine = -1;
// add text
if (maxLine != 0)
this.tiddler.text = this.tiddler.text + text;
// Trunck to maxLine
if (maxLine >= 0) {
var textArray = this.tiddler.text.split('\n');
if (textArray.length > maxLine + 1)
textArray.splice(1,textArray.length-1-maxLine);
this.tiddler.text = textArray.join('\n');
}
// update tiddler fields
this.tiddler.modifier = config.options.txtUserName;
this.tiddler.modified = new Date();
store.addTiddler(this.tiddler);
// refresh and notifiy for immediate update
story.refreshTiddler(this.tiddler.title);
store.notify(this.tiddler.title, true);
};
bidix.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir, backupDir) {
if (!this.tiddler)
return;
var now = new Date();
var text = "\n| ";
var filename = bidix.basename(document.location.toString());
if (!filename) filename = '/';
text += now.formatString("0DD/0MM/YYYY 0hh:0mm:0ss") +" | ";
text += config.options.txtUserName + " | ";
text += "[["+filename+"|"+location + "]] |";
text += " [[" + bidix.basename(storeUrl) + "|" + storeUrl + "]] | ";
text += uploadDir + " | ";
text += "[[" + bidix.basename(toFilename) + " | " +toFilename + "]] | ";
text += backupDir + " |";
this.addText(text);
};
bidix.UploadLog.prototype.endUpload = function(status) {
if (!this.tiddler)
return;
this.addText(" "+status+" |");
};
//
// Utilities
//
bidix.checkPlugin = function(plugin, major, minor, revision) {
var ext = version.extensions[plugin];
if (!
(ext &&
((ext.major > major) ||
((ext.major == major) && (ext.minor > minor)) ||
((ext.major == major) && (ext.minor == minor) && (ext.revision >= revision))))) {
// write error in PluginManager
if (pluginInfo)
pluginInfo.log.push("Requires " + plugin + " " + major + "." + minor + "." + revision);
eval(plugin); // generate an error : "Error: ReferenceError: xxxx is not defined"
}
};
bidix.dirname = function(filePath) {
if (!filePath)
return;
var lastpos;
if ((lastpos = filePath.lastIndexOf("/")) != -1) {
return filePath.substring(0, lastpos);
} else {
return filePath.substring(0, filePath.lastIndexOf("\\"));
}
};
bidix.basename = function(filePath) {
if (!filePath)
return;
var lastpos;
if ((lastpos = filePath.lastIndexOf("#")) != -1)
filePath = filePath.substring(0, lastpos);
if ((lastpos = filePath.lastIndexOf("/")) != -1) {
return filePath.substring(lastpos + 1);
} else
return filePath.substring(filePath.lastIndexOf("\\")+1);
};
bidix.initOption = function(name,value) {
if (!config.options[name])
config.options[name] = value;
};
//
// Initializations
//
// require PasswordOptionPlugin 1.0.1 or better
bidix.checkPlugin("PasswordOptionPlugin", 1, 0, 1);
// styleSheet
setStylesheet('.txtUploadStoreUrl, .txtUploadBackupDir, .txtUploadDir {width: 22em;}',"uploadPluginStyles");
//optionsDesc
merge(config.optionsDesc,{
txtUploadStoreUrl: "Url of the UploadService script (default: store.php)",
txtUploadFilename: "Filename of the uploaded file (default: in index.html)",
txtUploadDir: "Relative Directory where to store the file (default: . (downloadService directory))",
txtUploadBackupDir: "Relative Directory where to backup the file. If empty no backup. (default: ''(empty))",
txtUploadUserName: "Upload Username",
pasUploadPassword: "Upload Password",
chkUploadLog: "do Logging in UploadLog (default: true)",
txtUploadLogMaxLine: "Maximum of lines in UploadLog (default: 10)"
});
// Options Initializations
bidix.initOption('txtUploadStoreUrl','');
bidix.initOption('txtUploadFilename','');
bidix.initOption('txtUploadDir','');
bidix.initOption('txtUploadBackupDir','');
bidix.initOption('txtUploadUserName','');
bidix.initOption('pasUploadPassword','');
bidix.initOption('chkUploadLog',true);
bidix.initOption('txtUploadLogMaxLine','10');
// Backstage
merge(config.tasks,{
uploadOptions: {text: "upload", tooltip: "Change UploadOptions and Upload", content: '<<uploadOptions>>'}
});
config.backstageTasks.push("uploadOptions");
//}}}
If you have finished setting up ~TiddlyFolio (using these [[Instructions]]^^1^^) you can proceed to enter your data.
!Data Entry
Click on
* [[Passwords]] to enter your password information.
* [[Wallet]] to record the contents of your wallet -- credit cards and other items.
* ''New Item'' to record details of a data item other than a ''Passord'' or ''Wallet'' item.
* @@color(blue):new tiddler@@ in the Sidebar to add an item^^2^^
* @@color(blue):new journal@@ in the Sidebar to add a diary / timestamped item^^2^^
^^2^^ These items will lack the ''Encrypt'' checkbox until tagged with the word "Data".
Note:
* Check [[LoremIpsum]] to see how wiki text formatting is done.
* You may also use HTML; see [[HTMLFormattingPlugin]].
Press @@color(blue):save changes@@ in the Sidebar when you have finished.
To tag an item just enter the tag word (or words, plural, in doubled square brackets) on the tag line below the tiddler when editing it.
!Searching Tiddlers
Content in encrypted tiddlers cannot be searched until the tiddlers are decrypted. When a password has been entered correctly this will occur as and when each tiddler is displayed, regardless of whether the Encrypt checkbox is checked or not (this indicates how the tiddler is to be saved). To enable searching of all encrypted tiddlers click on ''Decrypt All'' on the main menu. This affects searching not storage of tiddlers.
//''WARNING:'' Make sure you understand how encryption is controlled: Read [[EncryptDecrypt]].//
^^1^^ Optional: See also [[Tips]] for information about [[Adding WYSIWYG]] editing capability.
<!--{{{-->
<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>
<!--}}}-->
|!Card Issuer ||
|!Card # ||
|!Name ||
|!Start date ||
|!Exp ||
|!Card verification nr ||
|!Call if lost/stolen ||
|!Billing address ||
|!Notes ||
!''First, Make a Backup of This File''
Because once you have enabled WYSIWYG editing //existing// tiddlers, such as your list of passwords, with wiki text formatting will, essentially, be uneditable.
#Download [[FCKeditor|http://www.fckeditor.net/download]] unzip it into the directory in which your ~TiddlyFolio files are stored
##Check: It should be in a subdirectory called fckeditor.
##Note: in local mode (//i.e.//, on your PC) ~FCKeditor doesn't display toolbar icons if there are spaces in its path (as in "C:\My documents\~FCKeditor").
#Right click this [[link|http://visualtw.ouvaton.org/VisualTW.html]] and save the ~VisualTW.html file to your ~TiddlyFolio directory
#With your ~TiddlyFolio file open: click on the ''backstage'' link at the top right corner of your main browser window, then click on ''import'' and click on the ''Browse...'' button
#Select the ~VisualTW.html file and click ''Open'' in Windows, then ''open'', then click on the ''Allow'' button when your browser gives you an Internet Security warning
#Check the box against the @@color(blue):Wysiwyg plugin@@ and click on ''import''
#Add the following text to the ~MarkupPreHead tiddler from the "All" menu on the Sidebar (with the right script path) : <script type="text/javascript" src="fckeditor/fckeditor.js"></script>
##How: Click the ''More'' tab above the list of tiddlers in the Sidebar, then click on ''Shadowed'', then select the tiddler and edit it
##Click on @@color(blue):save changes@@ in the Sidebar
You are almost there.
The last step is //critical// to get right. Edit the ''@@color(blue):EditTemplate@@'' tiddler (on the "All" menu in the Sidebar) and find this line:
<div class='editor' macro='edit text'></div>.
Change it to
<div class='editor' macro='editHtml text'></div>.
Note the capitalisation. It's Html not HTML. If you get it wrong you will not be able to edit anything after you have clicked on @@color(blue):done@@.
Click on @@color(blue):save changes@@ in the Sidebar and refresh your browser. From now on clicking on @@color(blue):new tiddler@@ in the Sidebar will invoke the fckeditor via the new plugin. If you need to revert to wiki text editing all you have to do is undo the last step above. However, this can't be done using fckeditor. The quickest and easiest solution I found was to just edit the html file, find "editHtml" and make the change manually. You'll need something better than Notepad if you are using Windows. I recommend [[EditPad Lite|http://www.editpadpro.com/editpadlite.html]].
| source file:|{{{WYSIWYGdemo.gif}}}|
| attached on:|18 September 2007 by EatsWombats|
| description:|WYSIWYG demo|
| embedded:|[[WYSIWYGdemo.gif|WYSIWYGdemo.gif]] - {{{type=image/gif, size=15729 bytes, encoded=21299 bytes}}}|
| local file:|//none//|
| remote link:|//none//|
image
<<<
usage: {{{[img[tooltip|WYSIWYGdemo.gif]] or [img[tooltip|WYSIWYGdemo.gif][link]]}}}
[img[tooltip|WYSIWYGdemo.gif]]
<<<
/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhAAL4APcAAAAAAIAAAACAAICAAAAAgIAAgACAgL+/v8DcwKnV6gAAAAAA
OgAAZgAuVgA6kABAOgBEaQA+AABmZgBmtACQOgCQZgCQ2wC2ZgC2tgC2/wDbkAD5
4AD/AAD/OgD/ZgD/kAD/tjE5lDZWoTFrxDoAADoANDoAZjo6ADs8Pjo7Zzo6jzpk
sTpmZjpmkDpwhDqQkDuJvzqQ2zr/AEZHSkVGc0dIkUZIokZH/UdffkVsc0WOS0Kt
SkP79EhJc05soERpwEmqT1JjlFOBxVtZW2BiqF6tamYAAGYAOWYAZmY9P2U8jmY6
AGZmAGZmOmVljWZzVmV2jml7jmJ6qGaQkmSq3Ga2/2b/AGb//2dAa2hoaWpoqWaF
xWqq2GrScndhXm1weXWFo3SOw3pjXoCb0X+b5nic+ne86H29mYs+aoE+i4VlP4eI
i4qNk4SUso85OopVUIt1s5F4zoh4Z5aKeY6P2o2w/JE3AJBkAJdbkJCQOpCQZpCQ
k5ShtpGlzpCwl5DbtpHd/ZD/AJD/OpkzZptlQqSwyZ+59aNobK1mPqKGP6mvtKLg
tqszAKszZrJiZqeUgaqS3K2mk7a2pay036260q3GpbMzOrZSALZmALmEQLWEZLa2
ZrTI+rXZkrb+/rb/ALb/trwzALygkLa6xb7Ah7vG2r3Zqs1aAMxmWsahasydwcGw
g8S9qsvLy8LS7cXT+cvtxMn43M3s+s1mM8xmf81tKcaFUcyBn9KwTNTXq9VMANhs
X9WBM9WdbdW24dzc3Nzj99xyQt5/AOWBM9uQOt6bgdi4beG9WeC5mN/P/9vMbejO
itvSlebt+tv/OuArAOeEKeiNwO6cNOecMd2dWuwAAO3GYu3Xqe7uouzt6vH0+/QA
K/UrK/0rbPdwoPi0WOu8iv/CZ/DSav7OgP7Vk/b4Svb0wf7+2/b3/f8ATP8A//86
//9Mif9qAP9mZv9m//+o//+1Zv7noP//tf//Zv7+/v//4Z+hqHx8gv8AAAD/AP//
AAAA//8A/wD//////yH5BAAAAAAALAAAAAAAAvgAhwAAAIAAAACAAICAAAAAgIAA
gACAgL+/v8DcwKnV6gAAAAAAOgAAZgAuVgA6kABAOgBEaQA+AABmZgBmtACQOgCQ
ZgCQ2wC2ZgC2tgC2/wDbkAD54AD/AAD/OgD/ZgD/kAD/tjE5lDZWoTFrxDoAADoA
NDoAZjo6ADs8Pjo7Zzo6jzpksTpmZjpmkDpwhDqQkDuJvzqQ2zr/AEZHSkVGc0dI
kUZIokZH/UdffkVsc0WOS0KtSkP79EhJc05soERpwEmqT1JjlFOBxVtZW2BiqF6t
amYAAGYAOWYAZmY9P2U8jmY6AGZmAGZmOmVljWZzVmV2jml7jmJ6qGaQkmSq3Ga2
/2b/AGb//2dAa2hoaWpoqWaFxWqq2GrScndhXm1weXWFo3SOw3pjXoCb0X+b5nic
+ne86H29mYs+aoE+i4VlP4eIi4qNk4SUso85OopVUIt1s5F4zoh4Z5aKeY6P2o2w
/JE3AJBkAJdbkJCQOpCQZpCQk5ShtpGlzpCwl5DbtpHd/ZD/AJD/OpkzZptlQqSw
yZ+59aNobK1mPqKGP6mvtKLgtqszAKszZrJiZqeUgaqS3K2mk7a2pay036260q3G
pbMzOrZSALZmALmEQLWEZLa2ZrTI+rXZkrb+/rb/ALb/trwzALygkLa6xb7Ah7vG
2r3Zqs1aAMxmWsahasydwcGwg8S9qsvLy8LS7cXT+cvtxMn43M3s+s1mM8xmf81t
KcaFUcyBn9KwTNTXq9VMANhsX9WBM9WdbdW24dzc3Nzj99xyQt5/AOWBM9uQOt6b
gdi4beG9WeC5mN/P/9vMbejOitvSlebt+tv/OuArAOeEKeiNwO6cNOecMd2dWuwA
AO3GYu3Xqe7uouzt6vH0+/QAK/UrK/0rbPdwoPi0WOu8iv/CZ/DSav7OgP7Vk/b4
Svb0wf7+2/b3/f8ATP8A//86//9Mif9qAP9mZv9m//+o//+1Zv7noP//tf//Zv7+
/v//4Z+hqHx8gv8AAAD/AP//AAAA//8A/wD//////wj+AOsJHEiwoMGDCBMqXMiw
ocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2b
Cn/p3Mmzp8+fQIMKHUq0qNGjPHEqXcq0qVOSv54+jSq1qtWrWJnqzKqUKtevYMOK
3eh1bMyyZtOqXTsWLduVbt/KnUt3Zty6UPHq3cu35N2+DrMJHkzY4F/AiBMrRnh4
77hZqhZmC0a5MuVshhdr3sy5Hlpps5LV+wa5nrzSDEn7svo4ssLJlitjLti4s+3b
ZtGqrgf6Frrdb1tLji07M+7jyNOiPa3K3CxbtLRJQ5VtGKpmpmf5Bj1rlq/Ht4b+
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
---END_DATA---
%/
[img[open wallet|wallet.jpg][Wallet Contents]]
This tiddler lists the items in your wallet (below the word ''tagging:'' above). Click on the wallet picture for details. Just tag new items with the word ''Wallet'' and they will show up here automatically. A few blank items have been entered already to help you get started. Click on them and enter your details, then add and delete items as needed. You do not need to edit this tiddler, however editing it and immediately pressing ''done'' will adjust the timestamp; this may be a useful way of noting when you last checked your wallet contents against this list.
New items tagged with the word ''Wallet'' are also tagged, by default, with the word ''Unencrypted''.
See [[Using TiddlyFolio]] for more on the significance of this. To add new items
Click ''Wallet'' on the main menu for this screen, then one of
* <<newTiddler label:"New Credit Card" tag:"Wallet" tag:"Unencrypted" tag:"Data" tag:"excludeWikiWords" text:{{store.getTiddlerText('Credit Card')}}>>
* <<newTiddler label:"New Debit Card" tag:"Wallet" tag:"Unencrypted" tag:"Data" tag:"excludeWikiWords" text:{{store.getTiddlerText('Debit Card')}}>>
* <<newTiddler label:"New ID Card" tag:"Wallet" tag:"excludeWikiWords" tag:"Unencrypted" text:{{store.getTiddlerText('ID Card')}}>>
* <<newTiddler label:"New Wallet Item" tag:"Wallet" tag:"excludeWikiWords" tag:"Data" tag:"Unencrypted">>
and enter the appropriate details.
<<forEachTiddler
where
'tiddler.tags.contains("Wallet")'
write
'"<html><B><font size =3>[["+ tiddler.title+ "]]</b></font></html>" + "----\n<<tiddler [["+tiddler.title+"]]$))\n"'
>>
The following macro call exports all tiddlers tagged with Wallet to a text file "c:/mywallet.txt", using a customized format.
Source: http://tiddlywiki.abego-software.de/#ForEachTiddlerExamples
{{{
<<forEachTiddler
script 'function getSortedTagsText(tiddler) {var tags = tiddler.tags; if (!tags) return ""; tags.sort(); var result = ""; for (var i = 0; i < tags.length;i++) {result += tags[i]+ " ";} return result;} function writeTiddler(tiddler) {return "==== "+tiddler.title+"=========================\nTags: "+ getSortedTagsText(tiddler)+"\nModified: "+tiddler.modified.convertToYYYYMMDDHHMM()+"\nModifier: "+tiddler.modifier+"\n--------------------------------------------------\n"+tiddler.text+"\n--------------------------------------------------\n(End of "+tiddler.title+")\n\n\n\n"}'
write
'writeTiddler(tiddler)'
toFile 'file:///c:/mywallet.txt' withLineSeparator '\r\n'
>>
}}}
For better readablility here the script text in a nicer layout:
{{{
function getSortedTagsText(tiddler) {
var tags = tiddler.tags;
if (!tags)
return "";
tags.sort();
var result = "";
for (var i = 0; i < tags.length;i++) {
result += tags[i]+ " ";
}
return result;
}
function writeTiddler(tiddler) {
return "====[ "+tiddler.title+" ]=========================\n"+
"Tags: "+ getSortedTagsText(tiddler)+"\n"+
"Modified: "+tiddler.modified.convertToYYYYMMDDHHMM()+"\n"+
"Modifier: "+tiddler.modifier+"\n"+
"--------------------------------------------------\n"+
tiddler.text+"\n"+
"--------------------------------------------------\n"
"(End of "+tiddler.title+")\n\n\n\n"
}
}}}
<<forEachTiddler
where
'tiddler.tags.contains("Wallet")'
script 'function getSortedTagsText(tiddler) {var tags = tiddler.tags; if (!tags) return ""; tags.sort(); var result = ""; for (var i = 0; i < tags.length;i++) {result += tags[i]+ " ";} return result;} function writeTiddler(tiddler) {return "====[ "+tiddler.title+" ]=========================\nTags: "+ getSortedTagsText(tiddler)+"\nModified: "+tiddler.modified.convertToYYYYMMDDHHMM()+"\nModifier: "+tiddler.modifier+"\n--------------------------------------------------\n"+tiddler.text+"\n--------------------------------------------------\n(End of "+tiddler.title+")\n\n\n\n"}'
write
'writeTiddler(tiddler)'
toFile 'file:///c:/mywallet.txt' withLineSeparator '\r\n'
>>
This document is a ~TiddlyWiki from tiddlyspot.com. A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.
@@font-weight:bold;font-size:1.3em;color:#444; //What now?// @@ Before you can save any changes, you need to enter your password in the form below. Then configure privacy and other site settings at your [[control panel|http://tiddlyfolio.tiddlyspot.com/controlpanel]] (your control panel username is //tiddlyfolio//).
<<tiddler TspotControls>>
See also GettingStarted.
@@font-weight:bold;font-size:1.3em;color:#444; //Working online// @@ You can edit this ~TiddlyWiki right now, and save your changes using the "save to web" button in the column on the right.
@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// @@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick. You can make changes and save them locally without being connected to the Internet. When you're ready to sync up again, just click "upload" and your ~TiddlyWiki will be saved back to tiddlyspot.com.
@@font-weight:bold;font-size:1.3em;color:#444; //Help!// @@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]]. Also visit [[TiddlyWiki.org|http://tiddlywiki.org]] for documentation on learning and using ~TiddlyWiki and check out this [[primer|http://tidhelp.tiddlyspot.com/]] at ~TiddlySpot. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help. If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].
@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// @@ We hope you like using your tiddlyspot.com site. Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions.
!usage
{{{[img[baby.jpg]]}}}
[img[baby.jpg]]
!notes
//none//
!type
image/jpeg
!file
file:///C:/Users/PC1/Desktop/baby.jpg
!url
!data
data:image/jpeg;base64,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
| source file:|{{{bullet.gif}}}|
| attached on:|18 September 2007 by YourName|
| description:|bullet icon used by TiddlyPedia theme|
| embedded:|[[bullet.gif|bullet.gif]] - {{{type=image/gif, size=50 bytes, encoded=69 bytes}}}|
| local file:|//none//|
| remote link:|//none//|
image
<<<
usage: {{{[img[tooltip|bullet.gif]] or [img[tooltip|bullet.gif][link]]}}}
[img[tooltip|bullet.gif]]
<<<
/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhBQANAIAAAGOMnP///yH5BAEAAAEALAAAAAAFAA0AAAIJjI+pu+APo4Sp
ADs=
---END_DATA---
%/
| source file:|{{{emergencyinfo.gif}}}|
| attached on:|18 September 2007 by EatsWombats|
| description:|emergency info|
| embedded:|[[emergencyinfo.gif|emergencyinfo.gif]] - {{{type=image/gif, size=5156 bytes, encoded=6983 bytes}}}|
| local file:|//none//|
| remote link:|//none//|
image
<<<
usage: {{{[img[tooltip|emergencyinfo.gif]] or [img[tooltip|emergencyinfo.gif][link]]}}}
[img[tooltip|emergencyinfo.gif]]
<<<
/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhVwBVAPcAAAAAAIAAAACAAICAAAAAgIAAgACAgMLCw8DcwKbK8AAAABIH
ZxIGfg0NDRsFjBwGrB0KnxgYGB8YYCMjIykRjygZqDgmczUklTQiuS0tLTghgjki
qj09PUEjw0I0gEQyjkQyr1ErnUopxkot000xqEs3nE8zwlcy71I7u1E5zlJCi1M/
oVRAyltAxlo61VpEnFpBs11OmFZWVmZcjGNajGZA4mpNzGpYmmdWpmhQvG1S2W5W
1Wxgqmloa3FVsnNP7nFbn3RguXJnmXxY6Hhbz39jvHljzXtg3HxxontssXd3d4ds
x4hq6IB5i4V6u4WFhYx6y4542I54wY+DuZWCzpeB4pOTk6EIBpwAGJ8EI54pQ5uH
1JiPwZycnKGZuqUXNacdSKcnWqcrOqYqSaOJ7qCOzaaM1qCI3KWb1q0BHa4CJqoi
TqqF8a2T5K+W8a2c2Kenpa2jv6+my7Cj5K2trbUCHLQOMLkeIbMZObIVRLYqSbM1
UbhEVrVhbrhte7We3LSo1bW0tb8AG70DJ8AMD70YOr45Sr1GYr5Ra7qn5bum8L6y
1cC05MGv8by7x8K818UJPcEhQ8UkMcEpQsQqTsY3TMZCWcJiesBkm8JtcMhte8hv
g8B1iMqEi8aLlsi788sAE8oAJM4BMM4NMskdNc5RZstZcs5ee8hdgM16cs97htF8
ks+JlMu57crHzczE2M7F5tkALNUNQtYgRtc6WdREbtdee9ZriNd9jdeGlNWLntWX
n9XNw9LP1tfO7dbW1+YLONw2XttRbuNhduBdethofOBujNmAk9ymtt67xdzZzN7c
2+De5t7e5+hUduWFnOibuOWxveXNwOXP0ufN5uXS8ODR+ufS2+rYv+bd9OL99uuN
puiapO6nuPC3xPDCyPDG1vLQz+/P2/TB5u/O9/LX2u3g4/Dq9+zr6vP3+PT97/D+
+/afsvnX4/n73vne1vvf6Pzt7fz3+f3+3/3+7v39/vv68KKho39/f/8AAAD/AP//
AAAA//8A/wD//////yH5BAAAAAAALAAAAABXAFUAhwAAAIAAAACAAICAAAAAgIAA
gACAgMLCw8DcwKbK8AAAABIHZxIGfg0NDRsFjBwGrB0KnxgYGB8YYCMjIykRjygZ
qDgmczUklTQiuS0tLTghgjkiqj09PUEjw0I0gEQyjkQyr1ErnUopxkot000xqEs3
nE8zwlcy71I7u1E5zlJCi1M/oVRAyltAxlo61VpEnFpBs11OmFZWVmZcjGNajGZA
4mpNzGpYmmdWpmhQvG1S2W5W1Wxgqmloa3FVsnNP7nFbn3RguXJnmXxY6Hhbz39j
vHljzXtg3HxxontssXd3d4dsx4hq6IB5i4V6u4WFhYx6y4542I54wY+DuZWCzpeB
4pOTk6EIBpwAGJ8EI54pQ5uH1JiPwZycnKGZuqUXNacdSKcnWqcrOqYqSaOJ7qCO
zaaM1qCI3KWb1q0BHa4CJqoiTqqF8a2T5K+W8a2c2Kenpa2jv6+my7Cj5K2trbUC
HLQOMLkeIbMZObIVRLYqSbM1UbhEVrVhbrhte7We3LSo1bW0tb8AG70DJ8AMD70Y
Or45Sr1GYr5Ra7qn5bum8L6y1cC05MGv8by7x8K818UJPcEhQ8UkMcEpQsQqTsY3
TMZCWcJiesBkm8JtcMhte8hvg8B1iMqEi8aLlsi788sAE8oAJM4BMM4NMskdNc5R
ZstZcs5ee8hdgM16cs97htF8ks+JlMu57crHzczE2M7F5tkALNUNQtYgRtc6WdRE
btdee9ZriNd9jdeGlNWLntWXn9XNw9LP1tfO7dbW1+YLONw2XttRbuNhduBdetho
fOBujNmAk9ymtt67xdzZzN7c2+De5t7e5+hUduWFnOibuOWxveXNwOXP0ufN5uXS
8ODR+ufS2+rYv+bd9OL99uuNpuiapO6nuPC3xPDCyPDG1vLQz+/P2/TB5u/O9/LX
2u3g4/Dq9+zr6vP3+PT97/D++/afsvnX4/n73vne1vvf6Pzt7fz3+f3+3/3+7v39
/vv68KKho39/f/8AAAD/AP//AAAA//8A/wD//////wj+AOsJHEiwoMGDCAt6e2bs
GLt2CdclnEixosWL9bhNGgUMkixn8DCKHEkyYTp59bqpyTIo1iA1ai7Fq7dOHkqa
Ekvq3EnQZj10iAQNEhVLlCg1X6LRRJnzJs+nJH0iUxPLpZ2hg+qYmslUoLycUMNa
tInO0tBYkjzROosHGc6mYuNWRLmrpShQpeztslN1kKmvYOUKnhiPT8tBkNjVM2eo
aihISgMPnlyQmxqsiNAJfDYoVCxBiJzSpEza3J5BqCG5tVev3Z46sULZ8Ua69sBt
aowOqoVSHUpdnUX5PTdatO2w5miFGmrH7bqT9eBVqmMUT+R68tIdH2kPMPbsEln+
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
LNsPsi77siKLC8cADbFYDwEBADs=
---END_DATA---
%/
| source file:|{{{encrypted.gif}}}|
| attached on:|18 September 2007 by EatsWombats|
| description:|encrypted|
| embedded:|[[encrypted.gif|encrypted.gif]] - {{{type=image/gif, size=2601 bytes, encoded=3522 bytes}}}|
| local file:|//none//|
| remote link:|//none//|
image
<<<
usage: {{{[img[tooltip|encrypted.gif]] or [img[tooltip|encrypted.gif][link]]}}}
[img[tooltip|encrypted.gif]]
<<<
/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhHAEkAPcAAAAAAIAAAACAAICAAAAAgIAAgACAgMDAwMDcwKbK8AABAP3/
/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/78KCgpICAgP8AAAD/AP//
AAAA//8A/wD//////yH5BAAAAAAALAAAAAAcASQAhwAAAIAAAACAAICAAAAAgIAA
gACAgMDAwMDcwKbK8AABAP3//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AP/78KCgpICAgP8AAAD/AP//AAAA//8A/wD//////wj+ABcIHEiwoMGDCBMqXMiw
ocOHECNKnEixosWLGDNq3Mixo8ePIEMiVEBSAcGSC0imNLmyIMqDJVmuZBlz5kyV
Kl2+jEkzJ06TPGEO5Ilyp9GWBmvaFBhUKdOcOn3W/NnyJ1CZQ6danZrVaVSqW69K
fcm0bEqzQE+qPZtQJs21bN+yTWp2rtuyb9MmvXo27d24eNuipTt08FyXhvMW/otV
LePCT5HKRaxXb13AmAc3vlzZ4V/EiQ+D/vxY8ea+qP1Cnnx69WXOgRfK3YzVsmW6
d2svxnxaNWrIoQnfBv67NeHIcGcbX1qXNGihgX3HhSp69OvDOxmSJSu69nLbjZ3+
M4dOHDtU7oB7d8Up+3rn0MZZA/98fX7sx8+hTyb+XuHs47B951hyrlVXXnhw1fdf
es0ZZp1mDfI2UoR2HSgYhBV2Z2Bw9C3YmoexwbYhdhTiF19+JK7lFndSVSUWcjB5
t6JOT/H1VY1jdaVjjDaB19OM1K2Ho1hWofWhUUXZiCRSxyXZFJHonXTeWEUOKdKV
WFYUZJZcdunll2CGKeaYZJZp5plopqnmmmy26eabcMYp55x06ljldkpuuWOSS4FF
1Y03/fiiVjFSieOhO+4lKJSB1jiSn1H1GFShMyLqqFdSQtmTi1Tq9ltm95UXoWIY
gqqiqCaOCKKErD63qm3+GQrHH4f1ZebpqxOyCmusruG3G6/2FResgw9Wl9uv+tHK
oH8AGrhfrqTSluGHpZJ6arIS+irtp8/Gqp6Rw8p4pKfJIXjhjwVmx6xWK5JLJLb9
ZXWtosiqOy+gLGaaYLXuDUugsBSaimqBn46Ybboh5mqquQGf2hRuBFNmJcD3Xisf
ssaGuKC35P1XWsT7TkuwgLoq+23J9tHnMMIoy5pqyw9e7GBv7U6MZ3w53skXn5Ha
XHOViqLb6E1SttUpc5NGWTSnyDmpdJ9hKWdppETt2elyFOlZ59Zcd+3112CHLfbY
ZJdt9tlop6322mxDpFTSfObIY5F/Njppz3ZvxWn+lG/3je6TQQvt9OBGv7s3kuMG
KqPVOLM3ZM1D85tyw/U2fKvCsy4rXcwaK9sxwh9Dm9h7G3OO8q7QKtn55vsx3B+1
xyZMLuYiRluwxf+u+nlwDZ5oMenEDsi7iAabxi/rlLsrKn+6zf50xiPvRu10F79d
K8dEB+gf5H3hymOiTEq2fPR9+jt86+YnWJlTs5OXeYeqEvtyt+EOf/3KeHkPca0I
qsw7+slbHfH89z7sBY98MxMevHJnv38djHK4O90B7QciAm4MgMDyW4sS9bwlsetJ
SgPhlDi4Ib/pS1Iw+orgokZAxh3KcJiyk1duBj4aRaZqHNRa23bIw6xhrYcKQAyi
EIdIRC8FBAA7
---END_DATA---
%/
| source file:|{{{external.png}}}|
| attached on:|18 September 2007 by EatsWombats|
| description:|external link symbol used in TiddlyPedia theme|
| embedded:|[[external.png|external.png]] - {{{type=image/png, size=165 bytes, encoded=223 bytes}}}|
| local file:|//none//|
| remote link:|//none//|
image
<<<
usage: {{{[img[tooltip|external.png]] or [img[tooltip|external.png][link]]}}}
[img[tooltip|external.png]]
<<<
/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/png;base64,
iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAFVBMVEVmmcwzmcyZ
zP8AZswAZv////////9E6giVAAAAB3RSTlP///////8AGksDRgAAADhJREFUGFcl
y0ESAEAEA0Ei6/9P3sEcVB8kmrwFyni0bOeyyDpy9JTLEaOhQq7Ongf5FeMhHS/4
AVnsAZubxDVmAAAAAElFTkSuQmCC
---END_DATA---
%/
| source file:|{{{headbg.jpg}}}|
| attached on:|18 September 2007 by EatsWombats|
| description:|background used in ~TiddlyPedia theme|
| embedded:|[[headbg.jpg|headbg.jpg]] - {{{type=image/jpeg, size=7881 bytes, encoded=10672 bytes}}}|
| local file:|//none//|
| remote link:|//none//|
image
<<<
usage: {{{[img[tooltip|headbg.jpg]] or [img[tooltip|headbg.jpg][link]]}}}
[img[tooltip|headbg.jpg]]
<<<
/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/jpeg;base64,
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
pqmqalFqtJUGrOhqk4mqUtJqampqa/RqapquqRhbcdOIbqoSWMoZnG01aiZjs3Gf
tdoO6lFFFFFFFFJRRRRRytyX9LwVBqmpqUclytrcHACgBSUqKJRRQALZYAFFABQB
SUUUlFFHK2XClAAAFABCoUAAAABQAFACoFAqKAhl2c6KXHu6AiZdkpKWkprGFopR
FSlAEUAARQAAABFEVAAAKKKKKKAKKTU1TU1KkAoqDWDWE1NTU0NTQ1NV1gqFSWZT
WzU1NTU1KWpOVv6WxSiiiiiikoooooooXkDgoopKWjkF4ABRAoACgABQBAUAEKKK
KSiilLAoAFBBQAAAAAARQAQUAAAEyZoopfLVgkpRQUsKAAAAAAAAAAAAAFAUUUUU
UUUUUUUAAAUUUmpRRRQFFFFFAJRRqUUUUUUUUUUampRSgBRRRRRRRRRRRRRQKBRS
UUUoAABRQAUAFAAAFFABRRRRQFFFAFFFAUUAUACoUUFAABQAUAAUAoIqSlFFFLEK
gUUUUAAoAioqCoKICiCgAAAAAAAAAAAAAAAIogKAAAAIoAigAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAD//Z
---END_DATA---
%/
| source file:|{{{keys.gif}}}|
| attached on:|18 September 2007 by EatsWombats|
| description:|KeyWiki|
| embedded:|[[keys.gif|keys.gif]] - {{{type=image/gif, size=2848 bytes, encoded=3859 bytes}}}|
| local file:|//none//|
| remote link:|//none//|
image
<<<
usage: {{{[img[tooltip|keys.gif]] or [img[tooltip|keys.gif][link]]}}}
[img[tooltip|keys.gif]]
<<<
/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlhOAA+APcAABAICBUPDRgYEBwcGCEQCCMjIygWCikYEC0eEi8qICoqKjIh
FjEpKS8uKDExMTkpCDwqETY0Kzo4LTg2Ljk5OUcmC0MzE0U2KUY/JURBOUJCQk8v
B0s5HEc6J0xHN0tLS1E/IVREJ1JRUFc7EV9RLltZU1lZWWZKGGVRIWFTOWFhXWhU
OG5YM2peTmphS21iU2ZlY21qY2xsbHdaK3FdPG9eQXRjS3NjSnJlYHVsXXNrWnJy
cXtjL3hjPHhuTnV1dH14aH59c3x8e4VjJ4JpM4JtSod1Qod2aoF6a4Z+dYSDg4he
Io9xOYp3RotzSoxza4t8Vol9Z42Ca4iGf4yEhI6MgYyMjJZ8PpV9R5F6UZWGWpKF
ZpKHdpOKYZKSjZOUkpWYrpt6N5yGUp+LTZyNYZ+TYJqSgpyWi5ualqWMY6GOcaSS
XaGXYqKVeaOVgaSYbqWce6WchKSfjKWcjJ+enqejlqOinqWlpaapvK2SV62TZK6b
Y6+lea+hhq6kj66qo66pnKysrbKysLWYX7WhhbSnmbWlnLerdrSup7OysLS0tbi4
ur2eUbufbL2lSr2hXruiZMSqbb+oiMCxfLqxgbu0o766sr29vcmycsW3pMW9jsa9
lMS+rMS+s8O9vMjEusXFxcPG0sbOxsbO1s6za8q9ccq8ptDCgc3It87Gxs7Otc3M
ydG3WNK1cdO8gtTCiNPEm9LRztbW1tXV3NnIguDPhdzOsODUhd/Uk9/QqtzXxdnV
zt/Z19/d197e3uLAZ+bQh+PZtOPVyOrZluncy+Th3Ofe5+fn5+fv5+3YlO3gkevd
ne7eru3evO/ezvLgge/nme/po+3k0ezn3e3p6PPtp/DrrfDttO7swO/v3u7t7O/v
8ffntfbvz/funffxqfTx6PPx7vTz9fn1rvf3vPj3z/n45/j28Pf39/r6/Pr7uPnm
pfnwpf/vrf/3nP33pvz2rf33vv/3zvr42/z24/377/z5+v/8p//9rf79tf7+vv7+
xf//zvz85f39+P7+/iH5BAAAAAAALAAAAAA4AD4AhxAICBUPDRgYEBwcGCEQCCMj
IygWCikYEC0eEi8qICoqKjIhFjEpKS8uKDExMTkpCDwqETY0Kzo4LTg2Ljk5OUcm
C0MzE0U2KUY/JURBOUJCQk8vB0s5HEc6J0xHN0tLS1E/IVREJ1JRUFc7EV9RLltZ
U1lZWWZKGGVRIWFTOWFhXWhUOG5YM2peTmphS21iU2ZlY21qY2xsbHdaK3FdPG9e
QXRjS3NjSnJlYHVsXXNrWnJycXtjL3hjPHhuTnV1dH14aH59c3x8e4VjJ4JpM4Jt
Sod1Qod2aoF6a4Z+dYSDg4heIo9xOYp3RotzSoxza4t8Vol9Z42Ca4iGf4yEhI6M
gYyMjJZ8PpV9R5F6UZWGWpKFZpKHdpOKYZKSjZOUkpWYrpt6N5yGUp+LTZyNYZ+T
YJqSgpyWi5ualqWMY6GOcaSSXaGXYqKVeaOVgaSYbqWce6WchKSfjKWcjJ+enqej
lqOinqWlpaapvK2SV62TZK6bY6+lea+hhq6kj66qo66pnKysrbKysLWYX7WhhbSn
mbWlnLerdrSup7OysLS0tbi4ur2eUbufbL2lSr2hXruiZMSqbb+oiMCxfLqxgbu0
o766sr29vcmycsW3pMW9jsa9lMS+rMS+s8O9vMjEusXFxcPG0sbOxsbO1s6za8q9
ccq8ptDCgc3It87Gxs7Otc3MydG3WNK1cdO8gtTCiNPEm9LRztbW1tXV3NnIguDP
hdzOsODUhd/Uk9/QqtzXxdnVzt/Z19/d197e3uLAZ+bQh+PZtOPVyOrZluncy+Th
3Ofe5+fn5+fv5+3YlO3gkevdne7eru3evO/ezvLgge/nme/po+3k0ezn3e3p6PPt
p/DrrfDttO7swO/v3u7t7O/v8ffntfbvz/funffxqfTx6PPx7vTz9fn1rvf3vPj3
z/n45/j28Pf39/r6/Pr7uPnmpfnwpf/vrf/3nP33pvz2rf33vv/3zvr42/z24/37
7/z5+v/8p//9rf79tf7+vv7+xf//zvz85f39+P7+/gj+AP8JHEiwoMGDCBMqXMiw
ocOHECNKnEixosWLGDNq3Mixo8ePIEOKHMnw2KpLq46RbBhulR0vaNAIEQJqZcJz
oNAIUvkvXKIYq2weBPWlZsFYXoQW9PUl0EF0MdAoFehPJjqEfybwFBqLgp2Elhoo
mmpnQNCD4aZIKDFWqJcEvhCisxQBzQ9ZQu84iItQVgxZx+6I7Fdunjl/qDJw8ofQ
jgpfx6zEQieL70Zz1bxBG3etSwYozOoxJoiOjoIdikAdOxbryyWO5ZR5g8cuGokA
NEjBknaOoDYlPyDPAgXYl5CtF/1ZgxZtHDx4yrS4YjSIWbBzV+0FsgIYFBg8s47+
bbsjFSM6a7WjNX/nDR+wQY2GvdJ1rpgXB1YW+dIWKpR4ar78gNxE5pQTzTfjqBcN
O9+wU4stuSQTiSTU6FIFDDIEAso2HIZDjTbbfGGFRf5gM44+1SD4zTvs5KNPLdJI
00oYjOTyITjF+BKIeBxq46MvKuBFYDn6FJnPN/ngQkYZkxwyhi6ZDLHEL8oQo004
2tyhITo9+ojOFztI5M885OhDTj7WWMNGCCEkcAEHEHTQwgontELLHsH4U1UAgSgC
Ioc9HvPBaw6NGc8+5PDRhw8YWNBBDEi8UAQHCCxggAVi9JBCFOHYE4sIA8gAyipc
AsrhHV84VE856uhzjSb+qPzxySd1mJHEFkSMYEAITaDgRBZcWDLNNJ2UkEEDDlyy
iKnb/KjEgAb5U06Z+kSjSSG9CETNGSF0AAkTFRCBCyuPgNDGsIAkUUIJMJQQKiiT
MTseHQgxNs8++uyTJBlu8CJQLCmMsAclWGxwxTO3zKBHJbGcE4QEGaigBB10aJCs
IqUCqo1x0FJ16D7xlNGDG7H8c0wdEPCQzBsQIMBCe3sgIIdAQAZhhyKryLLKFwpY
cYkspv5JHkL14EILJljYUAc1//TigQVXLHNICDggcUg+3mhRiTZXuQTYMSCyBoMG
oCgiDoh/bizgQf60UYMNUpT8Dycu2LDHOpPUcEb+LM3k8w4khNTzDzqo1BHLNuik
80866ATmABo/A3oMYOOl+lSO4QzuRw5HYLLOKUUgckw339xzCwvC/OPPNEjcoY1B
28iiwgexYOxL2XTIorZlBqFjTzF+vICIKcC8AoUn6NAzDj74GHFEb/74gUYvVxXU
uGmBXOILNWUrEtcx2yWUzipSmOELOsWoQYbc5Cx/ig2fXFWPHJMhtM0qIpggy1jb
xAKZIlbQhhB4Zz2uDaQYr/vHPJzjDTFgizHgiF9CGmcFBSjigr64hBVEoAHBXMJy
EDlH+/JRijYUYxo9QYPc5KINUGhABccQggZeiAZZoOOGSiAgQ9ARDHx4Yw3+uzgG
047xhwRO0BdKUMCGQOELxF3lKnQYUUR0cYg8ZMIfxcicP7QxmgkeQxEUkIFAFJeO
bRwjgyYwQfUego5PxCId9siWQLjIkNj9gAJ4MaMvaqcEDRSgBGuUSDiKMUdZdNGL
gaDADnCnBBhQQAGQVMINKdILLn6CCytUCDq0EQsZKIACFHBAAQqgAAdQAAaqCSRE
tGGJHAABFKr0Ih0eCclSmtIERTlGLB/SC09sAyKbXIUnR0lKDcDANbrbZUhueAxQ
WEEGMhCCFe5wCf/pciqD2+QZfcFNyIhnktjMZpc4dENlhvOc6EynOtfJzoXY453w
jKc85/nOdtrznukCDAgAOw==
---END_DATA---
%/
| source file:|{{{login.gif}}}|
| attached on:|18 September 2007 by EatsWombats|
| description:|login screen|
| embedded:|[[login.gif|login.gif]] - {{{type=image/gif, size=10633 bytes, encoded=14401 bytes}}}|
| local file:|//none//|
| remote link:|//none//|
image
<<<
usage: {{{[img[tooltip|login.gif]] or [img[tooltip|login.gif][link]]}}}
[img[tooltip|login.gif]]
<<<
/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
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
RdpMDdZ37dShTVpjfdqoldqppdpPDQgAOw==
---END_DATA---
%/
| source file:|{{{openbook.jpg}}}|
| attached on:|18 September 2007 by EatsWombats|
| description:|open book|
| embedded:|[[openbook.jpg|openbook.jpg]] - {{{type=image/jpeg, size=1400 bytes, encoded=1897 bytes}}}|
| local file:|//none//|
| remote link:|//none//|
image
<<<
usage: {{{[img[tooltip|openbook.jpg]] or [img[tooltip|openbook.jpg][link]]}}}
[img[tooltip|openbook.jpg]]
<<<
/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/jpeg;base64,
/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAkGBwgHBgkIBwgKCgkLDRYPDQwMDRsU
FRAWIB0iIiAdHx8kKDQsJCYxJx8fLT0tMTU3Ojo6Iys/RD84QzQ5Ojf/2wBDAQoK
Cg0MDRoPDxo3JR8lNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3
Nzc3Nzc3Nzc3Nzc3Nzf/wAARCABoAIcDASIAAhEBAxEB/8QAGwAAAQUBAQAAAAAA
AAAAAAAAAAECAwQFBgf/xABDEAACAQIDAwULCAoDAAAAAAAAAQIDBAURIQYxMhRR
crGzEhMiNEFTcXN0kcElNTZDUmGBkhUkM0RiZKGjstFjlKL/xAAVAQEBAAAAAAAA
AAAAAAAAAAAAAf/EABURAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIRAxEAPwD2
q6u7ezp99u69OjTzS7qpNRWfNqRUcTsa8+4o3dGpLmhPMr45o7F813H/ABkviSRb
eebb9LAud8h9pC98jzlWKHpAT93EO7X3kSFKHuqlzkcrujDjbX4CT3Gfd7mQadK5
o1k3SqKWT1y8g91IrnMrB14NbprqNCW4BzuKa3t+4a7yit8mvwZVq+Uq1CjU5Zb+
cXuYcroedX9TGYmZBtcst19av6lC42lwW2qyp3GJ29KcXk1OWWRSluOR2nnJbPY2
k3k5xzWfPUigPUQAAM3G/wBnavmuqfXl8SSHlG42v1eh911S/wA0LACSI9DY7hyK
HIVCIVANnuM674WaM9xnXe5gOwfhrdJdRfluKGD8NbpLqL89wFWqVKhbqlOoBGxr
YMRgDeayOQ2l+YMWz89T7WJ1mepym03zBinrqfbRJR6iAABQxrxaj7TR7SIsAxnx
Wn7TR7SIQAkiPQyI5FD0KhqHIBJ7jNvOFmjPcZt7wsB2DcNfpLqNCW4z8G4a3SXU
aEtwFSqVKpbqlOpvAhbGtiyY1sBGzlNp/o/ifrqfbROqZye030fxRf8APT7aJKPV
AAAKOM+KQ9oodpESD6hcceVlD2mh2sBlN9QEqHpkaY5MokQ5DExyASb0M2+fgs0Z
7jMvnowJMF4K3SXUaE9xm4I/Ar9JdRozegFSsynUepbrMp1HqBDLeIKxoCPccntI
/kHE/aKfbROrluOS2kfyFinr6fbRJSPVwFADOx55WMX/ADNDtYEVOWg/aJ5YdH2m
37aBWpT3AW4semQRloSJlEsWPTIkxyYCzehmXz0ZoTehmXz0YE2CPwK/SXUaE3oZ
mCPwK/TXUaE3oBWrMp1GWqzKdRgRsRiNiNgJJ6HJbRv5DxX19PtonVSZym0rywTF
vW03/diSrHrQAARlbTvLCs/5m37aBQpT0Rb2wqRpYJKdSUYQjcW7cpPJJd+h5WYd
tidlUyVO9tpPmjWi/iBtQmSxmUKVaMuGcX6GWIzKLakPUitGRIpASTehl3r3l+ct
DMvZaMCfA5eBX6a6jRm9DG2frwkriKlHulOOmeu41pvQgr1nvKc2WKz0KkmUMk9R
rY2U0nm2l+JDUureHHcUY9Kol8QJmcntO8sCxn7pwf8AcidBPFMPjxYhZr03EP8A
ZyW02K4dPB8ao08Rs5VZZdxCNxByl4Seiz1JVe1gABEdejSuKUqVelCrTlxQnFST
9KZS/QWEPfhVj/1of6AAHxwfC4cGG2cfRbwXwJ4WltTWULejFfw00gABzoUX9VD3
CO1o/Y90mAAJySi98P8A0xrsLWXFQjL06gAEnJ6GUV3mnlHhXcLT0A6FF/VQ9wAA
nJbfzMPcKragt1Cl+RAAC95pNZd6hl0UN5NbvfQpfkQAAcltn+70fyIOSW2fi9H8
iAAJgAAP/9k=
---END_DATA---
%/
| source file:|{{{siteisprivate.gif}}}|
| attached on:|18 September 2007 by EatsWombats|
| description:|ensure site is private|
| embedded:|[[siteisprivate.gif|siteisprivate.gif]] - {{{type=image/gif, size=11232 bytes, encoded=15210 bytes}}}|
| local file:|//none//|
| remote link:|//none//|
image
<<<
usage: {{{[img[tooltip|siteisprivate.gif]] or [img[tooltip|siteisprivate.gif][link]]}}}
[img[tooltip|siteisprivate.gif]]
<<<
/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/gif;base64,
R0lGODlh6QFGAPcAAAAAAIAAAACAAICAAAAAgIAAgACAgL+/v8rZw6HO8QAAAAEB
DgAAIwADRgMKEAANIAMPMwAQVQAZOwclTAIwcgQ+aQJGhg0GGAguWRVTnRMHBRgR
IRoZQCAgKR4pOBYyXxY+bBJLhyEAASASFCIiFChqoygaJysbNycoQi0rUS84Wi04
aSpFfixVgzUHADUWADQZDDBmojknQzs6QzdDVDhCcjxSbzpUi0UUAj0fF0EnLUMx
RUM0WkRAUkFOXEJgmERxnURyrElAZ0tHdUlSgkpZbE1hj1AnB1ElF08sKFAyQVJF
QVNRUlRonFZ5nVN7sVGIwF4kBGA0Q1g1FFc5I1w3MVo7VFlBZlxQQ1dRgllcaVpi
hmY3IV5aWl1tol9ygWB5rGKGumCIpGWUxm49DWxBRGxDVWpaT2llaWt7o2qMrXFD
InJDMXVYQ3ViWnBwb3BxhW9+hHKBl3aSm3GNvnaVr3ObzHSq3Y5SC4BRIYRNMYBL
PH1LTIJpUoRxZ4V8eIaIlYGdu4Orz4W354dTUopaMo1cU41oRo9xWZRcQpGHiZaU
lZOZpZWptpWsw5e80JS93pTG75taMJhhV55pSp5xW5x+dqCIip2ftamqqKSxxqbC
06XK3KtsM611Qat1VauCY6ubmK22x67R5qzb+bPm/bOOcbSbfbanlrWqo7O0tbu+
prTF0LuCVL6KZLrI3L3V6sHl5r3k+r7w/sWWcb6imcWkg8Osoca3rsfGx8nW2seN
TMmNZsyXZdCrg8+1k8+5pNHGtc7NztDb5tHv+tSPRtGectGhetSUlNenp+Kqa92r
fNy5lNnBrNzY1d/k5eWLi+exsee1f+W4iubGm+fGnOPJquTQuOnq7OLu0Of5/e80
M+lVVe/EjfLbtezez/obGvcxMfVeXfR4eP2dnfjUovLXwffmzPjt2/762Pb08P4A
APwPD/8YEP4hIfo7O/5KSv+Tk/usrP3ks/7xxv7+/v787aCeon5/f/8AAAD/AP//
AAAA//8A/wD//////yH5BAAAAAAALAAAAADpAUYAhwAAAIAAAACAAICAAAAAgIAA
gACAgL+/v8rZw6HO8QAAAAEBDgAAIwADRgMKEAANIAMPMwAQVQAZOwclTAIwcgQ+
aQJGhg0GGAguWRVTnRMHBRgRIRoZQCAgKR4pOBYyXxY+bBJLhyEAASASFCIiFChq
oygaJysbNycoQi0rUS84Wi04aSpFfixVgzUHADUWADQZDDBmojknQzs6QzdDVDhC
cjxSbzpUi0UUAj0fF0EnLUMxRUM0WkRAUkFOXEJgmERxnURyrElAZ0tHdUlSgkpZ
bE1hj1AnB1ElF08sKFAyQVJFQVNRUlRonFZ5nVN7sVGIwF4kBGA0Q1g1FFc5I1w3
MVo7VFlBZlxQQ1dRgllcaVpihmY3IV5aWl1tol9ygWB5rGKGumCIpGWUxm49DWxB
RGxDVWpaT2llaWt7o2qMrXFDInJDMXVYQ3ViWnBwb3BxhW9+hHKBl3aSm3GNvnaV
r3ObzHSq3Y5SC4BRIYRNMYBLPH1LTIJpUoRxZ4V8eIaIlYGdu4Orz4W354dTUopa
Mo1cU41oRo9xWZRcQpGHiZaUlZOZpZWptpWsw5e80JS93pTG75taMJhhV55pSp5x
W5x+dqCIip2ftamqqKSxxqbC06XK3KtsM611Qat1VauCY6ubmK22x67R5qzb+bPm
/bOOcbSbfbanlrWqo7O0tbu+prTF0LuCVL6KZLrI3L3V6sHl5r3k+r7w/sWWcb6i
mcWkg8Osoca3rsfGx8nW2seNTMmNZsyXZdCrg8+1k8+5pNHGtc7NztDb5tHv+tSP
RtGectGhetSUlNenp+Kqa92rfNy5lNnBrNzY1d/k5eWLi+exsee1f+W4iubGm+fG
nOPJquTQuOnq7OLu0Of5/e80M+lVVe/EjfLbtezez/obGvcxMfVeXfR4eP2dnfjU
ovLXwffmzPjt2/762Pb08P4AAPwPD/8YEP4hIfo7O/5KSv+Tk/usrP3ks/7xxv7+
/v787aCeon5/f/8AAAD/AP//AAAA//8A/wD//////wj+AOsJHEiwoMGDCBMqXMiw
ocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzpk2C
8tytcxfvps+fQIMKHUqUnM6dPRMeXbdzHNGnUKNKnUoVYU6mWLNmdUdOYDyt68yp
U1e1rNmzaNN6VAe2bVaC6sRhffcN21i1ePPq3WvWaFZxY+W2BTy2sLms0LDZJcu3
sePHkFWOyypvrOJnz5xp1owZs+LP2AQzjfZsceTTqFOrjpgVnuXMzoTJni17s2ds
maGBYwpuXOm7Gb89W028uPGfTF2/jp0r14F7i+5Jn37vgLPOmZNlDebMtMNrsA7+
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
---END_DATA---
%/
| source file:|{{{wallet.jpg}}}|
| attached on:|18 September 2007 by EatsWombats|
| embedded:|[[wallet.jpg|wallet.jpg]] - {{{type=image/jpeg, size=7098 bytes, encoded=9611 bytes}}}|
| local file:|//none//|
| remote link:|//none//|
image
<<<
usage: {{{[img[tooltip|wallet.jpg]] or [img[tooltip|wallet.jpg][link]]}}}
[img[tooltip|wallet.jpg]]
<<<
/% DO NOT EDIT BELOW THIS POINT
---BEGIN_DATA---
image/jpeg;base64,
/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAsICAoIBwsKCQoNDAsNERwSEQ8PESIZ
GhQcKSQrKigkJyctMkA3LTA9MCcnOEw5PUNFSElIKzZPVU5GVEBHSEX/2wBDAQwN
DREPESESEiFFLicuRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVF
RUVFRUVFRUVFRUVFRUX/wgARCADIAMgDAREAAhEBAxEB/8QAGwABAAMBAQEBAAAA
AAAAAAAAAAMEBQIBBgf/xAAYAQEBAQEBAAAAAAAAAAAAAAAAAQIDBP/aAAwDAQAC
EAMQAAAB+uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACFAAAAAAAAAH
hzA8EdV7XoAAAAAAAAKOFG2OKkdnJtk+pNXQoAAAAAACrixpzLWOCY6J6z8tDa7q
AAAAAADwqYvB4DsqTcONS2Wt86ESLe3npbNnoAAB4iWCaiWlJpJnrm53RagnSabn
lhvPtm5vHEVbrqXYuNTfOe59AIpaGOlDPWAoEWsc3Na5mt7nTznpbPnX0nXyy2Ze
d52ekc3JHNTy3bjR1z0d8cnPXLx1gl51mvrn5McOnU9ErrNOtrPnwt8Fas136PJF
z6Xpde481xp8/TTx1hmrER1o9OMBkZ3zrlHNSZ6z59EGulicbGOehz519X5T0ZWa
mOtr1eK714e51U494sbtzWprnaTOnTG4+jU6ce9Ywsdp3oqTduc9Ocb2OUGdU9XK
3rP3K+ufS6PPtzXRodOGhvloXnT3MnO4OfSznVPHfc6cLlx8nz9OzztvPO1MQaZe
umddx1GlfWK9xLNX89hLNSHZ3ZZ3w99Hlm6cqHD08ef17fTz6Wuf5/z9X0PLNG2r
bxdeg4SC5r6xFc2M7uZ6etTTUp6er1JFXNxJc2M72uvl0dc/gOfq4l9OpR5ZwnJD
cwazwzcWxjsmpmppej0AjTxL8uz38d+5+D5+iKaA9IdceGk1Fc37j6W42agl+fx3
z89fZel9js6Oa8SxG538V6z4Xn6IJrw8BFcSLrXnvaxoWAAQTWbjrmY61WpFkl8T
yyaN/v4rdnw/PvUmua9izc7dxs65z0AAACeS05vOx1o57Qnien1ffxTnw+O1Ka1L
NvXPVuPQAAAAAARy5uemRjrRa+47ePsyJbZbs9AAAAAAAAB4VpbVgAAAAAAAAAAA
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
---END_DATA---
%/