Welcome to TiddlyWiki created by Jeremy Ruston, Copyright © 2007 UnaMesa Association
<html><div class="embedr"><object width="425" height="520"><param name="movie" value="http://embedr.com/swf/slider/alan-watts/425/520/default/false/std"></param><param name="allowFullScreen" value="true"></param><param name="wmode" value="transparent"><embed src="http://embedr.com/swf/slider/alan-watts/425/520/default/false/std" type="application/x-shockwave-flash" allowFullScreen="true" width="425" height="520" wmode="transparent"></embed></object></div></html>
<html><embed id=VideoPlayback src=http://video.google.com/googleplayer.swf?docid=-2309502165382017424&hl=de&fs=true style=width:400px;height:326px allowFullScreen=true allowScriptAccess=always type=application/x-shockwave-flash> </embed></html>
<<tiddlerList filter:"tiddler.tags.contains('Video')" order:"title" dateFormat:"YYYY mmm. 0DD" itemTemplate:"{{vidList{+++[â–º play %title|show hide player]...\n<<tiddler '%title'$))\n===\n{{rightLink{[[open|%title]]}}}}}}">>
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
/***
|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.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1.3|
|Type|plugin|
|Requires||
|Description|run-time library for displaying attachment tiddlers|
This plugin provides "stand-alone" 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: This plugin does not include the "control panel" and supporting functions needed to //create// new attachment tiddlers. Those features are provided by [[AttachFilePlugin]], which can be installed while building your document, and then safely omitted to reduce the overall file size when you publish your finished document (assuming you don't intend to create any additional attachment tiddlers in that document)
!!!!!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.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: 0, date: new Date(2009,6,4)};
//}}}
//{{{
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 { // IE
var fso = new ActiveXObject("Scripting.FileSystemObject");
return fso.FileExists(f);
}
}
//}}}
//{{{
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);
}
}
//}}}
All videos about human awareness link here...
<<tagglyTagging>>
The Great British Broadcasting Institution...
<html><iframe src="http://www.ted.com/" class="browser"></iframe></html>
Integrated browsers...
<<tagglyTagging>>
<script>
var out='';
var tid="$1";
if(tid=="$"+"1") tid="ColorPalette";
var cols=["","Background","Foreground","Error","PrimaryPale","PrimaryLight","PrimaryMid","PrimaryDark","SecondaryPale","SecondaryLight","SecondaryMid","SecondaryDark","TertiaryPale","TertiaryLight","TertiaryMid","TertiaryDark"];
for (var c=0;c<cols.length;c++) {
if ((c)%4==0) out+='|width:120px; color |width:60px; # |width:150px; sample |h\n';
var col=store.getTiddlerSlice(tid,cols[c]);
if(col!=undefined) out+='| [['+cols[c]+'|'+tid+']]| {{{'+col+'}}} |@@padding:3px 7em;background-color:'+col+'; @@|\n';
}
return out;
</script>
Name:mjuzik
Background:#FFF
Foreground:#000
PrimaryPale:#999
PrimaryLight:#777
PrimaryMid:#111
PrimaryDark:#000
SecondaryPale:#CCF
SecondaryLight:#9AF
SecondaryMid:#69C
SecondaryDark:#27B
TertiaryPale:#EEE
TertiaryLight:#CCC
TertiaryMid:#999
TertiaryDark:#666
Error:#F88
<script>
var out="";
var tids=store.getTiddlers("title");
for (var i=0; i<tids.length; i++) {
t=tids[i].title;
if (tids[i].tags.contains("ColorPalette")) {
out+='![['+t+']]\n<<tiddler ColorFool with:"'+t+'">>\n';
}
}
return out;
</script>
/***
|''Name:''|DeliciousTaggingPlugin|
|''Version:''|0.1|
|''Source''|http://jackparke.googlepages.com/jtw.html#DeliciousTaggingPlugin ([[del.icio.us|http://del.icio.us/post?url=http://jackparke.googlepages.com/jtw.html%DeliciousTaggingPlugin]])|
|''Author:''|[[Jack]]|
!Description
Allows easy 'del.icio.us'-like tagging in the EditTemplate by showing all tags as a list of link-buttons.
!Usage
Replace your the editorFooter div in your [[EditTemplate]] with the following:
{{{
<div class='editorFooter' macro='deliciousTagging'></div>
}}}
!Code
***/
//{{{
version.extensions.deliciousTagging = {major: 0, minor: 1, revision: 0, date: new Date("June 11, 2007")};
config.macros.deliciousTagging= {};
config.macros.deliciousTagging.onTagClick = function(e)
{
if(!e) var e = window.event;
var tag = this.getAttribute("tag");
var title = this.getAttribute("tiddler");
if(!readOnly)
story.setTiddlerTag(title,tag,0);
return false;
};
config.macros.deliciousTagging.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
if(tiddler instanceof Tiddler) {
var title = tiddler.title;
if(!e) var e = window.event;
var tags = store.getTags();
var lingo = config.views.editor.tagChooser;
for(var t=0; t<tags.length; t++) {
var theTag = createTiddlyButton(place,tags[t][0],lingo.tagTooltip.format([tags[t][0]]),config.macros.deliciousTagging.onTagClick);
theTag.setAttribute("tag",tags[t][0]);
theTag.setAttribute("tiddler",tiddler.title);
place.appendChild(document.createTextNode(" "));
}
}
};
//}}}
/***
|''Name:''|DeprecatedFunctionsPlugin|
|''Description:''|Support for deprecated functions removed from core|
***/
//{{{
if(!version.extensions.DeprecatedFunctionsPlugin) {
version.extensions.DeprecatedFunctionsPlugin = {installed:true};
//--
//-- Deprecated code
//--
// @Deprecated: Use createElementAndWikify and this.termRegExp instead
config.formatterHelpers.charFormatHelper = function(w)
{
w.subWikify(createTiddlyElement(w.output,this.element),this.terminator);
};
// @Deprecated: Use enclosedTextHelper and this.lookaheadRegExp instead
config.formatterHelpers.monospacedByLineHelper = function(w)
{
var lookaheadRegExp = new RegExp(this.lookahead,"mg");
lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var text = lookaheadMatch[1];
if(config.browser.isIE)
text = text.replace(/\n/g,"\r");
createTiddlyElement(w.output,"pre",null,null,text);
w.nextMatch = lookaheadRegExp.lastIndex;
}
};
// @Deprecated: Use <br> or <br /> instead of <<br>>
config.macros.br = {};
config.macros.br.handler = function(place)
{
createTiddlyElement(place,"br");
};
// Find an entry in an array. Returns the array index or null
// @Deprecated: Use indexOf instead
Array.prototype.find = function(item)
{
var i = this.indexOf(item);
return i == -1 ? null : i;
};
// Load a tiddler from an HTML DIV. The caller should make sure to later call Tiddler.changed()
// @Deprecated: Use store.getLoader().internalizeTiddler instead
Tiddler.prototype.loadFromDiv = function(divRef,title)
{
return store.getLoader().internalizeTiddler(store,this,title,divRef);
};
// Format the text for storage in an HTML DIV
// @Deprecated Use store.getSaver().externalizeTiddler instead.
Tiddler.prototype.saveToDiv = function()
{
return store.getSaver().externalizeTiddler(store,this);
};
// @Deprecated: Use store.allTiddlersAsHtml() instead
function allTiddlersAsHtml()
{
return store.allTiddlersAsHtml();
}
// @Deprecated: Use refreshPageTemplate instead
function applyPageTemplate(title)
{
refreshPageTemplate(title);
}
// @Deprecated: Use story.displayTiddlers instead
function displayTiddlers(srcElement,titles,template,unused1,unused2,animate,unused3)
{
story.displayTiddlers(srcElement,titles,template,animate);
}
// @Deprecated: Use story.displayTiddler instead
function displayTiddler(srcElement,title,template,unused1,unused2,animate,unused3)
{
story.displayTiddler(srcElement,title,template,animate);
}
// @Deprecated: Use functions on right hand side directly instead
var createTiddlerPopup = Popup.create;
var scrollToTiddlerPopup = Popup.show;
var hideTiddlerPopup = Popup.remove;
// @Deprecated: Use right hand side directly instead
var regexpBackSlashEn = new RegExp("\\\\n","mg");
var regexpBackSlash = new RegExp("\\\\","mg");
var regexpBackSlashEss = new RegExp("\\\\s","mg");
var regexpNewLine = new RegExp("\n","mg");
var regexpCarriageReturn = new RegExp("\r","mg");
}
//}}}
/***
|''Name:''|FieldsEditorPlugin|
|''Description:''|//create//, //edit//, //view// and //delete// commands in toolbar <<toolbar fields>>.|
|''Version:''|1.0.2|
|''Date:''|Dec 21,2007|
|''Source:''|http://visualtw.ouvaton.org/VisualTW.html|
|''Author:''|Pascal Collin|
|''License:''|[[BSD open source license|License]]|
|''~CoreVersion:''|2.2.0|
|''Browser:''|Firefox 2.0; InternetExplorer 6.0, others|
!Demo:
On [[homepage|http://visualtw.ouvaton.org/VisualTW.html]], see [[FieldEditor example]]
!Installation:
*import this tiddler from [[homepage|http://visualtw.ouvaton.org/VisualTW.html]] (tagged as systemConfig)
*save and reload
*optionnaly : add the following css text in your StyleSheet : {{{#popup tr.fieldTableRow td {padding:1px 3px 1px 3px;}}}}
!Code
***/
//{{{
config.commands.fields.handlePopup = function(popup,title) {
var tiddler = store.fetchTiddler(title);
if(!tiddler)
return;
var fields = {};
store.forEachField(tiddler,function(tiddler,fieldName,value) {fields[fieldName] = value;},true);
var items = [];
for(var t in fields) {
var editCommand = "<<untiddledCall editFieldDialog "+escape(title)+" "+escape(t)+">>";
var deleteCommand = "<<untiddledCall deleteField "+escape(title)+" "+escape(t)+">>";
var renameCommand = "<<untiddledCall renameField "+escape(title)+" "+escape(t)+">>";
items.push({field: t,value: fields[t], actions: editCommand+renameCommand+deleteCommand});
}
items.sort(function(a,b) {return a.field < b.field ? -1 : (a.field == b.field ? 0 : +1);});
var createNewCommand = "<<untiddledCall createField "+escape(title)+">>";
items.push({field : "", value : "", actions:createNewCommand });
if(items.length > 0)
ListView.create(popup,items,this.listViewTemplate);
else
createTiddlyElement(popup,"div",null,null,this.emptyText);
}
config.commands.fields.listViewTemplate = {
columns: [
{name: 'Field', field: 'field', title: "Field", type: 'String'},
{name: 'Actions', field: 'actions', title: "Actions", type: 'WikiText'},
{name: 'Value', field: 'value', title: "Value", type: 'WikiText'}
],
rowClasses: [
{className: 'fieldTableRow', field: 'actions'}
],
buttons: [ //can't use button for selected then delete, because click on checkbox will hide the popup
]
}
config.macros.untiddledCall = { // when called from listview, tiddler is unset, so we need to pass tiddler as parameter
handler : function(place,macroName,params,wikifier,paramString) {
var macroName = params.shift();
if (macroName) var macro = config.macros[macroName];
var title = params.shift();
if (title) var tiddler = store.getTiddler(unescape(title));
if (macro) macro.handler(place,macroName,params,wikifier,paramString,tiddler);
}
}
config.macros.deleteField = {
handler : function(place,macroName,params,wikifier,paramString,tiddler) {
if(!readOnly && params[0]) {
fieldName = unescape(params[0]);
var btn = createTiddlyButton(place,"delete", "delete "+fieldName,this.onClickDeleteField);
btn.setAttribute("title",tiddler.title);
btn.setAttribute("fieldName", fieldName);
}
},
onClickDeleteField : function() {
var title=this.getAttribute("title");
var fieldName=this.getAttribute("fieldName");
var tiddler = store.getTiddler(title);
if (tiddler && fieldName && confirm("delete field " + fieldName+" from " + title +" tiddler ?")) {
delete tiddler.fields[fieldName];
store.saveTiddler(tiddler.title,tiddler.title,tiddler.text,tiddler.modifier,tiddler.modified,tiddler.tags,tiddler.fields);
story.refreshTiddler(title,"ViewTemplate",true);
}
return false;
}
}
config.macros.createField = {
handler : function(place,macroName,params,wikifier,paramString,tiddler) {
if(!readOnly) {
var btn = createTiddlyButton(place,"create new", "create a new field",this.onClickCreateField);
btn.setAttribute("title",tiddler.title);
}
},
onClickCreateField : function() {
var title=this.getAttribute("title");
var tiddler = store.getTiddler(title);
if (tiddler) {
var fieldName = prompt("Field name","");
if (store.getValue(tiddler,fieldName)) {
window.alert("This field already exists.");
}
else if (fieldName) {
var v = prompt("Field value","");
tiddler.fields[fieldName]=v;
store.saveTiddler(tiddler.title,tiddler.title,tiddler.text,tiddler.modifier,tiddler.modified,tiddler.tags,tiddler.fields);
story.refreshTiddler(title,"ViewTemplate",true);
}
}
return false;
}
}
config.macros.editFieldDialog = {
handler : function(place,macroName,params,wikifier,paramString,tiddler) {
if(!readOnly && params[0]) {
fieldName = unescape(params[0]);
var btn = createTiddlyButton(place,"edit", "edit this field",this.onClickEditFieldDialog);
btn.setAttribute("title",tiddler.title);
btn.setAttribute("fieldName", fieldName);
}
},
onClickEditFieldDialog : function() {
var title=this.getAttribute("title");
var tiddler = store.getTiddler(title);
var fieldName=this.getAttribute("fieldName");
if (tiddler && fieldName) {
var value = tiddler.fields[fieldName];
value = value ? value : "";
var lines = value.match(/\n/mg);
lines = lines ? true : false;
if (!lines || confirm("This field contains more than one line. Only the first line will be kept if you edit it here. Proceed ?")) {
var v = prompt("Field value",value);
tiddler.fields[fieldName]=v;
store.saveTiddler(tiddler.title,tiddler.title,tiddler.text,tiddler.modifier,tiddler.modified,tiddler.tags,tiddler.fields);
story.refreshTiddler(title,"ViewTemplate",true);
}
}
return false;
}
}
config.macros.renameField = {
handler : function(place,macroName,params,wikifier,paramString,tiddler) {
if(!readOnly && params[0]) {
fieldName = unescape(params[0]);
var btn = createTiddlyButton(place,"rename", "rename "+fieldName,this.onClickRenameField);
btn.setAttribute("title",tiddler.title);
btn.setAttribute("fieldName", fieldName);
}
},
onClickRenameField : function() {
var title=this.getAttribute("title");
var fieldName=this.getAttribute("fieldName");
var tiddler = store.getTiddler(title);
if (tiddler && fieldName) {
var newName = prompt("Rename " + fieldName + " as ?", fieldName);
if (newName) {
tiddler.fields[newName]=tiddler.fields[fieldName];
delete tiddler.fields[fieldName];
store.saveTiddler(tiddler.title,tiddler.title,tiddler.text,tiddler.modifier,tiddler.modified,tiddler.tags,tiddler.fields);
story.refreshTiddler(title,"ViewTemplate",true);
}
}
return false;
}
}
config.shadowTiddlers.StyleSheetFieldsEditor = "/*{{{*/\n";
config.shadowTiddlers.StyleSheetFieldsEditor += ".fieldTableRow td {padding : 1px 3px}\n";
config.shadowTiddlers.StyleSheetFieldsEditor += ".fieldTableRow .button {border:0; padding : 0 0.2em}\n";
config.shadowTiddlers.StyleSheetFieldsEditor +="/*}}}*/";
store.addNotification("StyleSheetFieldsEditor", refreshStyles);
//}}}
<script>
var cls="$1";
var e=place;
var here=e.getAttribute('tiddler');
var where="";
while (where=="") {
e=e.parentNode;
if (e.getAttribute('tiddler')&&e.getAttribute('tiddler')!=here) where=e.getAttribute('tiddler');
}
var tids = store.getTiddlers("title");
var out="";
for (var i=0; i<tids.length; i++) {
var t=tids[i].title;
if (t!=where&&t.indexOf(where)==0) {
if(cls!="$"+"1") {
out+='{{'+cls+'{';
if (cls=="accu") out+='<<slider "chkPlayer'+t+'" "'+t+'" "play" "click to play">><br/>';
else out+='[['+t+']]<br />';
}
out+='<<tiddler "' + t + '">>';
if(cls!="$"+"1") out+='}}}';
}
}
if ("$2"!="$"+"2") out+='{{'+cls+'More{read more on... $2}}}';
return out;
</script>
<script>
if ("$1"!="$"+"1") return "<<tiddler '$1'>>";
</script>
/***
|Name|GotoPlugin|
|Source|http://www.TiddlyTools.com/#GotoPlugin|
|Documentation|http://www.TiddlyTools.com/#GotoPluginInfo|
|Version|1.9.2|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|view any tiddler by entering it's title - displays list of possible matches|
''View a tiddler by typing its title and pressing //enter//.'' As you type, a list of possible matches is displayed. You can scroll-and-click (or use arrows+enter) to select/view a tiddler, or press escape to close the listbox to resume typing. When the listbox is not displayed, pressing //escape// clears the current input.
!!!Documentation
>see [[GotoPluginInfo]]
!!!Configuration
<<<
*Match titles only after {{twochar{<<option txtIncrementalSearchMin>>}}} or more characters are entered.<br>Use down-arrow to start matching with shorter input. //Note: This option value is also set/used by [[SearchOptionsPlugin]]//.
*To set the maximum height of the listbox, you can create a tiddler tagged with <<tag systemConfig>>, containing:
//{{{
config.macros.gotoTiddler.listMaxSize=10; // change this number
//}}}
<<<
!!!Revisions
<<<
2009.05.22 [1.9.2] use reverseLookup() for IncludePlugin
|please see [[GotoPluginInfo]] for additional revision details|
2006.05.05 [0.0.0] started
<<<
!!!Code
***/
//{{{
version.extensions.GotoPlugin= {major: 1, minor: 9, revision: 2, date: new Date(2009,5,22)};
// automatically tweak shadow SideBarOptions to add <<gotoTiddler>> macro above <<search>>
config.shadowTiddlers.SideBarOptions=config.shadowTiddlers.SideBarOptions.replace(/<<search>>/,"{{button{goto}}}\n<<gotoTiddler>><<search>>");
if (config.options.txtIncrementalSearchMin===undefined) config.options.txtIncrementalSearchMin=3;
config.macros.gotoTiddler= {
listMaxSize: 10,
listHeading: 'Found %0 matching title%1...',
searchItem: "Search for '%0'...",
handler:
function(place,macroName,params,wikifier,paramString,tiddler) {
var quiet =params.contains("quiet");
var showlist =params.contains("showlist");
var search =params.contains("search");
params = paramString.parseParams("anon",null,true,false,false);
var instyle =getParam(params,"inputstyle","");
var liststyle =getParam(params,"liststyle","");
var filter =getParam(params,"filter","");
var html=this.html;
var keyevent=window.event?"onkeydown":"onkeypress"; // IE event fixup for ESC handling
html=html.replace(/%keyevent%/g,keyevent);
html=html.replace(/%search%/g,search);
html=html.replace(/%quiet%/g,quiet);
html=html.replace(/%showlist%/g,showlist);
html=html.replace(/%display%/g,showlist?'block':'none');
html=html.replace(/%position%/g,showlist?'static':'absolute');
html=html.replace(/%instyle%/g,instyle);
html=html.replace(/%liststyle%/g,liststyle);
html=html.replace(/%filter%/g,filter);
if (config.browser.isIE) html=this.IEtableFixup.format([html]);
var span=createTiddlyElement(place,'span');
span.innerHTML=html; var form=span.getElementsByTagName("form")[0];
if (showlist) this.fillList(form.list,'',filter,search,0);
},
html:
'<form onsubmit="return false" style="display:inline;margin:0;padding:0">\
<input name=gotoTiddler type=text autocomplete="off" accesskey="G" style="width:%instyle%"\
title="Enter title text... ENTER=goto, SHIFT-ENTER=search for text, DOWN=select from list"\
onfocus="this.select(); this.setAttribute(\'accesskey\',\'G\');"\
%keyevent%="return config.macros.gotoTiddler.inputEscKeyHandler(event,this,this.form.list,%search%,%showlist%);"\
onkeyup="return config.macros.gotoTiddler.inputKeyHandler(event,this,%quiet%,%search%,%showlist%);">\
<select name=list style="display:%display%;position:%position%;%liststyle%"\
onchange="if (!this.selectedIndex) this.selectedIndex=1;"\
onblur="this.style.display=%showlist%?\'block\':\'none\';"\
%keyevent%="return config.macros.gotoTiddler.selectKeyHandler(event,this,this.form.gotoTiddler,%showlist%);"\
onclick="return config.macros.gotoTiddler.processItem(this.value,this.form.gotoTiddler,this,%showlist%);">\
</select><input name="filter" type="hidden" value="%filter%">\
</form>',
IEtableFixup:
"<table style='width:100%;display:inline;padding:0;margin:0;border:0;'>\
<tr style='padding:0;margin:0;border:0;'><td style='padding:0;margin:0;border:0;'>\
%0</td></tr></table>",
getItems:
function(list,val,filter) {
if (!list.cache || !list.cache.length || val.length<=config.options.txtIncrementalSearchMin) {
// starting new search, fetch and cache list of tiddlers/shadows/tags
list.cache=new Array();
if (filter.length) {
var fn=store.getMatchingTiddlers||store.getTaggedTiddlers;
var tiddlers=store.sortTiddlers(fn.apply(store,[filter]),'title');
} else
var tiddlers=store.reverseLookup('tags','excludeLists');
for(var t=0; t<tiddlers.length; t++) list.cache.push(tiddlers[t].title);
if (!filter.length) {
for (var t in config.shadowTiddlers) list.cache.pushUnique(t);
var tags=store.getTags();
for(var t=0; t<tags.length; t++) list.cache.pushUnique(tags[t][0]);
}
}
var found = [];
var match=val.toLowerCase();
for(var i=0; i<list.cache.length; i++)
if (list.cache[i].toLowerCase().indexOf(match)!=-1) found.push(list.cache[i]);
return found;
},
getItemSuffix:
function(t) {
if (store.tiddlerExists(t)) return ""; // tiddler
if (store.isShadowTiddler(t)) return " (shadow)"; // shadow
return " (tag)"; // tag
},
fillList:
function(list,val,filter,search,key) {
if (list.style.display=="none") return; // not visible... do nothing!
var indent='\xa0\xa0\xa0';
var found = this.getItems(list,val,filter); // find matching items...
found.sort(); // alpha by title
while (list.length > 0) list.options[0]=null; // clear list
var hdr=this.listHeading.format([found.length,found.length==1?"":"s"]);
list.options[0]=new Option(hdr,"",false,false);
for (var t=0; t<found.length; t++) list.options[list.length]=
new Option(indent+found[t]+this.getItemSuffix(found[t]),found[t],false,false);
if (search)
list.options[list.length]=new Option(this.searchItem.format([val]),"*",false,false);
list.size=(list.length<this.listMaxSize?list.length:this.listMaxSize); // resize list...
list.selectedIndex=key==38?list.length-1:key==40?1:0;
},
keyProcessed:
function(ev) { // utility function
ev.cancelBubble=true; // IE4+
try{event.keyCode=0;}catch(e){}; // IE5
if (window.event) ev.returnValue=false; // IE6
if (ev.preventDefault) ev.preventDefault(); // moz/opera/konqueror
if (ev.stopPropagation) ev.stopPropagation(); // all
return false;
},
inputEscKeyHandler:
function(event,here,list,search,showlist) {
if (event.keyCode==27) {
if (showlist) { // clear input, reset list
here.value=here.defaultValue;
this.fillList(list,'',here.form.filter.value,search,0);
}
else if (list.style.display=="none") // clear input
here.value=here.defaultValue;
else list.style.display="none"; // hide list
return this.keyProcessed(event);
}
return true; // key bubbles up
},
inputKeyHandler:
function(event,here,quiet,search,showlist) {
var key=event.keyCode;
var list=here.form.list;
var filter=here.form.filter;
// non-printing chars bubble up, except for a few:
if (key<48) switch(key) {
// backspace=8, enter=13, space=32, up=38, down=40, delete=46
case 8: case 13: case 32: case 38: case 40: case 46: break; default: return true;
}
// blank input... if down/enter... fall through (list all)... else, and hide or reset list
if (!here.value.length && !(key==40 || key==13)) {
if (showlist) this.fillList(here.form.list,'',here.form.filter.value,search,0);
else list.style.display="none";
return this.keyProcessed(event);
}
// hide list if quiet, or below input minimum (and not showlist)
list.style.display=(!showlist&&(quiet||here.value.length<config.options.txtIncrementalSearchMin))?'none':'block';
// non-blank input... enter=show/create tiddler, SHIFT-enter=search for text
if (key==13 && here.value.length) return this.processItem(event.shiftKey?'*':here.value,here,list,showlist);
// up or down key, or enter with blank input... shows and moves to list...
if (key==38 || key==40 || key==13) { list.style.display="block"; list.focus(); }
this.fillList(list,here.value,filter.value,search,key);
return true; // key bubbles up
},
selectKeyHandler:
function(event,list,editfield,showlist) {
if (event.keyCode==27) // escape... hide list, move to edit field
{ editfield.focus(); list.style.display=showlist?'block':'none'; return this.keyProcessed(event); }
if (event.keyCode==13 && list.value.length) // enter... view selected item
{ this.processItem(list.value,editfield,list,showlist); return this.keyProcessed(event); }
return true; // key bubbles up
},
processItem:
function(title,here,list,showlist) {
if (!title.length) return;
list.style.display=showlist?'block':'none';
if (title=="*") { story.search(here.value); return false; } // do full-text search
if (!showlist) here.value=title;
story.displayTiddler(null,title); // show selected tiddler
return false;
}
}
//}}}
Background: #fff
Foreground: #000
PrimaryPale: #eee
PrimaryLight: #999
PrimaryMid: #333
PrimaryDark: #014
SecondaryPale: #eee
SecondaryLight: #999
SecondaryMid: #333
SecondaryDark: #014
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #bbb
Error: #f88
Name: HawkColors
Background: #ffffff
Foreground: #000033
PrimaryPale: #e5edf4
PrimaryLight: #679DC2
PrimaryMid: #005B99
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #FFA02F
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/***
|Name:|HideWhenPlugin|
|Description:|Allows conditional inclusion/exclusion in templates|
|Version:|3.1 ($Rev: 3919 $)|
|Date:|$Date: 2008-03-13 02:03:12 +1000 (Thu, 13 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#HideWhenPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
For use in ViewTemplate and EditTemplate. Example usage:
{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}
{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}
***/
//{{{
window.hideWhenLastTest = false;
window.removeElementWhen = function(test,place) {
window.hideWhenLastTest = test;
if (test) {
removeChildren(place);
place.parentNode.removeChild(place);
}
};
merge(config.macros,{
hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( eval(paramString), place);
}},
showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !eval(paramString), place);
}},
hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.tags.containsAll(params), place);
}},
showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !tiddler.tags.containsAll(params), place);
}},
hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.tags.containsAny(params), place);
}},
showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !tiddler.tags.containsAny(params), place);
}},
hideWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.tags.containsAll(params), place);
}},
showWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !tiddler.tags.containsAll(params), place);
}},
hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place);
}},
showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place);
}},
hideWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.title == params[0], place);
}},
showWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( tiddler.title != params[0], place);
}},
'else': { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
removeElementWhen( !window.hideWhenLastTest, place);
}}
});
//}}}
/***
|Name|HoverMenuPlugin|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#HoverMenuPlugin|
|Version|1.11+|
|Requires|~TW2.x|
!Description:
Provides a hovering menu on the edge of the screen for commonly used commands, that scrolls with the page.
!Code
THIS IS A MODIFIED VERSION!!!
***/
//{{{
config.hoverMenu={};
config.hoverMenu.settings={
align: 'right', //align menu to 'right' or 'left' side of screen
x: 4, //horizontal menu distance to side of screen
y: 100 //vertical menu distance to top of screen
}
config.hoverMenu.handler=function(){
if (!document.getElementById("hoverMenu")){
var theMenu = createTiddlyElement(document.getElementById("contentWrapper"), "div","hoverMenu");
theMenu.setAttribute("refresh","content");
theMenu.setAttribute("tiddler","HoverMenu");
var menuContent = store.getTiddlerText("HoverMenu");
wikify(menuContent,theMenu);
}
var Xloc = this.settings.x;
Yloc =this.settings.y;
var ns = (navigator.appName.indexOf("Netscape") != -1);
function SetMenu(id){
var GetElements=document.getElementById?document.getElementById(id):document.all?document.all[id]:document.layers[id];
if(document.layers)GetElements.style=GetElements;
GetElements.sP=function(x,y){this.style[config.hoverMenu.settings.align]=x +"px";this.style.top=y +"px";};
GetElements.x = Xloc;
GetElements.y = findScrollY();
GetElements.y += Yloc;
return GetElements;
}
window.LoCate_XY=function(){
var pY = findScrollY();
ftlObj.y += (pY + Yloc - ftlObj.y)/15;
ftlObj.sP(ftlObj.x, ftlObj.y);
setTimeout("LoCate_XY()", 10);
}
ftlObj = SetMenu("hoverMenu");
LoCate_XY();
}
window.old_lewcid_hovermenu_restart = restart;
restart = function(){
window.old_lewcid_hovermenu_restart();
config.hoverMenu.handler();
}
setStylesheet(
"#hoverMenu .button, #hoverMenu .tiddlyLink {border:1px solid #AAA; font-weight:bold; background-color:#EEE; color:#666;padding:1px 5px 1px 3px;float:right;}\n"+
"#hoverMenu .button:hover, #hoverMenu .tiddlyLink:hover {border:1px solid #666; color:#fff; background:#000;}\n"+
"#hoverMenu .button {width:100%; text-align:center}"+
"#hoverMenu {position:absolute; width:7px;}\n"+
"\n","hoverMenuStyles");
config.macros.renameButton={};
config.macros.renameButton.handler = function(place,macroName,params,wikifier,paramString,tiddler){
if (place.lastChild.tagName!="BR"){
place.lastChild.firstChild.data = params[0];
if (params[1]) place.lastChild.title = params[1];
}
}
config.shadowTiddlers["HoverMenu"]="<<top>><<toggleSideBar '' '' hide>><<fullscreen F>><<jump J '' top>><<saveChanges>><<renameButton S>><<newTiddler>><<renameButton N>><<fontSize>>";
config.macros.toggleSideBar={};
config.macros.toggleSideBar.settings={
styleHide : "#sidebar { display: none;}\n"+"#contentWrapper #displayArea { margin-right: 2em;}\n"+"",
styleShow : " ",
arrow1: "<",
arrow2: ">"
};
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");
this.firstChild.data= (this.firstChild.data).replace(settings.arrow1,settings.arrow2);
}
else {
setStylesheet(settings.styleHide,"ToggleSideBarStyles");
sidebar.setAttribute("toggle","hide");
this.firstChild.data= (this.firstChild.data).replace(settings.arrow2,settings.arrow1);
}
return false;
}
setStylesheet(".HideSideBarButton .button {font-weight:bold; padding: 0 5px;}\n","ToggleSideBarButtonStyles");
config.macros.top={};
config.macros.top.handler=function(place,macroName){createTiddlyButton(place,"^","jump to top",this.onclick);}
config.macros.top.onclick=function(){window.scrollTo(0,0);};
config.commands.top ={text:" ^ ",tooltip:"jump to top"};
config.commands.top.handler = function(event,src,title){window.scrollTo(0,0);}
config.macros.jump= {};
config.macros.jump.handler = function (place,macroName,params,wikifier,paramString,tiddler){
var label = (params[0] && params[0]!=".")? params[0]: 'jump';
var tooltip = (params[1] && params[1]!=".")? params[1]: 'jump to an open tiddler';
var top = (params[2] && params[2]=='top') ? true: false;
var btn =createTiddlyButton(place,label,tooltip,this.onclick);
if (top==true) btn.setAttribute("top","true");
}
config.macros.jump.onclick = function(e){
if (!e) var e = window.event;
var theTarget = resolveTarget(e);
var top = theTarget.getAttribute("top");
var popup = Popup.create(this);
if(popup){
if(top=="true"){
createTiddlyButton(createTiddlyElement(popup,"li"),'Top ↑','Top of TW',config.macros.jump.top);
createTiddlyElement(popup,"hr");
}
story.forEachTiddler(function(title,element){createTiddlyLink(createTiddlyElement(popup,"li"),title,true);});}
Popup.show(popup,false);
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
return false;
}
config.macros.jump.top = function(){window.scrollTo(0,0);}
Popup.show = function(unused,slowly){
var curr = Popup.stack[Popup.stack.length-1];
var rootLeft = findPosX(curr.root);
var rootTop = findPosY(curr.root);
var rootHeight = curr.root.offsetHeight;
var popupLeft = rootLeft;
var popupTop = rootTop + rootHeight;
var popupWidth = curr.popup.offsetWidth;
var winWidth = findWindowWidth();
if (isChild(curr.root,'hoverMenu'))var x = config.hoverMenu.settings.x;
else var x = 0;
if(popupLeft + popupWidth+x > winWidth)popupLeft = winWidth - popupWidth -x;
if (isChild(curr.root,'hoverMenu')) curr.popup.style.right = x + "px";
else curr.popup.style.left = popupLeft + "px";
curr.popup.style.top = popupTop + "px";
curr.popup.style.display = "block";
addClass(curr.root,"highlight");
if(config.options.chkAnimate) anim.startAnimating(new Scroller(curr.popup,slowly));
else window.scrollTo(0,ensureVisible(curr.popup));
}
window.isChild = function(e,parentId) {
while (e != null) {
var parent = document.getElementById(parentId);
if (parent == e) return true;
e = e.parentNode;
}
return false;
}
var lewcidFullScreen = false;
config.commands.fullscreen = {text:"↕",tooltip:"Fullscreen mode"};
config.commands.fullscreen.handler = function (event,src,title){
if (lewcidFullScreen == false){
lewcidFullScreen = true;
setStylesheet('#sidebar, .header, #mainMenu{display:none;} #displayArea{margin:0em 0 0 0 !important;}',"lewcidFullScreenStyle");
}
else{
lewcidFullScreen = false;
setStylesheet(' ',"lewcidFullScreenStyle");
}
}
config.macros.fullscreen={};
config.macros.fullscreen.handler = function(place,macroName,params,wikifier,paramString,tiddler){
var label = params[0]||" ↕ ";
var tooltip = params[1]||"Fullscreen mode";
createTiddlyButton(place,label,tooltip,config.commands.fullscreen.handler);
}
var lewcid_fullscreen_closeTiddler = Story.prototype.closeTiddler;
Story.prototype.closeTiddler =function(title,animate,slowly){
lewcid_fullscreen_closeTiddler.apply(this,arguments);
if (story.isEmpty() && lewcidFullScreen == true) config.commands.fullscreen.handler();
}
Slider.prototype.lewcidStop = Slider.prototype.stop;
Slider.prototype.stop = function(){
this.lewcidStop();
if (story.isEmpty() && lewcidFullScreen == true) config.commands.fullscreen.handler();
}
//}}}
/***
|Name|''fontSize''|h
|Author|[[Saq Imtiaz]]|
|Version|1.0|
|Description|Resize tiddler text on the fly. The text size is remembered between sessions by use of a cookie.|
|Source|http://lewcid.googlepages.com/lewcid.html#FontSizePlugin|
|TW Version|2.x|
***/
//{{{
config.fontSize={};
//configuration settings
config.fontSize.settings ={
defaultSize : 100, // all sizes in %
maxSize : 200,
minSize : 40,
stepSize : 10
}
//startup code
var fontSettings = config.fontSize.settings;
if (!config.options.txtFontSize) {config.options.txtFontSize = fontSettings.defaultSize;
saveOptionCookie("txtFontSize");
}
setStylesheet(".tiddler .viewer {font-size:"+config.options.txtFontSize+"%;}\n.fontResizer {display:block;position:relative;top:10px;}","fontResizer");
//macro
config.macros.fontSize={};
config.macros.fontSize.handler = function (place,macroName,params,wikifier,paramString,tiddler){
var sp = createTiddlyElement(place,"span",null,"fontResizer");
sp.ondblclick=this.onDblClick;
if (params[0]) createTiddlyText(sp,params[0]);
createTiddlyButton(sp,"+","increase font-size",this.incFont);
createTiddlyButton(sp,"=","reset font-size",this.resetFont);
createTiddlyButton(sp,"–","decrease font-size",this.decFont);
}
config.macros.fontSize.onDblClick = function (e){
if (!e) var e = window.event;
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
return false;
}
config.macros.fontSize.setFont = function (){
saveOptionCookie("txtFontSize");
setStylesheet(".tiddler .viewer {font-size:"+config.options.txtFontSize+"%;}\n","fontResizerStyles");
}
config.macros.fontSize.incFont=function(){
if (config.options.txtFontSize < fontSettings.maxSize)
config.options.txtFontSize = (config.options.txtFontSize*1)+fontSettings.stepSize;
config.macros.fontSize.setFont();
}
config.macros.fontSize.decFont=function(){
if (config.options.txtFontSize > fontSettings.minSize)
config.options.txtFontSize = (config.options.txtFontSize*1) - fontSettings.stepSize;
config.macros.fontSize.setFont();
}
config.macros.fontSize.resetFont=function(){
config.options.txtFontSize=fontSettings.defaultSize;
config.macros.fontSize.setFont();
}
config.paramifiers.font ={
onstart: function(v){
config.options.txtFontSize = v;
config.macros.fontSize.setFont();
}
}
//}}}
!usage
{{{[img[ImgTopMenu]]}}}
[img[ImgTopMenu]]
!notes
//none//
!type
image/png
!file
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAdCAMAAABc3/ZbAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFAAAABgsPDRcfFCMvGy4+IjpOKUZeMFJuNl19AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGz1BwgAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAAABtJREFUGFdjYCAaMDIwMTAzsDCwMrAxsDNwAAABBgAlMS+ngAAAAABJRU5ErkJggg==
!usage
{{{[img[TreeOfLife]]}}}
[img[TreeOfLife]]
!notes
//none//
!type
image/jpeg
!file
!url
!data
data:image/jpeg;base64,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
On Donnerstag, 24. September 2009 03:54:29, TB imported 1 tiddler from
[[C:\xTiddle\bck_tiddlyspot\mjuzik\mjuzik.html|C:\xTiddle\bck_tiddlyspot\mjuzik\mjuzik.html]]:
<<<
#[[All Videos]] - added
<<<
/***
|Name|InlineJavascriptPlugin|
|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|
|Documentation|http://www.TiddlyTools.com/#InlineJavascriptPluginInfo|
|Version|1.9.5|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|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
<<<
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
|please see [[InlineJavascriptPluginInfo]] for additional revision details|
2005.11.08 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.InlineJavascriptPlugin= {major: 1, minor: 9, revision: 5, date: new Date(2009,4,11)};
config.formatters.push( {
name: "inlineJavascript",
match: "\\<script",
lookahead: "\\<script(?: src=\\\"((?:.|\\n)*?)\\\")?(?: label=\\\"((?:.|\\n)*?)\\\")?(?: title=\\\"((?:.|\\n)*?)\\\")?(?: key=\\\"((?:.|\\n)*?)\\\")?( 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(/^#/,'')); } }
//}}}
All [[inline scripts|InlineJavascriptPlugin]] are tagging here...
<<tagglyTagging>>
<<tiddler Video with: 5606758>>
As found [[here|http://www.cedar-chiropractic.com/#FunLinks%20%5B%5Bmy%20waiting%20room%20aquarium%5D%5D]].
/***
|Name:|LessBackupsPlugin|
|Description:|Intelligently limit the number of backup files you create|
|Version:|3.0.1 ($Rev: 2320 $)|
|Date:|$Date: 2007-06-18 22:37:46 +1000 (Mon, 18 Jun 2007) $|
|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));
}
//}}}
/%
|Name|ListRating|
|Source|http://lastfm.tiddlyspot.com/#ListRating|
|Version|0.0.1|
|Author|TobiasBeer|
|''License''|[[Creative Commons Attribution-Share Alike 3.0|http://creativecommons.org/licenses/by-sa/3.0/]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|gets a list of tiddlers with a given rating, see RatingMacro|
Usage: <<tiddler ListRating with:rate>>
%/<script>
var getRate='$1';
var pre='$2';
if(pre=='$'+'2') pre='';
var sep='$3';if(sep=='$'+'3') sep='<br/>';
var tids=window.store.getTiddlers('modified').reverse();
var cats=config.macros.rating.ratings;
var rNum=parseInt(getRate);
if (getRate=='$'+'1'||isNaN(rNum)||rNum<0||rNum>cats.length-1) getRate=(cats.length-1).toString();
var out='';
for (var t=0;t<tids.length; t++) {
var rate = store.getValue(tids[t],"rating");
if (rate==undefined) rate="0";
if (rate==getRate) {
out+="[["+pre+tids[t].title+"|"+tids[t].title+"]]"+sep;
}
}
return out;
</script>
/***
|''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);
}
//}}}
<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
<style type="text/css">#contentWrapper {display:none;}</style><div id="splashscreen" style="border: 1px solid #DDD; display:block; text-align:center; width:500px; margin:100px auto; padding:30px; color:white; font-size:24px; background-color:#CCC;">inspired<span style="font-size:0.8em; margin-left:20px;">by tiddlywiki</span><br style="margin-bottom:20px"><span style="font-size: 12px;color:#A66;">requires javascript</span></div>
//{{{
config.options.txtFadeTimer = 5000; // 5 seconds
function displayMessage(text,linkText,fadeTimer) {
var e = getMessageDiv();
if(!e) {
alert(text);
return;
}
if(linkText) {
var link = createTiddlyElement(e,"a",null,null,text);
link.href = linkText;
link.target = "_blank";
} else {
e.appendChild(document.createTextNode(text));
}
if(config.options.txtFadeTimer > 0) {
setTimeout(clearMessage, config.options.txtFadeTimer);
}
}
//}}}
Mostly plugins modified by me...
<<tagglyTagging>>
Name: MptwSmoke
Background: #fff
Foreground: #000
PrimaryPale: #aaa
PrimaryLight: #777
PrimaryMid: #111
PrimaryDark: #000
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/***
|Name|NestedSlidersPlugin|
|Source|http://www.TiddlyTools.com/#NestedSlidersPlugin|
|Documentation|http://www.TiddlyTools.com/#NestedSlidersPluginInfo|
|Version|2.4.9|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Options|##Configuration|
|Description|show content in nest-able sliding/floating panels, without creating separate tiddlers for each panel's content|
!!!!!Documentation
>see [[NestedSlidersPluginInfo]]
!!!!!Configuration
<<<
<<option chkFloatingSlidersAnimate>> allow floating sliders to animate when opening/closing
>Note: This setting can cause 'clipping' problems in some versions of InternetExplorer.
>In addition, for floating slider animation to occur you must also allow animation in general (see [[AdvancedOptions]]).
<<<
!!!!!Revisions
<<<
2008.11.15 - 2.4.9 in adjustNestedSlider(), don't make adjustments if panel is marked as 'undocked' (CSS class). In onClickNestedSlider(), SHIFT-CLICK docks panel (see [[MoveablePanelPlugin]])
|please see [[NestedSlidersPluginInfo]] for additional revision details|
2005.11.03 - 1.0.0 initial public release. Thanks to RodneyGomes, GeoffSlocock, and PaulPetterson for suggestions and experiments.
<<<
!!!!!Code
***/
//{{{
version.extensions.NestedSlidersPlugin= {major: 2, minor: 4, revision: 9, date: new Date(2008,11,15)};
// options for deferred rendering of sliders that are not initially displayed
if (config.options.chkFloatingSlidersAnimate===undefined)
config.options.chkFloatingSlidersAnimate=false; // avoid clipping problems in IE
// default styles for 'floating' class
setStylesheet(".floatingPanel { position:absolute; z-index:10; padding:0.5em; margin:0em; \
background-color:#eee; color:#000; border:1px solid #000; text-align:left; }","floatingPanelStylesheet");
// if removeCookie() function is not defined by TW core, define it here.
if (window.removeCookie===undefined) {
window.removeCookie=function(name) {
document.cookie = name+'=; expires=Thu, 01-Jan-1970 00:00:01 UTC; path=/;';
}
}
config.formatters.push( {
name: "nestedSliders",
match: "\\n?\\+{3}",
terminator: "\\s*\\={3}\\n?",
lookahead: "\\n?\\+{3}(\\+)?(\\([^\\)]*\\))?(\\!*)?(\\^(?:[^\\^\\*\\@\\[\\>]*\\^)?)?(\\*)?(\\@)?(?:\\{\\{([\\w]+[\\s\\w]*)\\{)?(\\[[^\\]]*\\])?(\\[[^\\]]*\\])?(?:\\}{3})?(\\#[^:]*\\:)?(\\>)?(\\.\\.\\.)?\\s*",
handler: function(w)
{
lookaheadRegExp = new RegExp(this.lookahead,"mg");
lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
{
var defopen=lookaheadMatch[1];
var cookiename=lookaheadMatch[2];
var header=lookaheadMatch[3];
var panelwidth=lookaheadMatch[4];
var transient=lookaheadMatch[5];
var hover=lookaheadMatch[6];
var buttonClass=lookaheadMatch[7];
var label=lookaheadMatch[8];
var openlabel=lookaheadMatch[9];
var panelID=lookaheadMatch[10];
var blockquote=lookaheadMatch[11];
var deferred=lookaheadMatch[12];
// location for rendering button and panel
var place=w.output;
// default to closed, no cookie, no accesskey, no alternate text/tip
var show="none"; var cookie=""; var key="";
var closedtext=">"; var closedtip="";
var openedtext="<"; var openedtip="";
// extra "+", default to open
if (defopen) show="block";
// cookie, use saved open/closed state
if (cookiename) {
cookie=cookiename.trim().slice(1,-1);
cookie="chkSlider"+cookie;
if (config.options[cookie]==undefined)
{ config.options[cookie] = (show=="block") }
show=config.options[cookie]?"block":"none";
}
// parse label/tooltip/accesskey: [label=X|tooltip]
if (label) {
var parts=label.trim().slice(1,-1).split("|");
closedtext=parts.shift();
if (closedtext.substr(closedtext.length-2,1)=="=")
{ key=closedtext.substr(closedtext.length-1,1); closedtext=closedtext.slice(0,-2); }
openedtext=closedtext;
if (parts.length) closedtip=openedtip=parts.join("|");
else { closedtip="show "+closedtext; openedtip="hide "+closedtext; }
}
// parse alternate label/tooltip: [label|tooltip]
if (openlabel) {
var parts=openlabel.trim().slice(1,-1).split("|");
openedtext=parts.shift();
if (parts.length) openedtip=parts.join("|");
else openedtip="hide "+openedtext;
}
var title=show=='block'?openedtext:closedtext;
var tooltip=show=='block'?openedtip:closedtip;
// create the button
if (header) { // use "Hn" header format instead of button/link
var lvl=(header.length>5)?5:header.length;
var btn = createTiddlyElement(createTiddlyElement(place,"h"+lvl,null,null,null),"a",null,buttonClass,title);
btn.onclick=onClickNestedSlider;
btn.setAttribute("href","javascript:;");
btn.setAttribute("title",tooltip);
}
else
var btn = createTiddlyButton(place,title,tooltip,onClickNestedSlider,buttonClass);
btn.innerHTML=title; // enables use of HTML entities in label
// set extra button attributes
btn.setAttribute("closedtext",closedtext);
btn.setAttribute("closedtip",closedtip);
btn.setAttribute("openedtext",openedtext);
btn.setAttribute("openedtip",openedtip);
btn.sliderCookie = cookie; // save the cookiename (if any) in the button object
btn.defOpen=defopen!=null; // save default open/closed state (boolean)
btn.keyparam=key; // save the access key letter ("" if none)
if (key.length) {
btn.setAttribute("accessKey",key); // init access key
btn.onfocus=function(){this.setAttribute("accessKey",this.keyparam);}; // **reclaim** access key on focus
}
btn.setAttribute("hover",hover?"true":"false");
btn.onmouseover=function(ev) {
// optional 'open on hover' handling
if (this.getAttribute("hover")=="true" && this.sliderPanel.style.display=='none') {
document.onclick.call(document,ev); // close transients
onClickNestedSlider(ev); // open this slider
}
// mouseover on button aligns floater position with button
if (window.adjustSliderPos) window.adjustSliderPos(this.parentNode,this,this.sliderPanel);
}
// create slider panel
var panelClass=panelwidth?"floatingPanel":"sliderPanel";
if (panelID) panelID=panelID.slice(1,-1); // trim off delimiters
var panel=createTiddlyElement(place,"div",panelID,panelClass,null);
panel.button = btn; // so the slider panel know which button it belongs to
btn.sliderPanel=panel; // so the button knows which slider panel it belongs to
panel.defaultPanelWidth=(panelwidth && panelwidth.length>2)?panelwidth.slice(1,-1):"";
panel.setAttribute("transient",transient=="*"?"true":"false");
panel.style.display = show;
panel.style.width=panel.defaultPanelWidth;
panel.onmouseover=function(event) // mouseover on panel aligns floater position with button
{ if (window.adjustSliderPos) window.adjustSliderPos(this.parentNode,this.button,this); }
// render slider (or defer until shown)
w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
if ((show=="block")||!deferred) {
// render now if panel is supposed to be shown or NOT deferred rendering
w.subWikify(blockquote?createTiddlyElement(panel,"blockquote"):panel,this.terminator);
// align floater position with button
if (window.adjustSliderPos) window.adjustSliderPos(place,btn,panel);
}
else {
var src = w.source.substr(w.nextMatch);
var endpos=findMatchingDelimiter(src,"+++","===");
panel.setAttribute("raw",src.substr(0,endpos));
panel.setAttribute("blockquote",blockquote?"true":"false");
panel.setAttribute("rendered","false");
w.nextMatch += endpos+3;
if (w.source.substr(w.nextMatch,1)=="\n") w.nextMatch++;
}
}
}
}
)
function findMatchingDelimiter(src,starttext,endtext) {
var startpos = 0;
var endpos = src.indexOf(endtext);
// check for nested delimiters
while (src.substring(startpos,endpos-1).indexOf(starttext)!=-1) {
// count number of nested 'starts'
var startcount=0;
var temp = src.substring(startpos,endpos-1);
var pos=temp.indexOf(starttext);
while (pos!=-1) { startcount++; pos=temp.indexOf(starttext,pos+starttext.length); }
// set up to check for additional 'starts' after adjusting endpos
startpos=endpos+endtext.length;
// find endpos for corresponding number of matching 'ends'
while (startcount && endpos!=-1) {
endpos = src.indexOf(endtext,endpos+endtext.length);
startcount--;
}
}
return (endpos==-1)?src.length:endpos;
}
//}}}
//{{{
window.onClickNestedSlider=function(e)
{
if (!e) var e = window.event;
var theTarget = resolveTarget(e);
while (theTarget && theTarget.sliderPanel==undefined) theTarget=theTarget.parentNode;
if (!theTarget) return false;
var theSlider = theTarget.sliderPanel;
var isOpen = theSlider.style.display!="none";
// if SHIFT-CLICK, dock panel first (see [[MoveablePanelPlugin]])
if (e.shiftKey && config.macros.moveablePanel) config.macros.moveablePanel.dock(theSlider,e);
// toggle label
theTarget.innerHTML=isOpen?theTarget.getAttribute("closedText"):theTarget.getAttribute("openedText");
// toggle tooltip
theTarget.setAttribute("title",isOpen?theTarget.getAttribute("closedTip"):theTarget.getAttribute("openedTip"));
// deferred rendering (if needed)
if (theSlider.getAttribute("rendered")=="false") {
var place=theSlider;
if (theSlider.getAttribute("blockquote")=="true")
place=createTiddlyElement(place,"blockquote");
wikify(theSlider.getAttribute("raw"),place);
theSlider.setAttribute("rendered","true");
}
// show/hide the slider
if(config.options.chkAnimate && (!hasClass(theSlider,'floatingPanel') || config.options.chkFloatingSlidersAnimate))
anim.startAnimating(new Slider(theSlider,!isOpen,e.shiftKey || e.altKey,"none"));
else
theSlider.style.display = isOpen ? "none" : "block";
// reset to default width (might have been changed via plugin code)
theSlider.style.width=theSlider.defaultPanelWidth;
// align floater panel position with target button
if (!isOpen && window.adjustSliderPos) window.adjustSliderPos(theSlider.parentNode,theTarget,theSlider);
// if showing panel, set focus to first 'focus-able' element in panel
if (theSlider.style.display!="none") {
var ctrls=theSlider.getElementsByTagName("*");
for (var c=0; c<ctrls.length; c++) {
var t=ctrls[c].tagName.toLowerCase();
if ((t=="input" && ctrls[c].type!="hidden") || t=="textarea" || t=="select")
{ try{ ctrls[c].focus(); } catch(err){;} break; }
}
}
var cookie=theTarget.sliderCookie;
if (cookie && cookie.length) {
config.options[cookie]=!isOpen;
if (config.options[cookie]!=theTarget.defOpen) window.saveOptionCookie(cookie);
else window.removeCookie(cookie); // remove cookie if slider is in default display state
}
// prevent SHIFT-CLICK from being processed by browser (opens blank window... yuck!)
// prevent clicks *within* a slider button from being processed by browser
// but allow plain click to bubble up to page background (to close transients, if any)
if (e.shiftKey || theTarget!=resolveTarget(e))
{ e.cancelBubble=true; if (e.stopPropagation) e.stopPropagation(); }
Popup.remove(); // close open popup (if any)
return false;
}
//}}}
//{{{
// click in document background closes transient panels
document.nestedSliders_savedOnClick=document.onclick;
document.onclick=function(ev) { if (!ev) var ev=window.event; var target=resolveTarget(ev);
if (document.nestedSliders_savedOnClick)
var retval=document.nestedSliders_savedOnClick.apply(this,arguments);
// if click was inside a popup... leave transient panels alone
var p=target; while (p) if (hasClass(p,"popup")) break; else p=p.parentNode;
if (p) return retval;
// if click was inside transient panel (or something contained by a transient panel), leave it alone
var p=target; while (p) {
if ((hasClass(p,"floatingPanel")||hasClass(p,"sliderPanel"))&&p.getAttribute("transient")=="true") break;
p=p.parentNode;
}
if (p) return retval;
// otherwise, find and close all transient panels...
var all=document.all?document.all:document.getElementsByTagName("DIV");
for (var i=0; i<all.length; i++) {
// if it is not a transient panel, or the click was on the button that opened this panel, don't close it.
if (all[i].getAttribute("transient")!="true" || all[i].button==target) continue;
// otherwise, if the panel is currently visible, close it by clicking it's button
if (all[i].style.display!="none") window.onClickNestedSlider({target:all[i].button})
if (!hasClass(all[i],"floatingPanel")&&!hasClass(all[i],"sliderPanel")) all[i].style.display="none";
}
return retval;
};
//}}}
//{{{
// adjust floating panel position based on button position
if (window.adjustSliderPos==undefined) window.adjustSliderPos=function(place,btn,panel) {
if (hasClass(panel,"floatingPanel") && !hasClass(panel,"undocked")) {
// see [[MoveablePanelPlugin]] for use of 'undocked'
var rightEdge=document.body.offsetWidth-1;
var panelWidth=panel.offsetWidth;
var left=0;
var top=btn.offsetHeight;
if (place.style.position=="relative" && findPosX(btn)+panelWidth>rightEdge) {
left-=findPosX(btn)+panelWidth-rightEdge; // shift panel relative to button
if (findPosX(btn)+left<0) left=-findPosX(btn); // stay within left edge
}
if (place.style.position!="relative") {
var left=findPosX(btn);
var top=findPosY(btn)+btn.offsetHeight;
var p=place; while (p && !hasClass(p,'floatingPanel')) p=p.parentNode;
if (p) { left-=findPosX(p); top-=findPosY(p); }
if (left+panelWidth>rightEdge) left=rightEdge-panelWidth;
if (left<0) left=0;
}
panel.style.left=left+"px"; panel.style.top=top+"px";
}
}
//}}}
//{{{
// TW2.1 and earlier:
// hijack Slider stop handler so overflow is visible after animation has completed
Slider.prototype.coreStop = Slider.prototype.stop;
Slider.prototype.stop = function()
{ this.coreStop.apply(this,arguments); this.element.style.overflow = "visible"; }
// TW2.2+
// hijack Morpher stop handler so sliderPanel/floatingPanel overflow is visible after animation has completed
if (version.major+.1*version.minor+.01*version.revision>=2.2) {
Morpher.prototype.coreStop = Morpher.prototype.stop;
Morpher.prototype.stop = function() {
this.coreStop.apply(this,arguments);
var e=this.element;
if (hasClass(e,"sliderPanel")||hasClass(e,"floatingPanel")) {
// adjust panel overflow and position after animation
e.style.overflow = "visible";
if (window.adjustSliderPos) window.adjustSliderPos(e.parentNode,e.button,e);
}
};
}
//}}}
{{right{[[mjuzikTheme]] | <<tag Site>>}}}
<<tiddler OptionsPanel>>
|wideTable|k
| option | setting |h
| username|<<option txtUserName>>|
| autosave|<<option chkAutoSave>>|
| save backups|<<option chkSaveBackups>>|
| reguar expression search|<<option chkRegExpSearch>>|
| case sensitive search|<<option chkCaseSensitiveSearch>>|
| enable animations|<<option chkAnimate>>|
|>| <<selectPalette>> <<slider chkAdvancedOptions AdvancedOptions "advanced options" "click to change advanced options">> |
| <<tiddler TspotControls>> |>|
/***
|''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"
});
*/
//}}}
Name: PaulosColors
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #04b
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #69c
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
Providing great services to music lovers...
<<tagglyTagging>>
/***
|''Name:''|~PopupMacro|
|''Author:''|Saq Imtiaz|
|''Version:''|1.0.0 (2006-05-09)|
|''Description:''|Create popups with custom content|
|''Source:''|http://tw.lewcid.org/#PopupMacro|
|''Documentation:''|http://tw.lewcid.org/#PopupMacroDocs|
|''Requires:''|TW Version 2.0.8 or better|
***/
{{{
config.macros.popup = {};
config.macros.popup.arrow = (document.all?"â–¼":"â–¾");
config.macros.popup.handler = function(place,macroName,params,wikifier,paramString,theTiddler) {
if (!params[0] || !params[1])
{createTiddlyError(place,'missing macro parameters','missing label or content parameter');
return false;};
var label = params[0];
var source = (params[1]).replace(/\$\)\)/g,">>");
var nestedId = params[2]? params[2]: 'nestedpopup';
var onclick = function(event) {
if(!event){var event = window.event;}
var theTarget = resolveTarget(event);
var nested = (!isNested(theTarget));
if ((Popup.stack.length > 1)&&(nested==true)) {Popup.removeFrom(1);}
else if(Popup.stack.length > 0 && nested==false) {Popup.removeFrom(0);};
var theId = (nested==false)? "popup" : nestedId;
var popup = createTiddlyElement(document.body,"ol",theId,"popup",null);
Popup.stack.push({root: button, popup: popup});
wikify(source,popup);
Popup.show(popup,true);
event.cancelBubble = true;
if (event.stopPropagation) event.stopPropagation();
return false;
}
var button = createTiddlyButton(place, label+this.arrow,label, onclick, null);
};
window.isNested = function(e) {
while (e != null) {
var contentWrapper = document.getElementById("contentWrapper");
if (contentWrapper == e) return true;
e = e.parentNode;
}
return false;
};
setStylesheet(
"#popup {padding:3px;}\n"+
".popup li , .popup ul, .popup ol {list-style:none !important; margin:0px; !important; font-size:100%; padding-top:0px !important; padding:0px !important;}\n"+
".popup span li , .popup span ul, .popup span ol {list-style:none !important; margin:0px !important; font-size:100%; padding-top:0px !important; padding:0px !important;}\n"+
"#nestedpopup {background:#2E5ADF; border: 1px solid #0331BF; margin-left:1em; }\n"+
"",
"CustomPopupStyles");
}}}
/***
|Name:|QuickOpenTagPlugin|
|Description:|Changes tag links to make it easier to open tags as tiddlers|
|Version:|3.0.1 ($Rev: 3861 $)|
|Date:|$Date: 2008-03-08 10:53:09 +1000 (Sat, 08 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#QuickOpenTagPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
***/
//{{{
config.quickOpenTag = {
dropdownChar: (document.all ? "\u25bc" : "\u25be"), // the little one doesn't work in IE?
createTagButton: function(place,tag,excludeTiddler) {
// little hack so we can do this: <<tag PrettyTagName|RealTagName>>
var splitTag = tag.split("|");
var pretty = tag;
if (splitTag.length == 2) {
tag = splitTag[1];
pretty = splitTag[0];
}
var sp = createTiddlyElement(place,"span",null,"quickopentag");
createTiddlyText(createTiddlyLink(sp,tag,false),pretty);
var theTag = createTiddlyButton(sp,config.quickOpenTag.dropdownChar,
config.views.wikified.tag.tooltip.format([tag]),onClickTag);
theTag.setAttribute("tag",tag);
if (excludeTiddler)
theTag.setAttribute("tiddler",excludeTiddler);
return(theTag);
},
miniTagHandler: function(place,macroName,params,wikifier,paramString,tiddler) {
var tagged = store.getTaggedTiddlers(tiddler.title);
if (tagged.length > 0) {
var theTag = createTiddlyButton(place,config.quickOpenTag.dropdownChar,
config.views.wikified.tag.tooltip.format([tiddler.title]),onClickTag);
theTag.setAttribute("tag",tiddler.title);
theTag.className = "miniTag";
}
},
allTagsHandler: function(place,macroName,params) {
var tags = store.getTags(params[0]);
var filter = params[1]; // new feature
var ul = createTiddlyElement(place,"ul");
if(tags.length == 0)
createTiddlyElement(ul,"li",null,"listTitle",this.noTags);
for(var t=0; t<tags.length; t++) {
var title = tags[t][0];
if (!filter || (title.match(new RegExp('^'+filter)))) {
var info = getTiddlyLinkInfo(title);
var theListItem =createTiddlyElement(ul,"li");
var theLink = createTiddlyLink(theListItem,tags[t][0],true);
var theCount = " (" + tags[t][1] + ")";
theLink.appendChild(document.createTextNode(theCount));
var theDropDownBtn = createTiddlyButton(theListItem," " +
config.quickOpenTag.dropdownChar,this.tooltip.format([tags[t][0]]),onClickTag);
theDropDownBtn.setAttribute("tag",tags[t][0]);
}
}
},
// todo fix these up a bit
styles: [
"/*{{{*/",
"/* created by QuickOpenTagPlugin */",
".tagglyTagged .quickopentag, .tagged .quickopentag { margin-right:1em; border:none; padding:0px 0px 0px 1px; }",
".quickopentag .tiddlyLink { padding:2px; padding-left:3px; }",
".quickopentag a.button { padding:1px; padding-left:2px; padding-right:2px;}",
"/* extra specificity to make it work right */",
"#displayArea .viewer .quickopentag a.button, ",
"#displayArea .viewer .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink, ",
"#mainMenu .quickopentag a.tiddyLink ",
" { border:0px solid black; }",
"#displayArea .viewer .quickopentag a.button, ",
"#mainMenu .quickopentag a.button ",
" { margin-left:0px; padding-left:2px; }",
"#displayArea .viewer .quickopentag a.tiddlyLink, ",
"#mainMenu .quickopentag a.tiddlyLink ",
" { margin-right:0px; padding-right:0px; padding-left:0px; margin-left:0px; }",
"a.miniTag {font-size:150%;} ",
"#mainMenu .quickopentag a.button ",
" /* looks better in right justified main menus */",
" { margin-left:0px; padding-left:2px; margin-right:0px; padding-right:0px; }",
"#topMenu .quickopentag { padding:0px; margin:0px; border:0px; }",
"#topMenu .quickopentag .tiddlyLink { padding-right:1px; margin-right:0px; }",
"#topMenu .quickopentag .button { padding-left:1px; margin-left:0px; border:0px; }",
"/*}}}*/",
""].join("\n"),
init: function() {
// we fully replace these builtins. can't hijack them easily
window.createTagButton = this.createTagButton;
config.macros.allTags.handler = this.allTagsHandler;
config.macros.miniTag = { handler: this.miniTagHandler };
config.shadowTiddlers["QuickOpenTagStyles"] = this.styles;
store.addNotification("QuickOpenTagStyles",refreshStyles);
}
}
config.quickOpenTag.init();
//}}}
|linkTable|k
|min-width:100px;padding-right:5px; Station|min-width:70px; Play |min-width:70px; Browse |h
| [[AccuRadio|http://www.accuradio.com]]| [[►|AccuRadio]] | [[¤|Browse AccuRadio]] |
| [[BBC Radio|http://www.bbc.co.uk/radio]]| [[►|Browse BBC Radio]] | [[¤|Browse BBC Radio]] |
| [[LastFM|http://www.lastfm.com]]| [[►|Browse LastFM]] | [[¤|Browse LastFM]] |
<<tagglyTagging>>
/***
|''Name:''|RatingMacro|
|''Description''|allows to rate tiddlers. e.g. via stars|
|''Version:''|0.1.0|
|''Type''|macro|
|''Author:''|[[TobiasBeer]]|
|''Info:''|http://lastfm.tiddlyspot.com/#RatingMacroInfo [[RatingMacroInfo]]|
|''Source:''|http://lastfm.tiddlyspot.com/#RatingMacro [[RatingMacro]]|
|''License''|[[Creative Commons Attribution-Share Alike 3.0|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''Feedback:''|[[here|http://groups.google.com/group/tiddlywiki/browse_frm/thread/35b6e27237f1749b]]|
|''~CoreVersion''|2.2|
Inspired by http://sinojellyempty.tiddlyspot.com/#FiveStarsPlugin
!Code
***/
//{{{
config.macros.rating = {
icon: "★",
cssClass: "rating",
tooltip: "rating: ",
ratings: ["none","poor", "below average", "average", "above average", "excellent"],
defaultStyle: ["color:"+store.getTiddlerSlice('ColorPalette','TertiaryPale')+";text-decoration:none;background:none;"],
colorOn: store.getTiddlerSlice('ColorPalette','SecondaryMid'),
colorOff: store.getTiddlerSlice('ColorPalette','SecondaryPale'),
update: function(obj,action){
//actions --> 0:refresh 1:highlight 2:save
p=obj.parentNode;
var r=obj.getAttribute("rel");
var tidName=obj.getAttribute("tiddler");
var tid=store.getTiddler(tidName);
if (tid==null) return;
if (action==2) {
tid.fields["rating"]=r;
store.setDirty(true);
tids=obj.getAttribute("update").readBracketedList();
for (i=0;i<tids.length;i++) {
story.refreshTiddler(tids[i],null,true);
refreshDisplay(tids[i]);
}
story.refreshTiddler(tidName,null,true);
}
var last=parseInt(tid.fields["rating"]||0);
for (i=1;i<this.ratings.length;i++){
p.childNodes[i].style.color=((action>0&&i<=r)||(action==0&&i<=last))?this.colorOn:this.colorOff;
}
},
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
var t=params.shift();
if (t===undefined||t=='=here') t=story.findContainingTiddler(place).getAttribute('tiddler');
var sHTML='<span title="rating" class="'+this.cssClass+'">';
for (var i=0; i<this.ratings.length; i++){
sHTML += '<a href="#" onmouseover="config.macros.rating.update(this,1)" onclick="config.macros.rating.update(this,2)" onmouseout="config.macros.rating.update(this,0)" title="'+this.tooltip+this.ratings[i]+'" rel="'+i+'" update="[['+params.join(']] [[')+']]" tiddler="'+t+'" style="'+this.defaultStyle+'">'+this.icon+'</a>';
}
place.innerHTML+=sHTML+'</span>';
this.update(place.lastChild.firstChild,0);
}
}
//}}}
/%
|Name|RatingSummary|
|Source|http://lastfm.tiddlyspot.com/#RatingSummary|
|Version|0.0.1|
|Author|TobiasBeer|
|''License''|[[Creative Commons Attribution-Share Alike 3.0|http://creativecommons.org/licenses/by-sa/3.0/]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|generates an overview of rated tiddlers, see RatingMacro|
Usage: <<tiddler GetRatingOverview with:"icons names count range[fromRating:toRating]">>
...all parameters optional, order irrelevant
%/<script>
params="$1";
var bIcons = params.indexOf("icons")>=0;
var bNames = params.indexOf("names")>=0;
var bCount = params.indexOf("count")>=0;
var bByTitle = params.indexOf("byTitle");
var range = params.split("range[");
var fromCat=1;
var toCat=-1;
if (range[1]!=undefined) {
bounds = range[1].split(":");
if (!isNaN(bounds[0])) fromCat=bounds[0];
var upper = bounds[1].split("]")[0];
if(!isNaN(upper)) toCat=upper;
}
var numCats=config.macros.rating.ratings.length-1;
toCat<0?toCat=numCats:toCat=Math.min(toCat,numCats);
fromCat=Math.max(fromCat,0);
fromCat=Math.min(fromCat,numCats);
fromCat=Math.min(fromCat,toCat);
numCols=toCat-fromCat+1;
(bByTitle==true)?tids=window.store.getTiddlers('title'):tids=window.store.getTiddlers('modified').reverse();
var cats=config.macros.rating.ratings;
var cTids=[];
for (var c=0;c<cats.length;c++) cTids[c]=[];
for (var t=0;t<tids.length; t++) {
var rate = parseInt(store.getValue(tids[t],"rating"));
if (isNaN(rate)) rate=0;
cTids[rate].push(tids[t].title);
}
var out="|"; var pre="|ratingTable"+numCols+"|k\n|";
for (var c=0;c<Math.min(cats.length,toCat+1);c++) {
switch (c) {
case 0: var sStar=cats[0];break;
case 1: sStar="";
default: sStar+=config.macros.rating.icon; break;
}
if (c>=fromCat) {
bIcons=bIcons||!bNames;
bNames?sep="<br>":sep=" ";
bIcons?sStars=sStar+sep:sStars="";
(bNames&&c>0)?sName=cats[c]+" ":sName="";
bCount?sCount=" ("+cTids[c].length.toString()+") ":sCount=" ";
hdStyle="text-align:center;width:"+Math.floor(95/numCols).toString()+"%;";
pre+=hdStyle+sStars+sName+sCount+"|";
out+='padding-left:5px;vertical-align:top;';
for (var t=0;t<cTids[c].length; t++)
out+="[["+cTids[c][t]+"]]<br />";
out+="|";
}
}
setStylesheet('.ratingTable'+numCols+'{width:'+Math.floor(90*numCols/numCats)+'%;}','RatingTableStyles');
return(pre+"h\n"+out);
</script>
|wideTable linkTable|k
| ★★★★★ |h
|<<tiddler ListRating with:5 '- ' ''>>|
| ★★★★ |h
|<<tiddler ListRating with:4 '- ' ''>>|
| ★★★ |h
|<<tiddler ListRating with:3 '- ' ''>>|
| ★★ |h
|<<tiddler ListRating with:2 '- ' ''>>|
| ★ |h
|<<tiddler ListRating with:1 '- ' ''>>|
<<tiddlerList filter:"tiddler.tags.contains('Video')" top:"3" order:"-modified" dateFormat:"YYYY mmm. 0DD" itemTemplate:"{{recently{%link}}}\n{{light{(%created)}}}\n\n<<tiddler %link$))\n">>{{tagClear{ }}}{{recently{[[Click to see all videos...|All Videos]]}}}
Name: MGTDRed
Background: #fff
Foreground: #000
PrimaryPale: #fdd
PrimaryLight: #c55
PrimaryMid: #711
PrimaryDark: #500
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/***
|Name:|RenameTagsPlugin|
|Description:|Allows you to easily rename or delete tags across multiple tiddlers|
|Version:|3.0 ($Rev: 5501 $)|
|Date:|$Date: 2008-06-10 23:11:55 +1000 (Tue, 10 Jun 2008) $|
|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) {
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);
},
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();
//}}}
All scripts are tagging here...
<<tagglyTagging>>
//{{{
merge(config.macros,{
setPalette: {
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
var paletteName = params[0] ? params[0] : tiddler.title;
createTiddlyButton(place,"apply","Apply this palette",function(e) {
config.macros.selectPalette.updatePalette(tiddler.title);
return false;
});
}
},
selectPalette: {
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
var sel=document.createElement("span");
sel.className="selectPalette";
place.appendChild(sel);
createTiddlyDropDown(sel,this.onPaletteChange,this.getPalettes());
},
getPalettes: function() {
var result = [
{caption:"Select color palette", name:""},
{caption:"(Default)", name:"(default)"}
];
var tagged = store.getTaggedTiddlers("ColorPalette","title");
for(var t=0; t<tagged.length; t++)
result.push({caption:tagged[t].title, name:tagged[t].title});
return result;
},
onPaletteChange: function(e) {
config.macros.selectPalette.updatePalette(this.value);
return true;
},
updatePalette: function(title) {
if (title != "") {
store.deleteTiddler("ColorPalette");
if (title != "(default)")
store.saveTiddler("ColorPalette","ColorPalette",store.getTiddlerText(title),
config.options.txtUserName,undefined,"");
this.refreshPalette();
if(config.options.chkAutoSave)
saveChanges(true);
}
},
refreshPalette: function() {
config.macros.refreshDisplay.onClick();
}
}
});
//}}}
/%
!info
|Name|ShowPopup|
|Source|http://www.TiddlyTools.com/#ShowPopup|
|Version|1.2.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|transcluded html|
|Requires||
|Overrides||
|Description|display tiddler content in a TiddlyWiki popup panel|
Usage:
<<<
{{{
<<tiddler ShowPopup with: TiddlerName label tooltip buttonClass width popupClass>>
}}}
where:
*''~TiddlerName''<br>title of the tiddler to be displayed
*''label''<br>text for the command link
*''tooltip''<br>mouseover help text for the link
*''buttonClass''<br>CSS classname applied to the command text (default=button)
*''width''<br>width of the popup (using CSS measurements, default=auto)
*''popupClass''<br>CSS classname applied to the popup panel (default=none).<br>Use 'sticky' for persistent popups (see StickyPopupPlugin)
<<<
Example:
<<<
{{{
<<tiddler ShowPopup with: ShowPopup [[Try this]] [[show this tiddler in a popup]]>>
}}}
<<tiddler ShowPopup with: ShowPopup [[Try this]] [[show this tiddler in a popup]]>>
<<<
!end
!show
<html><hide linebreaks>
<a href="javascript:;" class="$4" title="$3" onclick="
var p=Popup.create(this); if(!p)return;
p.className+='$6'!='$'+'6'?' $6':'';
var d=createTiddlyElement(p,'div');
var s=d.style;
s.whiteSpace='normal';
s.width='$5'!='$'+'5'?'$5':'auto';
s.padding='2px';
wikify(store.getTiddlerText('$1',''),d);
Popup.show();
event.cancelBubble=true;
if(event.stopPropagation)event.stopPropagation();
return(false);
">$2</a></html>
!end
%/<<tiddler {{'ShowPopup##'+('$1'=='$'+'1'?'info':'show')}} with: [[$1]] [[$2]] [[$3]] [[$4]] [[$5]] [[$6]]>>
<<saveChanges>><<tiddler TspotSidebar>><<closeAll>>[[options|Options]]
<<slider chkSliderSideBarTabs SideBarTabs##Config "lists »" "show detailed lists">>
@@display:none;
!Config
<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>
@@
/***
|''Name''|SimpleSearchPlugin|
|''Description''|displays search results as a simple list of matching tiddlers|
|''Authors''|FND|
|''Version''|0.4.1|
|''Status''|stable|
|''Source''|http://devpad.tiddlyspot.com/#SimpleSearchPlugin|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/contributors/FND/plugins/SimpleSearchPlugin.js|
|''License''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''Keywords''|search|
!Code
***/
//{{{
if(!version.extensions.SimpleSearchPlugin) { //# ensure that the plugin is only installed once
version.extensions.SimpleSearchPlugin = { installed: true };
if(!config.extensions) { config.extensions = {}; }
config.extensions.SimpleSearchPlugin = {
heading: "Search Results",
containerId: "searchResults",
btnCloseLabel: "close",
btnCloseTooltip: "dismiss search results",
btnCloseId: "search_close",
btnOpenLabel: "Open all",
btnOpenTooltip: "open all search results",
btnOpenId: "search_open",
displayResults: function(matches, query) {
story.refreshAllTiddlers(true); // update highlighting within story tiddlers
var el = document.getElementById(this.containerId);
query = '"""' + query + '"""'; // prevent WikiLinks
if(el) {
removeChildren(el);
} else { //# fallback: use displayArea as parent
var container = document.getElementById("displayArea");
el = document.createElement("div");
el.id = this.containerId;
el = container.insertBefore(el, container.firstChild);
}
var msg = "!" + this.heading + "\n";
if(matches.length > 0) {
msg += "''" + config.macros.search.successMsg.format([matches.length.toString(), query]) + ":''\n";
this.results = [];
for(var i = 0 ; i < matches.length; i++) {
this.results.push(matches[i].title);
msg += "* [[" + matches[i].title + "]]\n";
}
} else {
msg += "''" + config.macros.search.failureMsg.format([query]) + "''"; // XXX: do not use bold here!?
}
createTiddlyButton(el, this.btnCloseLabel, this.btnCloseTooltip, config.extensions.SimpleSearchPlugin.closeResults, "button", this.btnCloseId);
wikify(msg, el);
if(matches.length > 0) { // XXX: redundant!?
createTiddlyButton(el, this.btnOpenLabel, this.btnOpenTooltip, config.extensions.SimpleSearchPlugin.openAll, "button", this.btnOpenId);
}
},
closeResults: function() {
var el = document.getElementById(config.extensions.SimpleSearchPlugin.containerId);
removeNode(el);
config.extensions.SimpleSearchPlugin.results = null;
highlightHack = null;
},
openAll: function(ev) {
story.displayTiddlers(null, config.extensions.SimpleSearchPlugin.results);
return false;
}
};
config.shadowTiddlers.StyleSheetSimpleSearch = "/*{{{*/\n" +
"#" + config.extensions.SimpleSearchPlugin.containerId + " {\n" +
"\toverflow: auto;\n" +
"\tpadding: 5px 1em 10px;\n" +
"\tbackground-color: [[ColorPalette::TertiaryPale]];\n" +
"\tmargin-top: 20px;\n" +
"}\n\n" +
"#" + config.extensions.SimpleSearchPlugin.containerId + " h1 {\n" +
"\tmargin-top: 0px;\n" +
"\tborder: none;\n" +
"}\n\n" +
"#" + config.extensions.SimpleSearchPlugin.containerId + " ul {\n" +
"\tmargin: 0.5em;\n" +
"\tpadding-left: 1.5em;\n" +
"}\n\n" +
"#" + config.extensions.SimpleSearchPlugin.containerId + " .button {\n" +
"\tdisplay: block;\n" +
"\tborder-color: [[ColorPalette::TertiaryDark]];\n" +
"\tpadding: 5px;\n" +
"\tbackground-color: [[ColorPalette::TertiaryLight]];\n" +
"}\n\n" +
"#" + config.extensions.SimpleSearchPlugin.containerId + " .button:hover {\n" +
"\tborder-color: [[ColorPalette::SecondaryMid]];\n" +
"\tbackground-color: [[ColorPalette::SecondaryLight]];\n" +
"}\n\n" +
"#" + config.extensions.SimpleSearchPlugin.btnCloseId + " {\n" +
"\tfloat: right;\n" +
"\tmargin: 0px -0.5em 0px 0px;\n" +
"}\n\n" +
"#" + config.extensions.SimpleSearchPlugin.btnOpenId + " {\n" +
"\tfloat: left;\n" +
"\tmargin-top: 5px;\n" +
"}\n" +
"/*}}}*/";
store.addNotification("StyleSheetSimpleSearch", refreshStyles);
// override Story.search()
Story.prototype.search = function(text, useCaseSensitive, useRegExp) {
highlightHack = new RegExp(useRegExp ? text : text.escapeRegExp(), useCaseSensitive ? "mg" : "img");
var matches = store.search(highlightHack, null, "excludeSearch");
var q = useRegExp ? "/" : "'";
config.extensions.SimpleSearchPlugin.displayResults(matches, q + text + q);
};
// override TiddlyWiki.search() to sort by relevance
TiddlyWiki.prototype.search = function(searchRegExp, sortField, excludeTag, match) {
var candidates = this.reverseLookup("tags", excludeTag, !!match);
var primary = [];
var secondary = [];
var tertiary = [];
for(var t = 0; t < candidates.length; t++) {
if(candidates[t].title.search(searchRegExp) != -1) {
primary.push(candidates[t]);
} else if(candidates[t].tags.join(" ").search(searchRegExp) != -1) {
secondary.push(candidates[t]);
} else if(candidates[t].text.search(searchRegExp) != -1) {
tertiary.push(candidates[t]);
}
}
var results = primary.concat(secondary).concat(tertiary);
if(sortField) {
results.sort(function(a, b) {
return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);
});
}
return results;
};
} //# end of "install only once"
//}}}
Tiddlers related to the site design...
[[inspired|Recently Added]]
<html><iframe src="http://www.southpark.de/alleEpisoden/?lang=en"></iframe></html>
/***
|Name|SplashScreenPlugin|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#SplashScreenPlugin|
|Version|0.21 |
|Requires|~TW2.08+|
!Description:
Provides a simple splash screen that is visible while the TW is loading.
!Code
***/
//{{{
var old_lewcid_splash_restart=restart;
restart = function()
{ if (document.getElementById("splashscreen"))
document.getElementById("splashscreen").style.display = "none";
if (document.getElementById("contentWrapper"))
document.getElementById("contentWrapper").style.display = "block";
old_lewcid_splash_restart();
if (splashScreenInstall)
{if(config.options.chkAutoSave)
{saveChanges();}
displayMessage("TW SplashScreen has been installed, please save and refresh your TW.");
}
}
var oldText = store.getTiddlerText("MarkupPreHead");
if (oldText.indexOf("splashscreen")==-1)
{var siteTitle = store.getTiddlerText("SiteTitle");
var splasher='\n<style type="text/css">#contentWrapper {display:none;}</style><div id="splashscreen" style="border: 1px solid #DDD; display:block; text-align:center; width:500px; margin:100px auto; padding:30px; color:white; font-size:24px; background-color:#CCC;">inspired<span style="font-size:0.8em; margin-left:20px;">by tiddlywiki</span><br style="margin-bottom:20px"><span style="font-size: 12px;color:#A66;">requires javascript</span></div>';
if (! store.tiddlerExists("MarkupPreHead"))
{var myTiddler = store.createTiddler("MarkupPreHead");}
else
{var myTiddler = store.getTiddler("MarkupPreHead");}
myTiddler.set(myTiddler.title,oldText+splasher,config.options.txtUserName,null,null);
store.setDirty(true);
var splashScreenInstall = true;
}
//}}}
/*{{{*/
.vid {text-align:center;float:left;margin-right:10px;margin-top:10px;font-weight:bold;color:[[ColorPalette::SecondaryLight]];}
.vid a, .vidMore a {color:[[ColorPalette::SecondaryMid]];padding:1px 3px;}
.vid a:hover, .vidMore a hover {background-color:[[ColorPalette::TertiaryPale]];}
.vidMore {display:block;clear:both;color:[[ColorPalette::TertiaryDark]];font-size:1.6em;margin-top:1em;}
.vidList, .ted, .recently {display:block;clear:both;width:100%;margin-top:20px;background:[[ColorPalette::SecondaryPale]];border:1px solid [[ColorPalette::TertiaryLight]];}
.vidList:hover, .ted:hover, .recently:hover {background:none;border:1px solid [[ColorPalette::TertiaryPale]];}
.vidList .sliderPanel, .ted .sliderPanel {margin:7px 0px 0px 7px;}
.vidList .button, .ted .button, .recently .tiddlyLinkExisting {display:block;width:99%;border:none;padding:0.5em 0.5% 0.5em 0.5%;font-size:1.3em;color:[[ColorPalette::PrimaryMid]];font-weight:normal;margin:0;}
.vidList .button:hover, .ted .button:hover, .recently .tiddlyLinkExisting:hover {background-color:[[ColorPalette::TertiaryPale]];color:[[ColorPalette::PrimaryDark]];}
.rightLink .tiddlyLinkExisting, .rightLink .tiddlyLinkExisting {padding:8px 15px;margin:-32px 0px 0px 0px;float:right;z-index:2;}
table.thumbs, table.thumbs thead, table.thumbs tr, table.thumbs td {border:none;}
table.thumbs img {margin:5px;}
table.linkTable .tiddlyLinkExisting, table.linkTable .externalLink {display:block;width:92%;text-decoration:none;padding:3px 4%;}
table.linkTable .externalLink {}
table.linkTable .quickopentag .tiddlyLinkExisting, table.linkTable .quickopentag .externalLink {display:inline;}
table.linkTable td {padding:0;}
.play .tiddlyLinkExisting{padding:5px 50px;}
.fat .tiddlyLinkExisting {color:[[ColorPalette::SecondaryMid]];font-size:1.3em;padding:2px;font-weight:bold;}
.fat .tiddlyLinkExisting:hover {color:[[ColorPalette::Background]];background-color:[[ColorPalette::SecondaryLight]];font-size:1.3em;}
.embedr {width:425px;height:520px;float:left;margin-right:10px;}
/*}}}*/
!Guitar at it's finest
Korean boy playing one tune after the next... pure amazement.
*http://www.sunghajung.com
<html>
<div class="embedr"><object width="425" height="520"><param name="movie" value="http://embedr.com/swf/slider/sungha-jung-best-rated/425/520/default/false/std"></param><param name="allowFullScreen" value="true"></param><param name="wmode" value="transparent"><embed src="http://embedr.com/swf/slider/sungha-jung-best-rated/425/520/default/false/std" type="application/x-shockwave-flash" allowFullScreen="true" width="425" height="520" wmode="transparent"></embed></object></div>
<div class="embedr"><object width="425" height="520"><param name="movie" value="http://embedr.com/swf/slider/sungha-jung-youtube-channel-most-recent/425/520/default/false/std"></param><param name="allowFullScreen" value="true"></param><param name="wmode" value="transparent"><embed src="http://embedr.com/swf/slider/sungha-jung-youtube-channel-most-recent/425/520/default/false/std" type="application/x-shockwave-flash" allowFullScreen="true" width="425" height="520" wmode="transparent"></embed></object></div>
</html>
[[TED|http://www.ted.com/]] is a host of riveting talks by remarkable people, free to the world...
<<tiddlerList filter:"tiddler.tags.contains('TED')" top:"7" order:"-created" dateFormat:"YYYY mmm. 0DD" itemTemplate:"{{vidList{+++[â–º play %title|show hide player]...\n<<tiddler '%title'$))\n===\n{{rightLink{[[open|%title]]}}}}}}">>{{recently{[[â–º click to see all TED videos, sorted by title...|TED All]]}}}
<<tiddler Video with:"talks/dynamic/JeffHawkins_2003-medium.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/JeffHawkins-2003.embed_thumbnail.jpg" "[[TED|http://www.ted.com/talks/jeff_hawkins_on_how_brain_science_will_change_computing.html]]">>
Treo creator Jeff Hawkins urges us to take a new look at the brain -- to see it not as a fast processor, but as a memory system that stores and plays back experiences to help us predict, intelligently, what will happen next.
<<tiddler Video with:"talks/dynamic/CharlesLeadbeater_2005G-medium.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/CharlesLeadbeater-2005G.embed_thumbnail.jpg" "[[TED|http://www.ted.com/talks/charles_leadbeater_on_innovation.html]]">>
In this deceptively casual talk, Charles Leadbeater weaves a tight argument that innovation isn't just for professionals anymore. Passionate amateurs, using new tools, are creating products and paradigms that companies can't.
<<tiddler Video with:"vu=http://video.ted.com/talks/dynamic/RichardSt.John_2005-medium.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/RichardSt.John-2005.embed_thumbnail.jpg" "[[TED|http://www.ted.com/talks/richard_st_john_s_8_secrets_of_success.html]]">>
Why do people succeed? Is it because they're smart? Or are they just lucky? Neither. Analyst Richard St. John condenses years of interviews into an unmissable 3-minute slideshow on the real secrets of success.
<<tiddler Video with:"talks/dynamic/SirKenRobinson_2006-medium.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/SirKenRobinson-2006.embed_thumbnail.jpg" "[[TED|http://www.ted.com/talks/ken_robinson_says_schools_kill_creativity.html]]">>
Sir Ken Robinson makes an entertaining and profoundly moving case for creating an education system that nurtures (rather than undermines) creativity.
<<tiddler Video with:"talks/dynamic/MichaelShermer_2006-medium.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/MichaelShermer-2006.embed_thumbnail.jpg" "[[TED|http://www.ted.com/talks/michael_shermer_on_believing_strange_things.html]]">>
Why do people see the Virgin Mary on a cheese sandwich or hear demonic lyrics in "Stairway to Heaven"? Using video and music, skeptic Michael Shermer shows how we convince ourselves to believe -- and overlook the facts.
<<tiddler Video with:"talks/dynamic/DavidKeith_2007S-medium.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/DavidKeith-2007S.embed_thumbnail.jpg" "[[TED|http://www.ted.com/talks/david_keith_s_surprising_ideas_on_climate_change.html]]">>
Environmental scientist David Keith proposes a cheap, effective, shocking means to address climate change: What if we injected a huge cloud of ash into the atmosphere to deflect sunlight and heat?
<<tiddler Video with:"talks/dynamic/VilayanurRamachandran_2007-medium.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/VilayanurRamachandran-2007.embed_thumbnail.jpg" "[[TED|http://www.ted.com/talks/vilayanur_ramachandran_on_your_mind.html]]">>
Vilayanur Ramachandran tells us what brain damage can reveal about the connection between celebral tissue and the mind, using three startling delusions as examples.
<<tiddler Video with:"talks/dynamic/AlaindeBotton_2009G-medium.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/AlaindeBotton-2009G.embed_thumbnail.jpg" "[[TED|http://www.ted.com/talks/alain_de_botton_a_kinder_gentler_philosophy_of_success.html?ga_source=embed]]">>
Alain de Botton examines our ideas of success and failure -- and questions the assumptions underlying these two judgments. Is success always earned? Is failure? He makes an eloquent, witty case to move beyond snobbery to find true pleasure in our work.
<<tiddler Video with:"talks/dynamic/DanielPink_2009G-medium.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/DanielPink-2009G.embed_thumbnail.jpg" "[[TED|http://www.ted.com/talks/view/id/618]]">>
Career analyst Dan Pink examines the puzzle of motivation, starting with a fact that social scientists know but most managers don't: Traditional rewards aren't always as effective as we think. Listen for illuminating stories -- and maybe, a way forward.
<<tiddler Video with:"talks/dynamic/ElizabethGilbert_2009-medium.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/ElizabethGilbert_2009.embed_thumbnail.jpg" "[[TED|http://www.ted.com/talks/elizabeth_gilbert_on_genius.html]]">>
Elizabeth Gilbert muses on the impossible things we expect from artists and geniuses -- and shares the radical idea that, instead of the rare person "being" a genius, all of us "have" a genius. It's a funny, personal and surprisingly moving talk.
<<tiddler Video with:"talks/dynamic/HansRosling_2006-medium.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/HansRosling-2006.embed_thumbnail.jpg" "[[TED|http://www.ted.com/talks/hans_rosling_shows_the_best_stats_you_ve_ever_seen.html]]">>
You've never seen data presented like this. With the drama and urgency of a sportscaster, statistics guru Hans Rosling debunks myths about the so-called "developing world." http://www.gapminder.org
<<tiddler Video with:"talks/dynamic/HowardRheingold_2005-medium.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/HowardRheingold-2005.embed_thumbnail.jpg" "[[TED|http://www.ted.com/talks/howard_rheingold_on_collaboration.html]]">>
Howard Rheingold talks about the coming world of collaboration, participatory media and collective action -- and how Wikipedia is really an outgrowth of our natural human instinct to work as a group.
<<tiddler Video with:"talks/dynamic/ImogenHeap_WaitItOut_2009G-medium.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/ImogenHeap-WaitItOut-2009G.embed_thumbnail.jpg" "[[TED|http://www.ted.com/talks/imogen_heap_wait.html]]">>
Imogen Heap plays a powerful stripped-down version of "Wait It Out," from her new record, Ellipse.
<<tiddler Video with:"talks/dynamic/JohnLaGrou_2009-medium.flv&su=http://images.ted.com/images/ted/tedindex/embed-posters/JohnLaGrou-2009.embed_thumbnail.jpg" "[[TED|http://www.ted.com/talks/john_la_grou_plugs_smart_power_outlets_1.html]]">>
John La Grou unveils an ingenious new technology that will smarten up the electrical outlets in our homes, using microprocessors and RFID tags. The invention, Safeplug, promises to prevent deadly accidents like house fires -- and to conserve energy.
<<tiddler Video with:"talks/dynamic/PranavMistry_2009I-high.flv&su=http://images.ted.com/images/ted/76651_254x191.jpg" "[[TED|http://www.ted.com/talks/pranav_mistry_the_thrilling_potential_of_sixthsense_technology.html]]">>
At ~TEDIndia, Pranav Mistry demos several tools that help the physical world interact with the world of data -- including a deep look at his SixthSense device and a new, paradigm-shifting paper "laptop." In an onstage Q&A, Mistry says he'll open-source the software behind SixthSense, to open its possibilities to all.
<<tiddlerList filter:"tiddler.title.indexOf('TED - ')>-1" order:"title" dateFormat:"YYYY mmm. 0DD" itemTemplate:"{{vidList{+++[â–º play %title|show hide player]...\n<<tiddler '%title'$))\n===\n{{rightLink{[[open|%title]]}}}}}}">>
<<tabs txtMoreTab "Miss" "Missing tiddlers" TabMoreMissing "Orph" "Orphaned tiddlers" TabMoreOrphans "Shad" "Shadowed tiddlers" TabMoreShadowed "Plug" "Plugins" systemConfig>>
<<timeline "modified" "15">>
[[see complete list »|Timeline]]
<<tiddler {{config.options['txtMySearch']='';'';}}>><<option
txtMySearch>>/%
%/<html><nowiki><form style='display:inline'>
<select name='tags'><option value=''>Search by tag...</option></select>
<input type='button' value='search' onclick="
var tag=this.form.tags.value;
var text=config.options['txtMySearch'];
var useRE=config.options['chkRegExpSearch'];
var useCase=config.options['chkCaseSensitiveSearch'];
highlightHack=new RegExp(useRE?text:text.escapeRegExp(),useCase?'mg':'img');
var matches=store.search(highlightHack,'tags',tag,true);
highlightHack=null;
var q=useRE?'/':'\x27';
if(matches.length>0) {
config.extensions.SimpleSearchPlugin.displayResults(matches, q + text + q);
displayMessage(config.macros.search.successMsg.format([matches.length.toString(),q+text+q]));
}
else displayMessage(config.macros.search.failureMsg.format([q+text+q]));
return false;
"></form></html><<tiddler {{
var list=place.lastChild.getElementsByTagName('form')[0].tags;
var tags=store.getTags()
for (var t=0;t<tags.length;t++) list.options[list.length]=new Option(tags[t][0],tags[t][0]);
'';}}>>
/***
|Name:|TagglyTaggingPlugin|
|Description:|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|
|Version:|3.3.1 ($Rev: 9828 $)|
|Date:|$Date: 2009-06-03 21:38:41 +1000 (Wed, 03 Jun 2009) $|
|Source:|http://mptw.tiddlyspot.com/#TagglyTaggingPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
!Notes
See http://mptw.tiddlyspot.com/#TagglyTagging
***/
//{{{
merge(String.prototype,{
parseTagExpr: function(debug) {
if (this.trim() == "")
return "(true)";
var anyLogicOp = /(!|&&|\|\||\(|\))/g;
var singleLogicOp = /^(!|&&|\|\||\(|\))$/;
var spaced = this.
// because square brackets in templates are no good
// this means you can use [(With Spaces)] instead of [[With Spaces]]
replace(/\[\(/g," [[").
replace(/\)\]/g,"]] ").
// space things out so we can use readBracketedList. tricky eh?
replace(anyLogicOp," $1 ");
var expr = "";
var tokens = spaced.readBracketedList(false); // false means don't uniq the list. nice one JR!
for (var i=0;i<tokens.length;i++)
if (tokens[i].match(singleLogicOp))
expr += tokens[i];
else
expr += "tiddler.tags.contains('%0')".format([tokens[i].replace(/'/,"\\'")]); // fix single quote bug. still have round bracket bug i think
if (debug)
alert(expr);
return '('+expr+')';
}
});
merge(TiddlyWiki.prototype,{
getTiddlersByTagExpr: function(tagExpr,sortField) {
var result = [];
var expr = tagExpr.parseTagExpr();
store.forEachTiddler(function(title,tiddler) {
if (eval(expr))
result.push(tiddler);
});
if(!sortField)
sortField = "title";
result.sort(function(a,b) {return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);});
return result;
}
});
config.taggly = {
// for translations
lingo: {
labels: {
asc: "\u2191", // down arrow
desc: "\u2193", // up arrow
title: "title",
modified: "modified",
created: "created",
show: "+",
hide: "-",
normal: "normal",
group: "group",
commas: "commas",
sitemap: "sitemap",
numCols: "cols\u00b1", // plus minus sign
label: "Tagged as '%0':",
exprLabel: "Matching tag expression '%0':",
excerpts: "excerpts",
descr: "descr",
slices: "slices",
contents: "contents",
sliders: "sliders",
noexcerpts: "title only",
noneFound: "(none)"
},
tooltips: {
title: "Click to sort by title",
modified: "Click to sort by modified date",
created: "Click to sort by created date",
show: "Click to show tagging list",
hide: "Click to hide tagging list",
normal: "Click to show a normal ungrouped list",
group: "Click to show list grouped by tag",
sitemap: "Click to show a sitemap style list",
commas: "Click to show a comma separated list",
numCols: "Click to change number of columns",
excerpts: "Click to show excerpts",
descr: "Click to show the description slice",
slices: "Click to show all slices",
contents: "Click to show entire tiddler contents",
sliders: "Click to show tiddler contents in sliders",
noexcerpts: "Click to show entire title only"
},
tooDeepMessage: "* //sitemap too deep...//"
},
config: {
showTaggingCounts: true,
listOpts: {
// the first one will be the default
sortBy: ["title","modified","created"],
sortOrder: ["asc","desc"],
hideState: ["show","hide"],
listMode: ["normal","group","sitemap","commas"],
numCols: ["1","2","3","4","5","6"],
excerpts: ["noexcerpts","excerpts","descr","slices","sliders","contents"]
},
valuePrefix: "taggly.",
excludeTags: ["excludeTagging"],
excerptSize: 50,
excerptMarker: "/%"+"%/",
siteMapDepthLimit: 25
},
getTagglyOpt: function(title,opt) {
var val = store.getValue(title,this.config.valuePrefix+opt);
return val ? val : this.config.listOpts[opt][0];
},
setTagglyOpt: function(title,opt,value) {
// create it silently if it doesn't exist
if (!store.tiddlerExists(title)) {
store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),"");
// <<tagglyTagging expr:"...">> creates a tiddler to store its display settings
// Make those tiddlers less noticeable by tagging as excludeSearch and excludeLists
// Because we don't want to hide real tags, check that they aren't actually tags before doing so
// Also tag them as tagglyExpression for manageability
// (contributed by RA)
if (!store.getTaggedTiddlers(title).length) {
store.setTiddlerTag(title,true,"excludeSearch");
store.setTiddlerTag(title,true,"excludeLists");
store.setTiddlerTag(title,true,"tagglyExpression");
}
}
// if value is default then remove it to save space
return store.setValue(title, this.config.valuePrefix+opt, value == this.config.listOpts[opt][0] ? null : value);
},
getNextValue: function(title,opt) {
var current = this.getTagglyOpt(title,opt);
var pos = this.config.listOpts[opt].indexOf(current);
// supposed to automagically don't let cols cycle up past the number of items
// currently broken in some situations, eg when using an expression
// lets fix it later when we rewrite for jquery
// the columns thing should be jquery table manipulation probably
var limit = (opt == "numCols" ? store.getTaggedTiddlers(title).length : this.config.listOpts[opt].length);
var newPos = (pos + 1) % limit;
return this.config.listOpts[opt][newPos];
},
toggleTagglyOpt: function(title,opt) {
var newVal = this.getNextValue(title,opt);
this.setTagglyOpt(title,opt,newVal);
},
createListControl: function(place,title,type) {
var lingo = config.taggly.lingo;
var label;
var tooltip;
var onclick;
if ((type == "title" || type == "modified" || type == "created")) {
// "special" controls. a little tricky. derived from sortOrder and sortBy
label = lingo.labels[type];
tooltip = lingo.tooltips[type];
if (this.getTagglyOpt(title,"sortBy") == type) {
label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];
onclick = function() {
config.taggly.toggleTagglyOpt(title,"sortOrder");
return false;
}
}
else {
onclick = function() {
config.taggly.setTagglyOpt(title,"sortBy",type);
config.taggly.setTagglyOpt(title,"sortOrder",config.taggly.config.listOpts.sortOrder[0]);
return false;
}
}
}
else {
// "regular" controls, nice and simple
label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];
tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];
onclick = function() {
config.taggly.toggleTagglyOpt(title,type);
return false;
}
}
// hide button because commas don't have columns
if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))
createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");
},
makeColumns: function(orig,numCols) {
var listSize = orig.length;
var colSize = listSize/numCols;
var remainder = listSize % numCols;
var upperColsize = colSize;
var lowerColsize = colSize;
if (colSize != Math.floor(colSize)) {
// it's not an exact fit so..
upperColsize = Math.floor(colSize) + 1;
lowerColsize = Math.floor(colSize);
}
var output = [];
var c = 0;
for (var j=0;j<numCols;j++) {
var singleCol = [];
var thisSize = j < remainder ? upperColsize : lowerColsize;
for (var i=0;i<thisSize;i++)
singleCol.push(orig[c++]);
output.push(singleCol);
}
return output;
},
drawTable: function(place,columns,theClass) {
var newTable = createTiddlyElement(place,"table",null,theClass);
var newTbody = createTiddlyElement(newTable,"tbody");
var newTr = createTiddlyElement(newTbody,"tr");
for (var j=0;j<columns.length;j++) {
var colOutput = "";
for (var i=0;i<columns[j].length;i++)
colOutput += columns[j][i];
var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class
wikify(colOutput,newTd);
}
return newTable;
},
createTagglyList: function(place,title,isTagExpr) {
switch(this.getTagglyOpt(title,"listMode")) {
case "group": return this.createTagglyListGrouped(place,title,isTagExpr); break;
case "normal": return this.createTagglyListNormal(place,title,false,isTagExpr); break;
case "commas": return this.createTagglyListNormal(place,title,true,isTagExpr); break;
case "sitemap":return this.createTagglyListSiteMap(place,title,isTagExpr); break;
}
},
getTaggingCount: function(title,isTagExpr) {
// thanks to Doug Edmunds
if (this.config.showTaggingCounts) {
var tagCount = config.taggly.getTiddlers(title,'title',isTagExpr).length;
if (tagCount > 0)
return " ("+tagCount+")";
}
return "";
},
getTiddlers: function(titleOrExpr,sortBy,isTagExpr) {
return isTagExpr ? store.getTiddlersByTagExpr(titleOrExpr,sortBy) : store.getTaggedTiddlers(titleOrExpr,sortBy);
},
getExcerpt: function(inTiddlerTitle,title,indent) {
if (!indent)
indent = 1;
var displayMode = this.getTagglyOpt(inTiddlerTitle,"excerpts");
var t = store.getTiddler(title);
if (t && displayMode == "excerpts") {
var text = t.text.replace(/\n/," ");
var marker = text.indexOf(this.config.excerptMarker);
if (marker != -1) {
return " {{excerpt{<nowiki>" + text.substr(0,marker) + "</nowiki>}}}";
}
else if (text.length < this.config.excerptSize) {
return " {{excerpt{<nowiki>" + t.text + "</nowiki>}}}";
}
else {
return " {{excerpt{<nowiki>" + t.text.substr(0,this.config.excerptSize) + "..." + "</nowiki>}}}";
}
}
else if (t && displayMode == "contents") {
return "\n{{contents indent"+indent+"{\n" + t.text + "\n}}}";
}
else if (t && displayMode == "sliders") {
return '<<slider "" "'+title + '" "slide»" "click to show">>';
}
else if (t && displayMode == "descr") {
var descr = store.getTiddlerSlice(title,'Description');
return descr ? " {{excerpt{" + descr + "}}}" : "";
}
else if (t && displayMode == "slices") {
var result = "";
var slices = store.calcAllSlices(title);
for (var s in slices)
result += "|%0|<nowiki>%1</nowiki>|\n".format([s,slices[s]]);
return result ? "\n{{excerpt excerptIndent{\n" + result + "}}}" : "";
}
return "";
},
notHidden: function(t,inTiddler) {
if (typeof t == "string")
t = store.getTiddler(t);
return (!t || !t.tags.containsAny(this.config.excludeTags) ||
(inTiddler && this.config.excludeTags.contains(inTiddler)));
},
// this is for normal and commas mode
createTagglyListNormal: function(place,title,useCommas,isTagExpr) {
var list = config.taggly.getTiddlers(title,this.getTagglyOpt(title,"sortBy"),isTagExpr);
if (this.getTagglyOpt(title,"sortOrder") == "desc")
list = list.reverse();
var output = [];
var first = true;
for (var i=0;i<list.length;i++) {
if (this.notHidden(list[i],title)) {
var countString = this.getTaggingCount(list[i].title);
var excerpt = this.getExcerpt(title,list[i].title);
if (useCommas)
output.push((first ? "" : ", ") + "[[" + list[i].title + "]]" + countString + excerpt);
else
output.push("*[[" + list[i].title + "]]" + countString + excerpt + "\n");
first = false;
}
}
return this.drawTable(place,
this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),
useCommas ? "commas" : "normal");
},
// this is for the "grouped" mode
createTagglyListGrouped: function(place,title,isTagExpr) {
var sortBy = this.getTagglyOpt(title,"sortBy");
var sortOrder = this.getTagglyOpt(title,"sortOrder");
var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);
if (sortOrder == "desc")
list = list.reverse();
var leftOvers = []
for (var i=0;i<list.length;i++)
leftOvers.push(list[i].title);
var allTagsHolder = {};
for (var i=0;i<list.length;i++) {
for (var j=0;j<list[i].tags.length;j++) {
if (list[i].tags[j] != title) { // not this tiddler
if (this.notHidden(list[i].tags[j],title)) {
if (!allTagsHolder[list[i].tags[j]])
allTagsHolder[list[i].tags[j]] = "";
if (this.notHidden(list[i],title)) {
allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"
+ this.getTaggingCount(list[i].title) + this.getExcerpt(title,list[i].title) + "\n";
leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers
}
}
}
}
}
var allTags = [];
for (var t in allTagsHolder)
allTags.push(t);
var sortHelper = function(a,b) {
if (a == b) return 0;
if (a < b) return -1;
return 1;
};
allTags.sort(function(a,b) {
var tidA = store.getTiddler(a);
var tidB = store.getTiddler(b);
if (sortBy == "title") return sortHelper(a,b);
else if (!tidA && !tidB) return 0;
else if (!tidA) return -1;
else if (!tidB) return +1;
else return sortHelper(tidA[sortBy],tidB[sortBy]);
});
var leftOverOutput = "";
for (var i=0;i<leftOvers.length;i++)
if (this.notHidden(leftOvers[i],title))
leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + this.getExcerpt(title,leftOvers[i]) + "\n";
var output = [];
if (sortOrder == "desc")
allTags.reverse();
else if (leftOverOutput != "")
// leftovers first...
output.push(leftOverOutput);
for (var i=0;i<allTags.length;i++)
if (allTagsHolder[allTags[i]] != "")
output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(allTags[i]) + this.getExcerpt(title,allTags[i]) + "\n" + allTagsHolder[allTags[i]]);
if (sortOrder == "desc" && leftOverOutput != "")
// leftovers last...
output.push(leftOverOutput);
return this.drawTable(place,
this.makeColumns(output,parseInt(this.getTagglyOpt(title,"numCols"))),
"grouped");
},
// used to build site map
treeTraverse: function(title,depth,sortBy,sortOrder,isTagExpr) {
var list = config.taggly.getTiddlers(title,sortBy,isTagExpr);
if (sortOrder == "desc")
list.reverse();
var indent = "";
for (var j=0;j<depth;j++)
indent += "*"
var childOutput = "";
if (depth > this.config.siteMapDepthLimit)
childOutput += indent + this.lingo.tooDeepMessage;
else
for (var i=0;i<list.length;i++)
if (list[i].title != title)
if (this.notHidden(list[i].title,this.config.inTiddler))
childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder,false);
if (depth == 0)
return childOutput;
else
return indent + "[["+title+"]]" + this.getTaggingCount(title) + this.getExcerpt(this.config.inTiddler,title,depth) + "\n" + childOutput;
},
// this if for the site map mode
createTagglyListSiteMap: function(place,title,isTagExpr) {
this.config.inTiddler = title; // nasty. should pass it in to traverse probably
var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"),isTagExpr);
return this.drawTable(place,
this.makeColumns(output.split(/(?=^\*\[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic
"sitemap"
);
},
macros: {
tagglyTagging: {
handler: function (place,macroName,params,wikifier,paramString,tiddler) {
var parsedParams = paramString.parseParams("tag",null,true);
var refreshContainer = createTiddlyElement(place,"div");
// do some refresh magic to make it keep the list fresh - thanks Saq
refreshContainer.setAttribute("refresh","macro");
refreshContainer.setAttribute("macroName",macroName);
var tag = getParam(parsedParams,"tag");
var expr = getParam(parsedParams,"expr");
if (expr) {
refreshContainer.setAttribute("isTagExpr","true");
refreshContainer.setAttribute("title",expr);
refreshContainer.setAttribute("showEmpty","true");
}
else {
refreshContainer.setAttribute("isTagExpr","false");
if (tag) {
refreshContainer.setAttribute("title",tag);
refreshContainer.setAttribute("showEmpty","true");
}
else {
refreshContainer.setAttribute("title",tiddler.title);
refreshContainer.setAttribute("showEmpty","false");
}
}
this.refresh(refreshContainer);
},
refresh: function(place) {
var title = place.getAttribute("title");
var isTagExpr = place.getAttribute("isTagExpr") == "true";
var showEmpty = place.getAttribute("showEmpty") == "true";
removeChildren(place);
addClass(place,"tagglyTagging");
var countFound = config.taggly.getTiddlers(title,'title',isTagExpr).length
if (countFound > 0 || showEmpty) {
var lingo = config.taggly.lingo;
config.taggly.createListControl(place,title,"hideState");
if (config.taggly.getTagglyOpt(title,"hideState") == "show") {
createTiddlyElement(place,"span",null,"tagglyLabel",
isTagExpr ? lingo.labels.exprLabel.format([title]) : lingo.labels.label.format([title]));
config.taggly.createListControl(place,title,"title");
config.taggly.createListControl(place,title,"modified");
config.taggly.createListControl(place,title,"created");
config.taggly.createListControl(place,title,"listMode");
config.taggly.createListControl(place,title,"excerpts");
config.taggly.createListControl(place,title,"numCols");
config.taggly.createTagglyList(place,title,isTagExpr);
if (countFound == 0 && showEmpty)
createTiddlyElement(place,"div",null,"tagglyNoneFound",lingo.labels.noneFound);
}
}
}
}
},
// todo fix these up a bit
styles: [
"/*{{{*/",
"/* created by TagglyTaggingPlugin */",
".tagglyTagging { padding-top:0.5em; }",
".tagglyTagging li.listTitle { display:none; }",
".tagglyTagging ul {",
" margin-top:0px; padding-top:0.5em; padding-left:2em;",
" margin-bottom:0px; padding-bottom:0px;",
"}",
".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }",
".tagglyTagging table { margin:0px; padding:0px; }",
".tagglyTagging .button { visibility:hidden; margin-left:3px; margin-right:3px; }",
".tagglyTagging .button, .tagglyTagging .hidebutton {",
" color:[[ColorPalette::TertiaryLight]]; font-size:90%;",
" border:0px; padding-left:0.3em;padding-right:0.3em;",
"}",
".tagglyTagging .button:hover, .hidebutton:hover, ",
".tagglyTagging .button:active, .hidebutton:active {",
" border:0px; background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];",
"}",
".selected .tagglyTagging .button { visibility:visible; }",
".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }",
".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }",
".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }",
".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }",
".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}",
".tagglyTagging ul ul li {margin-left:0.5em; }",
".editLabel { font-size:90%; padding-top:0.5em; }",
".tagglyTagging .commas { padding-left:1.8em; }",
"/* not technically tagglytagging but will put them here anyway */",
".tagglyTagged {margin-bottom:5px;}",
".tagglyTagged li.listTitle { display:none; }",
".tagglyTagged li { display: inline; font-size:90%; }",
".tagglyTagged ul { margin:0px; padding:0px; }",
".excerpt { color:[[ColorPalette::TertiaryDark]]; }",
".excerptIndent { margin-left:4em; }",
"div.tagglyTagging table,",
"div.tagglyTagging table tr,",
"td.tagglyTagging",
" {border-style:none!important; }",
".tagglyTagging .contents { border-bottom:2px solid [[ColorPalette::TertiaryPale]]; padding:0 1em 1em 0.5em;",
" margin-bottom:0.5em; }",
".tagglyTagging .indent1 { margin-left:3em; }",
".tagglyTagging .indent2 { margin-left:4em; }",
".tagglyTagging .indent3 { margin-left:5em; }",
".tagglyTagging .indent4 { margin-left:6em; }",
".tagglyTagging .indent5 { margin-left:7em; }",
".tagglyTagging .indent6 { margin-left:8em; }",
".tagglyTagging .indent7 { margin-left:9em; }",
".tagglyTagging .indent8 { margin-left:10em; }",
".tagglyTagging .indent9 { margin-left:11em; }",
".tagglyTagging .indent10 { margin-left:12em; }",
".tagglyNoneFound { margin-left:2em; color:[[ColorPalette::TertiaryMid]]; font-size:90%; font-style:italic; }",
"/*}}}*/",
""].join("\n"),
init: function() {
merge(config.macros,this.macros);
config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;
store.addNotification("TagglyTaggingStyles",refreshStyles);
}
};
config.taggly.init();
//}}}
!Read more on...
[[storyofstuff.com|http://www.storyofstuff.com]]
!Video on Vimeo
<<tiddler "The Story of Stuff HQ">>
!Embedr Playlist using [[youtube|Youtube]] videos
<html><div class="embedr"><object width="425" height="520"><param name="movie" value="http://embedr.com/swf/slider/the-story-of-stuff/425/520/default/false/std"></param><param name="allowFullScreen" value="true"></param><param name="wmode" value="transparent"><embed src="http://embedr.com/swf/slider/the-story-of-stuff/425/520/default/false/std" type="application/x-shockwave-flash" allowFullScreen="true" width="425" height="520" wmode="transparent"></embed></object></div><br /><h1 class="tagClear" style="line-height:3em;">Browse storyofstuff.com</h1>
<iframe src="http://www.storyofstuff.com" style="width:100%;height:800px;"></iframe></html>
<<tiddler Video with: 950524>>
<html><div class="embedr"><object width="425" height="520"><param name="movie" value="http://embedr.com/swf/slider/the-web-of-live/425/520/default/false/std"></param><param name="allowFullScreen" value="true"></param><param name="wmode" value="transparent"><embed src="http://embedr.com/swf/slider/the-web-of-live/425/520/default/false/std" type="application/x-shockwave-flash" allowFullScreen="true" width="425" height="520" wmode="transparent"></embed></object></div></html>
All tiddlers containing independent script are tagging here...
<<tagglyTagging>>
/***
|''Name:''|TiddlerListMacro|
|''Version:''|2.3 (8-Jan-2008)|
|''Source''|http://jackparke.googlepages.com/jtw.html#TiddlerListMacro ([[del.icio.us|http://del.icio.us/post?url=http://jackparke.googlepages.com/jtw.html%23TiddlerListMacro]])|
|''Author:''|[[Jack]]|
|''Type:''|Macro|
|''Documentation:''|[[TiddlerListMacroDocumentation]]|
!Description
The TiddlerListMacro lists tiddlers with ~SQL-Like features:
* List tiddlers containing a word in the title or text (case-sensitive)
* List tiddlers tagged with given tags or exclude certain tags
* Ascending and descending sorting of single fields
* Limit number of tiddlers displayed
* Specify different HTML formats for the lists
* Grouping of items in a list
* Customizable wiki templates
* Numbering and totals
!Usage
{{{<<tiddlerList parameter1:"value1" parameter2:"value2" ...>>}}}
!Examples ([[TiddlerListMacroExamples]])
List all tiddlers tagged with "Plugin"
{{{<<tiddlerList tags:Plugin>>}}}
List newest 3 plugins which are not templates:
{{{<<tiddlerList tags:"Plugin,-Template" top:3 order:"-created">>}}}
List all tiddlers containing "Jack" in their title or text (last modified first):
{{{<<tiddlerList search:"Jack" order:"-modified">>}}}
List all tiddlers starting with "T" in a table:
{{{<<tiddlerList title:"^T" format:"table" header:"Tiddlers beginning with T" footer:"%count items listed">>}}}
Group tiddlers by first letter
{{{<<tiddlerList top:"15" group:"tiddler.title.substr(0,1)" groupTemplate:"''%group''">>}}}
Show a list of all tiddlers with creation date (overrides default item template)
{{{<<tiddlerList itemTemplate:"* %link (%created)\n">>}}}
Show all tiddlers that have the host's tiddler title in their tag list
{{{<<tiddlerList filter:"tiddler.tags.contains(currentTiddler.title)">>}}}
!Parameters
|!Parameter|!Type|!Meaning|!Example|
|top|Integer|Number of tiddlers to display|"10"|
|tags|String|List tiddlers with matching tags (AND Logic). Leading - to exclude.|"~ToDo,Urgent,-Done"|
|title|~RegEx|List tiddlers with matching title|"^[Pp]"|
|text|~RegEx|List tiddlers with matching text|"Searchtext"|
|search|~RegEx|List tiddlers with matching title OR text|"Problem"|
|filter*|~JavaScript|List tiddlers according to boolean expression)|"tiddler.title.length<4 && tiddler.tags.contains('Idea')"|
|format|String (fixed list)|HTML formatting of list. list (ul, default), nlist (ol), span, stack (div), csv, table.|"list"|
|order|String|Sort order of tiddlers. - is descending, + ascending|"-created"|
|group*|~JavaScript|Grouping field|tiddler.title.substr(0,1)|
|customParameter*|~JavaScript|Custom parameter to be evalled for use in the itemTemplate|tiddler.text.match(/Version: (.*)/)[1]|
|header|String|Top caption|"Tiddlers beginning with T"|
|footer|String|Bottom caption|"End of list"|
|itemTemplate|~WikiTemplate|~WikiText with %placeholders|"%link\n%abstract\n%modified"|
|groupTemplate|~WikiTemplate|~WikiText with %placeholders for the start of each group|"!!%group"|
|groupFooterTemplate|~WikiTemplate|~WikiText with %placeholders for the end of each group|"----\n"|
|dateFormat|String|Date formatting string when displaying dates|~YYYY-MM-DD|
|separator|String|Define a string or character to be inserted between items listed|" "|
|debug|Boolean|Set to 1 or true for debug mode where only wikitext will be output|debug:1|
{{{*}}} Parameter will be evalled (do not pass with {{{{{ }} }}} unless you want it evalled twice!)
!Template Placeholders
Placeholder values for itemTemplate parameter
|!Placeholder|!Field|
|%item|List item number|
|%link|Link to Tiddler {{{[[MyTiddler]]}}}|
|%title|Tiddler Name {{{MyTiddler}}}|
|%nolink|Unlinked Tiddler Title {{{~MyTiddler}}}|
|%abstract|First 300 chars of tiddler text|
|%text|All tiddler text|
|%tags|Tags separated by space|
|%created|Creation date|
|%modified|Modified date|
|%modifier|Last modifier|
|%group|Name of group field|
|%custom|The result of your evalled customParameter|
|%count|Number of items listed (footer only)|
!Variables
{{{{{currentTiddler}} }}}refers to the current (host) tiddler in function scope (i.e. within the filter or group parameters)
{{{{{gCurrentTiddler}} }}}refers to the current (host) tiddler in global scope (i.e. within{{{ {{}} }}}evalled parameters. Example:
{{{<<tiddlerList tags:{{gCurrentTiddler.title}}>>}}}
!Style
No styles are pre-assigned to the lists. Use {{{@@}}} notation to define custom styles in the header, footer, groupTemplate and itemTemplate parameters.
!Code
***/
//{{{
version.extensions.tiddlerList = {major: 2, minor: 3, revision: 0, date: new Date("Jan 08, 2008")};
// template = [header, item, separator, group, footer]
config.macros.tiddlerList={
formats : {list:true, nlist:true, span:true, stack:true, csv:true, table:true},
templates : {
list : [ "%0\n", "* %0\n", "", "%group\n", "%0\n"],
nlist : [ "%0", "# %0\n", "", "%group\n", "%0\n"],
span : [ "%0", "%0", " ", "%group", "%0"],
stack : [ "%0", "%0", "\n", "%group", "%0"],
csv : [ "%0", "%0", ", ", "%0", "%0\n"],
table : ["|!%0|\n", "|%0|\n", "", "|%group|\n", "|%0|\n"]
},
dateFormat : "DD MMM YYYY"
}
if (typeof gCurrentTiddler == 'undefined')
var gCurrentTiddler;
config.macros.tiddlerList.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
// Some globals
var count=0, groupCount=0, theGroup="", lastGroup="", firstInGroup = false;
var currentTiddler = tiddler;
gCurrentTiddler = tiddler;
var listWikiText="";
var formats = this.formats;
// SQL-Like parameters
var parameters = paramString.parseParams("name",null,true);
var pTags = parameters[0]["tags"]?parameters[0]["tags"][0].split(","):[];
var pOrder = parameters[0]["order"]?parameters[0]["order"][0]:"title";
var pTop = parameters[0]["top"]?parameters[0]["top"][0]:-1;
var pText = parameters[0]["text"]?parameters[0]["text"][0]:"";
var pTitle = parameters[0]["title"]?parameters[0]["title"][0]:"";
var pSearch = parameters[0]["search"]?parameters[0]["search"][0]:"";
var pFilter = parameters[0]["filter"]?parameters[0]["filter"][0]:"";
var pHeader = parameters[0]["header"]?paramFormat(parameters[0]["header"][0]):"";
var pFooter = parameters[0]["footer"]?paramFormat(parameters[0]["footer"][0]):"";
var pGroup = parameters[0]["group"]?parameters[0]["group"][0]:"";
var pDateFormat = parameters[0]["dateFormat"]?parameters[0]["dateFormat"][0]:this.dateFormat;
var pCustomParameter = parameters[0]["customParameter"]?parameters[0]["customParameter"][0]:"";
var pFormat = parameters[0]["format"]?parameters[0]["format"][0]:"list";
pFormat = formats[pFormat]?pFormat:"list"
// Separator
var pSeparator = parameters[0]["separator"]?paramFormat(parameters[0]["separator"][0]):(parameters[0]["seperator"]?paramFormat(parameters[0]["seperator"][0]):this.templates[pFormat][2])
// Template for group
var pGroupTemplate = this.templates[pFormat][3];
if (parameters[0]["groupTemplate"])
pGroupTemplate = paramFormat(parameters[0]["groupTemplate"][0])
pGroupTemplate = pGroupTemplate.replace("$))", ">>")
// Template for group footer
var pGroupFooterTemplate = "";
if (parameters[0]["groupFooterTemplate"])
pGroupFooterTemplate = paramFormat(parameters[0]["groupFooterTemplate"][0])
pGroupFooterTemplate = pGroupFooterTemplate.replace("$))", ">>")
// Template for item
var pItemTemplate = this.templates[pFormat][1];
if (parameters[0]["itemTemplate"])
pItemTemplate = paramFormat(parameters[0]["itemTemplate"][0])
pItemTemplate = pItemTemplate.replace(/\$\)\)/g, ">>").replace(/%link/g, "%0").replace(/%item/g, "%1").replace(/%abstract/g, "%2").replace(/%text/g, "%3").replace(/%created/g, "%4").replace(/%modified/g, "%5").replace(/%modifier/g, "%6").replace(/%group/g, "%7").replace(/%title/g, "%8").replace(/%tags/g, "%9").replace(/%nolink/g, "%10").replace(/%custom/g, "%11")
// Template for footer
var pFooterTemplate = this.templates[pFormat][4].replace("%count", "%1")
// Get all tiddlers
var tiddlers = store.reverseLookup("tags","",false);
// Sorting
if(!pOrder)
pOrder = "title";
if (pOrder.match(/^\-/i)) {
pOrder = pOrder.substr(1)
var sortDesc = true;
}
// Sorting on a standard field
if (pOrder.match(/(title)|(text)|(modifier)|(modified)|(created)|(tags)/))
if (sortDesc)
tiddlers.sort(function (a,b) {if(a[pOrder] == b[pOrder]) return(0); else return (a[pOrder] > b[pOrder]) ? -1 : +1; });
else
tiddlers.sort(function (a,b) {if(a[pOrder] == b[pOrder]) return(0); else return (a[pOrder] < b[pOrder]) ? -1 : +1; });
else
if (sortDesc)
tiddlers.sort(function (a,b) {if(a.fields[pOrder] == b.fields[pOrder]) return(0); else return (a.fields[pOrder] > b.fields[pOrder]) ? -1 : +1; });
else
tiddlers.sort(function (a,b) {if(a.fields[pOrder] == b.fields[pOrder]) return(0); else return (a.fields[pOrder] < b.fields[pOrder]) ? -1 : +1; });
// Header
if (pHeader)
listWikiText += formatItem(this.templates[pFormat][0], [pHeader], pFormat)
for(var t=0; t<tiddlers.length; t++) {
tiddler = tiddlers[t];
if (pText!="" && tiddler.text=="") tiddler.text=store.getValue(tiddler, 'text')
if (pTop==-1 || count<pTop) {
if (pText=="" || tiddler.text.match(pText)) {
if (pTitle=="" || tiddler.title.match(pTitle)) {
if (pSearch=="" || (tiddler.title.match(pSearch) || tiddler.text.match(pSearch))) {
if (pFilter=="" || eval(pFilter)) {
if (pTags.length==0 || compareArrays(tiddler.tags, pTags, "all")) {
count++;
if (tiddler.text=="") tiddler.text=store.getValue(tiddler, 'text')
// Grouping
if (pGroup) {
theGroup = eval(pGroup);
if(theGroup != lastGroup) {
groupCount++;firstInGroup = true;
if (pGroupFooterTemplate && groupCount>1)
listWikiText += pGroupFooterTemplate.replace("%group", theGroup)
listWikiText += pGroupTemplate.replace("%group", theGroup)
lastGroup = theGroup;
} else
firstInGroup = false;
}
// Separators
if (count>1 && !firstInGroup) listWikiText += pSeparator;
//Plaintext title
var noLink = tiddler.title.match(config.textPrimitives.wikiLink)?"~" + tiddler.title:tiddler.title;
// Custom parameter
if (pCustomParameter)
var custom="";
try {
custom = eval(pCustomParameter)
} catch (e) {}
// List individual tiddler
var strItem = formatItem(pItemTemplate,["[[" + tiddler.title + "]]",count,tiddler.text.substr(0,300),tiddler.text,tiddler.created.formatString(pDateFormat),tiddler.modified.formatString(pDateFormat),tiddler.modifier,theGroup,tiddler.title,tiddler.tags.join(" "),noLink,custom], pFormat)
for (var fld in tiddler.fields) strItem = strItem.replace('%field.' + fld, tiddler.fields[fld]);
listWikiText += strItem
}
}
}
}
}
}
}
// Last group footer
if (pGroup && pGroupFooterTemplate && count>0)
listWikiText += pGroupFooterTemplate.replace("%group", theGroup)
// Footer
if (pFooter) {
pFooter = pFooter.replace("%count", count)
listWikiText += formatItem(pFooterTemplate, [pFooter], pFormat)
}
// Render result
if (!parameters[0]["debug"])
wikify(listWikiText,place, null, currentTiddler)
else
place.innerHTML = "<textarea style=\"width:100%;\" rows=30>" + listWikiText + "</textarea>"
// Local functions
function paramFormat(param) {
// Allow "\n" in non evalled parameters
return param.replace(/\\n/g, "\n");
}
function formatItem(template, values, format) {
// Fill template with values (depending on list format)
if (format.match(/table/) && values[0].match(/\|/))
return ("%0\n").format(values)
else
return template.format(values)
}
function compareArrays(array, values, logic) {
// Compare items in array with AND("all") or OR("any") logic
var matches=0;
for(var v=0; v<values.length; v++)
if(values[v].replace(/^\s+|\s+$/g,"").match(/^\-/) && !array.contains(values[v].replace(/^\s+|\s+$/g,"").substr(1)))
matches++;
else if (array.contains(values[v]))
matches++;
return ((logic=="all" && matches==values.length) || (logic!="all" && matches>0))
}
}
String.prototype.prettyTrim = function(len,prefix,postfix) {
var result = this.trim().replace(/\r\n/g,' ').replace(/\n/g,' ');
if (!prefix) prefix = '';
if (!postfix) postfix = '';
if (result.length > len - 3)
return prefix + result.substr(0,len) + '...' + postfix;
else if (result.length > 0)
return prefix + result + postfix;
else
return result;
}
//}}}
|wideTable|k
|font-weight:bold; By Date Modified |font-weight:bold; By Date Created |h
|<<timeline "modified">>|<<timeline "created">>|
|~ViewToolbar|closeTiddler closeOthers refreshDisplay +editTiddler jump > fields syncing permalink references deleteTiddler|
|~EditToolbar|+saveTiddler -cancelTiddler fields jump 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 = 'inspired';
// 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")
});
//}}}
/%
|Name|TwitterTabs|
|Source|http://www.TiddlyTools.com/#TwitterTabs|
|Version|1.0.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Description|display a tabset with current Twitter feeds|
%/<<tiddler HideTiddlerBackground>><<tiddler HideTiddlerTags>>/%
- - - - - TAB DEFINITIONS - - - - -
%/<<tabs txtTwitterTabs
'tiddlytools' 'show tweets from @tiddlytools' [[TwitterTabs##tiddlytools]]
'jermolene' 'show tweets from @jermolene' [[TwitterTabs##jermolene]]
'find...' 'find tweets containing...' [[TwitterTabs##search]]
'from...' 'show tweets from...' [[TwitterTabs##user]]
>>/%
!tiddlytools
<<tiddler [[TwitterTabs##showUserResults]] with: tiddlytools>>
!jermolene
<<tiddler [[TwitterTabs##showUserResults]] with: jermolene>>
!search
<<tiddler [[TwitterTabs##showSearchForm]] with: {{config.options.txtTweetSearch||'TiddlyWiki'}}>>
!user
<<tiddler [[TwitterTabs##showUserForm]] with: {{config.options.txtTweetUser||'TiddlyWiki'}}>>
!end
- - - - - TAB CONTENT FORMATTING - - - - -
!showSearchForm
{{small smallform{
search for tweets containing: <<option {{config.options.txtTweetSearch='$1';'txtTweetSearch'}}>><html>
<hide linebreaks><input type='button' value='search' onclick="
var target=this.parentNode.parentNode.parentNode;
var out='\<\<tiddler [[TwitterTabs##showSearchForm]] with: {{config.options.txtTweetSearch}}\>\>';
removeChildren(target); wikify(out,target);
"></html>@@display:block;white-space:normal;<<tiddler [[TwitterTabs##showSearchResults]]
with: {{config.options.txtTweetSearch}}>>@@}}}
!end
!showUserForm
{{small smallform{
show tweets from: <<option {{config.options.txtTweetUser='$1';'txtTweetUser'}}>><html>
<hide linebreaks><input type='button' value='search' onclick="
var target=this.parentNode.parentNode.parentNode;
var out='\<\<tiddler [[TwitterTabs##showUserForm]] with: {{config.options.txtTweetUser}}\>\>';
removeChildren(target); wikify(out,target);
"></html>@@display:block;white-space:normal;<<tiddler [[TwitterTabs##showUserResults]]
with: {{config.options.txtTweetUser}}>>@@}}}
!end
!showSearchResults
{{toolbar{<script label="refresh">
var target=place.parentNode.parentNode;
var out='\<\<tiddler [[TwitterTabs##showSearchResults]] with: [[$1]]\>\>';
removeChildren(target); wikify(out,target);
</script>}}}~~__[[Recent tweets about: "$1"|http://search.twitter.com/search?q=$1]]__~~
<hr>@@display:block;height:20em;overflow:auto;<script>
window.twitterPlace=place;
</script><script src="http://search.twitter.com/search.json?q=$1&rpp=25&callback=twitterCallback">
</script>@@
!end
!showUserResults
{{toolbar{<script label="refresh">
var target=place.parentNode.parentNode;
var out='\<\<tiddler [[TwitterTabs##showUserResults]] with: [[$1]]\>\>';
removeChildren(target); wikify(out,target);
</script>}}}~~__[[Recent tweets from $1|http://twitter.com/$1]]__~~
<hr>@@display:block;height:20em;overflow:auto;<script>
window.twitterPlace=place;
</script><script src="http://twitter.com/statuses/user_timeline/$1.json?callback=twitterCallback">
</script>@@
!end
- - - - - TWEET ITEM FORMAT - - - - -
| where: %0=image, %1=name, %2=text, %3=timestamp
| note: "(48px+,48px+)" syntax requires [[ImageSizePlugin]]
!itemFormat
{{small{
[<img[%0]][[%1|http://twitter.com/%1]]: %2
{{fine{
%3}}} {{clear{
}}}
}}}
!end
- - - - - CALLBACK RENDERING FUNCTION - - - - -
%/<script>
window.twitterCallback=function(data){ // data object returned from twitter.com
var fmt=store.getTiddlerText('TwitterTabs##itemFormat');
if (data.results) data=data.results; // for SEARCH results
removeChildren(window.twitterPlace);
for (var i=0; i<data.length; i++) { var item=data[i];
var img=item.user? item.user.profile_image_url : item.profile_image_url;
var who=item.user? item.user.screen_name : item.from_user;
wikify(fmt.format([img,who,item.text,item.created_at]),window.twitterPlace);
}
}
</script>
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 19/11/2009 00:19:04 | Tobias | [[/|http://inspired.tiddlyspot.com/#]] | [[store.cgi|http://inspired.tiddlyspot.com/store.cgi]] | . | [[index.html | http://inspired.tiddlyspot.com/index.html]] | . | ok |
| 19/11/2009 00:40:59 | Tobias | [[/|http://inspired.tiddlyspot.com/#Southpark]] | [[store.cgi|http://inspired.tiddlyspot.com/store.cgi]] | . | [[index.html | http://inspired.tiddlyspot.com/index.html]] | . | ok |
| 19/11/2009 01:41:05 | Tobias | [[/|http://inspired.tiddlyspot.com/#Southpark]] | [[store.cgi|http://inspired.tiddlyspot.com/store.cgi]] | . | [[index.html | http://inspired.tiddlyspot.com/index.html]] | . | ok |
| 19/11/2009 02:00:52 | Tobias | [[/|http://inspired.tiddlyspot.com/#Southpark]] | [[store.cgi|http://inspired.tiddlyspot.com/store.cgi]] | . | [[index.html | http://inspired.tiddlyspot.com/index.html]] | . | ok |
| 19/11/2009 02:20:23 | Tobias | [[/|http://inspired.tiddlyspot.com/#Southpark]] | [[store.cgi|http://inspired.tiddlyspot.com/store.cgi]] | . | [[index.html | http://inspired.tiddlyspot.com/index.html]] | . |
| 26/11/2009 20:42:12 | Tobias | [[/|http://inspired.tiddlyspot.com/]] | [[store.cgi|http://inspired.tiddlyspot.com/store.cgi]] | . | [[index.html | http://inspired.tiddlyspot.com/index.html]] | . |
| 09/12/2009 17:09:46 | Tobias | [[/|http://inspired.tiddlyspot.com/]] | [[store.cgi|http://inspired.tiddlyspot.com/store.cgi]] | . | [[index.html | http://inspired.tiddlyspot.com/index.html]] | . |
| 10/12/2009 13:03:49 | Tobias | [[/|http://inspired.tiddlyspot.com/]] | [[store.cgi|http://inspired.tiddlyspot.com/store.cgi]] | . | [[index.html | http://inspired.tiddlyspot.com/index.html]] | . | ok |
| 10/12/2009 13:04:04 | Tobias | [[/|http://inspired.tiddlyspot.com/]] | [[store.cgi|http://inspired.tiddlyspot.com/store.cgi]] | . | [[index.html | http://inspired.tiddlyspot.com/index.html]] | . |
| 10/12/2009 17:15:27 | Tobias | [[/|http://inspired.tiddlyspot.com/]] | [[store.cgi|http://inspired.tiddlyspot.com/store.cgi]] | . | [[index.html | http://inspired.tiddlyspot.com/index.html]] | . |
/***
|''Name:''|UploadPlugin|
|''Description:''|Save to web a TiddlyWiki|
|''Version:''|4.1.3|
|''Date:''|Feb 24, 2008|
|''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: 3,
date: new Date("Feb 24, 2008"),
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");
//}}}
<script>
var e=place; while (!e.getAttribute('tiddler')) e=e.parentNode;
title=e.getAttribute('tiddler');
if (title=="Video") return "[[Recently Added]] | [[All Videos]] All tiddlers tagged ''Video'' reference here...<br/><<tagglyTagging>>";
tid=store.getTiddler(title);
if (tid==undefined) return;
var vid="$1";
if (vid=="$"+"1") return;
var types=["TED","Youtube","YoutubePlaylist","Vimeo"];
types["TED"]=['http://video.ted.com/','<object width="446" height="326"><param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" /><param name="allowFullScreen" value="true" /><param name="wmode" value="transparent" /><param name="bgColor" value="#ffffff" /><param name="flashvars" value="vu=%V%" /><embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="446" height="326" allowFullScreen="true" flashvars="vu=%V%"></embed></object>'];
types["Youtube"]=['http://www.youtube.com/v/','<object width= "425" height="344"><param name="movie" value="%V%&ap=%2526fmt%3D18&autoplay=0&rel=1&fs=1&loop=0"></param><param name="allowFullScreen" value="true"></param><embed src="%V%&ap=%2526fmt%3D18&autoplay=0&rel=1&fs=1&loop=0" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object>'];
types["YoutubePlaylist"]=['http://www.youtube.com/p/','<object width= "425" height="344"><param name="movie" value="%V%&ap=%2526fmt%3D18&autoplay=0&rel=1&fs=1&loop=0"></param><param name="allowFullScreen" value="true"></param><embed src="%V%&ap=%2526fmt%3D18&autoplay=0&rel=1&fs=1&loop=0" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object>'];
types["Vimeo"]=['http://vimeo.com/moogaloop.swf?clip_id=','<object width="425" height="344"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="%V%&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" /><embed src="%V%&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="420" height="344"></embed></object>'];
var i=-1;
var type="";
while (type==""&&i<types.length){i++;if(tid.tags.contains(types[i])) type=types[i];}
if(type=="")return "@@color:red;undefined video type, define in sourcecode of [[Video]]@@";
var url=types[type][0]+vid;
var out='<html>'+types[type][1].replace(/%V%/g, url);
if(type=="YoutubePlaylist") out+='<br><iframe src="http://www.youtube.com/view_play_list?p='+vid+'" style="margin-top:20px;width:1000px;height:800px;"></iframe>';
out+='</html>';
if ("$2"!="$"+"2") out+='{{vidMore{read more on... $2}}}';
return out;
</script>
All [[Vimeo|http://www.vimeo.com]] videos link here...
<<tagglyTagging>>
<<tiddler Video with: BhmsDGanyes>>
All youtube videos link here...
<<tagglyTagging>>
*[[sadfsaf|dfsdfg]]
**[[Recently Added]]
<<tagglyTagging>>
Fun stuff...
<<tagglyTagging>>
Name:mjuzik
Background:#FFF
Foreground:#000
PrimaryPale:#999
PrimaryLight:#777
PrimaryMid:#111
PrimaryDark:#000
SecondaryPale:#CCF
SecondaryLight:#9AF
SecondaryMid:#69C
SecondaryDark:#27B
TertiaryPale:#EEE
TertiaryLight:#CCC
TertiaryMid:#999
TertiaryDark:#666
Error:#F88
| Name | mjuzikTheme |h
|Description|A clean theme with a left and right top menu|
|PageTemplate|##PageTemplate|
|ViewTemplate|##ViewTemplate|
|EditTemplate|##EditTemplate|
|StyleSheet|##StyleSheet|
!PageTemplate
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='topMenu'>
<span id="topMenuL" refresh='content' tiddler='topMenuL'></span>
<span id="toggleSidebar" macro="toggleSideBar hide" style="display:none;"></span>
<span id="topMenuR" refresh='content' tiddler='topMenuR'></span>
</div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
!ViewTemplate
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'>
<span macro="tiddler cycleTags with: tagsTasks" title="task management" style="margin-right:20px;">
</span>
</div>
<div class="tagglyTagged" macro="tags"></div>
<div class='titleContainer'>
<span class='title' macro='view title'></span>
<span macro="miniTag"></span>
</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>)<span macro='rating =here RatingSummary' style="margin-left:10px;"></span></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
!EditTemplate
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div class="editLabel">Tags</div><div class="editor" macro="edit tags"></div>
<div class='editorFooter' macro='deliciousTagging'></div>
<!--<div class="editorFooter"><span macro="message views.editor.tagPrompt"></span><span macro="tagChooser"></span></div>-->
<div macro='annotations'></div>
<div class="editLabel">Content</div><div class="editor" macro="edit text"></div>
<!--}}}-->
!StyleSheet
/*{{{*/
/* a contrasting background so I can see where one tiddler ends and the other begins */
body {background: [[ColorPalette::TertiaryLight]];font-family:Verdana, sans-serif; }
/* prefer monospace for editing */
.editor textarea, .editor input {font-family: 'Consolas' monospace;background-color:[[ColorPalette::TertiaryPale]];}
/* sexy colours and font for the header */
.siteTitle {line-height:1.3em;}
.headerForeground {color: [[ColorPalette::SecondaryPale]];}
.headerShadow, .headerShadow a {color: [[ColorPalette::PrimaryMid]];}
.headerForeground a:hover {color:[[ColorPalette::TertiaryPale]];}
/* separate the top menu parts */
.headerForeground, .headerShadow {padding: 1em 0.2em 0 1em;font-family:Verdana, sans-serif;font-weight:bold;}
.headerForeground .siteSubtitle, .headerForeground .siteTitle, .headerForeground .siteTitle .tiddlyLinkExisting {color:[[ColorPalette::SecondaryMid]];}
.headerShadow .siteSubtitle {color: [[ColorPalette::PrimaryMid]];}
.headerShadow {left: 1px;top: 1px;} /* make shadow go and down right instead of up and left */
.headerForeground .siteTitle .tiddlyLinkExisting:hover {color:[[ColorPalette::SecondaryLight]];background:none;}
/* tiddler titles */
.title {font-size:250%;font-weight:normal;}
.subtitle {padding:0px;margin:0px;padding-left:1em;font-size: 90%;color: [[ColorPalette::TertiaryMid]];}
.subtitle .tiddlyLink {color: [[ColorPalette::TertiaryMid]];}
/* a little bit of extra whitespace */
.viewer {padding-bottom:3px;}
/* don't want any background color for headings */
h1,h2,h3,h4,h5,h6 {background-color: transparent;color: [[ColorPalette::Foreground]];}
/* give tiddlers 3d style border and explicit background */
.tiddler, #searchResults {
background: [[ColorPalette::Background]];
border-right: 2px [[ColorPalette::TertiaryMid]] solid;
border-bottom: 2px [[ColorPalette::TertiaryMid]] solid;
margin-bottom: 1em;
padding:1em 2em 2em 1.5em;
}
#displayArea {margin: 1em 16.2em 0em 1em;} /*use the freed up space */
#backstageButton a {margin-right:10px;color:#666;}
#backstageButton a:hover {background:none;}
#topMenu {
background: [[ColorPalette::PrimaryMid]];
background-image: url('[[ImgTopMenus]]');
background-repeat:repeat-x;
color:[[ColorPalette::PrimaryPale]];
min-height:25px;
padding:2px 2px 1px 2px;
}
#topMenuL br, #topMenuR br {display: none;}
#topMenuL {margin-top:5px;height:23px;float:left;}
#topMenuR {margin-top:2px;height:23px;float:right;margin-right:2em;}
#topMenuR table{width:152px;}
#topMenu .button, #topMenu .tiddlyLink, #topMenu a{
border:none;
font-weight:bold;
margin-left: 0.5em;
margin-right: 0.5em;
padding:3px 1px;
color: [[ColorPalette::TertiaryLight]];
font-size: 115%;
}
#topMenu .button:hover, #topMenu .tiddlyLink:hover {color: [[ColorPalette::TertiaryPale]];background:none;}
/* make 2.2 act like 2.1 with the invisible buttons */
.toolbar {visibility:hidden;}
.selected .toolbar {visibility:visible;}
/* experimental. this is a little borked in IE7 with the button borders but worth it I think for the extra screen realestate */
.toolbar {float:right;}^
/*clear viewer from viewer toolbar (due to add reminder form)
.viewer {clear:both; POSITION: relative;}
/* fix for TaggerPlugin. from sb56637. improved by FND */
.popup li .tagger a {display:inline;}
/* make it print a little cleaner */
@media print {
/* not sure if important is needed */
#topMenu {display: none ! important;}
.tiddler {border-style: none ! important;margin:0px ! important;padding:0px ! important;padding-bottom:2em ! important;}
.tagglyTagging .button, .tagglyTagging .hidebutton {display: none ! important;}
.headerShadow {visibility: hidden ! important;}
.tagglyTagged .quickopentag, .tagged .quickopentag {border-style: none ! important;}
.quickopentag a.button, .miniTag {display: none ! important;}
}
#sidebarOptions br {display:none;}
#sidebarOptions .sliderPanel {font-size:1em;margin-left:0px;padding:0px;background:none;}
#sidebarOptions .sliderPanel br {display:inline;}
#sidebarOptions .tiddlyLink {font-weight:normal;}
#sidebarOptions .tiddlyLink:hover {background-color:[[ColorPalette::SecondaryLight]];color:[[ColorPalette::Foreground]];}
.wideTable{width:98%}
.wideTable td{padding-left:5px;}
.wideTable thead td{padding-left:15px;}
.light {color:#AAA;}
.light .externalLink, .light .tiddlyLink {color:#AAA;}
.light .externalLink:hover, .light .tiddlyLink:hover {background:#CCC;color:#666;}
.viewer table td, .viewer table tr {vertical-align:top;}
.viewer table, table.twtable {border:1px solid [[ColorPalette::TertiaryDark]];}
.viewer table thead, table.twtable thead {border-bottom:1px solid [[ColorPalette::TertiaryDark]];font-weight:bold;}
#sidebarTabs {margin-top:3px;}
#sidebarTabs .sliderPanel a.button {display:inline;}
#sidebarTabs a.button {padding:0.2em 0.3em;margin:0 0.2em;display:block;}
#sidebar {margin-top:10px;margin-right:3px;margin-right:1em;}
#sidebar .button {border-style: none;}
#messageArea{margin-top:0px;}
#toolbar .tiddlyLinkExisting {font-weight:normal;}
iframe {border:none;height:800px;width:100%;padding:0px;margin:0px;}
.tagglyTagging {margin-top:5px;}
.right {float:right;margin-right:2%;}
.titleContainer .miniTag {color:[[ColorPalette::SecondaryDark]];}
.titleContainer .miniTag:hover {background:none;color:[[ColorPalette::TertiaryDark]];}
/* get user styles specified in StyleSheet */
[[StyleSheet]]
/*}}}*/
<script>
var l,ls=[
['http://fora.tv','educating vid-bits'],
['http://nuoviso.com','clearing up the garbage'],
['http://ted.com','inspiring talks']]
var out='|linkTable|k\n| what | where |h';
for(l=0;l<ls.length;l++)out+='\n|padding:2px 5px 0 5px;color:#336;'+ls[l][1]+'|'+ls[l][0]+'|';
return out;
</script>
installed pülugins:
<<list filter [tag[systemConfig]]>>
<<closeAll>><<renameButton x 'close all open articles'>>|[[ted|TED]]|[[yoututbe|Youtube]]|[[awareness|Awareness]]|[[fun]]|[[portals]]
[[ratings|Ratings]]|[[browse|Browser]]|<<permaview>><<gotoTiddler search liststyle:"z-index:99;right:2em;border:1px solid #999;margin-right:-2px;padding:0;" inputstyle:"border:1px solid #999;padding:0px;">>
/*{{{*/
config.options.chkShowRightSidebar=false;
config.options.txtTheme = 'mjuzikTheme';
config.options.chkInsertTabs = true;
config.views.wikified.defaultText = "";
config.views.editor.defaultText = "";
config.options.chkSaveBackups = true;
config.options.txtBackupFolder = 'twbackup';
config.options.chkAutoSave = (window.location.protocol == "file:");
config.commands.syncing.text="sync";
config.commands.references.text="ref";
config.commands.permalink.text="url";
config.macros.permaview.label="url";
config.macros.saveChanges.label="save";
config.macros.list.all.prompt="all tiddlers by title:";
config.macros.list.shadowed.prompt="default content tiddlers:";
config.macros.list.missing.prompt="not linked tiddlers:";
config.macros.list.orphans.prompt="linked but undefined:";
/*}}}*/