Welcome to TiddlyWiki created by Jeremy Ruston, Copyright © 2007 UnaMesa Association
|''Type:''|file|
|''URL:''|http://www.tiddlytools.com/|
|''Workspace:''|(default)|
This tiddler was automatically created to record the details of this server
Messing around with TiddlyWiki, and finally read my email. [[UnLtdWorld|http://unltdworld.com]] have announced an update to their site. ~UnLtdWorld is build on [[elgg]] - a really cool Social Networking platform I have installed and played around with for a while. I'd like to get a site up for the ~KhmerFoss site, and see if all the groups in Cambodia could get their details in one place.
One can dream.
Updated TiddlyWiki to 1.5.2.
<<<
We've just released TiddlyWiki version 2.5.2 at:
http://www.tiddlywiki.com/
(We released a version 2.5.1 yesterday, but found and fixed a problem
with the upgrade mechanism almost immediately, hence the re-release).
The big change is the start of the process of breaking off some of the
unique bits of functionality that TiddlyWiki possesses into separate
jQuery plugins that can be used by other developers in other projects.
Besides being good to bring things like local file operations to a
wider audience, part of the benefit will be that the quality of these
pieces of code
will improve through wider usage. For this release, we've concentrated
on TiddlyWiki's cryptographic library, stylesheet manipulation
functions, and local file system code. There's some documentation here:
http://jquery.tiddlywiki.org/
Besides the pluginification, there's the usual mix of bug fixes and tweaks:
- Improved separators and "more/less" extenders for toolbars
- Added plugin version information to the PluginManager
- Fixed Tags macro to respect the excludeLists tag
- Fixed problem with saving of extended tiddler fields
For the full list of changes see http://trac.tiddlywiki.org/wiki/History
Many thanks to the contributors and testers for this release. Please
let us have any comments here,
Cheers
Jeremy
<<<
<<<
Metadata application profile: ANZ-LOM
Published: May 2008
Audience: project managers; multimedia developers.
This metadata profile supports the access, search, selection, use, trade and management of digital content. The profile is based on the LOM standard. It replaces Metadata application profile v2.2.
<<<
Documentation describing metadata and protocols from the [[The Learning Corporation]], and used to build [[Scootle]] (I assume)
This is a TiddlyWiki - a Wiki written in HTML and ~JavaScript. It is an interesting idea, and I'm using it for two reasions:
# this is a new version - so I ''have'' to try it out,
# my ISP have done something to my PHP setup, and don't seem to have worked out what the ''Reply'' button on their email is for. I have told them what is wrong ... I'll be moving to a new host soon.
There are a whole load of tools that add functions to a ~TiddlyWiki - synchronization, sorting, templates etc available on the net. I will add some links to some interesting examples soon.
!Best viewed in ...
I thought the days of the "Best viewed in ..." were gone, but a ~TiddlyWiki is a single self contained file, and a lot of the fixes for Internet Explorer rely on graphics. So unfortunately if you are using Internet Explorer, it does not look so good.
For best results, [[Firefox 3.5|http://www.mozilla.com/en-US/firefox/all-beta.html]] or [[Safari 4|http://www.apple.com/safari/]].
For worst results, Internet Explorer upto and including version 8.
text/plain
.txt .text .js .vbs .asp .cgi .pl
----
text/html
.htm .html .hta .htx .mht
----
text/comma-separated-values
.csv
----
text/javascript
.js
----
text/css
.css
----
text/xml
.xml .xsl .xslt
----
image/gif
.gif
----
image/jpeg
.jpg .jpe .jpeg
----
image/png
.png
----
image/bmp
.bmp
----
image/tiff
.tif .tiff
----
audio/basic
.au .snd
----
audio/wav
.wav
----
audio/x-pn-realaudio
.ra .rm .ram
----
audio/x-midi
.mid .midi
----
audio/mp3
.mp3
----
audio/m3u
.m3u
----
video/x-ms-asf
.asf
----
video/avi
.avi
----
video/mpeg
.mpg .mpeg
----
video/quicktime
.qt .mov .qtvr
----
application/pdf
.pdf
----
application/rtf
.rtf
----
application/postscript
.ai .eps .ps
----
application/wordperfect
.wpd
----
application/mswrite
.wri
----
application/msexcel
.xls .xls3 .xls4 .xls5 .xlw
----
application/msword
.doc
----
application/mspowerpoint
.ppt .pps
----
application/x-director
.swa
----
application/x-shockwave-flash
.swf
----
application/x-zip-compressed
.zip
----
application/x-gzip
.gz
----
application/x-rar-compressed
.rar
----
application/octet-stream
.com .exe .dll .ocx
----
application/java-archive
.jar
[[AttachFilePlugin]] reads binary data from locally-stored files (e.g., images, PDFs, mp3's, etc.) and converts it to base64-encoded text that is stored in tiddlers tagged with<<tag attachment>>. [[AttachFilePluginFormatters]] allows you to use those tiddlers in place of the external path/file references that are normally part of the image and external links wiki syntax.
[[FileDropPlugin]] and [[FileDropPluginConfig]] allow you to quickly create attachment tiddlers simply by dragging files directly from your system's desktop folder display and dropping it onto an open TiddlyWiki document. Text files are automatically created as simple tiddlers, while binary files are automatically encoded and attached.
/***
|Name|AttachFilePlugin|
|Source|http://www.TiddlyTools.com/#AttachFilePlugin|
|Documentation|http://www.TiddlyTools.com/#AttachFilePluginInfo|
|Version|4.0.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires|AttachFilePluginFormatters, AttachFileMIMETypes|
|Overrides||
|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 <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1.3|
|Type|plugin|
|Requires||
|Overrides|'image' and 'prettyLink' formatters, TiddlyWiki.prototype.getRecursiveTiddlerText|
|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);
}
}
//}}}
/*{{{*/
.externalLink {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJUSURBVDjLpVPNaxNBFP8lqY1JSJOGFBtSU11BaEulUUFB7EUalB70kINCQfBv8FgNgvRUJCdPUj36FxgqKahpi18NSQXBikRbE6UfYpNtsruzO+ubTTaHNoLgwuMxs/P7eG/eOEzTxP98Xfs38vn8Y13XpxhjXZRB2QpN00R+mkwmb3QkKBaLAQI8CgaDSbfbC5VA4ByWP3LZ2xvE/HzmOq0OEhQKhcsCHA6Hoz6fD6WvZQh1zk1wkxORCYPIVFXtXAIdzsRiMWuj0VDACPyhuEIEvB0TiStWGR0JRI3d3d2oVqtNZcPA8MiYpW621EWz/+pAMBsEEofEpQjrxcI7yoalLv5FJq92dOAQoGw2a8bjcdRqNTrEUK5st9XtnNm+g7omQ+O698mt1YZN4LQdNJttWmEIZaNZ+5a/hLnfaSg6w0B4CApj9WsPj3kOlNAGt4DPNqdJmUH9weCjvvSFTmKo/xxqyh6K31/L47OhwKvbv2SLQDTHnkhhWfRA5xomRm7CoLXliCaisruB0YELkLWGc2X95e6p+85Q24G4BZfL1aybXCi6ZoG/7XwG4zoR0kQaDFW1hrGjFyGzuvNNaXHH2XLwNpfLQZZl+P1+HPa4iUCBbug40hNDf88gIgEJh1we9PmjyG8sYenL4lZdw1mHbT2dTk/SPNyLRCJnjksn8GB1Cgo506gU4UYKD+O8lMD79WUsrD3/qem4VJkxPzr2v8ZUKpUgolmKUfsxibwcncPpwXG8WFsoa9wCf2rPwb980l3HnsFd3gY3pM0Zs2Tv/wEq26vP9fcF2QAAAABJRU5ErkJggg);
background-position:right center;
background-repeat:no-repeat;
padding-right:18px;
}
body {
background-attachment: fixed;
background-image:url(data:image/gif;base64,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
);
}
/*}}}*/
The link below can be used to add items to the Wiki. Just drag the link to your bookmark bar.
<html><a href="javascript:u=document.location.href;t=document.title;s=window.getSelection();void(window.open(%22http://dcrobertson.tiddlyspot.com#newTiddler:[[%22+escape(t)+']]','_blank','width=1024,height=700,status=yes,resizable=yes,scrollbars=yes'));">Add a Tiddler</a></html>
Background: #fff
Foreground: #000
PrimaryPale: #fff
PrimaryLight: #cc8f55
PrimaryMid: #a95c0c
PrimaryDark: #841
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccbaa2
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
-----
Background
{{Background{
Background}}}
Foreground
{{Foreground{
Foreground}}}
PrimaryPale
{{PrimaryPale{
PrimaryPale}}}
PrimaryLight
{{PrimaryLight{
PrimaryLight}}}
PrimaryMid
{{PrimaryMid{
PrimaryMid}}}
PrimaryDark
{{PrimaryDark{
PrimaryDark}}}
SecondaryPale
{{SecondaryPale{
SecondaryPale}}}
SecondaryLight
{{SecondaryLight{
SecondaryLight}}}
SecondaryMid
{{SecondaryMid{
SecondaryMid}}}
SecondaryDark
{{SecondaryDark{
SecondaryDark}}}
TertiaryPale
{{TertiaryPale{
TertiaryPale}}}
TertiaryLight
{{TertiaryLight{
TertiaryLight}}}
TertiaryMid
{{TertiaryMid{
TertiaryMid}}}
TertiaryDark
{{TertiaryDark{
TertiaryDark}}}
Error
{{Error{
Error}}}
/***
|Name|CommentPlugin|
|Source|http://www.TiddlyTools.com/#CommentPlugin|
|Documentation|http://www.TiddlyTools.com/#CommentPluginInfo|
|Version|2.9.3|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|automatically insert formatted comments into tiddler content|
!!!!!Documentation
>see [[CommentPluginInfo]]
!!!!!Configuration
>see [[CommentPluginInfo]]
!!!!!Revisions
<<<
2009.04.10 [2.9.3] invoke autoSaveChanges() after adding a comment
| please see [[CommentPluginInfo]] for previous revision details |
2006.04.20 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.CommentPlugin= {major: 2, minor: 9, revision: 3, date: new Date(2009,4,10)};
config.macros.comment= {
marker: '/%'+'comment'+'%/',
fmt: "__''%subject%''__\n^^posted by %who% on %when%^^\n<<<\n%message%\n<<<\n",
datefmt: 'DDD, MMM DDth, YYYY at hh12:0mm:0ss am',
tags: '',
reverse: false,
handler: function(place,macroName,params,wikifier,paramstring,tiddler) {
var span=createTiddlyElement(place,'span');
var here=story.findContainingTiddler(place);
if (here) var tid=here.getAttribute('tiddler'); // containing tiddler title
span.setAttribute('here',tid);
var target=(params[0]&¶ms[0].length&¶ms[0]!='here')?params[0]:tid; // target title
span.setAttribute('target',target);
var overwrite=(params[1]&¶ms[1].toLowerCase()=='overwrite'); if (overwrite) params.shift();
span.setAttribute('overwrite',overwrite?'true':'false');
var reverse=(params[1]&¶ms[1].toLowerCase()=='reverse'); if (reverse) params.shift();
span.setAttribute('reverse',(reverse||this.reverse)?'true':'false');
var marker=this.marker;
if (params[1]&¶ms[1].substr(0,7)=='marker:') {
var marker='/%'+params[1].substr(7)+'%/';
params.shift();
}
span.setAttribute('marker',marker);
var tags=(params[1]&¶ms[1].length)?params[1]:this.tags; // target tags
span.setAttribute('tags',tags);
var fmt=(params[2]&¶ms[2].length)?params[2]:this.fmt; // output format
span.setAttribute('fmt',fmt.unescapeLineBreaks());
var datefmt=(params[3]&¶ms[3].length)?params[3]:this.datefmt; // date format
span.setAttribute('datefmt',datefmt.unescapeLineBreaks());
var html=this.html;
html=html.replace(/%nosubject%/g,(fmt.indexOf('%subject%')==-1)?'none':'block');
html=html.replace(/%nomessage%/g,(fmt.indexOf('%message%')==-1)?'none':'block');
var subjtxt=''; var msgtxt='';
html=html.replace(/%subjtxt%/g,subjtxt);
html=html.replace(/%msgtxt%/g,msgtxt);
span.innerHTML=html;
},
html: "<form style='display:inline;margin:0;padding:0;'>\
<div style='display:%nosubject%'>\
subject:<br>\
<input type='text' name='subject' title='enter subject text' style='width:95%' value='%subjtxt%'>\
</div>\
<div style='display:%nomessage%'>\
message:<br>\
<textarea name='message' rows='7' title='enter message text' \
style='width:95%'>%msgtxt%</textarea>\
</div>\
<center>\
<i>Please enter your information and then press</i>\
<input type='button' value='post' onclick='\
var s=this.form.subject; var m=this.form.message;\
if (\"%nosubject%\"!=\"none\" && !s.value.length)\
{ alert(\"Please enter a subject\"); s.focus(); return false; }\
if (\"%nomessage%\"!=\"none\" && !m.value.length)\
{ alert(\"Please enter a message\"); m.focus(); return false; }\
var here=this.form.parentNode.getAttribute(\"here\");\
var reverse=this.form.parentNode.getAttribute(\"reverse\")==\"true\";\
var target=this.form.parentNode.getAttribute(\"target\");\
var marker=this.form.parentNode.getAttribute(\"marker\");\
var tags=this.form.parentNode.getAttribute(\"tags\").readBracketedList();\
var fmt=this.form.parentNode.getAttribute(\"fmt\");\
var datefmt=this.form.parentNode.getAttribute(\"datefmt\");\
var overwrite=this.form.parentNode.getAttribute(\"overwrite\")==\"true\";\
config.macros.comment.addComment(here,reverse,target,tags,fmt,datefmt,\
s.value,m.value,overwrite,marker);'>\
</center>\
</form>",
addComment: function(here,reverse,target,newtags,fmt,datefmt,subject,message,overwrite,marker) {
var UTC=new Date().convertToYYYYMMDDHHMMSSMMM();
var rand=Math.random().toString();
var who=config.options.txtUserName;
var when=new Date().formatString(datefmt);
target=target.replace(/%tiddler%/g,here);
target=target.replace(/%UTC%/g,UTC);
target=target.replace(/%random%/g,rand);
target=target.replace(/%who%/g,who);
target=target.replace(/%when%/g,when);
target=target.replace(/%subject%/g,subject);
var t=store.getTiddler(target);
var text=t?t.text:'';
var modifier=t?t.modifier:config.options.txtUserName;
var modified=t?t.modified:new Date();
var tags=t?t.tags:[];
for(var i=0; i<newtags.length; i++) tags.pushUnique(newtags[i]);
var fields=t?t.fields:{};
var out=fmt;
out=out.replace(/%tiddler%/g,here);
out=out.replace(/%UTC%/g,UTC);
out=out.replace(/%when%/g,when);
out=out.replace(/%who%/g,who);
out=out.replace(/%subject%/g,subject);
out=out.replace(/%message%/g,message);
var pos=text.indexOf(marker);
if (pos==-1) pos=text.length; // no marker - insert at end
else if (reverse) pos+=marker.length; // reverse order by inserting AFTER marker
var newtxt=overwrite?out:(text.substr(0,pos)+out+text.substr(pos));
store.saveTiddler(target,target,newtxt,modifier,modified,tags,fields);
autoSaveChanges();
if (document.getElementById(story.idPrefix+target))
story.refreshTiddler(target,DEFAULT_VIEW_TEMPLATE,true);
if (here!=target && document.getElementById(story.idPrefix+here))
story.refreshTiddler(here,DEFAULT_VIEW_TEMPLATE,true);
}
};
//}}}
/***
|Name|CommentPluginInfo|
|Source|http://www.TiddlyTools.com/#CommentPlugin|
|Documentation|http://www.TiddlyTools.com/#CommentPluginInfo|
|Version|2.9.3|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|Documentation|
|Requires||
|Overrides||
|Description|Documentation for CommentPlugin|
!!!!!Usage
<<<
syntax:
{{{
<<comment TiddlerName overwrite reverse marker:... tags format dateformat>>
}}}
where:
*''~TiddlerName'' //(optional)//<br>specifies the 'target' tiddler into which comments will be written. If you use the keyword, //{{{"here"}}}// (or omit all parameters), the current tiddler is used by default. The ~TiddlerName can also include special //substitution markers// to construct a unique target title by dynamically inserting values, where:
**%tiddler%=containing tiddler title,
**%UTC%=UTC timestamp (YYYYMMMDD.HHMMSSMMM),
**%random%=random decimal number (.123456789),
**%who%=current TiddlyWiki username,
**%subject%=comment subject text.
*''overwrite'' //(optional)//<br>Normally, comments are //added// to a target tiddler if it already exists. However, if you use the ''overwrite'' keyword, the new comment text //''completely replaces the previous contents of an existing tiddler''//.
*''reverse'' //(optional)//<br>By default, new comments are added to the target tiddler //following// any existing comments. When ''reverse'' is used, new comments are inserted //before// existing comments, resulting in a reverse-chronological display (i.e, newest comments shown first).
*''marker:...'' //(optional)//<br>specifies an alternative //substitution marker// within the target tiddler (see below).
*''tags'' //(optional)//<br>adds specified space-separated tags to the target tiddler whenever a comment is written. Note that the list of tags should be enclosed in "..." so that it is processed as a single parameter.
*''format'' //(optional)//<br>specifies a custom output format that overrides the default format defined in {{{config.macros.comment.fmt}}} (see Configuration, below), using the following //substitution markers//:
**%tiddler%=containing tiddler title,
**%UTC%=UTC timestamp (YYYYMMMDD.HHMMSSMMM),
**%when%=formatted date/time,
**%who%=username,
**%subject%=subject,
**%message%=comment body text.
*''dateformat'' //(optional)//<br>specifies a custom date/timestamp output to be inserted in place of {{{%when%}} in the comment output format above. Overrides the default format defined in {{{config.macros.comment.datefmt}}} (see Configuration, below).
To indicate the location within the target tiddler where new comments are to be inserted, embed {{{/%comment%/}}} as a //substitution marker// //within that target tiddler's source//. Each new comment is inserted immediately preceding the marker, resulting in a time-ordered sequence of comments. If no marker is present, new comments are appended to the end of the tiddler. To insert comments from different forms into separate locations in the //same target tiddler//, you can use the ''marker:...'' parameter to specify alternative marker text (e.g., use "marker:note" or "marker:memo" to specify {{{/%note%/}}} or {{{/%memo%/}}} instead of {{{/%comment%/}}})
<<<
!!!!!Configuration
<<<
To configure the behavior and formats used by [[CommentPlugin]], //''place one or more of the following javascript statements in a tiddler tagged with<<tag systemConfig>>''//: //(note: the default values for each setting are shown)//
{{{
config.macros.comment.reverse=false;
}}}
>when set to {{{true}}}, all new comments are inserted //following// the comment marker instead of preceding it, resulting in a reverse chronological display order. If no comment marker is present in the target tiddler source, the 'reverse' option is ignored and new comments are always appended to the end of the tiddler.
{{{
config.macros.comment.fmt="__''%subject%''__\n^^posted by %who% on %when%^^\n<<<\n%message%\n<<<\n";
}}}
>defines the comment output format to be inserted into the tiddler, where: %when%=date/time, %who%=username, %subject%=subject, and %message% is the body of the comment. //Note: if you omit %subject% from the output format, the subject input field on the comment form will be automatically suppressed. Similarly, omitting %message% from the output format suppresses the message input field. This can be useful when using the {{{<<comment>>}}} macro to create simple activity logs that only require a short, one-line subject rather than entering extended message content.//
{{{
config.macros.comment.datefmt="DDD, MMM DDth, YYYY at hh12:0mm:0ss am";
}}}
>defines the date/timestamp output used within the comment format above.
{{{
config.macros.comment.tags="";
}}}
>defines an optional space-separated, list of tags to be added to the target tiddler whenever a comment is written. This is most useful when the target tiddler is different from the tiddler containing the {{{<<comment>>}}} macro, to make it easy to locate that tiddler later on.
Note: as of revision 2.0.0, dependencies on [[NestedSlidersPlugin]], [[MoveablePanelPlugin]], [[InlineJavascriptPlugin]] and [[ExpandSlidersScript]] have been eliminated. As a result, the comment form and generated comment output are no longer automatically contained within sliders and the "view all/close all" command is not automatically included. To recreate the previous output format and comment interface, use the following syntax in the tiddler in which you want to place your comments:
{{{
+++^40em^[add a note]...
<<moveablePanel>>add a note
----
<<comment here "" "+++!!!!![%when% (%who%): %subject%]>...\n%message%\n===\n">>===
| <<tiddler ExpandSlidersScript with: here "view all" "close all">>
}}}
<<<
!!!!!Revisions
<<<
2009.04.10 [2.9.3] invoke autoSaveChanges() after adding a comment
2009.03.09 [2.9.2] added marker:... macro parameter
2009.03.08 [2.9.1] fix handling of nosubject/nomessage when macro param specifies output format
2008.05.17 [2.9.0] optional 'overwrite' param replaces existing comment when stored as separate tiddler
2008.04.21 [2.8.0] replaced use of %n markers with special 'named' markers: %tiddler%, %UTC%, %random%, %who%, %when%, %subject% and %message% to avoid conflict with TW core processing of tiddler content. Also, added support for 'reverse' macro param.
2008.04.17 [2.7.0] added support for constructing target by inserting UTC timestamp, random number, username and/or subject text into target tiddler title
2008.04.15 [2.6.0] added support for custom format and dateformat parameters to override global default formats
2008.04.15 [2.5.1] make sure tiddlers are displayed before attempting to refresh them
2008.04.15 [2.5.0] refresh tiddler containing comment macro after adding new comment to target tiddler (if different)
2008.04.14 [2.4.0] added optional tag list parameter for tagging the target tiddler when comments are written
2008.04.14 [2.3.0] if %2 (subject) or %3 (message) are omitted from format string, suppress display and validation of corresponding form elements.
2008.04.13 [2.2.0] added optional ~TiddlerName param to specify target tiddler for writing comments
2008.04.10 [2.1.0] converted from inline script to plugin
2008.04.05 [2.0.0] removed dependencies on NestedSlidersPlugin, MoveablePanelPlugin, ExpandSlidersScript
2007.10.24 [1.2.0] added config.options.txtCommentDateFormat
2007.07.05 [1.1.0] added 'view all/close all' toolbar item plus code cleanup
2007.06.28 [1.0.2] added tiddler.fields to saveTiddler() call (preserves custom fields)
2007.05.26 [1.0.1] added support for optional 'reverse' keyword.
2006.04.20 [1.0.0] initial release
<<<
<html><form method=post target="" action="http://www.robertson.net.nz/cgi-bin/FormMail.pl">
<input type="hidden" name="recipient" value="don@robertson.net.nz">
<input type="text" name="realname" value="your name" onfocus="this.select()">
<input type="text" name="email" value="your email address" onfocus="this.select()"><input type="hidden" name="redirect" value="http://dcrobertson.tiddlyspot.com/#[[ThankYou]]"><input type="hidden" name="subject" value="TiddlyTools feedback">
<span>Your message:</span>
<textarea rows="7" cols="50" name="msg" style="width:99%" onfocus="this.select()"></textarea>
<p>Enter your information, then press
<input type="submit" value="send"
onclick="var f=this.form;
if (f.realname.value==f.realname.defaultValue)
{ alert('Please enter your name'); f.realname.focus(); return false; }
if (f.email.value==f.email.defaultValue)
{ alert('Please enter your email address'); f.email.focus(); return false; }
if (!f.msg.value.length)
{ alert('Please enter a message'); f.msg.focus(); return false; }
var target=this.form.nextSibling;
target.style.display='block';
">
</p>
</form>
</html>
[[Welcome]]
[[DonRobertson]]
/***
|Name|DiscussionPlugin|
|Source|http://www.TiddlyTools.com/#DiscussionPlugin|
|Documentation|http://www.TiddlyTools.com/#DiscussionPluginInfo|
|Version|1.5.7|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires|CommentPlugin|
|Overrides||
|Description|display tabbed discussion summary with comment input form|
!!!!!Documentation
>see [[DiscussionPluginInfo]]
!!!!!Configuration
<<<
When installed, [[DiscussionPlugin]] can automatically modify the default shadow [[ViewTemplate]] so that all tiddlers will be rendered with two tabs: "Page", and "Discussion". The "Page" tab displays the regular tiddler content, while the "Discussion" tab displays the summary list of comments as well as an input form to enter new comments. You can enable/disable this action by setting/clearing the following checkbox:
><<option chkDiscussionTemplate>> Automatically modify default shadow [[ViewTemplate]]
Note: //''You must reload your document for changes to this option to take effect.''// In addition, this option is only applied to the shadow [[ViewTemplate]]. If you are using a custom [[ViewTemplate]], you will need to manually alter that template to add the Page and Discussion tab display.
''Please see [[DiscussionPluginInfo]] for additional configuration options and instructions.''
<<<
!!!!!Revisions
<<<
2009.01.04 [1.5.7] in customized ViewTemplate, corrected 'tabs' macro to avoid error when viewing shadow tiddlers
| please see [[DiscussionPluginInfo]] for previous revision details |
2008.04.15 [1.0.0] initial prototype
<<<
!!!!!Code
***/
//{{{
version.extensions.DiscussionPlugin= {major: 1, minor: 5, revision: 7, date: new Date(2009,1,4)};
if (config.options.chkDiscussionTemplate===undefined)
config.options.chkDiscussionTemplate=false;
config.macros.discussion= {
reverse: // display order for summary list
false,
listfmt: // format for summary list items
"#<<slider [[]] [[%tiddler%]] [[%subject%]] [[posted by %who% on %when%]]>>\n",
tags: // tags for comment tiddlers
"excludeLists",
slices: // slice format included in comment tiddlers - used to create summary list display
"/%\n|subject|%subject%|\n|byline|%who%|\n|date|%when%|\n%/",
titlefmt: // format for dynamically generating comment tiddler title
"_%UTC%%random%", // default: append UTC timestamp and random number
commentfmt: // format for individual comment content
"^^posted by %who% on %when%^^\n<<<\n%message%\n<<<\n",
datefmt: // date format for comments
"DDD, MMM DDth, YYYY at hh12:0mm:0ss am",
handler: function(place,macroName,params,wikifier,paramstring,tiddler) {
var here=story.findContainingTiddler(place);
if (here) var tid=here.getAttribute("tiddler"); // containing tiddler title
var listfmt=(params[0]&¶ms[0].length)?params[0]:this.listfmt; // item format
var reverse=(params[1]&¶ms[1].toLowerCase()=="reverse"); if (reverse) params.shift();
var tags=params[1]?params[1]:this.tags; // target tags
if (!tags.readBracketedList().contains("comment")) tags+=" comment"; // must be tagged with "comment"
var commentfmt=(params[2]&¶ms[2].length)?params[2]:this.commentfmt; // output format
var datefmt=(params[3]&¶ms[3].length)?params[3]:this.datefmt; // date format
var tids=store.getTaggedTiddlers("comment","created");
if (reverse||this.reverse) tids=tids.reverse();
var out=""; var count=0;
for (var t=0; t<tids.length; t++) if (tids[t].title!=tid && tids[t].title.substr(0,tid.length)==tid) {
count++;
var title=tids[t].title;
var subject=store.getTiddlerSlice(title,"subject");
var byline=store.getTiddlerSlice(title,"byline");
var when=store.getTiddlerSlice(title,"date");
out+=listfmt;
out=out.replace(/%tiddler%/g,title);
out=out.replace(/%subject%/g,subject);
out=out.replace(/%who%/g,byline);
out=out.replace(/%when%/g,when);
}
out="!!!There "+(count==1?"is ":"are ")+count+" comment"+(count==1?"":"s")+":\n"+out;
var next="%tiddler%"+this.titlefmt;
out+="!!!Add a comment:\n";
out+="<<comment "+next+" [["+tags+"]] [["+this.slices+commentfmt+"]] [["+datefmt+"]]>>";
wikify(out,place);
},
countComments: function(tid,after) {
var tids=store.getTaggedTiddlers("comment","created");
var count=0;
for (var t=0; t<tids.length; t++)
if (tids[t].title!=tid && tids[t].title.substr(0,tid.length)==tid)
if (!after||tid.modified>=after) count++;
return count;
}
};
//}}}
// // automatically add shadow tiddlers and templates for displaying page/discussion tabs
//{{{
// macro for rendering current tiddler content
config.macros.currentTiddler= {
handler: function(place,macroName,params,wikifier,paramstring,tiddler) {
var here=story.findContainingTiddler(place); if (!here) return;
var txt=store.getTiddlerText(here.getAttribute("tiddler"),"");
txt=txt.replace(/\<\<currentTiddler\>\>/g,""); // prevents infinite recursion!
removeChildren(place); wikify(txt,createTiddlyElement(place,"div",null,"viewer"));
}
};
// [[CurrentTiddler]] allows tab to show tiddler content
config.shadowTiddlers.CurrentTiddler="<<currentTiddler>>";
// [[DiscussionTiddler]] allows tab to show discussion panel
config.shadowTiddlers.DiscussionTiddler="<<discussion>>";
// [[NoDiscussionViewTemplate]] is an unmodified copy of the shadow [[ViewTemplate]]
config.shadowTiddlers.NoDiscussionViewTemplate=store.getTiddlerText("ViewTemplate");
// [[DiscussionViewTemplate]] is a copy of the current [[ViewTemplate]] where the
// default viewer content ("view text wikified") is replaced with tabs for Page/Discussion
config.shadowTiddlers.DiscussionViewTemplate=store.getTiddlerText("ViewTemplate").replace(/view text wikified/,
'tabs txtDiscussionTab Page Page CurrentTiddler {{var c=0; if(place) var h=story.findContainingTiddler(place); if(h) c=config.macros.discussion.countComments(h.getAttribute("tiddler")); "Discussion"+(c?" ("+c+")":"")}} Discussion DiscussionTiddler');
// optionally, automatically apply DiscussionViewTemplate to all tiddlers
if (config.options.chkDiscussionTemplate) config.shadowTiddlers.ViewTemplate="[[DiscussionViewTemplate]]";
//}}}
/***
|Name|DiscussionPluginInfo|
|Source|http://www.TiddlyTools.com/#DiscussionPlugin|
|Documentation|http://www.TiddlyTools.com/#DiscussionPluginInfo|
|Version|1.5.7|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|Documentation|
|Requires||
|Overrides||
|Description|Documentation for DiscussionPlugin|
!!!!!Usage
<<<
syntax:
{{{
<<discussion listformat reverse tags commentformat dateformat>>
}}}
where:
*''listformat'' //(optional)//<br>specifies the display format for each item in the summary list. //Note: when specifying additional macro parameters, you can use a blank value (e.g., {{{""}}}) as a 'placeholder' to allow the default item format to be used.//
*''reverse'' //(optional)//<br>by default, the comments in the discussion summary list are shown in date/time order, with the oldest item listed first. The ''reverse'' keyword, when present, indicates the display order should be inverted so that the most recent item is listed first.
*''tags'' //(optional)//<br>specifies one or more space-separated tags to add to the target tiddler whenever a comment is written. Note that the list of tags should be enclosed in "..." so that it is processed as a single parameter. If you do not want tags added to the individual comment tiddlers, use a blank value (e.g., {{{""}}}) as a 'placeholder'. Regardless of the tags that are specified, a tag of "comment" is always added to each target tiddler. This is required in order to locate the tiddler when generating the dicussion summary list.
*''commentformat'' //(optional)//<br>specifies a custom output format to be used when inserting comments into the target tiddler, where: %when%=formatted date/timestamp, %who%=username, %subject%=comment subject text, and %message% is the body of the comment. When present, this parameter overrides the default output format defined via {{{config.macros.comment.fmt}}}. See the ''Configuration'' section below and in [[CommentPluginInfo]] for additional details.
*''dateformat'' //(optional)//<br>specifies a custom date/timestamp output used within the comment format above. When present, this parameter overrides the default date/timestamp format defined via {{{config.macros.comment.datefmt}}}. See the ''Configuration'' section below and in [[CommentPluginInfo]] for additional details.
<<<
!!!!!Configuration
<<<
[[DiscussionPlugin]] can automatically modify the default shadow [[ViewTemplate]] so that all tiddlers will be rendered with two tabs: "Page", and "Discussion". The "Page" tab displays the regular tiddler content, while the "Discussion" tab displays the summary list of comments as well as an input form to enter new comments. You can enable/disable this action by setting/clearing the following checkbox:
><<option chkDiscussionTemplate>> Automatically modify default shadow [[ViewTemplate]]
>usage: {{{<<option chkDiscussionTemplate>>}}}
>^^(or place {{{config.options.chkDiscussionTemplate=true;}}} in a tiddler tagged with "systemConfig")^^
Note: //''You must reload your document for changes to this option to take effect.''// In addition, this option is only applied to the shadow [[ViewTemplate]]. If you are using a custom [[ViewTemplate]], you will need to manually alter that template to add the Page and Discussion tab display (see below)
<<<
!!!!!Using tags to add discussion tabs to individual tiddlers
<<<
When your document is loaded, DiscussionPlugin automatically creates a shadow DiscussionViewTemplate that is copy of the current ViewTemplate, with the discussion tab syntax automatically installed. If TiddlyTools' TaggedTemplateTweak is also installed in your document then, rather than using the checkbox option to add discussion tabs to //every// tiddler in your document, you can selectively tag individual tiddlers with "discussion" to add the discussion tabs to only those specific tiddlers.
Conversely, if you enable the checkbox option to modify the default ViewTemplate, you can selectively tag individual tiddlers with "noDiscussion" to apply a shadow NoDiscussionViewTemplate that will use an unmodified version of the current ViewTemplate, thereby preventing the discussion tabs from appearing on those specific tiddlers.
<<<
!!!!!Using a customized [[ViewTemplate]]
<<<
To enable the discussion tab display when using a custom [[ViewTemplate]], you should edit that template and change this line:
{{{
<div class='viewer' macro='view text wikified'></div>
}}}
to:
{{{
<div class='viewer' macro='tabs txtDiscussionTab
Page Page CurrentTiddler Discussion Discussion DiscussionTiddler'></div>
}}}
>[[CurrentTiddler]] and [[DiscussionTiddler]] are special shadow tiddlers defined by the plugin. [[CurrentTiddler]] enables the {{{<<tabs>>}}} macro used in the [[ViewTemplate]] to display the content for the current tiddler within a tab, while [[DiscussionTiddler]] simply invokes the default {{{<<discussion>>}}} macro without any extra parameters in order to render the corresponding discussion summary list and comment input form. You can modify the these shadow definitions to add macro parameters or other custom content that will automatically appear in the discussion tab when each tiddler is rendered.
Note: if you are using a custom [[ViewTemplate]], you should also manually create custom versions of DiscussionViewTemplate and NoDiscussionViewTemplate as well, so that you can use the tagging method described above to selectively display discussion tabs for tiddlers that also apply your custom-defined templates.
<<<
!!!!!Plugin customization settings
<<<
To configure the global defaults used by [[DiscussionPlugin]], you can place one or more of the following javascript statements in a tiddler tagged with <<tag systemConfig>>: //(note: the default values for each setting are shown)//
{{{
config.macros.discussion.listfmt="#<<slider [[]] [[%tiddler%]] [[%subject%]] [[posted by %who% on %when%]]>>\n";
}}}
>defines the output format for each item in the discussion summary list, where: %tiddler%=tiddler title of the individual comment tiddler, %subject%=subject text, %who%=username, and %when% is the formatted date/time of the comment. These values are automatically stored in each comment tiddler by using a //hidden slice table//, so that this information can be easily retrieved when generating the summary list output.
{{{
config.macros.discussion.reverse=false;
}}}
>when set to {{{true}}}, the discussion summary list is displayed in a reverse chronological order.
{{{
config.macros.discussion.titlefmt="_%UTC%%random%";
}}}
>When comments are entered, they are written into separate target tiddlers whose titles are constructed by appending a generated suffix to the title of the tiddler containing the {{{<<discussion>>}}} macro. By default, this suffix contains the current UTC timestamp (e.g., YYYYMMDD.HHMMSSMMM) plus a randomly generated number (e.g., .123456789) to ensure that all target tiddlers have unique titles while also associating each comment with the specific discussion summary. The suffix is specified by using //substitution markers//, where: %UTC%=the UTC timestamp, %random%=a random decimal number, %who%=username, and %subject% is the subject text entered into the comment form.
{{{
config.macros.discussion.tags="comment excludeLists";
}}}
>Target tiddlers are automatically tagged with "comment" so that the {{{<<discussion>>}}} macro can locate them when generating the summary list. To reduce 'information clutter', target tiddlers are also tagged with "excludeLists" so that they don't automatically appear in the list of tiddlers shown in the sidebar tabs. You can use this setting to specify an optional space-separated list of tags to be added to the target tiddler whenever a comment is written. You can use a blank value (e.g., {{{""}}} if you do not want to add any extra tags to the target tiddler. However, as noted above, regardless of the specified tags, target tiddlers will still be tagged with "comment" in order to ensure that the {{{<<discussion>>}}} macro includes them in the summary list.
{{{
config.macros.discussion.commentfmt="^^posted by %who% on %when%^^\n<<<\n%message%\n<<<\n";
}}}
>defines the comment output format to be inserted into the target tiddler, where: %when%=date/timestamp, %who%=username, %subject%=subject, and %message% is the body of the comment. //Note: if you omit %subject% from the output format, the subject input field on the comment form will be automatically suppressed. Similarly, omitting %message% from the output format suppresses the message input field. This can be useful when using the {{{<<comment>>}}} macro to create simple activity logs that only require a short, one-line subject rather than entering extended message content.//
{{{
config.macros.comment.datefmt="DDD, MMM DDth, YYYY at hh12:0mm:0ss am";
}}}
>defines the date/timestamp output used within the comment format above.
<<<
!!!!!Revisions
<<<
2009.01.04 [1.5.7] in customized ViewTemplate, corrected 'tabs' macro to avoid error when viewing shadow tiddlers
2008.10.31 [1.5.6] added optional 'after' param to countComments() so 'new postings' count can be displayed (using customized DiscussionViewTemplate
2008.10.30 [1.5.5] added comment count to discussion tab. See countComments() function.
2008.05.15 [1.5.0] added automatic creation of shadows for DiscussionViewTemplate and NoDiscussionViewTemplate
2008.04.21 [1.4.0] replaced use of %n markers with special 'named' markers: %tiddler%, %UTC%, %random%, %who%, %when%, %subject% and %message% to avoid conflict with TW core processing of tiddler content.
2008.04.17 [1.3.0] added ability to customize generated 'comment tiddler' titles by using substitution parameters.
2008.04.17 [1.2.0] added ability to customize generated 'comment tiddler' titles by using substitution parameters.
2008.04.15 [1.1.1] in currentTiddler.handler(), prevent infinite recursion by removing {{{<<currentTiddler>>}}} from content being wikified.
2008.04.15 [1.1.0] added parameters for reverse, listformat, tags, commentformat, dateformat
2008.04.14 [1.0.0] initial prototype
<<<
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='viewer' macro='tabs txtDiscussionTab Page Page CurrentTiddler {{var c=0; if(place) var h=story.findContainingTiddler(place); if(h) c=config.macros.discussion.countComments(h.getAttribute("tiddler")); "Discussion"+(c?" ("+c+")":"")}} Discussion DiscussionTiddler'></div>
<div class='tagged' macro='tags'></div>
<div class='tagClear'></div>
<!--}}}-->
Experienced in all things Linux - Networking, Systems Administration, Monitoring and Support, Web Application Development, Migration, Network Backups etc.
I have been using and developing Web and Internet applications since Mosaic was new, and have been looking after Linux networks and servers since last century, and have administered many servers remotely.
<<tagsTree "DonRobertson" "" 1 6 index label>>
<<<
MIT OpenCourseWare:
Highlights for High School
Highlights for High School features MIT OpenCourseWare materials that are most useful for high school students and teachers.
<<<
http://ocw.mit.edu/OcwWeb/hs/home/home/index.htm
I have worked as a freelancer/contractor for ~Non-Governmental Organizations, Government agencies and commercial clients.
!New Zealand Insurance: Project Quest
The Quest project was a re-design of NZI’s contract quotation software. It included Web interfaces for both customers and NZI Staff.
* Web Interface Prototype Design,
* Deployment of an IBM Websphere development server,
* XML Schema design,
* XSLT scripting and building the HTML interface.
!Clear Communications
Clear Communications is New Zealand’s second largest Telecommunications company. I was involved in a project to automate the building of customer circuits using TCL/Expect scripting and SNMP messaging.
* Tcl/Expect scripting,
* SNMP coding.
!Work and Income New Zealand
!!Intranet Development and Migration
Work and Income New Zealand were moving their internal procedure manuals and processes to an Intranet. I was involved in the design, testing and development of the new Intranet.
* User testing Intranet Design,
* Modification and Implementation of Intranet design,
* ASP and ~JavaScript Scripting,
* Migration of existing material to the Intranet.
!!Call tracking application
The call tracking application imported data into an Oracle database, and created web pages for users detailing their cell phone usage. Users could mark personal calls and have a bill prepared.
* Intranet Application Design and Development,
* ASP and ~JavaScript scripting,
* Oracle Database development.
''Go Global'' was one of New Zealand's first Web Design companies. I was their first employee, starting as a part time contractor. When I left, Go Global had seven full time employees.
!Position: Technical Director
!Responsibilities
HTML editing, conversion of files to database and web formats, scripting databases to output HTML, site management for Go Global clients, client contact.
!Achievements
*Highly Commended award in both sections of the 1996 TUANZ Web Design Cookoff for Kiwihome and Countrywide Bank sites,
*Silicon Graphics Craft Award for “Excellence in depth” for overall site development,
*Cardinal ~On-Line Award for “The best example of on-line media for the corporate sector” for the Ministry of Forestry,
*Development of the New Zealand Bed & Breakfast web site,
*Development of email workflow system for Bed and Breakfast site bookings.
/***
|Name|HTMLFormattingPlugin|
|Source|http://www.TiddlyTools.com/#HTMLFormattingPlugin|
|Documentation|http://www.TiddlyTools.com/#HTMLFormattingPluginInfo|
|Version|2.4.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|'HTML' formatter|
|Description|embed wiki syntax formatting inside of HTML content|
The ~HTMLFormatting plugin allows you to ''mix wiki-style formatting syntax within HTML formatted content'' by extending the action of the standard TiddlyWiki formatting handler.
!!!!!Documentation
>see [[HTMLFormattingPluginInfo]]
!!!!!Revisions
<<<
2009.01.05 [2.4.0] in wikifyTextNodes(), pass w.highlightRegExp and w.tiddler to wikify() so that search term highlighting and tiddler-relative macro processing will work
| see [[HTMLFormattingPluginInfo]] for additional revision details |
2005.06.26 [1.0.0] Initial Release (as code adaptation - pre-dates TiddlyWiki plugin architecture!!)
<<<
!!!!!Code
***/
//{{{
version.extensions.HTMLFormattingPlugin= {major: 2, minor: 4, revision: 0, date: new Date(2009,1,5)};
// find the formatter for HTML and replace the handler
initHTMLFormatter();
function initHTMLFormatter()
{
for (var i=0; i<config.formatters.length && config.formatters[i].name!="html"; i++);
if (i<config.formatters.length) config.formatters[i].handler=function(w) {
if (!this.lookaheadRegExp) // fixup for TW2.0.x
this.lookaheadRegExp = new RegExp(this.lookahead,"mg");
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var html=lookaheadMatch[1];
// if <nowiki> is present, just let browser handle it!
if (html.indexOf('<nowiki>')!=-1)
createTiddlyElement(w.output,"span").innerHTML=html;
else {
// if <hide linebreaks> is present, suppress wiki-style literal handling of newlines
if (html.indexOf('<hide linebreaks>')!=-1) html=html.replace(/\n/g,' ');
// remove all \r's added by IE textarea and mask newlines and macro brackets
html=html.replace(/\r/g,'').replace(/\n/g,'\\n').replace(/<</g,'%%(').replace(/>>/g,')%%');
// create span, let browser parse HTML
var e=createTiddlyElement(w.output,"span"); e.innerHTML=html;
// then re-render text nodes as wiki-formatted content
wikifyTextNodes(e,w);
}
w.nextMatch = this.lookaheadRegExp.lastIndex; // continue parsing
}
}
}
// wikify #text nodes that remain after HTML content is processed (pre-order recursion)
function wikifyTextNodes(theNode,w)
{
function unmask(s) { return s.replace(/\%%\(/g,'<<').replace(/\)\%%/g,'>>').replace(/\\n/g,'\n'); }
switch (theNode.nodeName.toLowerCase()) {
case 'style': case 'option': case 'select':
theNode.innerHTML=unmask(theNode.innerHTML);
break;
case 'textarea':
theNode.value=unmask(theNode.value);
break;
case '#text':
var txt=unmask(theNode.nodeValue);
var newNode=createTiddlyElement(null,"span");
theNode.parentNode.replaceChild(newNode,theNode);
wikify(txt,newNode,highlightHack,w.tiddler);
break;
default:
for (var i=0;i<theNode.childNodes.length;i++)
wikifyTextNodes(theNode.childNodes.item(i),w); // recursion
break;
}
}
//}}}
|Name|HTMLFormattingPluginInfo|
|Source|http://www.TiddlyTools.com/#HTMLFormattingPlugin|
|Documentation|http://www.TiddlyTools.com/#HTMLFormattingPluginInfo|
|Version|2.4.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|documentation|
|Requires||
|Overrides||
|Description|documentation for HTMLFormattingPlugin|
The ~HTMLFormatting plugin allows you to freely ''mix wiki-style formatting syntax within HTML formatted content'' by extending the action of the standard TiddlyWiki formatting handler.
!!!!!Usage
<<<
The shorthand Wiki-style formatting syntax of ~TiddlyWiki is very convenient and enables most content to be reasonably well presented. However, there are times when tried-and-true HTML formatting syntax allows more more precise control of the content display.
When a tiddler is about to be displayed, ~TiddlyWiki looks for tiddler content contained within {{{<html>}}} and {{{</html>}}} markers. When present, the TiddlyWiki core simply passes this content directly to the browser's internal "rendering engine" to process as ~HTML-formatted content. However, TiddlyWiki does not also process the HTML source content for any embedded wiki-formatting syntax it may contain. This means that while you can use HTML formatted content, you cannot mix wiki-formatted content within the HTML formatting.
This plugin extends the TiddlyWiki core processing so that, after the HTML formatting has been processed, all the pieces of text occuring within the HTML block are then processed one piece at a time, so that normal wiki-style formatting can be applied to the individual text pieces.
Note: To bypass this extended processing for a specific section of HTML content, embed ''{{{<nowiki>}}}'' //anywhere// inside the {{{<html>...</html>}}} delimiters, and wiki formatting will not be applied to that content.
<<<
!!!!!Line breaks
<<<
One major difference between Wiki formatting and HTML formatting is how "line breaks" are processed. Wiki formatting treats all line breaks as literal content to be displayed //as-is//. However, because HTML normally ignores line breaks and actually processes them as simple "word separators" instead, many people who write HTML include extra line breaks in their documents, just to make the "source code" easier to read.
Even though you can use HTML tags within your tiddler content, the default treatment for line breaks still follows the Wiki-style rule (i.e., all new lines are displayed as-is). When adding HTML content to a tiddler (especially if you cut-and-paste it from another web page), you should take care to avoid adding extra line breaks to the text.
If removing all the extra line breaks from your HTML content would be a big hassle, you can quickly //override the default Wiki-style line break rule// so that the line breaks use the standard HTML rules, by placing ''{{{<hide linebreaks>}}}'' //anywhere// within the HTML content. This automatically converts all line breaks to spaces before rendering the content, so that the literal line breaks will be processed as simple word-breaks instead.
Note: this does //not// alter the actual tiddler content that is stored in the document, just the manner in which it is displayed. Any line breaks contained in the tiddler will still be there when you edit its content. Also, to include a literal line break when the ''<{{{hide linebreaks}}}>'' tag is present, you will need to use a ''<{{{br}}}>'' or ''<{{{p}}}>'' HTML tag instead of simply typing a line break.
<<<
!!!!!How it works
<<<
The TW core support for HTML does not let you put ANY wiki-style syntax (including TW macros) *inside* the {{{<html>...</html>}}} block. Everything between {{{<html>}}} and {{{</html>}}} is handed to the browser for processing and that is it.
However, not all wiki syntax can be safely passed through the browser's parser. Specifically, any TW macros inside the HTML will get 'eaten' by the browser since the macro brackets, {{{<<...>>}}} use the "<" and ">" that normally delimit the HTML/XML syntax recognized by the browser's parser.
Similarly, you can't use InlineJavascript within the HTML because the {{{<script>...</script>}}} syntax will also be consumed by the browser and there will be nothing left to process afterward. Note: unfortunately, even though the browser removes the {{{<script>...</script>}}} sequence, it doesn't actually execute the embedded javascript code that it removes, so any scripts contained inside of <html> blocks in TW are currently being ignored. :-(
As a work-around to allow TW *macros* (but not inline scripts) to exist inside of <html> formatted blocks of content, the plugin first converts the {{{<<}}} and {{{>>}}} into "%%(" and ")%%", making them "indigestible" so they can pass unchanged through the belly of the beast (the browser's HTML parser).
After the browser has done its job, the wiki syntax sequences (including the "undigested" macros) are contained in #text nodes in the browser-generated DOM elements. The plugin then recursively locates and processes each #text node, converts the %%( and )%% back into {{{<<}}} and {{{>>}}}, passes the result to wikify() for further rendering of the wiki-formatted syntax into a containing SPAN that replaces the previous #text node. At the end of this process, none of the encoded %%( and )%% sequences remain in the rendered tiddler output.
<<<
!!!!!Revisions
<<<
2009.01.05 [2.4.0] in wikifyTextNodes(), pass w.highlightRegExp and w.tiddler to wikify() so that search term highlighting and tiddler-relative macro processing will work
2008.10.02 [2.3.0] added use of {{{<nowiki>}}} marker to bypass all wikification inside a specific HTML block
2008.09.19 [2.2.0] in wikifyTextNodes(), don't wikify the contents of STYLE nodes (thanks to MorrisGray for bug report)
2008.04.26 [*.*.*] plugin size reduction: more documentation moved to HTMLFormattingInfo
2008.01.08 [*.*.*] plugin size reduction: documentation moved to HTMLFormattingInfo
2007.12.04 [*.*.*] update for TW2.3.0: replaced deprecated core functions, regexps, and macros
2007.06.14 [2.1.5] in formatter, removed call to e.normalize(). Creates an INFINITE RECURSION error in Safari!!!!
2006.09.10 [2.1.4] update formatter for 2.1 compatibility (use this.lookaheadRegExp instead of temp variable)
2006.05.28 [2.1.3] in wikifyTextNodes(), decode the *value* of TEXTAREA nodes, but don't wikify() its children. (thanks to "ayj" for bug report)
2006.02.19 [2.1.2] in wikifyTextNodes(), put SPAN element into tiddler DOM (replacing text node), BEFORE wikifying the text content. This ensures that the 'place' passed to any macros is correctly defined when the macro is evaluated, so that calls to story.findContainingTiddler(place) will work as expected. (Thanks for bug report from GeoffSlocock)
2006.02.05 [2.1.1] wrapped wikifier hijack in init function to eliminate globals and avoid FireFox 1.5.0.1 crash bug when referencing globals
2005.12.01 [2.1.0] don't wikify #TEXT nodes inside SELECT and TEXTAREA elements
2005.11.06 [2.0.1] code cleanup
2005.10.31 [2.0.0] replaced hijack wikify() with hijack config.formatters["html"] and simplified recursive WikifyTextNodes() code
2005.10.09 [1.0.2] combined documentation and code into a single tiddler
2005.08.05 [1.0.1] moved HTML and CSS definitions into plugin code instead of using separate tiddlers
2005.07.26 [1.0.1] Re-released as a plugin. Added <{{{html}}}>...</{{{nohtml}}}> and <{{{hide newlines}}}> handling
2005.06.26 [1.0.0] Initial Release (as code adaptation - pre-dates TiddlyWiki plugin architecture!!)
<<<
This package defines a set of small icons appear adjacent to the title of each tiddler and indicate various information about the tiddler, such as whether it has unsaved changes, or has been changed recently, or has been tagged as<<tag Trash>>. Additional icons indicate important categories of tiddlers (based on tags), such as plugins, scripts, templates, attachments, bookmarks, tasks, etc.
----
<<tiddler ShowAllIcons>>
----
{{fine italic{
Note: this package includes icons that are part of the "Silk" icon set: http://www.famfamfam.com/lab/icons/silk/ containing 1000 16-by-16 pixel icons in PNG format, created by Mark James, a part-time web developer, part-time student currently living in Birmingham, UK, and is licensed under a Creative Commons Attribution 2.5 License. Please visit http://www.famfamfam.com/ for further information and licensing details.}}}
/***
|Name|ImagePathPlugin|
|Source|http://www.TiddlyTools.com/#ImagePathPlugin|
|Version|0.7.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin,formatter|
|Requires||
|Overrides|'image' formatter|
|Description|Tell TiddlyWiki where to look for image files. Permits multiple 'fallback' locations|
|Status|ALPHA - initial development/testing only - may be unstable - do not distribute|
!!!!!Usage
<<<
This plugin adds "resolvePath()" fallback processing to the {{{[img[...]]}}} formatter's handler, so that local image file references can be successfully resolved, even if the files cannot be located on the local filesystem.
The plugin tries alternative file "paths" that are listed, one per line, in an optional tiddler, [[ImagePathList]]. Each path in the list is combined with the image filename, which is then checked for existence, until the file is located. If no alternative is found, or [[ImagePathList]] is not present, then a 'last-ditch' fallback is attempted using the remote system and path specified in [[SiteUrl]] (if present).
If no fallback attempt is successful (i.e., because no [[ImagePathList]] OR [[SiteUrl]] tiddlers have been defined), the plugin simply passes the original image file value along for default handling by the browser without any "path resolution" being applied.(i.e, the current TW core behavior occurs).
| ''Important note: This plugin may cause one or more security alert messages to appear, because it uses browser-specific functions that can require security permission in order to access the local filesystem to check for the existence of a given image file. If you block local access, the 'last-ditch' fallback using the remote [[SiteUrl]] (if present) will be attempted.'' |
Note: the image formatter code contained here also includes support for AttachFilePlugin extensions (if installed). AttachFilePlugin includes its own fallback mechanism for handling embedded vs. local file vs. remote URL references to the attached binary file. Both methods may be used: ImagePathPlugin provides fallback for images contained in tiddler content, while AttachFilePlugin works well for access to non-image binary files (or images used in CSS as backgrounds, textures, etc.)
<<<
!!!!!Examples
<<<
coming soon...
<<<
!!!!!Revisions
<<<
''2007.04.13 [0.7.1]'' in testFile(), convert any file:// references to local native format before checking for existence.
''2007.03.26 [0.7.0]'' for IE, use onError handling to trigger call to resolvePath() so it will only be invoked if the original path/file is not found by the browser-native lookup. This avoids an unneeded call to fileExists() and the accompanying ActiveX security alert message box (as well as being slightly more efficient...)
''2007.03.25 [0.6.0]'' code cleanup (moved global functions into config.formatterHelpers) plus documentation re-write
''2007.03.24 [0.5.0]'' initial implementation - ALPHA - do not distribute
<<<
!!!!!Code
***/
//{{{
version.extensions.ImagePathPlugin= {major: 0, minor: 7, revision: 1, date: new Date(2007,4,13)};
//}}}
//{{{
// name of path definition tiddler
if (config.options.txtPathTiddler==undefined) config.options.txtPathTiddler="ImagePathList";
//}}}
//{{{
// low-level wrapper for platform-specific tests for local file existence
// returns true/false without visible error display
// Uses Components for FF and ActiveX FSO object for MSIE
// NOTE: this can cause a security warning on some browsers
config.formatterHelpers.fileExists=function(theFile) {
var found=false;
// DEBUG: alert('testing fileExists('+theFile+')...');
if(window.Components) {
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(theFile); }
catch(e) { return false; } // invalid directory
found = file.exists();
}
else { // use ActiveX FSO object for MSIE
var fso = new ActiveXObject("Scripting.FileSystemObject");
found = fso.FileExists(theFile)
}
// DEBUG: alert(theFile+" "+(found?"exists":"not found"));
return found;
}
//}}}
//{{{
// higher-level logic for checking local file existence.
// with secondary check for finding relative file references
// and automatic OK of http-based references without checking local filesystem
config.formatterHelpers.testFile=function(theFile) {
if (document.location.protocol!="file:") return true; // viewing remote document, can't test local filesystem... assume OK
if (theFile.substr(0,5)=="http:") return true; // remote HTTP reference... assume OK
if (theFile.substr(0,5)=="file:") theFile=getLocalPath(theFile); // convert local FILE reference to native format
if (this.fileExists(theFile)) return true; // file exists locally... OK to use!
// file might have been relative, add path from current document and try again
var docPath=document.location.href;
var slashpos=docPath.lastIndexOf("/"); if (slashpos==-1) slashpos=docPath.lastIndexOf("\\");
if (slashpos!=-1 && slashpos!=docPath.length-1) docPath=docPath.substr(0,slashpos+1); // trim off filename
if (this.fileExists(getLocalPath(docPath+theFile)))
return true; // ah ha!... file exists relative to current document... OK to use!
return false; // file not found on local system
}
//}}}
//{{{
// given a path/file string, check for existence and
// try alternatives (if any) defined in a tiddler
// with last-ditch using system/path from SiteUrl (if any)
config.formatterHelpers.resolvePath=function(theFile,testoriginal) {
if (testoriginal && this.testFile(theFile)) return theFile; // FOUND FILE - use specified path/file without modification
// get the filename portion only
var slashpos=theFile.lastIndexOf("/"); if (slashpos==-1) slashpos=theFile.lastIndexOf("\\");
var theName=(slashpos==-1)?theFile:theFile.substr(slashpos+1);
// get list of fallbacks (if any)
var pathText=store.getTiddlerText(config.options.txtPathTiddler);
if (pathText && pathText.length) {
var paths=pathText.split("\n");
for (p=0; p<paths.length; p++) // combine path+filename until one works...
if (this.testFile(paths[p]+theName))
return paths[p]+theName; // FOUND FILE - use alternative path+filename
}
// try "last ditch" fallback using SiteURL - assumes that original path/file was relative to document location
var siteURL=store.getTiddlerText("SiteUrl");
if (!siteURL||!siteURL.length) return theFile; // NO FALLBACK - use original path/file and hope for the best
// trim filename (if any) from site URL
var slashpos=siteURL.lastIndexOf("/"); if (slashpos==-1) slashpos=siteURL.lastIndexOf("\\");
if (slashpos!=-1 && slashpos!=siteURL.length-1) siteURL=siteURL.substr(0,slashpos+1);
return siteURL+theFile; // LAST DITCH: use system/path from SiteUrl combined with original file/path
}
//}}}
//{{{
// replace standard handler for image formatter
// adds call to resolvePath() to handle fallback processing
// includes support for AttachFilePlugin as well
config.formatters[config.formatters.findByField("name","image")].handler=function(w) {
if (!this.lookaheadRegExp) // fixup for TW2.0.x
this.lookaheadRegExp = new RegExp(this.lookahead,"mg");
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
// Simple bracketted link
var e = w.output;
if(lookaheadMatch[5]) {
var link = lookaheadMatch[5];
if (!config.formatterHelpers.isExternalLink) // fixup for TW2.0.x
var external=!store.tiddlerExists(link)&&!store.isShadowTiddler(link);
else
var external=config.formatterHelpers.isExternalLink(link);
if (external) {
if (config.macros.attach && config.macros.attach.isAttachment(link)) { // ELS - attachments
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);
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];
if (config.macros.attach!=undefined && config.macros.attach.isAttachment(lookaheadMatch[4])) // ELS - attachments
img.src=config.macros.attach.getAttachment(lookaheadMatch[4]);
else {
if (config.browser.isIE || config.browser.isSafari) { // ELS - path processing
// IE and Safari use browser's onError handling to check the original file...
// avoids extra security alert messages due to use of Components/ActiveX for filesystem access
img.onerror=(function(){this.src=config.formatterHelpers.resolvePath(this.src,false);return false;});
img.src=lookaheadMatch[4]; // ELS - path processing
} else {
// if NOT IE or Safari, always check the original path/file before rendering
img.src=config.formatterHelpers.resolvePath(lookaheadMatch[4],true);
}
}
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
//}}}
/***
|Name|ImageSizePlugin|
|Source|http://www.TiddlyTools.com/#ImageSizePlugin|
|Version|1.2.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin,formatter|
|Requires||
|Overrides|'image' formatter|
|Description|adds support for resizing images|
This plugin adds optional syntax to scale an image to a specified width and height and/or interactively resize the image with the mouse.
!!!!!Usage
<<<
The extended image syntax is:
{{{
[img(w+,h+)[...][...]]
}}}
where ''(w,h)'' indicates the desired width and height (in CSS units, e.g., px, em, cm, in, or %). Use ''auto'' (or a blank value) for either dimension to scale that dimension proportionally (i.e., maintain the aspect ratio). You can also calculate a CSS value 'on-the-fly' by using a //javascript expression// enclosed between """{{""" and """}}""". Appending a plus sign (+) to a dimension enables interactive resizing in that dimension (by dragging the mouse inside the image). Use ~SHIFT-click to show the full-sized (un-scaled) image. Use ~CTRL-click to restore the starting size (either scaled or full-sized).
<<<
!!!!!Examples
<<<
{{{
[img(100px+,75px+)[images/meow2.jpg]]
}}}
[img(100px+,75px+)[images/meow2.jpg]]
{{{
[<img(34%+,+)[images/meow.gif]]
[<img(21% ,+)[images/meow.gif]]
[<img(13%+, )[images/meow.gif]]
[<img( 8%+, )[images/meow.gif]]
[<img( 5% , )[images/meow.gif]]
[<img( 3% , )[images/meow.gif]]
[<img( 2% , )[images/meow.gif]]
[img( 1%+,+)[images/meow.gif]]
}}}
[<img(34%+,+)[images/meow.gif]]
[<img(21% ,+)[images/meow.gif]]
[<img(13%+, )[images/meow.gif]]
[<img( 8%+, )[images/meow.gif]]
[<img( 5% , )[images/meow.gif]]
[<img( 3% , )[images/meow.gif]]
[<img( 2% , )[images/meow.gif]]
[img( 1%+,+)[images/meow.gif]]
{{tagClear{
}}}
<<<
!!!!!Revisions
<<<
2009.02.24 [1.2.1] cleanup width/height regexp, use '+' suffix for resizing
2009.02.22 [1.2.0] added stretchable images
2008.01.19 [1.1.0] added evaluated width/height values
2008.01.18 [1.0.1] regexp for "(width,height)" now passes all CSS values to browser for validation
2008.01.17 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.ImageSizePlugin= {major: 1, minor: 2, revision: 1, date: new Date(2009,2,24)};
//}}}
//{{{
var f=config.formatters[config.formatters.findByField("name","image")];
f.match="\\[[<>]?[Ii][Mm][Gg](?:\\([^,]*,[^\\)]*\\))?\\[";
f.lookaheadRegExp=/\[([<]?)(>?)[Ii][Mm][Gg](?:\(([^,]*),([^\)]*)\))?\[(?:([^\|\]]+)\|)?([^\[\]\|]+)\](?:\[([^\]]*)\])?\]/mg;
f.handler=function(w) {
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var floatLeft=lookaheadMatch[1];
var floatRight=lookaheadMatch[2];
var width=lookaheadMatch[3];
var height=lookaheadMatch[4];
var tooltip=lookaheadMatch[5];
var src=lookaheadMatch[6];
var link=lookaheadMatch[7];
// Simple bracketted link
var e = w.output;
if(link) { // LINKED IMAGE
if (config.formatterHelpers.isExternalLink(link)) {
if (config.macros.attach && config.macros.attach.isAttachment(link)) {
// see [[AttachFilePluginFormatters]]
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);
addClass(e,"imageLink");
}
var img = createTiddlyElement(e,"img");
if(floatLeft) img.align="left"; else if(floatRight) img.align="right";
if(width||height) {
var x=width.trim(); var y=height.trim();
var stretchW=(x.substr(x.length-1,1)=='+'); if (stretchW) x=x.substr(0,x.length-1);
var stretchH=(y.substr(y.length-1,1)=='+'); if (stretchH) y=y.substr(0,y.length-1);
if (x.substr(0,2)=="{{")
{ try{x=eval(x.substr(2,x.length-4))} catch(e){displayMessage(e.description||e.toString())} }
if (y.substr(0,2)=="{{")
{ try{y=eval(y.substr(2,y.length-4))} catch(e){displayMessage(e.description||e.toString())} }
img.style.width=x.trim(); img.style.height=y.trim();
config.formatterHelpers.addStretchHandlers(img,stretchW,stretchH);
}
if(tooltip) img.title = tooltip;
// GET IMAGE SOURCE
if (config.macros.attach && config.macros.attach.isAttachment(src))
src=config.macros.attach.getAttachment(src); // see [[AttachFilePluginFormatters]]
else if (config.formatterHelpers.resolvePath) { // see [[ImagePathPlugin]]
if (config.browser.isIE || config.browser.isSafari) {
img.onerror=(function(){
this.src=config.formatterHelpers.resolvePath(this.src,false);
return false;
});
} else
src=config.formatterHelpers.resolvePath(src,true);
}
img.src=src;
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
config.formatterHelpers.addStretchHandlers=function(e,stretchW,stretchH) {
e.title=((stretchW||stretchH)?'DRAG=stretch/shrink, ':'')
+'SHIFT-CLICK=show full size, CTRL-CLICK=restore initial size';
e.statusMsg='width=%0, height=%1';
e.style.cursor='move';
e.originalW=e.style.width;
e.originalH=e.style.height;
e.minW=Math.max(e.offsetWidth/20,10);
e.minH=Math.max(e.offsetHeight/20,10);
e.stretchW=stretchW;
e.stretchH=stretchH;
e.onmousedown=function(ev) { var ev=ev||window.event;
this.sizing=true;
this.startX=!config.browser.isIE?ev.pageX:(ev.clientX+findScrollX());
this.startY=!config.browser.isIE?ev.pageY:(ev.clientY+findScrollY());
this.startW=this.offsetWidth;
this.startH=this.offsetHeight;
return false;
};
e.onmousemove=function(ev) { var ev=ev||window.event;
if (this.sizing) {
var s=this.style;
var currX=!config.browser.isIE?ev.pageX:(ev.clientX+findScrollX());
var currY=!config.browser.isIE?ev.pageY:(ev.clientY+findScrollY());
var newW=(currX-this.offsetLeft)/(this.startX-this.offsetLeft)*this.startW;
var newH=(currY-this.offsetTop )/(this.startY-this.offsetTop )*this.startH;
if (this.stretchW) s.width =Math.floor(Math.max(newW,this.minW))+'px';
if (this.stretchH) s.height=Math.floor(Math.max(newH,this.minH))+'px';
clearMessage(); displayMessage(this.statusMsg.format([s.width,s.height]));
}
return false;
};
e.onmouseup=function(ev) { var ev=ev||window.event;
if (ev.shiftKey) { this.style.width=this.style.height=''; }
if (ev.ctrlKey) { this.style.width=this.originalW; this.style.height=this.originalH; }
this.sizing=false;
clearMessage();
return false;
};
e.onmouseout=function(ev) { var ev=ev||window.event;
this.sizing=false;
clearMessage();
return false;
};
}
//}}}
/***
|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 <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~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(/^#/,'')); } }
//}}}
Type the text for 'Learning Object Repositories'
Recieved this
<<<
I am in favor of Open Content concept. All educational materials published by the Open Institute and its partners try to ensure that they are licensed under the Creative Commons, free to use and to redistribute.
To go a bit further than Open Content, we are now looking for a strong and effective system for a national clearing house which will be used to store and share educational resources from different levels in education - general, higher education, teacher training, non-formal and so on. Does anyone know if there is any FOSS system which is capable of performing this job?
<<<
the other day, so I have been looking around for something that would do the job. Again. I went through a lot of this at the HSL, but the people above do seem to get things done.
eduCommons looks pretty good, but they are not keen on Zope/Plone product. Python is not a popular language in Cambodia. PHP is probably the most used FOSS language.
The European Union sponsored the Self project to the tune of €980 000, but there seems to have been very little activity on it since the launch of the beta version in early 2008 - about the time the funding ran out, but I am sure that is a conincidence. I mean coincidence.
Apart from looking like it was designed by a committee, it does have some pretty cool features. But it is also Zope/Plone based.
I am also wondering about Digital Libraries and Repositories - Greenstone, Fedora Commons, dSpace, Kete ... which mostly seem like overkill.
Anyway - I guess the first step will be to see what is needed, steal all the good ideas, and then see what can be put together with tools like Drupal.
<<<
Learning Object Metadata is a data model, usually encoded in XML, used to describe a learning object and similar digital resources used to support learning. The purpose of learning object metadata is to support the reusability of learning objects, to aid discoverability, and to facilitate their interoperability, usually in the context of online learning management systems (LMS).
The IEEE 1484.12.1 – 2002 Standard for Learning Object Metadata is an internationally-recognised open standard (published by the Institute of Electrical and Electronics Engineers Standards Association, New York) for the description of “learning objects”. Relevant attributes of learning objects to be described include: type of object; author; owner; terms of distribution; format; and pedagogical attributes, such as teaching or interaction style.
<<<
http://en.wikipedia.org/wiki/Learning_object_metadata
<<<
A learning object is a resource, usually digital and web-based, that can be used and re-used to support learning.
Learning objects offer a new conceptualization of the learning process: rather than the traditional "several hour chunk", they provide smaller, self-contained, re-usable units of learning.
They will typically have a number of different components, that range from descriptive data to information about rights and educational level. At their core, however, will be instructional content, practice, and assessment. A key issue is the use of metadata.
Learning object design raises issues of portability, and of the object's relation to a broader learning management syste
<<<
http://en.wikipedia.org/wiki/Learning_object
.
<<tagsTree "LearningObjects" "" 1 6 index label>>
Type the text for 'New Tiddler'
/***
|''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);
}
//}}}
[[Don Robertson|DonRobertson]]
[[Get Bookmarklet|Bookmark This]]
[[About]]
[[Contact Me]]
----
<<tagsTree menu "" 1 6 index label>>
<<<
Metadata is "data about data" -- information like keywords, page-length, title, word-count, abstract, location, SKU, ISBN, and so on. Explicit, human-generated metadata has enjoyed recent trendiness, especially in the world of XML. A typical scenario goes like this: a number of suppliers get together and agree on a metadata standard -- a Document Type Definition or scheme -- for a given subject area, say washing machines. They agree to a common vocabulary for describing washing machines: size, capacity, energy consumption, water consumption, price. They create machine-readable databases of their inventory, which are available in whole or part to search agents and other databases, so that a consumer can enter the parameters of the washing machine he's seeking and query multiple sites simultaneously for an exhaustive list of the available washing machines that meet his criteria.
If everyone would subscribe to such a system and create good metadata for the purposes of describing their goods, services and information, it would be a trivial matter to search the Internet for highly qualified, context-sensitive results: a fan could find all the downloadable music in a given genre, a manufacturer could efficiently discover suppliers, travelers could easily choose a hotel room for an upcoming trip.
A world of exhaustive, reliable metadata would be a utopia. It's also a pipe-dream, founded on self-delusion, nerd hubris and hysterically inflated market opportunities.
<<<
http://www.well.com/~doctorow/metacrap.htm
Data about data - I am a fan of [[Drupal]], and one of the reasons is because of its core ''Taxonomy'' module. With Drupal, you can create a number of vocabaluaries, and each term in the vocabluary can be linked to Related Terms, Synonyms, can have Parent/Child relationships and so forth.
This is a pretty powerful way to organise content - if you get the vocabluaries right in the first place.
It has been fashionable to abandon closed vocabluaries in favour of user tagging. I'm not convinced that this is an entirely good idea. There is a place for it, course, but often people use no tags or they use every tag available. And users add tags without relating them to existing tags or synonyms - relating Shcools to Schools, for example.
Sites that exchange data have problems as well - the tags from one site don't always match the tags used on another site, and the same term on a different site could have an entirely different meaning in a different context.
With 'web 2.0', pop-up lists of existing tags, predictive selection of options, and so on soves many problems, and letting users tag content saves a lot of time, and add tags helps the vocabluary evolve. But there is still the problem of a good starting vocabluary and sharing content.
[[Metacrap]] (from 2001) looks at some of the issues.
[[TemaTres|http://www.r020.com.ar/tematres/index.en.html#funcionalidades]]: open source thesaurus management software
Type the text for 'OpenContent'
<<<
OpenCourseWare, or OCW, is a term applied to course materials created by universities and shared freely with the world via the internet. The OCW movement began at MIT with the launch of MIT OpenCourseWare in October 2002. Since then, a number of universities have created OCW projects, some of which have been funded by the William and Flora Hewlett Foundation.
According to the website of the OCW Consortium, an OCW project:
*is a free and open digital publication of high quality educational materials, organized as courses.
*is available for use and adaptation under an open license.
*does not typically provide certification or access to instructors.
<<<
http://en.wikipedia.org/wiki/OpenCourseWare
<!--{{{-->
<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='pageArea'>
<div id='sidebarLeft' class='sidebar'>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<div id='sidebarRight' class='sidebar'>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
</div>
<!--}}}-->
/***
|''Name:''|PasswordOptionPlugin|
|''Description:''|Extends TiddlyWiki options with non encrypted password option.|
|''Version:''|1.0.2|
|''Date:''|Apr 19, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#PasswordOptionPlugin|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (Beta 5)|
***/
//{{{
version.extensions.PasswordOptionPlugin = {
major: 1, minor: 0, revision: 2,
date: new Date("Apr 19, 2007"),
source: 'http://tiddlywiki.bidix.info/#PasswordOptionPlugin',
author: 'BidiX (BidiX (at) bidix (dot) info',
license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',
coreVersion: '2.2.0 (Beta 5)'
};
config.macros.option.passwordCheckboxLabel = "Save this password on this computer";
config.macros.option.passwordInputType = "password"; // password | text
setStylesheet(".pasOptionInput {width: 11em;}\n","passwordInputTypeStyle");
merge(config.macros.option.types, {
'pas': {
elementType: "input",
valueField: "value",
eventName: "onkeyup",
className: "pasOptionInput",
typeValue: config.macros.option.passwordInputType,
create: function(place,type,opt,className,desc) {
// password field
config.macros.option.genericCreate(place,'pas',opt,className,desc);
// checkbox linked with this password "save this password on this computer"
config.macros.option.genericCreate(place,'chk','chk'+opt,className,desc);
// text savePasswordCheckboxLabel
place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));
},
onChange: config.macros.option.genericOnChange
}
});
merge(config.optionHandlers['chk'], {
get: function(name) {
// is there an option linked with this chk ?
var opt = name.substr(3);
if (config.options[opt])
saveOptionCookie(opt);
return config.options[name] ? "true" : "false";
}
});
merge(config.optionHandlers, {
'pas': {
get: function(name) {
if (config.options["chk"+name]) {
return encodeCookie(config.options[name].toString());
} else {
return "";
}
},
set: function(name,value) {config.options[name] = decodeCookie(value);}
}
});
// need to reload options to load passwordOptions
loadOptionsCookie();
/*
if (!config.options['pasPassword'])
config.options['pasPassword'] = '';
merge(config.optionsDesc,{
pasPassword: "Test password"
});
*/
//}}}
Publishing Solutions was a print publishing company specialising in technical documentation and managing the production, printing and distribution of magazines for client organizations.
''Position: Electronic Publisher''
''Responsibilities''
* Installation and administration of Microsoft Small Business Server,
* Client support for Windows 95,
* Troubleshooting and automating pre-press process,
* Internet/Intranet publishing.
''Achievements''
* Microsoft Exchange application for internal messaging, production tracking and workflow,
* Prototype hybrid CD-Web promotional package,
* Reorganising network and file storage,
* Establishing a PDF document delivery system.
!usage
{{{[img[RoyalPalacePattern_2bit.gif]]}}}
[img[RoyalPalacePattern_2bit.gif]]
!notes
//none//
!type
image/gif
!file
file:////home/don/Pictures/RoyalPalacePattern_2bit.gif
!url
!data
data:image/gif;base64,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
!usage
{{{[img[RoyalPalacePattern_2bit.png]]}}}
[img[RoyalPalacePattern_2bit.png]]
!notes
//none//
!type
image/png
!file
!url
!data
data:image/png;base64,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
<<<
Scootle provides access to more than 8,000 digital curriculum resources from The Le@rning Federation. Teachers can find interactive learning objects, images, audio files and movie clips via browse, search and filter technology. Scootle allows the creation of learning paths – collections of learning content interwoven with teacher comments and descriptions that can be made available to students either online or offline. These learning paths can be shared with colleagues.
<<<
http://www.scootle.edu.au/ec/p/home
Type the text for 'Server'
Type the text for 'Services'
/***
|Name|SetIconPlugin|
|Source|http://www.TiddlyTools.com/#SetIconPlugin|
|Documentation|http://www.TiddlyTools.com/#SetIconPluginInfo|
|Version|1.8.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.3|
|Type|plugin|
|Requires||
|Overrides||
|Options|##Configuration|
|Description|add an image to a toolbar, macro, or slider link|
!!!!!Documentation
>see [[SetIconPluginInfo]]
!!!!!Configuration
<<<
<<option chkIconsShowImage>> show images on links
<<option chkIconsShowText>> include link text with images
default image style: {{stretch{<<option txtIconsCSS>>}}}
<<<
!!!!!Revisions
<<<
2008.05.11 [1.8.0] added optional 'notext' value for iconpos to force text to be hidden for specific links
| see [[SetIconPluginInfo]] for additional revision details |
2008.05.09 [1.0.0] initial release (as inline script)
<<<
!!!!!Code
***/
//{{{
version.extensions.SetIconPlugin= {major: 1, minor: 8, revision: 0, date: new Date(2008,5,11)};
if (config.options.chkIconsShowImage===undefined)
config.options.chkIconsShowImage=true;
if (config.options.chkIconsShowText===undefined)
config.options.chkIconsShowText=true;
if (config.options.txtIconsCSS===undefined)
config.options.txtIconsCSS="vertical-align:middle;width:auto;height:auto";
config.macros.setIcon = {
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
if (!config.options.chkIconsShowImage) return; // text-only - do nothing
if (!params[0]) return; // no image src specified - do nothing
// find nearest link element
var btn=place.lastChild; // look for sibling link
while (btn && btn.nodeName!="A") btn=btn.previousSibling;
if (!btn) { // look for child link
var links=place.getElementsByTagName("A");
if (links.length) btn=links[links.length-1];
}
if (!btn) { // look for parent link
var btn=place.parentNode.lastChild;
while (btn && btn.nodeName!="A") btn=btn.previousSibling;
}
if (!btn) { // look for cousin link
var links=place.parentNode.getElementsByTagName("A");
if (links.length) btn=links[links.length-1];
}
if (!btn) return; // can't find a link - do nothing
// set icon and command text/tip
var txt=btn.innerHTML;
var src=params[0]; // default to direct URL
if (config.macros.attach && config.macros.attach.isAttachment(src))
src=config.macros.attach.getAttachment(src); // retrieve attachment (if any)
var css=params[1]; if (!css||!css.length) css=config.options.txtIconsCSS;
var after=params[2]&¶ms[2].toUpperCase()=="RIGHT";
var notext=params[2]&¶ms[2].toUpperCase()=="NOTEXT";
btn.innerHTML="<img src='"+src+"' style='"+css+"'>";
if (config.options.chkIconsShowText && !notext)
btn.innerHTML=after?txt+btn.innerHTML:btn.innerHTML+txt;
else
btn.title=txt.toUpperCase()+": "+btn.title; // add text to tooltip
// adjust nested slider button text/tip
if (btn.getAttribute("closedtext")!=null) {
btn.setAttribute("closedtext",btn.innerHTML);
btn.setAttribute("openedtext",btn.innerHTML);
if (!config.options.chkIconsShowText || notext) {
btn.setAttribute("closedtip",txt.toUpperCase()+": "+btn.getAttribute("closedtip"));
btn.setAttribute("openedtip",txt.toUpperCase()+": "+btn.getAttribute("openedtip"));
}
}
}
};
//}}}
/%
NOTE: To be properly displayed, this tiddler needs HTMLFormattingPlugin installed
<html><hide linebreaks><table class="borderless"><tr><td style="text-align:center">
[[Tiddler Icons|ShowAllIcons]] (from the [[Silk|http://www.famfamfam.com/lab/icons/silk/]] collection): <br>
{{fine{//(move mouse over icons to view descriptions) //}}}
</td><td>
<<tiddlerIcons recent>>
<<tiddlerIcons changed>>
<<tiddlerIcons unsaved>>
<<tiddlerIcons Trash>>
<<tiddlerIcons core>>
<<tiddlerIcons systemConfig>>
<<tiddlerIcons tag>>
<<tiddlerIcons CSS>>
<<tiddlerIcons html>>
<<tiddlerIcons template>>
<<tiddlerIcons script>>
<<tiddlerIcons attachment>>
<<tiddlerIcons settings>>
<<tiddlerIcons pluginInfo>>
<<tiddlerIcons faq>>
<<tiddlerIcons task>>
</td></tr></table></html>
Type the text for 'New Tiddler'
Type the text for 'Software'
/*{{{*/
html {
min-height:101%;
}
body {
background-color:[[ColorPalette::PrimaryLight]];
}
#pageArea {
position:relative;
width:980px;
margin:auto;
border: 0;
}
.headerForeground,
.headerShadow {
padding:0em 0 1em 1em;
}
.siteSubtitle {
display:block;
}
#displayArea{
margin: 10px 200px 0;
position:absolute;
width:600px;
}
#tiddlerDisplay .tiddler {
border: 1px solid transparent;
margin: 0 5px 10px 5px;
background-color:[[ColorPalette::PrimaryPale]];
}
.sidebar {
margin:10px 0;
padding:0;
}
#sidebarLeft {
width:200px;
float:left;
}
#mainMenu,
#sidebarOptions{
position:relative;
margin: 0 5px 10px 5px;
padding:5px;
width:180px;
background-color:[[ColorPalette::PrimaryPale]];
}
#sidebarRight {
width:180px;
float:right;
}
#sidebarTabs{
}
#sidebarRight .txtMainTab > .tabContents{
width:170px;
padding:5px;
}
#sidebarRight .txtMainTab {
width:180px;
padding:0px;
}
#sidebarRight .txtMoreTab > .tabContents{
width:160px;
padding:5px;
}
.tab {
margin:0 0 0 0.25em;
padding:2px 1px 1px;
border-radius-topleft: 0.5em;
border-radius-topright: 0.5em;
-webkit-border-top-left-radius: 0.5em;
-webkit-border-top-right-radius: 0.5em;
-moz-border-radius-topleft: 0.5em;
-moz-border-radius-topright: 0.5em;
-khtml-border-radius-topleft: 0.5em;
-khtml-border-radius-topright: 0.5em;
}
#mainMenu,
#sidebarOptions,
.tagging,
.tabContents,
h1.branch,
h1.branch a.button,
h2.branch,
h2.branch a.button,
h3.branch,
h3.branch a.button,
h4.branch,
h4.branch a.button,
h5.branch,
h5.branch a.button,
h6.branch,
h6.branch a.button,
#tiddlerDisplay .tiddler,
.tiddlyLink,
.button,
.tagged,
input {
border-radius: 0.5em;
-webkit-border-radius: 0.5em;
-moz-border-radius: 0.5em;
-khtml-border-radius: 0.5em;
}
.branch .button {
background-color:[[ColorPalette::PrimaryDark]];
}
.tagging {
max-width:30%;
}
li a.tiddlyLink {
display:block;
}
.subtree .subtree {
margin-left:1em;
}
.subtree a.tiddlyLink,
li a.tiddlyLink {
margin:2px;
line-height:1em;
}
.button,
.tiddlyLink,
input {
padding:0 5px;
}
#mainMenu br {
display:none;
}
h1.branch,
h1.branch a.tiddlyLink:hover,
h1.branch a.tiddlyLink,
h2.branch,
h2.branch a.tiddlyLink:hover,
h2.branch a.tiddlyLink,
h3.branch,
h3.branch a.tiddlyLink:hover,
h3.branch a.tiddlyLink,
h4.branch,
h4.branch a.tiddlyLink:hover,
h4.branch a.tiddlyLink,
h5.branch,
h5.branch a.tiddlyLink:hover,
h5.branch a.tiddlyLink,
h6.branch,
h6.branch a.tiddlyLink:hover,
h6.branch a.tiddlyLink,
#mainMenu,
#sidebarOptions,
.tagging,
.tagged,
.tiddlyLink,
.tagged a.button,
.button {
border: 1px solid transparent;
}
#mainMenu:hover,
#sidebarOptions:hover,
.tagging:hover,
h1.branch:hover,
h2.branch:hover,
h3.branch:hover,
h4.branch:hover,
h5.branch:hover,
h6.branch:hover,
.tiddlyLink:hover,
#tiddlerDisplay .tiddler:hover,
.button:hover,
.tagged:hover {
border: 1px solid [[ColorPalette::PrimaryMid]];
box-shadow: 2px 2px 5px [[ColorPalette::PrimaryDark]];
-moz-box-shadow: 2px 2px 5px [[ColorPalette::PrimaryDark]];
-webkit-box-shadow: 2px 2px 5px [[ColorPalette::PrimaryDark]];
-khtml-box-shadow: 2px 2px 5px [[ColorPalette::PrimaryDark]];
}
h1.branch:active,
h2.branch:active,
h3.branch:active,
h4.branch:active,
h5.branch:active,
h6.branch:active,
.tiddlyLink:active,
#tiddlerDisplay .tiddler:active,
.button:active {
border: 1px solid [[ColorPalette::PrimaryMid]];
box-shadow: 0 0 0 [[ColorPalette::PrimaryMid]];
-moz-box-shadow: 0 0 0 [[ColorPalette::PrimaryMid]];
-webkit-box-shadow: 0 0 0 [[ColorPalette::PrimaryMid]];
-khtml-box-shadow: 0 0 0 [[ColorPalette::PrimaryMid]];
}
#sidebarRight .tabset {
padding: 1em 2px 0 3px;
}
#sidebarRight .tabset a {
font-size: x-small;
padding: 2px 5px;
}
.sidebar .tiddlyLink {
display:block;
padding: 0px 2px;
margin: 0px 2px;
}
.sidebar h1.branch a,
.sidebar h2.branch a ,
.sidebar h3.branch a ,
.sidebar h4.branch a ,
.sidebar h5.branch a ,
.sidebar h6.branch a {
display:inline;
}
h1.branch,
h2.branch,
h3.branch,
h4.branch,
h5.branch,
h6.branch {
margin:0;
padding:0 2px;
font-size:100%;
line-height:1em;
}
h1.branch a.tiddlyLink,
h1.branch a.tiddlyLink:hover,
h1.branch a.tiddlyLink:active,
h2.branch a.tiddlyLink,
h2.branch a.tiddlyLink:hover,
h2.branch a.tiddlyLink:active,
h3.branch a.tiddlyLink,
h3.branch a.tiddlyLink:hover,
h3.branch a.tiddlyLink:active,
h4.branch a.tiddlyLink,
h4.branch a.tiddlyLink:hover,
h4.branch a.tiddlyLink:active,
h5.branch a.tiddlyLink,
h5.branch a.tiddlyLink:hover,
h5.branch a.tiddlyLink:active,
h6.branch a.tiddlyLink,
h6.branch a.tiddlyLink:hover,
h6.branch a.tiddlyLink:active {
background-color: transparent;
border: 1px solid transparent;
box-shadow: 0 0 0 transparent;
-moz-box-shadow: 0 0 0 transparent;
-webkit-box-shadow: 0 0 0 transparent;
-khtml-box-shadow: 0 0 0 transparent;
}
h1.branch:hover,
h2.branch:hover,
h3.branch:hover,
h4.branch:hover,
h5.branch:hover,
h6.branch:hover {
background-color: [[ColorPalette::PrimaryMid]];
}
h1.branch:hover a,
h2.branch:hover a,
h3.branch:hover a,
h4.branch:hover a,
h5.branch:hover a,
h6.branch:hover a {
color: [[ColorPalette::PrimaryPale]];
background-color: transparent;
}
.subtree {
margin-bottom:0;
padding-bottom:0.5em;
}
.viewer pre {
font-size:1.2em;
line-height:1.4em;
margin-left:0.5em;
max-width:560px;
overflow:auto;
padding:0.5em;
}
#sidebarLeft .sliderPanel {
background-color:transparent;
}
/*}}}*/
Styles for displaying the default pallet
/*{{{*/
.Background {background-color: [[ColorPalette::Background]];}
.Foreground {background-color: [[ColorPalette::Foreground]];}
.PrimaryPale {background-color: [[ColorPalette::PrimaryPale]];}
.PrimaryLight {background-color: [[ColorPalette::PrimaryLight]];}
.PrimaryMid {background-color: [[ColorPalette::PrimaryMid]];}
.PrimaryDark {background-color: [[ColorPalette::PrimaryDark]];}
.SecondaryPale {background-color: [[ColorPalette::SecondaryPale]];}
.SecondaryLight {background-color: [[ColorPalette::SecondaryLight]];}
.SecondaryMid {background-color: [[ColorPalette::SecondaryMid]];}
.SecondaryDark {background-color: [[ColorPalette::SecondaryDark]];}
.TertiaryPale {background-color: [[ColorPalette::TertiaryPale]];}
.TertiaryLight {background-color: [[ColorPalette::TertiaryLight]];}
.TertiaryMid {background-color: [[ColorPalette::TertiaryMid]];}
.TertiaryDark {background-color: [[ColorPalette::TertiaryDark]];}
.Error {background-color: [[ColorPalette::Error]];}
/*}}}*/
[[BackgroundImages]]
/***
|Name|TaggedTemplateTweak|
|Source|http://www.TiddlyTools.com/#TaggedTemplateTweak|
|Documentation|http://www.TiddlyTools.com/#TaggedTemplateTweakInfo|
|Version|1.5.2|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.chooseTemplateForTiddler()|
|Description|use alternative ViewTemplate/EditTemplate for tiddler's tagged with specific tag values|
This tweak extends story.chooseTemplateForTiddler() so that ''whenever a tiddler is marked with a specific tag value, it can be viewed and/or edited using alternatives to the standard tiddler templates.''
!!!!!Documentation
>see [[TaggedTemplateTweakInfo]]
!!!!!Revisions
<<<
2009.05.04 [1.5.2] check for tiddler exist *after* title-as-prefix (allows shadow tiddlers to use custom templates)
| please see [[TaggedTemplateTweakInfo]] for previous revision details |
2007.06.11 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.TaggedTemplateTweak= {major: 1, minor: 5, revision: 2, date: new Date(2009,5,4)};
Story.prototype.taggedTemplate_chooseTemplateForTiddler = Story.prototype.chooseTemplateForTiddler
Story.prototype.chooseTemplateForTiddler = function(title,template)
{
// get core template and split into theme and template name
var coreTemplate=this.taggedTemplate_chooseTemplateForTiddler.apply(this,arguments);
var theme=""; var template=coreTemplate;
var parts=template.split(config.textPrimitives.sectionSeparator);
if (parts[1]) { theme=parts[0]; template=parts[1]; }
else theme=config.options.txtTheme||""; // fallback if theme is not specified
theme+=config.textPrimitives.sectionSeparator;
// look for template using *title* as prefix
if (!store.getTaggedTiddlers(title).length) { // if tiddler is not a tag
if (store.getTiddlerText(theme+title+template)) { return theme+title+template; } // theme##TitleTemplate
if (store.getTiddlerText(title+template)) { return title+template; } // TitleTemplate
}
// look for templates using *tags* as prefix
var tiddler=store.getTiddler(title);
if (!tiddler) return coreTemplate; // tiddler doesn't exist... use core result
for (i=0; i<tiddler.tags.length; i++) {
var t=tiddler.tags[i]+template; // add tag prefix to template
var c=t.substr(0,1).toUpperCase()+t.substr(1); // capitalized for WikiWord title
if (store.getTiddlerText(theme+t)) { return theme+t; } // theme##tagTemplate
if (store.getTiddlerText(theme+c)) { return theme+c; } // theme##TagTemplate
if (store.getTiddlerText(t)) { return t; } // tagTemplate
if (store.getTiddlerText(c)) { return c; } // TagTemplate
}
// no match... use core result
return coreTemplate;
}
//}}}
/***
|Name|TaggedTemplateTweakInfo|
|Source|http://www.TiddlyTools.com/#TaggedTemplateTweak|
|Documentation|http://www.TiddlyTools.com/#TaggedTemplateTweakInfo|
|Version|1.5.2|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|documentation|
|Requires||
|Overrides||
|Description|Documentation for TaggedTemplateTweak|
The core function, "story.chooseTemplateForTiddler(title,template)" is essentially a "pass-thru" that returns the same template it was given, and is provided by the core so that plugins can customize the template selection logic to select alternative templates, based on whatever programmatic criteria is appropriate. This tweak extends story.chooseTemplateForTiddler() so that ''whenever a tiddler is marked with a specific tag value, it can be viewed and/or edited using alternatives to the standard tiddler templates.''
!!!!!Usage
<<<
Each alternative template is associated with a specific tiddler tag value by using that tag value as a prefix added to the standard TiddlyWiki template titles, [[ViewTemplate]] and [[EditTemplate]]. For example, any tiddlers that are tagged with ''<<tag media>>'' will look for alternative templates named [[mediaViewTemplate]] and [[mediaEditTemplate]].
To use templates that have proper WikiWord tiddler titles (e.g., [[MediaViewTemplate]] and [[MediaEditTemplate]]), the plugin will also attempt to use a capitalized form of the tag value (e.g., ''Media'') as a prefix. //This capitalization is for comparison purposes only and will not alter the actual tag values that are stored in the tiddler.//
To use templates contained as //sections// within a systemTheme definition, the plugin also tries prepending the currently selected theme (specified by {{{config.options.txtTheme}}}) plus the 'section separator' (##) to the template name (e.g. ''[[SomeTheme##MediaViewTemplate]]'').
In addition to tag matching, the plugin also tries using the tiddler's //title// as a prefix (i.e., ''TiddlerNameViewTemplate'' and ''TiddlerNameEditTemplate''). This allows you to associate a custom template with a specific tiddler, without needing to add any special tag designation to that tiddler. Note that, similar to the manner in which //specificity// rules are applied to CSS, a template matching a specific ID (tiddler title) will always take precedence over a template matching a particular class name (tag value). Thus, [[SomeTitleViewTemplate]] overrides [[someTagViewTemplate]], which overrides the default [[ViewTemplate]].
Finally, if no alternative template is found at all, then the tiddler defaults to using the appropriate standard [[ViewTemplate]] or [[EditTemplate]] definition as determined by the standard TiddlyWiki core handling.
''To add your own custom templates:''
>First, decide upon a suitable tag keyword to uniquely identify your custom templates and create custom view and/or edit templates using that keyword as a prefix (e.g., "KeywordViewTemplate" and "KeywordEditTemplate"). Then, simply create a tiddler and tag it with your chosen keyword... that's it! As long as the tiddler is tagged with your keyword, it will be displayed using the corresponding alternative templates. If you remove the tag or rename/delete the alternative templates, the tiddler will revert to using the standard viewing and editing templates.
<<<
!!!!!Examples
<<<
|Sample tiddler| tag | view template | edit template |
|[[MediaSample - QuickTime]]| <<tag media>> | [[MediaViewTemplate]] | [[MediaEditTemplate]] |
|[[MediaSample - Windows]]| <<tag media>> | [[MediaViewTemplate]] | [[MediaEditTemplate]] |
|[[CDSample]]| <<tag CD>> | [[CDViewTemplate]] | [[CDEditTemplate]] |
|<<newTiddler label:"create new task..." title:SampleTask tag:task text:"Type some text and then press DONE to view the task controls">> | <<tag task>> | [[TaskViewTemplate]] | [[EditTemplate]] |
//(note: if these samples are not present in your document, please visit// http://www.TiddlyTools.com/ //to view these sample tiddlers on-line)//
<<<
!!!!!Revisions
<<<
2009.05.04 [1.5.2] check for tiddler exist *after* title-as-prefix (allows shadow tiddlers to use custom templates)
2009.01.06 [1.5.1] reversed logic so that title-as-prefix takes precedence over tag-matched prefix
2008.12.18 [1.5.0] added handling for using tiddler //title// as prefix (e.g., {{{SomeTiddlerViewTemplate}}})
2008.08.29 [1.4.1] corrected handling for tiddlers with no matching tagged template when non-default theme is in effect (e.g., use "MyTheme##ViewTemplate").
2008.05.15 [1.4.0] support use of *shadow* tagged templates (e.g., [[DiscussionViewTemplate]] created by [[DiscussionPlugin]])
2008.05.10 [1.3.0] corrected handling for determining core template when using theme with sections
2008.05.01 [1.2.5] added support for tagged templates stored as sections in a theme
2008.04.01 [1.2.0] added support for using systemTheme section-based template definitions (requested by Phil Hawksworth)
2008.01.22 [*.*.*] plugin size reduction - documentation moved to [[TaggedTemplateTweakInfo]]
2007.06.23 [1.1.0] re-written to use automatic 'tag prefix' search instead of hard coded check for each tag. Allows new custom tags to be used without requiring code changes to this plugin.
2007.06.11 [1.0.0] initial release
<<<
/***
|''Name:''|TagsTreePlugin|
|''Description:''|Displays tags hierachy as a tree of tagged tiddlers.<br>Can be used to create dynamic outline navigation.|
|''Version:''|1.0.1|
|''Date:''|Jan 04,2008|
|''Source:''|http://visualtw.ouvaton.org/VisualTW.html|
|''Author:''|Pascal Collin|
|''License:''|[[BSD open source license|License]]|
|''~CoreVersion:''|2.1.0|
|''Browser:''|Firefox 2.0; InternetExplorer 6.0|
!Demo
On the plugin [[homepage|http://visualtw.ouvaton.org/VisualTW.html]] :
*Try to tag some <<newTiddler>> with a tag displayed in the menu and edit MainMenu.
*Look at some tags like [[Plugins]] or [[menu]].
!Installation
#import the plugin,
#save and reload,
#optionally, edit TagsTreeStyleSheet.
! Usage
{{{<<tagsTree>>}}} macro accepts the following //optional// parameters.
|!#|!parameter|!description|!by default|
|1|{{{root}}}|Uses {{{root}}} tag as tree root|- In a //tiddler// content or template : uses the tiddler as root tag.<br>- In the //page// content or template (by ex MainMenu) : displays all untagged tags.|
|2|{{{excludeTag}}}|Excludes all such tagged tiddlers from the tree|Uses default excludeLists tag|
|3|{{{level}}}|Expands nodes until level {{{level}}}.<br>Value {{{0}}} hides expand/collapse buttons.|Nodes are collapsed on first level|
|4|{{{depth}}}|Hierachy depth|6 levels depth (H1 to H6 header styles)|
|5|{{{sortField}}}|Alternate sort field. By example : "index".|Sorts tags and tiddlers alphabetically (on their title)|
|6|{{{labelField}}}|Alertnate label field. By example : "label".|Displays tiddler's title|
!Useful addons
*[[FieldsEditorPlugin]] : //create//, //edit//, //view// and //delete// commands in toolbar <<toolbar fields>>.
*[[TaggerPlugin]] : Provides a drop down listing current tiddler tags, and allowing toggling of tags.
!Advanced Users
You can change the global defaults for TagsTreePlugin, like default {{{level}}} value or level styles, by editing or overriding the first config.macros.tagsTree attributes below.
!Code
***/
//{{{
config.macros.tagsTree = {
expand : "+",
collapse : "–",
depth : 6,
level : 1,
sortField : "",
labelField : "",
styles : ["h1","h2","h3","h4","h5","h6"],
trees : {}
}
config.macros.tagsTree.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
var root = params[0] ? params[0] : (tiddler ? tiddler.title : null);
var excludeTag = params[1] ? params[1] : "excludeTagsTree";
var level = params[2] ? params[2] : config.macros.tagsTree.level;
var depth = params[3] ? params[3] : config.macros.tagsTree.depth;
var sortField = params[4] ? params[4] : config.macros.tagsTree.sortField;
var labelField = params[5] ? params[5] : config.macros.tagsTree.labelField;
var showButtons = (level>0);
var id = config.macros.tagsTree.getId(place);
if (config.macros.tagsTree.trees[id]==undefined) config.macros.tagsTree.trees[id]={};
config.macros.tagsTree.createSubTree(place,id,root,excludeTag,[],level>0 ? level : 1,depth, sortField, labelField,showButtons);
}
config.macros.tagsTree.createSubTree = function(place, id, root, excludeTag, ancestors, level, depth, sortField, labelField,showButtons){
var childNodes = root ? this.getChildNodes(root, ancestors) : this.getRootTags(excludeTag);
var isOpen = (level>0) || (!showButtons);
if (root && this.trees[id][root]!=undefined) isOpen = this.trees[id][root];
if (root && ancestors.length) {
var t = store.getTiddler(root);
if (childNodes.length && depth>0) {
var wrapper = createTiddlyElement(place , this.styles[Math.min(Math.max(ancestors.length,1),6)-1],null,"branch");
if (showButtons) {
b = createTiddlyButton(wrapper, isOpen ? config.macros.tagsTree.collapse : config.macros.tagsTree.expand, null, config.macros.tagsTree.onClick);
b.setAttribute("treeId",id);
b.setAttribute("tiddler",root);
}
createTiddlyText(createTiddlyLink(wrapper, root),t&&labelField ? t.fields[labelField] ? t.fields[labelField] : root : root);
}
else
createTiddlyText(createTiddlyLink(place, root,false,"leaf"),t&&labelField ? t.fields[labelField] ? t.fields[labelField] : root : root);
}
if (childNodes.length && depth) {
var d = createTiddlyElement(place,"div",null,"subtree");
d.style.display= isOpen ? "block" : "none";
if (sortField)
childNodes.sort(function(a, b){
var fa=a.fields[sortField];
var fb=b.fields[sortField];
return (fa==undefined && fb==undefined) ? a.title < b.title ? -1 : a.title > b.title ? 1 : 0 : (fa==undefined && fb!=undefined) ? 1 :(fa!=undefined && fb==undefined) ? -1 : fa < fb ? -1 : fa > fb ? 1 : 0;
})
for (var cpt=0; cpt<childNodes.length; cpt++)
this.createSubTree(d, id, childNodes[cpt].title, excludeTag, ancestors.concat(root), level-1, depth-1, sortField, labelField, showButtons);
}
}
config.macros.tagsTree.onClick = function(e){
var id = this.getAttribute("treeId");
var tiddler = this.getAttribute("tiddler");
var n = this.parentNode.nextSibling;
var isOpen = n.style.display != "none";
if(config.options.chkAnimate && anim && typeof Slider == "function")
anim.startAnimating(new Slider(n,!isOpen,null,"none"));
else
n.style.display = isOpen ? "none" : "block";
this.firstChild.nodeValue = isOpen ? config.macros.tagsTree.expand : config.macros.tagsTree.collapse;
config.macros.tagsTree.trees[id][tiddler]=!isOpen;
return false;
}
config.macros.tagsTree.getChildNodes = function(root ,ancestors){
var childs = store.getTaggedTiddlers(root);
var result = new Array();
for (var cpt=0; cpt<childs.length; cpt++)
if (childs[cpt].title!=root && ancestors.indexOf(childs[cpt].title)==-1) result.push(childs[cpt]);
return result;
}
config.macros.tagsTree.getRootTags = function(excludeTag){
var tags = store.getTags(excludeTag);
tags.sort(function(a,b) {return a[0].toLowerCase() < b[0].toLowerCase() ? -1 : (a[0].toLowerCase() == b[0].toLowerCase() ? 0 : +1);});
var result = new Array();
for (var cpt=0; cpt<tags.length; cpt++) {
var t = store.getTiddler(tags[cpt][0]);
if (!t || t.tags.length==0) result.push(t ? t : {title:tags[cpt][0],fields:{}});
}
return result;
}
config.macros.tagsTree.getId = function(element){
while (!element.id && element.parentNode) element=element.parentNode;
return element.id ? element.id : "<html>";
}
config.shadowTiddlers.TagsTreeStyleSheet = "/*{{{*/\n";
config.shadowTiddlers.TagsTreeStyleSheet +=".leaf, .subtree {display:block; margin-left : 0.5em}\n";
config.shadowTiddlers.TagsTreeStyleSheet +=".subtree {margin-bottom:0.5em}\n";
config.shadowTiddlers.TagsTreeStyleSheet +="#mainMenu {text-align:left}\n";
config.shadowTiddlers.TagsTreeStyleSheet +=".branch .button {border:1px solid #DDD; color:#AAA;font-size:9px;padding:0 2px;margin-right:0.3em;vertical-align:middle;text-align:center;}\n";
config.shadowTiddlers.TagsTreeStyleSheet +="/*}}}*/";
store.addNotification("TagsTreeStyleSheet", refreshStyles);
config.shadowTiddlers.MainMenu="<<tagsTree>>"
config.shadowTiddlers.PageTemplate = config.shadowTiddlers.PageTemplate.replace(/id='mainMenu' refresh='content' /,"id='mainMenu' refresh='content' force='true' ")
//}}}
Thankyou for sending me an email :-)
I'll get back to you soon.
''Don Robertson''
<<<
The Le@rning Federation develops digital curriculum content for all Australian and New Zealand schools. The project is a collaborative initiative of all Australian and New Zealand governments. Since 2001 our high-quality, innovative content has seeded and supported schools' moves into 21st-century education, and has begun the digital education revolution.
The content is free for all Australian and New Zealand schools. All copyright fees are paid upfront, so schools are not liable for further copyright payments to collection agencies such as Copyright Agency Limited.
The content is developed specifically to support students' learning of key concepts and skills detailed in all Australian and New Zealand curriculum documents. Teachers, students, jurisdiction officers, cultural and public organisations, and multimedia developers have all played parts in our work.
The content is made available to schools through educational jurisdictions.
Creating infrastructure for content, setting standards and specifications, developing quality assurance processes, and improving the capacity of schools to deliver the content have also been major focuses of our work.
<<<
http://www.thelearningfederation.edu.au
<<<
An OpenCourseWare is a free and open digital publication of high quality educational materials, organized as courses. The OpenCourseWare Consortium is a collaboration of more than 200 higher education institutions and associated organizations from around the world creating a broad and deep body of open educational content using a shared model. The mission of the OpenCourseWare Consortium is to advance education and empower people worldwide through opencourseware.
!The Goals of the Consortium
*Extend the reach and impact of opencourseware by encouraging the adoption and adaptation of open educational materials around the world.
*Foster the development of additional opencourseware projects.
*Ensure the long-term sustainability of opencourseware projects by identifying ways to improve effectiveness and reduce costs.
!Participation Requirements
In order to participate in Consortium activities, institutions must have committed to publishing, under the institution's name, materials from at least 10 courses in a format that meets the agreed-upon definition of an opencourseware. Organizations that do not publish their own content but whose activities further Consortium goals—such as translation and distribution affiliates—also participate in Consortium activities.
For more information on Consortium activities or participation requirements, please contact us directly at feedback@ocwconsortium.org.
<<<
http://www.ocwconsortium.org/about-us/about-us.html
/***
|Name|TiddlerIconsPlugin|
|Source|http://www.TiddlyTools.com/#TiddlerIconsPlugin|
|Version|2.1.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Options|##Configuration|
|Description|display icons next to tiddler title, based on tiddler's attributes (tags, fields, slices, etc)|
!!!!!Usage
<<<
{{{<<tiddlerIcons>>}}} - shows icons for the current tiddler
or
{{{<<tiddlerIcons =TiddlerName>>}}} - shows icons for the specified tiddler
or
{{{<<tiddlerIcons iconID>>}}} - shows a specific icon
<<<
!!!!!Examples
<<<
{{{
icons for current tiddler: <<tiddlerIcons>>
}}}
icons for current tiddler: <<tiddlerIcons>>
{{{
icons for [[Welcome]] tiddler: <<tiddlerIcons =Welcome>>
}}}
icons for [[Welcome]] tiddler: <<tiddlerIcons =Welcome>>
{{{
All icons:
<<tiddlerIcons recent>> <<tiddlerIcons changed>> <<tiddlerIcons unsaved>> <<tiddlerIcons Trash>>
<<tiddlerIcons tag>> <<tiddlerIcons core>> <<tiddlerIcons systemConfig>> <<tiddlerIcons CSS>>
<<tiddlerIcons html>> <<tiddlerIcons template>> <<tiddlerIcons script>> <<tiddlerIcons attachment>>
<<tiddlerIcons settings>> <<tiddlerIcons pluginInfo>> <<tiddlerIcons faq>> <<tiddlerIcons task>>
}}}
All icons:
<<tiddlerIcons recent>> <<tiddlerIcons changed>> <<tiddlerIcons unsaved>> <<tiddlerIcons Trash>> <<tiddlerIcons tag>> <<tiddlerIcons core>> <<tiddlerIcons systemConfig>> <<tiddlerIcons CSS>> <<tiddlerIcons html>> <<tiddlerIcons template>> <<tiddlerIcons script>> <<tiddlerIcons attachment>> <<tiddlerIcons settings>> <<tiddlerIcons pluginInfo>> <<tiddlerIcons faq>> <<tiddlerIcons task>>
<<<
!!!!!Configuration
<<<
You can add extra icons definitions based on matching tag values. First, import or create a tiddler called [[TiddlerIconsPluginConfig]] and tag it with<<tag systemConfig>>. Then, in that tiddler, use the following code format to //merge// your additional icon definitions into the default {{{config.macros.tiddlerIcons.map}}} object.
{{{
merge(config.macros.tiddlerIcons.map,{
tagvalue: ["tooltip","imagefile"],
tagvalue: ["tooltip","imagefile"],
...
tagvalue: ["tooltip","imagefile"] // note: no comma after last definition
}
}}}
<<<
!!!!!Revisions
<<<
2008.10.02 [2.1.0] added "=TiddlerName" param (shows icons for specified tiddler)
2007.08.01 [2.0.0] converted from inline script
2007.05.28 [1.0.0] initial release (as inline script)
<<<
!!!!!Code
***/
//{{{
version.extensions.TiddlerIconsPlugin= {major: 2, minor: 1, revision: 0, date: new Date(2008,10,2)};
config.macros.tiddlerIcons = {
unknown: "unknown tiddler icon: %0",
map: {
recent: ["this tiddler was UPDATED within the last 10 days","asterisk_yellow.png"],
changed: ["this tiddler was UPDATED after your last visit","star.png"],
unsaved: ["this tiddler has UNSAVED CHANGES","exclamation.png"],
tag: ["this is a TAG tiddler","tag_blue.png"],
html: ["this is an HTML MARKUP tiddler","html.png"]
},
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
var img="[img[%0|%1]]";
var imgs=[]; // collected set of applicable images
var p=params[0]; // abbrev
// if icon keyword was supplied, just show one icon and exit.
if (p&&p.substr(0,1)!="=") {
wikify(this.map[p]?img.format(this.map[p]):this.unknown.format([p]),place);
return;
}
// if TiddlerName was supplied, use that tiddler, otherwise use current tiddler
var here=story.findContainingTiddler(place);
if (!p && !here) return; // not in a tiddler
var title=p?p.substr(1):here.getAttribute('tiddler');
var tid=store.getTiddler(title); if (!tid) return; // tiddler not found
// add 'tag' icon if this tiddler IS a tag
var tags=store.getTags();
for (i=0;i<tags.length;i++) if (tags[i][0]==title) imgs.push(img.format(this.map["tag"]));
if (!tid) { wikify(imgs.join(""),place); return; }
// add 'unsaved', 'changed', or 'recent' icon based on tiddler vs. document date
// (uses config.options.lastSaved, updated by [[UnsavedChangesPlugin]])
if (tid.modified > (config.options.lastSaved?config.options.lastSaved:document.lastModified))
imgs.push(img.format(this.map["unsaved"]));
else {
// add 'changed' icon if tiddler has been modified since last visit
// (uses config.lastVisit, updated by [[VisitCounterPlugin]])
// truncate seconds from last visit timestamp for comparison with tiddler modification timestamp
if (config.lastVisit)
var last=new Date((new Date(config.lastVisit).getTime())-(new Date(config.lastVisit).getSeconds()*1000));
if (tid.modified >= last)
imgs.push(img.format(this.map["changed"]));
else if (tid.modified >= (new Date()).getTime()-86400000*10)
imgs.push(img.format(this.map["recent"])); // add 'recent' icon if tiddler has been modified in last 10 days
}
if (title.substr(0,6)=="Markup")
imgs.push(img.format(this.map["html"]));
// add 'type' icons based on tag(s)... see TiddlerIconsPluginConfig for icon map definitions
// sort tags for consistent icon display order
var tags=[]; for (i=0;i<tid.tags.length;i++) tags.push(tid.tags[i]); tags.sort();
for (var t=0; t<tags.length; t++)
if (this.map[tags[t]]) imgs.push(img.format(this.map[tags[t]]));
wikify(imgs.join(""),place);
}
};
//}}}
/***
|Name|TiddlerIconsPluginConfig|
|Source|http://www.TiddlyTools.com/#TiddlerIconsPluginConfig|
|Version|2.0.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires|TiddlerIconsPlugin|
|Overrides||
|Description|configure additional icons for TiddlerIconsPlugin, based on containing tiddler's tags|
!!!!!Usage
<<<
This plugin configuration tiddler can be used to add extra icon definitions, based on matching tag values, using the following code format:
{{{
merge(config.macros.tiddlerIcons.map, {
tagvalue: ["tooltip","imagefile"],
tagvalue: ["tooltip","imagefile"],
...
tagvalue: ["tooltip","imagefile"] // note: no comma after last definition
}
}}}
<<<
!!!!!Revisions
<<<
2007.08.01 [2.0.0] converted from inline script
<<<
!!!!!Code
***/
//{{{
merge(config.macros.tiddlerIcons.map, {
Trash: ["this tiddler has been tagged as TRASH","delete.png"],
core: ["this is a CUSTOMIZED TiddlyWiki core tiddler","application_add.png"],
systemConfig: ["this is a PLUGIN tiddler","cog.png"],
CSS: ["this is a CSS STYLESHEET tiddler","css.png"],
template: ["this is a TiddlyWiki layout TEMPLATE","layout.png"],
script: ["this is an INLINE SCRIPT tiddler","script_code.png"],
attachment: ["this is a binary file ATTACHMENT","disk.png"],
settings: ["this tiddler contains SETTINGS or DATA used by plugins or core features","wrench.png"],
pluginInfo: ["this tiddler contains PLUGIN DOCUMENTATION","information.png"],
TiddlyTools: ["this tiddler contains TIDDLYTOOLS INFORMATION","information.png"],
faq: ["this tiddler contains a FAQ/HOW-TO article","help.png"],
bookmark: ["this tiddler contains a BOOKMARK URL","page_link.png"],
task: ["this is a TASK tiddler","tick.png"]
});
//}}}
<<<
~TiddlyWiki is a single html file which has all the characteristics of a wiki - including all of the content, the functionality (including editing, saving, tagging and searching) and the style sheet. Because it's a single file, it's very portable - you can email it, put it on a web server or share it via a USB stick.
''But it's not just a wiki!'' It has very powerful plugin capabilities, so it can also be used to build new tools. You have full control over how it looks and behaves. For example, ~TiddlyWiki is already being used as:
*A personal notebook
*A GTD ("Getting Things Done") productivity tool
*A collaboration tool
*For building websites (this site is a ~TiddlyWiki file!)
*For rapid prototyping
*...and much more!
You can import and export data to and from all sorts of places. Check out some of the Examples of ~TiddlyWiki in use, and the Features that are available.
<<<
[[http://www.tiddlywiki.com|TiddlyWiki.com]]
/***
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 = 'dcrobertson';
// 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")
});
//}}}
One of the most popular Linux distributions available. Ubuntu s known for it's ease of use and up to date software.
Ubuntu is also popular for those creating specialist Derivatives, such as the [[eboxPlatform]], Kubuntu (with KDE), Edubuntu (for education), Ubuntu Studio (multimedia creation), Mythbuntu (with MythTV, for digital video recorders), Xubuntu (with the XFCE window manager), and the Ubuntu Server Edition.
The distribution is updated every six months, with some releases designated as Long Term Support (LTS) releases - intended for use in servers and where stability is paramount.
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 26/06/2009 22:15:50 | DonRobertson | [[/|http://dcrobertson.tiddlyspot.com/]] | [[store.cgi|http://dcrobertson.tiddlyspot.com/store.cgi]] | . | [[index.html | http://dcrobertson.tiddlyspot.com/index.html]] | . | ok |
| 26/06/2009 22:22:40 | DonRobertson | [[/|http://dcrobertson.tiddlyspot.com/]] | [[store.cgi|http://dcrobertson.tiddlyspot.com/store.cgi]] | . | [[index.html | http://dcrobertson.tiddlyspot.com/index.html]] | . |
| 26/06/2009 23:29:23 | DonRobertson | [[dcrobertson.html|file:///Users/don/Desktop/dcrobertson.html]] | [[store.cgi|http://dcrobertson.tiddlyspot.com/store.cgi]] | . | [[index.html | http://dcrobertson.tiddlyspot.com/index.html]] | . |
| 26/06/2009 23:36:20 | DonRobertson | [[/|http://dcrobertson.tiddlyspot.com/#newTiddler:[[About%20us]]]] | [[store.cgi|http://dcrobertson.tiddlyspot.com/store.cgi]] | . | [[index.html | http://dcrobertson.tiddlyspot.com/index.html]] | . |
| 26/06/2009 23:40:32 | DonRobertson | [[/|http://dcrobertson.tiddlyspot.com/#newTiddler:[[Scootle%20-%20Home]]]] | [[store.cgi|http://dcrobertson.tiddlyspot.com/store.cgi]] | . | [[index.html | http://dcrobertson.tiddlyspot.com/index.html]] | . |
| 26/06/2009 23:47:40 | DonRobertson | [[/|http://dcrobertson.tiddlyspot.com/#newTiddler:[[Metadata%20guidelines]]]] | [[store.cgi|http://dcrobertson.tiddlyspot.com/store.cgi]] | . | [[index.html | http://dcrobertson.tiddlyspot.com/index.html]] | . |
| 29/06/2009 15:26:27 | DonRobertson | [[/|http://dcrobertson.tiddlyspot.com/]] | [[store.cgi|http://dcrobertson.tiddlyspot.com/store.cgi]] | . | [[index.html | http://dcrobertson.tiddlyspot.com/index.html]] | . |
| 29/06/2009 15:28:26 | DonRobertson | [[/|http://dcrobertson.tiddlyspot.com/]] | [[store.cgi|http://dcrobertson.tiddlyspot.com/store.cgi]] | . | [[index.html | http://dcrobertson.tiddlyspot.com/index.html]] | . |
| 29/06/2009 15:31:08 | DonRobertson | [[/|http://dcrobertson.tiddlyspot.com/]] | [[store.cgi|http://dcrobertson.tiddlyspot.com/store.cgi]] | . | [[index.html | http://dcrobertson.tiddlyspot.com/index.html]] | . |
| 29/06/2009 16:46:30 | DonRobertson | [[dcrobertson.html|file:///home/don/Downloads/dcrobertson.html]] | [[store.cgi|http://dcrobertson.tiddlyspot.com/store.cgi]] | . | [[index.html | http://dcrobertson.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");
//}}}
<<<
!Purpose of this document
This document builds on the conceptual model of the digital content lifecycle in the context of NZ education (see part 1.3 Relationships to other documents) by providing a concrete technical model that can be implemented incrementally to fulfill the requirements including authoring, sharing, re-use and ensuring interoperability with multiple learning environments.
<<<
http://www.wikieducator.org/Funding_proposals/Reusable_and_portable_content_for_New_Zealand_schools/Using_Wikis_for_Developing,_Sharing_and_Reusing_Educational_Content
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagged' macro='tags'></div>
<div class='tagClear'></div>
<!--}}}-->
[[My profile|http://www.wsis-community.org/pg/profile/donrob]] on the World Summit for the Information Society Community site. This site is built using [[elgg]].
Welcome to this TiddlyWiki
!usage
{{{[img[application_add.png]]}}}
[img[application_add.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/application_add.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAH9SURBVDjLpZM9aFRREIW/ue9FF2IULDQuaYIGtTBRWGFJAgqSUsEmjZVgo4mFWBiwVVjBHwjGwsbCShExIAghoEUMARGNGFJYhIC7isXGRbORvJ0Zi/dWY5fFCwOnuHz3nDsz4u78z5HTlx6NDB4v3KjWvd0dMMPNUFPcHHPDVTF3XBU1Y/uWZHVxsXzl6e3hibgwUBhvy7WH3bmWHm5fres4MBHXEw/16s+Wra8lHgBiV+f6mX0tA86VlkkBbgCsNxQH3Bw1MBwzR83Qhqflxro63Z0dqGkKIOuCBEHc8SC4OGJCCIJIQESRyIksEDfS+9bIAE1SAFwEBCIHEzBzIocgEbGAiqMhdWxqWQTL5kAE3P8BiYCrYwIuQBAii1JAM0JTpAxJxQaQxUJsxvTbSV7NP6e2ukLSSFjT/cBJ4kaS/HEggLsjIvgG0Is3T3hfnuLYwFG6dvbwcuEZcx+nKY7mbwbPskSAZC4k00GEIMLk64ccPtCHBqVvzxAqCcVD/QAjwcz+Rsg+M4gQbahv37/QJts4dfAiAJdP3Gfvrl6AXFxeWn58/k4ybKqYGqqKmaFJgplh7lRrKyxUZpmvzDA29IDS1Fly0VaAX7KZbSyO5q91de+42t87SE/nET59fcfshxk+L9VuyWbXuTiaLwEXgA7gB3Bv7m5l7Dd8kw6XoJxL0wAAAABJRU5ErkJggg==
!usage
{{{[img[application_form_edit.png]]}}}
[img[application_form_edit.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/application_form_edit.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJcSURBVDjLpZPvS1NRGMfvv9Db6FUvIpDqLwj6AZER1EhBkvTFTALNlWJrkwKRoWKGjZltaUmuYmsIq7SEtrSt1qakzh/TtunSdq9j8253u3fL1vh27t2KNAqsAx+ecw7n+z0PzzkPBYD6HyjZZVNNpzXINz0OQP2IYPwI1YMFXOmfQ+O9WTT0eVFvmMQl/Qcobo+jVueG2uDkRZ1koLEEc9qRNWwXRddYTjIQb/4XqjtGIRmojX6k0+ltI2+15Q1UA4sQBAG8BA+e56W5w+H4jQmbDgsPy+C3ajDVdwzT3UUVlFiwZDKJshbvT1JkLQp+HQJtBWNXIuF9DqTCiHstcN04vkaJ1U5wHLgEgUsUIrfJQKCHwM43Y2P1KZjRDqRnBvEt5MTM/eoMJT4Vy8YRj8elKBFnSWTJHovoEhHPXkMu7UQ6WIt1z0X4BuRw6+XwaGV7qIbeacRiMUQLiPNYNCZl4LF1g51RIZdxQQhUIrNSjuS8GqH+06i73psvoqJnApFIZFMNxPXrwXYw48qCuAKZT2fBzTZhyXASjM+JkkZL3qBO5wHDMIS1QmTge2fE/MtGkvYbZJbl+LJyDgmSSUB/Al85WjpzpsGcN6jVvkc4TBPCoAnuoR7MDasx/aILn92lEJbLsT51Ff67p7C6OAmaFs/RkNWb8KMXTBduOqSfVdVmh7n9KJAMYcFQArt6J97eKcZw8yHUqPQk7SfkZhOIRsQkGWztrpbzRdkNlw4b7ltwaw7DXLUrNaLaf+CP3bh1o/Tgjkxr5d6sra04+6rzyNgz5b7df2vn7z39IYTVO0xbAAAAAElFTkSuQmCC
!usage
{{{[img[arrow_undo.png]]}}}
[img[arrow_undo.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/arrow_undo.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIJSURBVDjLpVM9aJNRFD35GsRSoUKKzQ/B0NJJF3EQlKrVgijSCBmC4NBFKihIcXBwEZdSHVoUwUInFUEkQ1DQ4CKiFsQsTrb5xNpgaZHw2Uog5t5zn0NJNFaw0guX97hwzuPcc17IOYfNlIdNVrhxufR6xJkZjAbSQGXjNAorqixSWFDV3KPhJ+UGLtSQMPryrDscPwLnAHOEOQc6gkbUpIagGmApWIb/pZRX4fjj889nWiSQtgYyBZ1BTUEj6AjPa0P71nb0Jfqwa+futIheHrzRn2yRQCUK/lOQhApBJVQJChHfnkCqOwWEQ+iORJHckUyX5ksvAEyGNuJC+s6xCRXNHNxzKMmQ4luwgjfvZp69uvr2+IZcyJ8rjIporrxURggetnV0QET3rrPxzMNM2+n7p678jUTrCiWhphAjVHR9DlR0WkSzf4IHxg5MSF0zXZEuVKWKSlCBCostS8zeG7oV64wPqxInbw86lbVXKEQ8mkAqmUJ4SxieeVhcnANFC02C7N2h69HO2IXeWC8MDj2JnqaFNAMd8f3HKjx6+LxQRmnOz1OZaxKIaF1VISYwB9ARZoQaYY6o1WpYCVYxt+zDn/XzVBv/MOWXW5J44ubRyVgkelFpmF/4BJVfOVDlVyqLVBZI5manPjajDOdcswfG9k/3X9v3/vfZv7rFBanriIo++J/f+BMT+YWS6hXl7QAAAABJRU5ErkJggg==
!usage
{{{[img[asterisk_yellow.png]]}}}
[img[asterisk_yellow.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/asterisk_yellow.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJ5SURBVDjLpZPNS1RhFMaff2EWLWo5tGnRaqCFRBAM0cZFwVSQpVHNQAWVMQwaSSZWtimLiKnsO5lEjKzs4y1zRK3oItfMj1FnnJkaUtNrjo45H3eejpCKNa5anMX73vs855zfOS9I4n9i2SHbCpvph8q8A9PNcCzcz76EM9EETj+DmmqENaeBiJ3mRyuzQy5mwyVMKqiFbzNN0MxgKZOd2zj5GMZE/ZL5ooHZAntGW89s7Bw5Ws25llWcfQHrzHPYE/51ZOQ0M4Fiitj4UQdbzhZSb+FJ63ZypJqp7p0UsTf+FN6kvoMMl3GmNY9jj+BckcF8/HoFldLzpZIqxhthJPVdkr2cifdb5sXefyAKLFvyzVJJAssisIxstILZ0DEyeJzpHifHfNBGamFZ+C9yC7bhG7BBxCrZZqWQpoiNP6S1TMBFDh4gA0VMdxfy+0NosftQX+8gGKkBY741HLoGhbnXUOZwKTn+gGa4nOlBN9MDxdJzCTmwj+wvEKPDTPUc5Zx+kOk+NxmqZOJTIXsviYGQVgKLAos/n0CbbIAS0ir1eY9kF4O+3UzpBYzehhaugQpdR3DwKth7EeyqEoO/oYzXwyKwDDN0ipme/VKFi0l9L8M3oYW8SwxWnIKI1XT7Vqb6i/ntLoLTHdulhROcUJsZuJJjCsvEPpyf8m8io5U0VB6FtFNIe6da84XFEcYaNrDzLDw5DUZ9cEwqm6zxGWYGPBTShogtQtoerV0rLA5JKy5+ubya7SdzbKKMyRG7ByPeIfvebKfAWszUdQFavKOI0bqNbCuF4XfneAvzIaStQrpOxEpIL746rQKOD2VQbSXwtLiXg/wNTNvAOhsl8oEAAAAASUVORK5CYII=
!usage
{{{[img[camera.png]]}}}
[img[camera.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/camera.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIrSURBVDjLxVPLjhJBFD3V3dCYSZjwDipDRjCOCcTgLGalJmxYufAD0E/QHV9g3LjSsGDhik/QjTEaTdgaEsQQINEFJjwEecmr6Yf3lkJmPwsruXWrq+85dc+9VcJxHFxkKLjg0HgqlUpP1+t1drvdXrIsS2w2G9dqtXKzt21b6Lpu+P3+N4VC4QnH5/P5U3Lfy+XyL1EsFg9VVZ1kMhmwHAJIa1Tf4eH96zC+vcKLDyfwRm6i1Wo/Go/HLwnsJWPtZ2oikainUil/JBJBp9NBr9fDcDjE5aMTfPz8E835bdw6vQMhBLrd7gNFUXSPxwNN08RsNrur0alJr9eLer2OcDiMdDoNkgKSglAohEajgUqlgkAggGw2i36/j8lkImOazeYNjQMHgwGCwSC2B0d4/n6FhSlgU366cOHe1Wvwz+eUfgucJQPb7Tai0aiUqvC0WCwQi8Xw+ouBjaPA4yJzK7AUFz79OJDA0WgkwYZhgAq8z1JjAqq2tN+Wm4AqNGouXw9Bk+G4QR2SxmCO4zV7mQGz7Fh5OI79F0wkCpmqCCyXSxlzPoM9wS4DqijcjgHTJv22Q+k5ksiNFabTqQSapilJOJ79noAZa7UaMoc9qOYSG9oziUSxlriy+YpqtbrXvSPZEWjMxidwewLjMc6Oj2VxOGBO1WdivhvJZFLusf54PC5lMYHI5XKPqa/P6EP3+XyCry4T8E/2BHDoEIdv6fmH92/9Vvz31/gHd9iUVZFEDKoAAAAASUVORK5CYII=
!usage
{{{[img[cog.png]]}}}
[img[cog.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/cog.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGSSURBVCjPVVFNSwJhEF78Ad79Cf6PvXQRsotUlzKICosuRYmR2RJR0KE6lBFFZVEbpFBSqKu2rum6llFS9HHI4iUhT153n6ZtIWMOM+/MM88z7wwH7s9Ub16SJcnbmrNcxVm2q7Z8/QPvEOtntpj92NkCqITLepEpjix7xQtiLOoQ2b6+E7YAN/5nfOEJ2WbKqOIOJ4bYVMEQx4LfBBQDsvFMhUcCVU1/CxVXmDBGA5ZETrhDCQVcYAPbyEJBhvrnBVPiSpNr6cYDNCQwo4zzU/ySckkgDYuNuVpI42T9k4gLKGMPs/xPzzovQiY2hQYe0jlJfyNNhTqiWDYBq/wBMcSRpnyPzu1oS7WtxjVBSthU1vgVksiQ3Dn6Gp5ah2YOKQo5GiuHPA6xT1EKpxQNCNYejgIR457KKio0S56YckjSa9jo//3mrj+BV0QQagqGTOo+Y7gZIf1puP3WHoLhEb2PjTlCTCWGXtbp8DCX3hZuOdaIc9A+aQvWk4ihq95p67a7nP+u+Ws+r0dql9z/zv0NCYhdCPKZ7oYAAAAASUVORK5CYII=
!usage
{{{[img[cross.png]]}}}
[img[cross.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/cross.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIhSURBVDjLlZPrThNRFIWJicmJz6BWiYbIkYDEG0JbBiitDQgm0PuFXqSAtKXtpE2hNuoPTXwSnwtExd6w0pl2OtPlrphKLSXhx07OZM769qy19wwAGLhM1ddC184+d18QMzoq3lfsD3LZ7Y3XbE5DL6Atzuyilc5Ciyd7IHVfgNcDYTQ2tvDr5crn6uLSvX+Av2Lk36FFpSVENDe3OxDZu8apO5rROJDLo30+Nlvj5RnTlVNAKs1aCVFr7b4BPn6Cls21AWgEQlz2+Dl1h7IdA+i97A/geP65WhbmrnZZ0GIJpr6OqZqYAd5/gJpKox4Mg7pD2YoC2b0/54rJQuJZdm6Izcgma4TW1WZ0h+y8BfbyJMwBmSxkjw+VObNanp5h/adwGhaTXF4NWbLj9gEONyCmUZmd10pGgf1/vwcgOT3tUQE0DdicwIod2EmSbwsKE1P8QoDkcHPJ5YESjgBJkYQpIEZ2KEB51Y6y3ojvY+P8XEDN7uKS0w0ltA7QGCWHCxSWWpwyaCeLy0BkA7UXyyg8fIzDoWHeBaDN4tQdSvAVdU1Aok+nsNTipIEVnkywo/FHatVkBoIhnFisOBoZxcGtQd4B0GYJNZsDSiAEadUBCkstPtN3Avs2Msa+Dt9XfxoFSNYF/Bh9gP0bOqHLAm2WUF1YQskwrVFYPWkf3h1iXwbvqGfFPSGW9Eah8HSS9fuZDnS32f71m8KFY7xs/QZyu6TH2+2+FAAAAABJRU5ErkJggg==
!usage
{{{[img[css.png]]}}}
[img[css.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/css.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGeSURBVDjLxVNNS0JRED3qA0MRoqCFouBGN9Yia9HGRa3b9x/6M62jf9CuTS0EV0arXASG0gcUYWIgmvi6792P7sz1WUI7Fw0Mc70z59wz88aYMQbLWBxL2tIEXrN5+mcPWkvrBsZQVNYDSKmglLTZ0J4lwjCER8XZ7OYcSDMxRs/cEdCZSKKoNeUU7u/rjoBMiE8GuKQrcCA1A0XuFK2sZKwC3xE4Zo1UahX5/Dam0yH6/Q4KhV17H+Lu7gKVyiESCQ/dbgPD4QvfSykQlzKcMxP4+fnGJr4seAdPT01MJh8oFve4uNOp20fWQBilQqvAEtBQqE+6IBuPe3h8bML3hyiX95FOr6HXayOT2UCpdIDR6I1r6VF6KK61z5N1ROAkvdBuX+H6+oznksttodE4wevrLbdC8h1GwCMZJF+pgIdSrR6xtCCYWLnrnBuP31GrHfN5MHhgcDRUj3pzbAFarfOFSUf++4tEA3dRwhNCsKRkMv2r+Oe7R7+jvbArNotu/6wC3/Z7yX3TdhkjbDS8eUTi5EoGuLhosX//N34Dm6aVPfzbYjIAAAAASUVORK5CYII=
|''Type:''|file|
|''URL:''|http://dcrobertson.tiddlyspot.com/|
|''Workspace:''|(default)|
This tiddler was automatically created to record the details of this server
!usage
{{{[img[delete.png]]}}}
[img[delete.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/delete.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJdSURBVDjLpZP7S1NhGMf9W7YfogSJboSEUVCY8zJ31trcps6zTI9bLGJpjp1hmkGNxVz4Q6ildtXKXzJNbJRaRmrXoeWx8tJOTWptnrNryre5YCYuI3rh+8vL+/m8PA/PkwIg5X+y5mJWrxfOUBXm91QZM6UluUmthntHqplxUml2lciF6wrmdHriI0Wx3xw2hAediLwZRWRkCPzdDswaSvGqkGCfq8VEUsEyPF1O8Qu3O7A09RbRvjuIttsRbT6HHzebsDjcB4/JgFFlNv9MnkmsEszodIIY7Oaut2OJcSF68Qx8dgv8tmqEL1gQaaARtp5A+N4NzB0lMXxon/uxbI8gIYjB9HytGYuusfiPIQcN71kjgnW6VeFOkgh3XcHLvAwMSDPohOADdYQJdF1FtLMZPmslvhZJk2ahkgRvq4HHUoWHRDqTEDDl2mDkfheiDgt8pw340/EocuClCuFvboQzb0cwIZgki4KhzlaE6w0InipbVzBfqoK/qRH94i0rgokSFeO11iBkp8EdV8cfJo0yD75aE2ZNRvSJ0lZKcBXLaUYmQrCzDT6tDN5SyRqYlWeDLZAg0H4JQ+Jt6M3atNLE10VSwQsN4Z6r0CBwqzXesHmV+BeoyAUri8EyMfi2FowXS5dhd7doo2DVII0V5BAjigP89GEVAtda8b2ehodU4rNaAW+dGfzlFkyo89GTlcrHYCLpKD+V7yeeHNzLjkp24Uu1Ed6G8/F8qjqGRzlbl2H2dzjpMg1KdwsHxOlmJ7GTeZC/nesXbeZ6c9OYnuxUc3fmBuFft/Ff8xMd0s65SXIb/gAAAABJRU5ErkJggg==
!usage
{{{[img[disk.png]]}}}
[img[disk.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/disk.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAH+SURBVBgZBcE9i11VGAbQtc/sO0OCkqhghEREAwpWAWUg8aMVf4KFaJEqQtAipTZWViKiCGOh2Ap2gmJhlSIWFsFOxUK0EsUM3pl79n4f12qHb3z3Fh7D83gC95GOJsDe0ixLk5Qq/+xv/Lw9Xd+78/HLX3Y8fXTr2nWapy4eCFKxG7Fby97SnDlYtMbxthyfzHO//nl85fNvfvnk8MbX5xa8IHx1518Vkrj54Q+qQms2vVmWZjdiu5ZR2rT01166/NCZg/2PFjwSVMU6yjoC1oq+x6Y3VbHdlXWExPd379nf7Nmejv2Os6OC2O4KLK0RNn3RNCdr2Z5GJSpU4o+/TkhaJ30mEk5HwNuvX7Hpi76wzvjvtIwqVUSkyjqmpHS0mki8+9mPWmuWxqYvGkbFGCUAOH/+QevYI9GFSqmaHr5wkUYTAlGhqiRRiaqiNes6SOkwJwnQEqBRRRJEgkRLJGVdm6R0GLMQENE0EkmkSkQSVVMqopyuIaUTs0J455VLAAAAAODW0U/GiKT0pTWziEj44PZ1AAAAcPPqkTmH3QiJrlEVDXDt0qsAAAAAapa5BqUnyaw0Am7//gUAAAB49tEXzTmtM5KkV/y2G/X4M5fPao03n/sUAAAAwIX7y5yBv9vhjW/fT/IkuSp5gJKElKRISYoUiSRIyD1tufs/IXxui20QsKIAAAAASUVORK5CYII=
The eboxPlatform is an [[Ubuntu]] Linux-based distribution for office servers. The distribution installs a minimal set of software needed to run the core services for an office or business, and a web-based administration interface.
A default installation includes:
* Centralized User Management
* File and Printer sharing
* email and Instant Messaging servers
* Network Firewall and Gateway
* Virtual Private Network Support
As it is based on Ubuntu Linux, additional software and updates can be easily installed.
<<<
!!What is eduCommons?
eduCommons is a content management system designed specifically to support OpenCourseWare projects like Notre Dame OCW and OCW Universidad de Cantabria. eduCommons will help you develop and manage an open access collection of course materials. It is built around a workflow process that guides content developers through the process of publishing materials in an openly accessible format. Try eduCommons for yourself on our demo site, or visit our eduCommons Adopters page for some examples.
<<<
http://educommons.com/
/%
|subject|A good place to add comments and so forth|
|byline|DonRobertson|
|date|Saturday, June 20th, 2009 at 9:45:47 pm|
%/^^posted by DonRobertson on Saturday, June 20th, 2009 at 9:45:47 pm^^
<<<
What is good, bad, and ugly :-)
<<<
/%
|subject|Test on tiddlyspot|
|byline|DonRobertson|
|date|Monday, June 22nd, 2009 at 12:32:34 am|
%/^^posted by DonRobertson on Monday, June 22nd, 2009 at 12:32:34 am^^
<<<
hello
<<<
[[elgg|http://www.elgg.org]] Social Networking Platform. Elgg provides spaces for people and groups to share files, blogs, forums bookmarks etc. Elgg was completely re-written between versions 0.9 and 1.0, so is still relatively new software, but it has rabidly built an enthusiastic user and developer community.
!Sites using elgg
<<list filter [tag[elgg]]>>
!usage
{{{[img[exclamation.png]]}}}
[img[exclamation.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/exclamation.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJPSURBVDjLpZPLS5RhFMYfv9QJlelTQZwRb2OKlKuINuHGLlBEBEOLxAu46oL0F0QQFdWizUCrWnjBaDHgThCMoiKkhUONTqmjmDp2GZ0UnWbmfc/ztrC+GbM2dXbv4ZzfeQ7vefKMMfifyP89IbevNNCYdkN2kawkCZKfSPZTOGTf6Y/m1uflKlC3LvsNTWArr9BT2LAf+W73dn5jHclIBFZyfYWU3or7T4K7AJmbl/yG7EtX1BQXNTVCYgtgbAEAYHlqYHlrsTEVQWr63RZFuqsfDAcdQPrGRR/JF5nKGm9xUxMyr0YBAEXXHgIANq/3ADQobD2J9fAkNiMTMSFb9z8ambMAQER3JC1XttkYGGZXoyZEGyTHRuBuPgBTUu7VSnUAgAUAWutOV2MjZGkehgYUA6O5A0AlkAyRnotiX3MLlFKduYCqAtuGXpyH0XQmOj+TIURt51OzURTYZdBKV2UBSsOIcRp/TVTT4ewK6idECAihtUKOArWcjq/B8tQ6UkUR31+OYXP4sTOdisivrkMyHodWejlXwcC38Fvs8dY5xaIId89VlJy7ACpCNCFCuOp8+BJ6A631gANQSg1mVmOxxGQYRW2nHMha4B5WA3chsv22T5/B13AIicWZmNZ6cMchTXUe81Okzz54pLi0uQWp+TmkZqMwxsBV74Or3od4OISPr0e3SHa3PX0f3HXKofNH/UIG9pZ5PeUth+CyS2EMkEqs4fPEOBJLsyske48/+xD8oxcAYPzs4QaS7RR2kbLTTOTQieczfzfTv8QPldGvTGoF6/8AAAAASUVORK5CYII=
!usage
{{{[img[help.png]]}}}
[img[help.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/help.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKkSURBVDjLpZPdT5JhGMb9W+BPaK3matVqndXWOOigA6fmJ9DUcrUMlrN0mNMsKTUznQpq6pyKAm8CIogmypcg8GIiX8rHRHjhVbPt6o01nMvZWge/k3vP9duuZ/edAyDnf/hjoCMP2Vr3gUDj3CdV6zT1xZ6iFDaKnLEkBFOmPfaZArWT5sw60iFP+BAbOzTcQSqDZzsNRyCNkcVoaGghzDlVQKylOHJrMrUZ2Yf52y6kc36IxpyoH1lHF7EBgyMKV4jCJ5U/1UVscU4IZOYEa3I1HtwI01hwxlDLhDoJD/wxGr5YGmOLAdRIrVCuhmD3JdA6SQabx12srGB0KSpc86ew4olDOGjH4x4z0gdHDD9+c4TaQQtq+k2Yt0egXYugTmoVZgV9cyHSxXTtJjZR3WNCVfcK/NE0ppYDUNu2QTMCtS0IbrsOrVMOWL27eNJtJLOCDoWXdgeTEEosqPxoBK/TwDzWY9rowy51gJ1dGr2zLpS2aVH5QQ+Hbw88sZ7OClrGXbQrkMTTAQu4HXqUv9eh7J0OSfo7tiIU+GItilpUuM/AF2tg98eR36Q+FryQ2kjbVhximQu8dgPKxPMoeTuH4tfqDIWvCBQ2KlDQKEe9dBlGTwR36+THFZg+QoUxAL0jgsoOQzYYS+wjskcjTzSToVAkA7Hqg4Spc6tm4vgT+eIFVvmb+eCSMwLlih/cNg0KmpRoGzdl+BXOb5jAsMYNjSWAm9VjwesPR1knFilPNMu510CkdPZtqK1BvJQsoaRZjqLGaTzv1UNp9EJl9uNqxefU5QdDnFNX+Y5Qxrn9bDLUR6zjqzsMizeWYdG5gy6ZDbk8aehiuYRz5jHdeDTKvlY1IrhSMUxe4g9SuVwpdaFsgDxf2i84V9zH/us1/is/AdevBaK9Tb3EAAAAAElFTkSuQmCC
!usage
{{{[img[html.png]]}}}
[img[html.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/html.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHUSURBVDjLxZM7a1RhEIafc3J2z6qJkIuCKChItBNSBQ0iIlZiK4gWItj6HwRbC7FRf4CVnSCIkH9gJVjYiCDximCyZ7/zfXOz2A0I2qVwmmFg3rm870wVEezFavZoey7Q3Hv+/Z87qDsiTlZFBJIGKStZlFSCTpyUlAZgfXXfH9BAPTCberVANBB3RAJRR8wp6jzd/DotALA9UcyZgZxis2QNijpZjSJBVqeIszTfkMY65cAjuHxmgSzGlbUFrp1d5ObGErcuLLNxep5hU3H93AqjYcXti4cZZ2OSDU9CnVURddqmIovTDmoev/5GVcGDF585tjzg1JGWo0tDDgxrThxq6XojieOd0nRZ6dVpBxU3zi/T1BVdViKCcTbcYX11ngB6cca9MSlGlprojHqcglycVJyHL79Q1Jn0TgBdb1gEbz9OeL81IYsRAakYvQSeC/WvVOiLE8GsM4xnvsuGe/Do1RY/dpRenIP753hyZxURJ3JQXbr/Lq6uLfLpZ6aIk9XJssv8VK5dNcQcmcl7fKVl89kHmu0dJRVjYTRHGVSMpELaQLVCtEY8EAvMHHUwn067+0LVybtvok9KSODZiaKEOJENihPm01gD3P+62Oq/f+Nv2d9y2D8jLUEAAAAASUVORK5CYII=
!usage
{{{[img[i4logo.gif]]}}}
[img[i4logo.gif]]
!notes
© 1995 ELS Design Studios - do not use without explicit prior permission
!type
image/gif
!file
./images/i4logo.gif
!url
!data
data:image/gif;base64,R0lGODlhIwAoALMAAAAAAAAQAAAYAAAhAAApAAAxAABCAABSAABeAAB2AACMAACUAACcAAClAACtAADGACH5BAEAAAAALAAAAAAjACgAQAT+EMhJq704S/WewQoTBJ2jaUinriyTFaupJZ1yAqlq33zPGyrBScD6SAIMBIX4kF0GigbrEdDAHovbtePyaQLSVcFLLlMGDaUZ1AirT5zVgILcAWiP9wnpMG66FHEJBAp2GQEIaXAdYydbHXoXDB0EPJMqfmsVYR2ZmhMslZ8Sj1MJo6gXAUKpFQQOHq0TByqAPAenGSFIjD1xDw0WAQs7QA+GGQNTrABIuRJSDnM8eH2ByDk2AciHgU2F4L+YZQjh4bDAhdMYAQa/jewqVRnGLNwVeM8aTCXrF/w9ctSAgwDBvD0smKUSF2kUvw4HF65o+KkepVaEpjgwOIoAAgMKBAqMCFkwopkIAAA7
!usage
{{{[img[information.png]]}}}
[img[information.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/information.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKcSURBVDjLpZPLa9RXHMU/d0ysZEwmMQqZiTaP0agoaKGJUiwIxU0hUjtUQaIuXHSVbRVc+R8ICj5WvrCldJquhVqalIbOohuZxjDVxDSP0RgzyST9zdzvvffrQkh8tBs9yy9fPhw45xhV5X1U8+Yhc3U0LcEdVxdOVq20OA0ooQjhpnfhzuDZTx6++m9edfDFlZGMtXKxI6HJnrZGGtauAWAhcgwVnnB/enkGo/25859l3wIcvpzP2EhuHNpWF9/dWs/UnKW4EOGDkqhbQyqxjsKzMgM/P1ymhlO5C4ezK4DeS/c7RdzQoa3x1PaWenJjJZwT9rQ1gSp/js1jYoZdyfX8M1/mp7uFaTR8mrt29FEMQILr62jQ1I5kA8OF59jIItVA78dJertTiBNs1ZKfLNG+MUHX1oaURtIHEAOw3p/Y197MWHEJEUGCxwfHj8MTZIcnsGKxzrIURYzPLnJgbxvG2hMrKdjItjbV11CYKeG8R7ygIdB3sBMFhkem0RAAQ3Fuka7UZtRHrasOqhYNilOwrkrwnhCU/ON5/q04vHV48ThxOCuoAbxnBQB+am65QnO8FqMxNCjBe14mpHhxBBGCWBLxD3iyWMaYMLUKsO7WYH6Stk1xCAGccmR/Ozs/bKJuXS39R/YgIjgROloSDA39Deit1SZWotsjD8pfp5ONqZ6uTfyWn+T7X0f59t5fqDhUA4ry0fYtjJcWeZQvTBu4/VqRuk9/l9Fy5cbnX+6Od26s58HjWWaflwkusKGxjm1bmhkvLXHvh1+WMbWncgPfZN+qcvex6xnUXkzvSiYP7EvTvH4toDxdqDD4+ygT+cKMMbH+3MCZ7H9uAaDnqytpVX8cDScJlRY0YIwpAjcNcuePgXP/P6Z30QuoP4J7WbYhuQAAAABJRU5ErkJggg==
!usage
{{{[img[layout.png]]}}}
[img[layout.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/layout.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFySURBVBgZpcE7a1RBGMfh3xwnRziwBlOoBEG28FYriMSU9oKkTop8AcFWEKystRDEL2BnIVbapdVC8EbAYCEokgsL2T05M+/fd9CFRTcYyfMESRxGxK08fHMLOANcAy6BhAiYqKpAFcDMsMz2TNT6+dPHLmPi9s0LAUksP3j9WP/p/tN3ckR+WcQ9WdtkTOxvdWGOD1+2W1ykMJ3it7MnjlKEwFQfv7UUw1FX4yJOUoMT8Ol7y0Eo54CLOJkibnVhjoOybBQRJ1PALd19ycgMEzy/d53PX3eYpj8/iyxTVDiZUfwYdly5eJLNYWKs19T0mppeU9NrasaUMkWFk4liMMp0ErttYlKXRZfFJLNEUeGCGUXbdgy7TB51/IvSHkXECTEm8ZeZI4E/SYki4iyZgIB7sbbBpMHuHtPIJFzEZbMNoP/20Q0m9edn2Y+kLVykyPZs6c6rc5KuYnbcLIEMWUaWQBmZIQmQwAZQvccFSRzGT6Th9AjEKBwhAAAAAElFTkSuQmCC
!usage
{{{[img[page.png]]}}}
[img[page.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/page.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAINSURBVBgZBcG/r55zGAfg6/4+z3va01NHlYgzEfE7MdCIGISFgS4Gk8ViYyM2Mdlsko4GSf8Do0FLRCIkghhYJA3aVBtEz3nP89wf11VJvPDepdd390+8Nso5nESBQoq0pfvXm9fzWf19453LF85vASqJlz748vInb517dIw6EyYBIIG49u+xi9/c9MdvR//99MPPZ7+4cP4IZhhTPbwzT2d+vGoaVRRp1rRliVvHq+cfvM3TD82+7mun0o/ceO7NT+/4/KOXjwZU1ekk0840bAZzMQ2mooqh0A72d5x/6sB9D5zYnff3PoYBoWBgFKPKqDKqjCpjKr//dcu9p489dra88cydps30KswACfNEKanSaxhlntjJ8Mv12Paie+vZ+0+oeSwwQ0Iw1xAR1CiFNJkGO4wu3ZMY1AAzBI0qSgmCNJsJUEOtJSMaCTBDLyQ0CknAGOgyTyFFiLI2awMzdEcSQgSAAKVUmAeNkxvWJWCGtVlDmgYQ0GFtgg4pNtOwbBcwQy/Rife/2yrRRVI0qYCEBly8Z+P4qMEMy7JaVw72N568e+iwhrXoECQkfH91kY7jwwXMsBx1L93ZruqrK6uuiAIdSnTIKKPLPFcvay8ww/Hh+ufeznTXu49v95IMoQG3784gYXdTqvRmqn/Wpa/ADFX58MW3L71SVU9ETgEIQQQIOOzub+fhIvwPRDgeVjWDahIAAAAASUVORK5CYII=
!usage
{{{[img[page_copy.png]]}}}
[img[page_copy.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/page_copy.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIpSURBVDjLddM9aFRBFIbh98zM3WyybnYVf4KSQjBJJVZBixhRixSaShtBMKUoWomgnaCxsJdgIQSstE4nEhNREgyoZYhpkogkuMa4/3fuHIu7gpLd00wz52POMzMydu/Dy958dMwYioomIIgqDa+VnWrzebNUejY/NV6nQ8nlR4ufXt0fzm2WgxUgqBInAWdhemGbpcWNN9/XN27PPb1QbRdgjEhPqap2ZUv5+iOwvJnweT1mT5djZKjI6Ej/udz+wt1OJzAKYgWyDjJWyFghmzFsbtcY2gsTJwv09/Vc7RTgAEQgsqAKaoWsM8wu/z7a8B7vA8cHD3Fr+ktFgspO3a+vrdVfNEulJ/NT4zWngCBYY1oqSghKI465fvYwW+VAatPX07IZmF7YfrC0uDE8emPmilOFkHYiBKxAxhmSRPlZVVa2FGOU2Ad2ap4zg92MDBXJZczFmdflx05VEcAZMGIIClZASdesS2cU/dcm4sTBArNzXTcNakiCb3/HLRsn4Fo2qyXh3WqDXzUlcgYnam3Dl4Hif82dbOiyiBGstSjg4majEpl8rpCNUQUjgkia0M5GVAlBEBFUwflEv12b/Hig6SmA1iDtzhcsE6eP7LIxAchAtwNVxc1MnhprN/+lh0txErxrPZVdFdRDEEzHT6LWpTbtq+HLSDDiOm2o1uqlyOT37bIhHdKaXoL6pqhq24Dzd96/tUYGwPSBVv7atFglaFIu5KLuPxeX/xsp7aR6AAAAAElFTkSuQmCC
!usage
{{{[img[page_edit.png]]}}}
[img[page_edit.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/page_edit.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAK5SURBVBgZBcFPaJZ1HADwz+95n3e6uTnREGdljRKtGCYiHTLxkIUmQeeCOnXzVnQIoi5BQV08TMo6GIiHiKI6ZEWgszzEmtpqSDP7s9ycm9NN977vnuf37fNJEWH/G6df6l676vki2YXVSCAhEpFVOU8uzMX36daNV88MH+oApIhw8O2zZz45vOuhokjrgoYAIALC7NKKEz8vmP67fee3XyfWjwwfakMJRSNt6yob68avaRQpkYhMHVlVheWV2r6tffYPjNi4eLyncWCodf7jI1Jr6sUSUkq9EdHoajQkIZALZOpEIWlPf27r4jndQy/oH9xp4c9tJk4de7eEIEGBlAgJREqKRP/yKXVcsH7r4+Ynf9eVOvrWbtK7YUt/CRBB2SBJIiW5Doqkd3nEllWj+gef1r56UldP8tfYhJt3UhTtuR0FRBAoU6FISYFGkaxePG1LfKv/gYNa/30oNW9o9vbpzvOOXj+wsvvwZ5cKCGSkRJGSIiWtK19af/uU/gef1ZoaVjRXdG7db+bMed173zJVD2QoIFdEkBG4fflrPYs/2vjIMzrTxzS6QvvWfWZGRs3tGZY2bFdnoICcQ0QQTI+e1L3wk5W82dWLR2Qtt+fvNnNuwuLeo1LvgNXNpK4CFFBn6iAysxc/8vCel636Z8SlL84a+2be+Hdjlh57R9WzWaDZKFSdCpSQq5AjvPlLx9DkrM74VwZ3POHm7JzJsUk/7PvU9Sv3yipwYlPTSjuDEqqqVtcMrG0a/+Oa9z8Ytnv7oOXNOyw9edyjffeIIIIL1yqRw0qrAiVU7ZyrnKNTS+te/9flFCYlkJdIS5UcRJEUOSnLlKs6V1DCSqueWdPVuOu1oc6aiCgEGdDfXYIIuptJSnKzkRbrKk9BCSnFe0+9cvq5lNLOED0AgkAIIEAr5zxaFk7A/5IUWNTkV3l/AAAAAElFTkSuQmCC
!usage
{{{[img[page_find.png]]}}}
[img[page_find.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/page_find.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAMBSURBVBgZBcFLaJxVGIDh9zvn/2cmmWTSJk1oxUu1xCZoi1qvi6gggpRIdd2Niy6KVRChiCBeNiK4KOiiGxGKkNiCpKIhQrzUxiINkmJqQqdt2iQzk8xkkiZNOpfMnHM+n0dUFYBXP774VksmedQIh4AUIAAIoAIacCHMbazpb7K5fnLi9GADQFQVgMOfX5r47t1D/cbIDgWLAgCAKoBSvtdk6J8Niovb1dn/rnX+dXpwOwIAMFb2JyK7Y2YFa0RAQAN4DTin1Jqel3vbee7RiMuh3Kqhb/2ld0Z3iqry0Rdfdy4vFdYsgTeOHufst1/RdJ73Pz2FD4GGU+oNz4u9KWbKitPA+L9Ffp+YG7b5tWrHzq7uTzq7up+/OjVJ/4GnufTHGP0Hn2AuO8O+/Y+DWDxKrE160sqeNsvBPUnOTxb7zX0P7M3MTk8dWy2VuFepc/XKJNve0AyGP8dHqWyuE1khYQ0314TLi44LN6okY4tExpmx82eP16qVtof7HqPn/oco37lLJtPOru7dtLam+encGSIRYmtIJiyphCWViFEMiME80tv3dro9wy8jQ1RW83S2JSjl5vj53DeUlnOMjQwTWyE2QhwZEtaSjAwBUIWoPdPRMvj6EW4t5FiazzLwymEKuXleGzzCcqnM+OgPGBEiq6ACCorgA/gAkXMu6bwnOzvNxmqJ4lIesQYxhts3r1FYmAdAEEQhMhCAVAzeKaaytclifol6rUY+l6OytcXd9Ttcz2ZZXSmyVi4SVPEBFAgKCsTW4BqOKL94+/rI92eoONv7YE+X/LjSwq0bC8zOF6hVq/iuvXx2pQmAKgQAYGh3THM7IKoKwMCHF2vDJ59NfTmT4KkeQ1DwCl4gKCigCqowveI49QIMvHehHgEAuO0QXAja8MjfBU8QRREAgoKgBAU1gglCFElwPrgIAKBZ96V0wu764EAjraoGhQAAdLREAKhCSyyIEGIrW96FgqgqAM+c+PWEa+qbIvKkoq0AACgooCgAKAD1EMKUgaH/AfiQhzSolJNMAAAAAElFTkSuQmCC
!usage
{{{[img[page_go.png]]}}}
[img[page_go.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/page_go.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKdSURBVBgZBcFLiFZlGADg5/3OmRlHbbwkpmQ37WZlmBYWIrnRRUnRolVQbcRN7Yp20SLauSvENgaB1C6KdpnlBbHMFl2IMsK7Ntg43mbm/8/53p4nMtO2dw+9Pj4x9koJGzEPAQIZZNXV+vfVK3kgrk29fXjPjgFAZKbnPjh6+NM3N64tJRYnjQQgE9LkjaH9J666dGbu1u+//rH0yJ4dc9BCaeKh0bZZ/Nu/mhJBkJU+q65LM8Pe1gdus+nB1vE6OT/rw1PPvvH1ku8/fH6uQEQszMxmtClGCm3QFJoggiJQrZwYteOple69f2y8nViwDwokAQUlKBFKhBKhRChNuPjfjHsWDj2yNOx85nbNSPMytACZtA0hZITaJyW0DaNZnLqSBrVT68CW1WOiLR20kEmijSKlRJQQyEo2hVFKDbU2UiEKKJCoiKBEKBFKhMgw0oSREr448YLPjm421hYVmUCB2pFJRSIzkUqhRGgb5rqhVcvW+uib9fpKX4EWak2ZSZIS7P12K9kb1M6g66xcssbaFZtcn73p1X336bvPQQt9pU+yUgFdHdj26Gv6rPraq9KF6bPWrdrsxmDGT7e2z3v8/ZlooXapZnrv54GQarCoG+izOn3lL8Pa6erQsB+6Nnfd+ru2uDG85fg/R2Zb6Lpe37NyYsSG5UVNDlyY1fWdOybu1tVen9XF6TOWLlzh5Nmjjv15OmfT4ha6uVq7WnPQi2PnezXSrW7gk2O7DerAbDewZtlaT6/e7sfTR5ybvmR8cs/NUx8/P9PCcLa/vGC0WfbOusGCzCyS+tgvYNF4C17ce6co4yavT/ly1w/TG3YePA8tROTu7W8deikinkg5H0CSSOnG8rmxc1PfxeLLX119ctfBk22xH/4HCmFTpxr5rC8AAAAASUVORK5CYII=
!usage
{{{[img[page_link.png]]}}}
[img[page_link.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/page_link.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAALQSURBVBgZBcFfaJVlHADg532/bzvNo9MtY1oXRlRWsCREIlFXoaBmUEIkaH9uCsokEIK6qbtg4UVBIN0kFETQnVQ3FmXOxMwg1BApA9GdTdFJbLqzc87763lSRNjy/i+vDgw2dudkLe5AAgmRiKJbyj83r8eP6b+Zd44d3LEAkCLC9g+PH/ty39qHc07LgkoAEAHh2mzHV7/fNHWpfeuvs+eHJw7uaEMNuUqr++tq2bmrqpwSiSj0ouh2w+1Oz5MPLPH4g7WT5dqiKA/NjL313dDRT59pZ0gpLY6Iqr/K+jJ1ospUiZTIEoqVg/12rFvp3vsbA/Vg8xBkCBJk5EROSU5JTklOSa6S1o3bVi3ueGQ4ee2JO1V91QtQA0RQVyRJpKT0gpzUFf2R/X09LJSuUhZsvK8h1bkLNUQQqFMWQiDlJCEKUWX6ySUppRIyKYMaAgUpkSSBQBT6KkDKUi+JHAoigBpKlwgKEiIC5IyS1FUQiSAkvUKvADWUEiKCYL5927k/jpu8eMby4SFTV69b9/ROA0uGHDt8yMhdQ36dmTE0O1iPjb3brKFX6AWdhY4jh7/WiFkv79ltbm7O5cuX/Tbxrap/wM7nnlXXlVarpe/06frI+cEPaijdUCK8980xq69d9NKeXd7+6HOzF064e+UKo6OjWlf+deDAKZOtKevXrze2aaNLly69nqHb7en1qKfOGh5sgqde2W9+oWPXrl02bNhg27Zttm7d6la7440394GlS5c2aui2S+mWEnnpinS5dRL8dGhc9HrGx8c1m00wNzcnlfDJxwdiy+bN6cqVK/M1dOZ7083+avn+7WuaX3x2NE/8fNSLY4+yadT09LQLFy5oNBpWrVplZGREztnEiVO9ycnJqRQR1u39YW+3E88n8VhemF68/Mb3ffeMLEuNRp+EM3OrO920KNYs+rM/KdFuL5RWa3rm1uzMlv8B/jBGW3bkYMYAAAAASUVORK5CYII=
!usage
{{{[img[page_refresh.png]]}}}
[img[page_refresh.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/page_refresh.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAALsSURBVBgZBcFtaJVlGMDx/3U/9znz7LjjfMGXYiq1VkkrUiRoZQUhhoOKrAi/hEH0IUHFZQSREu1TQh8CP0TaEBQtIYikfRD3ciSWc0rlWpuzEmbT5TZ1O8fzPPd9Xf1+8uLHvW8XSnXbnbABWAAIAAKYgClBdXz2lp2ROzMd/YfaUwAAAHnps3L/0Z0bHnVOGg0SDAAAzACMqbmMY4OzTF6rVYZ/H1lSPtReAwDwLpGH8z5pvHyTxImAgClEU0Iwqlnk+YcaeKrFM6BT9aaPzDz3/o+Le7/cWgNwIrLQzJJ84sg58AKJg0RABBwCKKtKeYorvmdtc67gS8UjAADOQAAc4AScCE4EJ4ITwSXCv9NV1izMmKtOEOq+JsklrwMAeAAz8AkIgomg0biRjjH03w9cn/uDMB4JaaCpYTVZmKd+5QkHzwLgzcAALw7DMGCyNsb5qe+4r34Jjy9tR02JFlGLBI1UKgNuyxcvXPlp19lmb4ACIiAIBozdHmBZvsjywgqGJgYZmxwlSwNNi1cTQ2T4SqrdHWebAZwGMAMFDDAzrs5cYuj6BU799i3zFcfuZ06ye9Mpbk1XCRVHqLyTtu3fWADwqoaZgYFhAOxYdxAzUIOokeODnWxb/xGL8is58MonvNw5yLlPz1cBfFSIBqagAAAYQVOEHF+V93G3OosavNV2gA+Ovsdc7ZcFT+wKFrLwj9dgqBn7L6YIhgqYCagjvfkhTQ23qcsH9nzzNFkaeLBpLdu3vcHwyJ/09p/r9iFEYoRVpRzrlzvUIBqc7nuN+xtLtDa3Ei3yWMs6okXUIqNXx+npK1+IIR73oaYaVC2NyM8TERXDEJa2nOTvy3uozA+QhcDwyAghDYQsouGBGELc+1fXtR6f3Ys3ivlk2b7WtGhmDgMFABZt/JyOrnep3Jmm3PkrImgh7+627uieGO3a0gPgRezg5r19r4rIk4bVAwBgYIDxJjE5nGvbeSYD7qnqkHccAwD4HyXFhGV2sNBxAAAAAElFTkSuQmCC
!usage
{{{[img[printer.png]]}}}
[img[printer.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/printer.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJtSURBVDjLjZPfS1NhGMfPXfh3OG/E/yBImNkqrYGCzAthh+WNgXihwQYb2CoYukGwsdRLoYUWQbRAhqzc2Q91IrrVhlhLqznL5Tyb23m3s317z1szBzM68Lk47/N9Pud5XjgcAK7OVfM7/a2piE87HalRoLVHStrp1VKvLVi7fE9wns/WaXi58UgoH4kl/CxIyOZ/cyRKSKRFmF/tw/B4p3jl7utLFwp6baHiySnBxheZUkHkM8HKrgSpUsVGWsaDN/tQG/1PLxT02EIlRbBJBZtfZaztlSF8JEgdFqBMdnh8im7LSqWpYHJysqXHFiS5AkGMfi12UP0zRRm+D6fwxvPI0dWu3Q8QvV7f0iCgzQZKnl4WjqkgcVDDeyrYpqLoXoWtsbxTpLUyrlsFDA4O5vv7+w1MQBu7Z2dnEY1GcXsqjCwVJDM1JCixb1Vs0VXCdIoAXSVLBTcfhhEIBDA+Pg6NRtOtCLbpg0wmA7PZ/F8oWUEQMDAwsKsIiCzLUFhfX4coiv8kFAqhnh8bG6txFosFhBDG4uIiUqkUEzVDqc3Pz5/leZ4HZzKZkEgkGG63G8lkEn6/vylKxuFwnOU7OzvBTUxMwOfzMex2O+LxOJaWlpoSi8VgtVrP8u3t7eDoHvB6vQyXywV6Jwyj0YjR0VE2Zl9fH7q6uqBWq9lZPd/W1gZuZGSk6vF42IHSuPD8JZbfBpvybOEFOjo6WHZubg6tra3gDAbDzNDQ0LZOpwPvCqNYIjg6IfhBOcxJSGdL2PtewKeMiKJUBu8MQ6VSKc1bFFPDv8C7ItXhJ2sYdv/lDmOVodR4Z6R6vucXuxIEyKz+W40AAAAASUVORK5CYII=
!usage
{{{[img[script_code.png]]}}}
[img[script_code.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/script_code.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAALtSURBVBgZTcFLaFxVAIDh/5577jwzj0wSUmqMtKIiBltbbJ1FUCxVoQu3FrHGVRU3BVcKrkTcKOhCUOtOAyJ23WIQtFawpoooZWKJpnbsNJN5PzP3PO5xArPo93nOOfasXCgfAz48mE8UhzpiqCN0FLFrog7QA+qABVpAA/gC+FYyERlz/NC+qeIbT85xt4GKckMV5Voju6A09ELLzXqfi38PTgLnJBORMfPZmMeectsSeB7SA19CPBAsxgW+EAQ+PLaQZH8uXTj/S+UDwYTVOitxmAh6yqOjoR1CZwSdETR2Yadv2fPm6i2KB9IszQZzkgkVmvnLZcuP21VeO1rgs+tdAu1YOZxlKiHw8fA9iADPdvn5nxa/3epUBGOH39sqjETu2UJG4oUwDB2RcmRSHuevdtjpWgZhxEBH4KDaDflobbNrlVoRh97demHpgfTth+5J5ZpNw5kjWQxw6mCa7aYlk4bPr7X54XqfkfGIHNjAYpQ6cOH1x9fEw/cnP13M+Ik7bc3ZYxniMR9PQCElObmYptox7E97XK0MscbhHJgwxKrQMiZ+v9Y9u3knHBUCn08ut6m2DQJHe6C5WOqQl4KbVcXR2QSxwENbS38wNEapLmNi4/0Hv/r3zxvHN0p1YnGP1e/r4ODr9TbZlKBTU7xSnKG4lCUZQKMfYkJVvfT2c44xyVjKr6lpEUI3g3UOPIE1lu6O5aUTcyRjPjhISUGttYtVYYUJuXxudRZ4p/jIvZx+eoHvSopmz/Ly8jyJwBFIkD7EfMimYLM8xChVZUJapU4Ap34tbdHalfRDh7aOUHsoE2FsROQchVyOV5/Zx3ZjiFWqxoS0Wh95/qlHk2+9+AR3sw60dSgDOPj4UoVUAL3+EKt1gwlptd7arnf4cq1EfipJPpsgn46TS8fJpGLEY4K4FJxenicuodbsYbX+jwkZGfPNlfWNhSvrG/cBM8AMMA1MA7lELAgSiYBsOkk+m+KPv8o3gJ+Y+B9yFXCQeyJWrQAAAABJRU5ErkJggg==
!usage
{{{[img[server_go.png]]}}}
[img[server_go.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/server_go.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJUSURBVDjLpVPNaxNBFP8lqY1JSJOGFBtSU11BaEulUUFB7EUalB70kINCQfBv8FgNgvRUJCdPUj36FxgqKahpi18NSQXBikRbE6UfYpNtsruzO+ubTTaHNoLgwuMxs/P7eG/eOEzTxP98Xfs38vn8Y13XpxhjXZRB2QpN00R+mkwmb3QkKBaLAQI8CgaDSbfbC5VA4ByWP3LZ2xvE/HzmOq0OEhQKhcsCHA6Hoz6fD6WvZQh1zk1wkxORCYPIVFXtXAIdzsRiMWuj0VDACPyhuEIEvB0TiStWGR0JRI3d3d2oVqtNZcPA8MiYpW621EWz/+pAMBsEEofEpQjrxcI7yoalLv5FJq92dOAQoGw2a8bjcdRqNTrEUK5st9XtnNm+g7omQ+O698mt1YZN4LQdNJttWmEIZaNZ+5a/hLnfaSg6w0B4CApj9WsPj3kOlNAGt4DPNqdJmUH9weCjvvSFTmKo/xxqyh6K31/L47OhwKvbv2SLQDTHnkhhWfRA5xomRm7CoLXliCaisruB0YELkLWGc2X95e6p+85Q24G4BZfL1aybXCi6ZoG/7XwG4zoR0kQaDFW1hrGjFyGzuvNNaXHH2XLwNpfLQZZl+P1+HPa4iUCBbug40hNDf88gIgEJh1we9PmjyG8sYenL4lZdw1mHbT2dTk/SPNyLRCJnjksn8GB1Cgo506gU4UYKD+O8lMD79WUsrD3/qem4VJkxPzr2v8ZUKpUgolmKUfsxibwcncPpwXG8WFsoa9wCf2rPwb980l3HnsFd3gY3pM0Zs2Tv/wEq26vP9fcF2QAAAABJRU5ErkJggg==
!usage
{{{[img[sitemap.png]]}}}
[img[sitemap.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/sitemap.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAACoSURBVCjPY/jPAIMMCgxmYKiAEAOKwhmMDGZ//v/5/+M/qhI0BW/+gxQBlTDiUPDl/3v8Cn7//4VfwR/cVkB8kfI27S0WR+7rm/ui70X7i9YX88O7whtflANh7ouUPqgCBsbZLyBGAq1hRLBiX4BZiODBxgIpgAWPOYM/BgukGCl4En9jsswYkIIHKIzBgiiABg9QGINlxoAUPEBhDJYZwhdmDDZYWAoAtTEEdnXdy7IAAAAASUVORK5CYII=
!usage
{{{[img[star.png]]}}}
[img[star.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/star.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIwSURBVDjLlZLNS5RRFMafe9/3vjPOjI1jaKKEVH40tGgRBWEibfoPQoKkVdtoEQQF4T/QqkVtWrSTFrVsF1FgJbWpIAh1k2PNh+PrfL4f95zTQk0HHKkDD/cc7vP8uHCuEhF0q/KnmXNgGR248PZFN4/GISXMC8L89DBPV0Dp4/SsazJjrtfb9/vdxfn/BgjzY5M8Aq8nBya+V3h93vtnQHFxat4kszntJAAAxus1YvnZQV5V/jyTEZarwnwFLGeFZdT0ZFOJdD84qoCDOpQ7grZfRNj020JSEOKvwvxGiF+q0tL0N5PuO+Mk0nC0B0BDsYCCImyzAIktBBloMwKJLSgKYcMAcdhC2KpVlIig+H5qxcv0n0xmj4Gbq+BwC2wtJLbgHUlMEFJwUpMIGpto16u+kJzSACAk+WCzvNbe+AVljkOYIcQQou3TbvdOJo+g4aNdqzaF+PT43HJVA8DQpcVIiPPtaqlEUQzlDELsTpgYwgTAQIjQqlUCtpQfn1spdmxh+PJSQyw9CrbKgM7tvcISQAxlBhC3GuCYXk3cWP25m3M7dk88qbWBRDVApaATOSjPBdXXwYEP5QyCgvjE/kwHgInHtHYBnYA2owhrPiiuw0sOw3EZFEagIB7qChDiYaUcNIoFtP1KxCTPhWiDw7WbXk9vKpnOgsI4exjg6Mbq96YQPxm79uPOvqvbXx4O3KrF6w8osv2df17kr5YXJq7vnw/S0v3k7Ie7xtud/wAaRnP+Cw8iKQAAAABJRU5ErkJggg==
!usage
{{{[img[table.png]]}}}
[img[table.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/table.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHISURBVDjLpVPNK0RRFP+9D98syMwUspHkm9I0YkFZWBFKkZ0s7a3Ewh+ilChK7FgoZCJFKYlYKB8zk2+Z5t0P577He29kQU7dd+6575zf+d1zztWklPiPmOozt/U4SThjXIoyIQS4AJjSXO0lGGlvcXAm6Vzsz4xUhm0AIeX4QLig+C+ZpxbOG1wGhGYHr1zMUmZGWRgs0ha3PE1nX/8mWmdgWTzLB+DUYbhm9FfZ35IEyrhXA3VXJfPbsV8B9LQUIeUHYJ8ASobag1jcucNgW8g9W4reYSDi2YnnZDoDiwCokDANct6NwTB0LEdj0HRA/wxa2SN25JNBEdWluUhZ366gqmAaGvrCAXKOozccTGPgt8+vn8GYSGcgyTYp3dpBnBg42nbQPRBTo5bTvqYkmxL6AQhNTWQGBXY3B7BxlEBXozcW64dxRKoKUZBju+P06gl5WaaviMJBM3TNDlbypemIZgHYOnlwASsCmW7nHADGnBoQ3c76YmweJ9BR5zFYjsbRHwm4tmJg6PhWA7pCXXk+bu7fURHKweXtq/sWaksz7SC/CCGFrwtyZ3r+rCnFRZ7qr1qc6mLZj4f9OEyPL8lVpbX/PucPv5QPKHB1TdEAAAAASUVORK5CYII=
!usage
{{{[img[tag_blue.png]]}}}
[img[tag_blue.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/tag_blue.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHcSURBVDjLhZPZihpBFIbrJeY2wbcQmjxdIGSSTC4zQxLyAK4o7igoKm7TPW49LoiYjqLG3DWpZmx7/tQpsR1xycW5qTr/9/+n+jTTdR3dbhftdhutVgvNZhOapkFVVTQajSsA7FKxTqcDx3GOajqdSki1Wr0IYeRMAsMwpPNkMnEhdCZSoFQqnYUwikzN5EYH9XpdNU0Ttm3LcwJWKhXk8/mTEEauu0YhfhKRDcuysDBt5H5tk4zHYxSLReRyuSMII+dd5M1mAxL//uvgw8Mz3t4DWWN7NxqNKAXS6fQBhIkZ+Wq1kk3r9Rpz4XytPeNLF/iqAx8f9pDhcEgpEI/HXQir1WpvxIx8uVzKps7Kls53AvCjB3x7PIQMBgNKgUgkIiGSUi6XFTEjXywWsunxj433qoM7fQ+51oDMzy2k1+tRCoRCoSt3lkKhoIgZ+Xw+P4J8F4DPTeDm3oK92aZIJpMIBAKvD15UzKdks1k+m81cyDsB+SRGuG2tYVpPL8Ued4SXlclklFQqxWkTCaILyG3bgWXvnf1+v8d9xFPLkUgklFgsxmkTd5+YxOL8QHwWQBWNRr3ipTktWL/fPym+CKAKh8PeYDDISezz+TwnV/l/v6tw9Qrxq3P3/wBazDrstPR7KQAAAABJRU5ErkJggg==
!usage
{{{[img[tick.png]]}}}
[img[tick.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/tick.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGrSURBVDjLvZPZLkNhFIV75zjvYm7VGFNCqoZUJ+roKUUpjRuqp61Wq0NKDMelGGqOxBSUIBKXWtWGZxAvobr8lWjChRgSF//dv9be+9trCwAI/vIE/26gXmviW5bqnb8yUK028qZjPfoPWEj4Ku5HBspgAz941IXZeze8N1bottSo8BTZviVWrEh546EO03EXpuJOdG63otJbjBKHkEp/Ml6yNYYzpuezWL4s5VMtT8acCMQcb5XL3eJE8VgBlR7BeMGW9Z4yT9y1CeyucuhdTGDxfftaBO7G4L+zg91UocxVmCiy51NpiP3n2treUPujL8xhOjYOzZYsQWANyRYlU4Y9Br6oHd5bDh0bCpSOixJiWx71YY09J5pM/WEbzFcDmHvwwBu2wnikg+lEj4mwBe5bC5h1OUqcwpdC60dxegRmR06TyjCF9G9z+qM2uCJmuMJmaNZaUrCSIi6X+jJIBBYtW5Cge7cd7sgoHDfDaAvKQGAlRZYc6ltJlMxX03UzlaRlBdQrzSCwksLRbOpHUSb7pcsnxCCwngvM2Rm/ugUCi84fycr4l2t8Bb6iqTxSCgNIAAAAAElFTkSuQmCC
!usage
{{{[img[wrench.png]]}}}
[img[wrench.png]]
!notes
license: http://www.famfamfam.com/lab/icons/silk/
!type
image/png
!file
./images/silk/icons/wrench.png
!url
!data
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAH0SURBVDjLlZPLbxJRGMX5X/xbjBpjjCtXLl2L0YWkaZrhNQwdIA4FZxygC22wltYYSltG1HGGl8nopCMPX9AUKQjacdW4GNPTOywak7ZAF/eRe/M73/nOzXUAcEwaqVTKmUgkGqIoWoIgWP/fTYSTyaSTgAfdbhemaSIej+NcAgRudDod9Pt95PN5RKPR8wnwPG/Z1XVdB8dxin0WDofBsiyCwaA1UYBY/tdqtVAqlRCJRN6FQiE1k8mg2WyCpunxArFY7DKxfFir1VCtVlEoFCBJEhRFQbFYhM/na5wKzq/+4ALprzqxbFUqFWiaBnstl8tQVRWyLMPr9R643W7nCZhZ3uUS+T74jR7Y5c8wDAO5XA4MwxzalklVy+PxNCiKcp4IkbbhzR4K+h9IH02wax3MiAYCgcBfv99/4TS3xxtfepcTCPyKgGl5gCevfyJb/Q3q6Q5uMcb7s3IaTZ6lHY5f70H6YGLp7QDx9T0kSRtr5V9wLbZxw1N/fqbAHIEXsj1saQR+M8BCdg8icbJaHOJBqo3r1KfMuJdyuBZb2NT2R5a5l108JuFl1CHuJ9q4NjceHgncefSN9LoPcYskT9pYIfA9Al+Z3X4xzUdz3H74RbODWlGGeCYPcVf4jksz08HHId6k63USFK7ObuOia3rYHkdyavlR+267GwAAAABJRU5ErkJggg==