Welcome to TiddlyWiki created by Jeremy Ruston; Copyright © 2004-2007 Jeremy Ruston, Copyright © 2007-2011 UnaMesa Association
CACHE MANIFEST
CACHE:
/_offline
/bags/common/tiddlers/profile.css
/_offline.css
/bags/common/tiddlers/jquery.js
/twikifier.js
/_offline.js
# VERSION 0.2.5
NETWORK:
*
/***
|''Name''|SimpleSearchPlugin|
|''Description''|displays search results as a simple list of matching tiddlers|
|''Authors''|FND|
|''Version''|0.4.1|
|''Status''|stable|
|''Source''|http://devpad.tiddlyspot.com/#SimpleSearchPlugin|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/contributors/FND/plugins/SimpleSearchPlugin.js|
|''License''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''Keywords''|search|
!Code
***/
//{{{
if(!version.extensions.SimpleSearchPlugin) { //# ensure that the plugin is only installed once
version.extensions.SimpleSearchPlugin = { installed: true };
if(!config.extensions) { config.extensions = {}; }
config.extensions.SimpleSearchPlugin = {
heading: "Search Results",
containerId: "searchResults",
btnCloseLabel: "close",
btnCloseTooltip: "dismiss search results",
btnCloseId: "search_close",
btnOpenLabel: "open all",
btnOpenTooltip: "open all search results",
btnOpenId: "search_open",
displayResults: function(matches, query) {
story.refreshAllTiddlers(true); // update highlighting within story tiddlers
var el = document.getElementById(this.containerId);
query = '"""' + query + '"""'; // prevent WikiLinks
if(el) {
removeChildren(el);
} else { //# fallback: use displayArea as parent
var container = document.getElementById("displayArea");
el = document.createElement("div");
el.id = this.containerId;
el = container.insertBefore(el, container.firstChild);
}
var msg = "!" + this.heading + "\n";
if(matches.length > 0) {
msg += "''" + config.macros.search.successMsg.format([matches.length.toString(), query]) + ":''\n";
this.results = [];
for(var i = 0 ; i < matches.length; i++) {
this.results.push(matches[i].title);
msg += "* [[" + matches[i].title + "]]\n";
}
} else {
msg += "''" + config.macros.search.failureMsg.format([query]) + "''"; // XXX: do not use bold here!?
}
createTiddlyButton(el, this.btnCloseLabel, this.btnCloseTooltip, config.extensions.SimpleSearchPlugin.closeResults, "button", this.btnCloseId);
if(matches.length > 0) { // XXX: redundant!?
createTiddlyButton(el, this.btnOpenLabel, this.btnOpenTooltip, config.extensions.SimpleSearchPlugin.openAll, "button", this.btnOpenId);
}
wikify(msg, el);
},
closeResults: function() {
var el = document.getElementById(config.extensions.SimpleSearchPlugin.containerId);
removeNode(el);
config.extensions.SimpleSearchPlugin.results = null;
highlightHack = null;
},
openAll: function(ev) {
story.displayTiddlers(null, config.extensions.SimpleSearchPlugin.results);
return false;
}
};
// override Story.search()
Story.prototype.search = function(text, useCaseSensitive, useRegExp) {
highlightHack = new RegExp(useRegExp ? text : text.escapeRegExp(), useCaseSensitive ? "mg" : "img");
var matches = store.search(highlightHack, null, "excludeSearch");
var q = useRegExp ? "/" : "'";
config.extensions.SimpleSearchPlugin.displayResults(matches, q + text + q);
};
// override TiddlyWiki.search() to sort by relevance
TiddlyWiki.prototype.search = function(searchRegExp, sortField, excludeTag, match) {
var candidates = this.reverseLookup("tags", excludeTag, !!match);
var primary = [];
var secondary = [];
var tertiary = [];
for(var t = 0; t < candidates.length; t++) {
if(candidates[t].title.search(searchRegExp) != -1) {
primary.push(candidates[t]);
} else if(candidates[t].tags.join(" ").search(searchRegExp) != -1) {
secondary.push(candidates[t]);
} else if(candidates[t].text.search(searchRegExp) != -1) {
tertiary.push(candidates[t]);
}
}
var results = primary.concat(secondary).concat(tertiary);
if(sortField) {
results.sort(function(a, b) {
return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);
});
}
return results;
};
} //# end of "install only once"
//}}}
!URL
http://www.ft.com/cms/s/2/c473c282-75f3-11e0-82c6-00144feabdc0.html#axzz1LgcaFuvq
!Description
No wonder, because their entire education had been a lesson in winging it. They knew that all you need to succeed is to speak well, and that’s what the British ruling classes do: they speak well.
!Notes
I've noticed this and it is entirely distressing.
My house has 1 imac, 2 11 inch airs, 1 13 inch white macbook, 1 13 inch black macbook, a 12 inch powerbook, a 13 inch silver macbook (from last year), 3 iphone 4s and 1 iphone 3g. this is wrong somehow
!URL
http://tiddlyspace.com/bags/ace-ide_public/tiddlers/chrjs-store.js
!Description
A store object, using the chrjs library.
mechanisms to interact with tiddlers, bags, recipes, etc on TiddlySpace and mechanisms to refresh those things and keep them up to date in the browser.
!Notes
Looks interesting and exciting
!URL
http://mygengo.com/talk/blog/release-schedules/
!Description
A regular release schedule also helps maintain momentum, and by extrapolation, morale.
<<<
Their nostalgia for British greatness is often no more than the trumpeting of a bunch of insular snobs who seem to have a hard time restraining their inner-fascist.
<<<
[[The British Euro Farce - NYTimes.com|http://www.nytimes.com/2011/12/13/opinion/cohen-the-british-euro-farce.html?_r=1&nl=todaysheadlines&emc=tha212]]
Watching parliament pretend to debate is always amusing.
I am inbox zero across all my many inboxes for the first time in forever.
I'm old school web guy still believing in the dream of hypertext fixing //everything//.
/***
http://github.com/FND/jquery/blob/master/ajaxq.js
***/
//{{{
(function($) {
var queue = [];
var pending = 0;
var _ajax = $.ajax;
$.ajax = function(options) {
var _complete = options.complete;
var callback = function(xhr, status) {
pending--;
if(_complete) {
_complete.apply(this, arguments); // XXX: exception can halt queue
}
dispatch();
};
options.complete = callback;
queue.push(options);
dispatch();
};
var dispatch = function() {
if(pending < 2 && queue.length) {
pending++;
var options = queue.shift();
_ajax.apply($, [options]);
}
$(document).trigger("ajaxQueue", { pending: pending });
};
})(jQuery);
//}}}
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
Hard to believe this 5 year old bug in apache is still getting attention and still not getting fixed https://issues.apache.org/bugzilla/show_bug.cgi?id=35256
!URL
http://blog.jonudell.net/2011/01/24/seven-ways-to-think-like-the-web/
!Description
Given the web’s hybrid nature, how to can we teach people to make best use of this distributed hypermedia system?
!Notes
Nothing new here, but nicely composed in one place.
<html>
<head>
<title>@s</title>
<link href="/bags/common/tiddlers/profile.css" type='text/css' rel='stylesheet' >
<link href="/jquery-ui.css" type='text/css' rel='stylesheet' >
</style>
<script type="text/javascript" src="/bags/common/tiddlers/backstage.js"></script>
</head>
<body>
<div id="container">
<div id="header">
<h1>@s</h1>
</div>
<h2>Tiddlers that are @ing this space</h2>
Tiddlers that are tagged with <span class='magicTag'>@<spacename></span> are listed below.
<ul id="ats">
</ul>
</div>
<script type='text/javascript' src='/bags/common/tiddlers/jquery.js'></script>
<script type='text/javascript' src='http://htmljs.tiddlyspace.com/htmljs-prettydates'></script>
<script type='text/javascript' src='/bags/common/tiddlers/jquery-json.js'></script>
<script type='text/javascript' src='/bags/tiddlyspace/tiddlers/chrjs'></script>
<script type="text/javascript">
$.ajaxSetup({
beforeSend: function(xhr) {
xhr.setRequestHeader("X-ControlView", "false");
}
});
var host = "http://tiddlyspace.com";
// TODO: what about running from homepage?
var magicTag = "@" + document.location.hostname.split(".")[0];
$(".magicTag").text(magicTag);
var search = new tiddlyweb.Search("tag:" + magicTag, "/");
var list = $("#ats");
search.get(function(tiddlers) {
tiddlers.sort(function(a, b) {
return a.modified < b.modified ? 1 : -1;
});
for(var i = 0; i < tiddlers.length; i++) {
var tiddler = tiddlers[i];
var item = $("<li />").appendTo(list);
$("<a />").attr("href",
host + "/bags/" + encodeURIComponent(tiddler.bag.name) + "/tiddlers/" + encodeURIComponent(tiddler.title)).text(tiddler.title).appendTo(item);
$("<span />").text(" " + simpleDate(tiddler.modified)).appendTo(item);
$("<span />").text(" from ").appendTo(item);
// TODO: hacky
$("<a />").attr("href", "http://" + tiddler.modifier + ".tiddlyspace.com").text(tiddler.modifier).appendTo(item);
}
if(tiddlers.length === 0) {
$("<li />").text("no tiddlers tagged " + magicTag).appendTo(list);
}
}, function() {
$("<li />").text("Unable to retrieve tiddlers tagged " + magicTag).appendTo(list);
});
</script>
</body>
</html>
My god I hate winter in England. It is //so// mediocre.
<<<
Do your best not to get trapped between existing users who don't want to rock the boat, and don't lose your agility and ability to iterate with the system you're developing. Long delays between releases can be deadly.
<<<
[[Where Tcl and Tk Went Wrong|http://journal.dedasys.com/2010/03/30/where-tcl-and-tk-went-wrong/]]
//{{{
(function($) {
// disable ControlView for XHRs by default (soon obsolete due to TiddlySpace core inclusion)
$.ajaxSetup({
beforeSend: function(xhr) {
xhr.setRequestHeader("X-ControlView", "false");
}
});
var now = new Date();
var delta = 172800000; // 48 hours
$(document).bind("startup", function(ev) {
store.forEachTiddler(function(title, tiddler) {
if(!tiddler.tags.contains("excludeLists") && (now - tiddler.modified < delta)) {
dispatch(tiddler); // XXX: queries can be combined
}
});
});
var dispatch = function(tiddler) {
var adaptor = tiddler.getAdaptor();
$.ajax({
url: "/search?q=title:" + tiddler.title, // XXX: encoding!?
type: "GET",
dataType: "json",
success: function(tiddlers, status, xhr) {
var spaceBag = config.extensions.tiddlyspace.currentSpace.name +
"_public";
tiddlers = tiddlers.length < 20 ? tiddlers : []; // ignore common tiddlers (e.g. SiteInfo)
$.each(tiddlers, function(i, tid) {
if(tid.bag != spaceBag && !tid.tags.contains("excludeLists")) { // overly simplistic; inclusions
retrieve(tid, adaptor);
}
});
},
error: function(xhr, error, exc) {
console.log("ERROR", arguments); // TODO
}
});
};
var retrieve = function(tid, adaptor) {
var callback = function(context, userParams) {
if(!context.status) {
return; // TODO: notification?
}
var tiddler = context.tiddler;
var title = "%0 [%1]".format(tiddler.title, tiddler.fields["server.bag"]);
tiddler.fields.doNotSave = "true";
var dirty = store.isDirty();
store.setDirty(false);
store.saveTiddler(title, title, tiddler.text, tiddler.modifier,
tiddler.modified, tiddler.tags, tiddler.fields, true,
tiddler.created, tiddler.creator);
store.setDirty(dirty);
};
var context = {
workspace: "bags/" + tid.bag,
headers: {
"X-ControlView": "false"
}
};
adaptor.getTiddler(tid.title, context, null, callback);
};
})(jQuery);
//}}}
/***
!Usage
<<repview>>
!Problems:
* external tiddlers, the link is wrong
***/
//{{{
(function($) {
var representations = {
atom: 'A',
html: 'H',
json: 'J',
txt: 'T',
perm: 'P'
};
config.macros.repview = {
makeUrl: function(tiddler, rep) {
var title;
var bag = encodeURIComponent(tiddler.fields['server.bag']);
if (rep == 'raw') {
title = encodeURIComponent(tiddler.title);
} else if (rep == 'perm') {
title = encodeURIComponent(String.encodeTiddlyLink(tiddler.title));
return '#' + title;
} else {
title = encodeURIComponent(tiddler.title + '.' + rep);
}
return '/bags/%0/tiddlers/%1'.format([bag, title]);
},
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
$.each(representations, function(rep, label) {
if (tiddler.fields['server.content-type'] && rep == 'html') {
rep = 'raw';
label = 'R';
}
var attributes = {
href: config.macros.repview.makeUrl(tiddler, rep)
};
var extra_attributes = {
target: '_blank',
'class': 'externalLink repviewlink'
}
if (rep != 'perm') {
attributes = $.extend(attributes, extra_attributes);
}
$("<a />").attr(attributes)
.text(label)
.appendTo(place);
});
}
};
})(jQuery);
//}}}
my number one pet peeve with phones is not being able to send and receive sms over wifi
One more into the foul London breach.
When one self-destructive drug addled person is more important than all the other thousands of deaths that happened on the day of their death, then we are and will remain a completely fucked society.
!URL
http://pythonpaste.org/testing-applications.html
!Description
I reckon that either possible outcome for this weekend is great: Either the world really is ending (woot) OR in your face IDIOTS
<html>
<head>
<title>Upload file to your space</title>
<style type="text/css">
form,
input,
textarea {
border: solid 1px green;
}
textarea {
width: 400px;
height: 400px;
}
form.error,
textarea.error,
input.error {
border: solid 1px red;
}
form.saving,
textarea.saving,
input.saving {
border: solid 1px yellow;
}
</style>
<link href="/HtmlCss" type='text/css' rel='stylesheet' >
<script type='text/javascript' src='http://tiddlyspace.com/bags/ts_public/tiddlers/jquery.min.js'></script>
<script type='text/javascript' src='http://tiddlyspace.com/bags/ts_public/tiddlers/jquery-json.min.js'></script>
<script type='text/javascript' src='/TiddlySpaceCSRF'></script>
<script type='text/javascript' src='/jquery.form.js'></script>
<script type="text/javascript">
$(document).ready(function() {
var space = window.location.hostname.split(".")[0];
var csrf = window.getCSRFToken();
var form = $('#upload')[0];
$(form).attr("action", "/bags/" + space + "_public/tiddlers?csrf_token=" + csrf + "&redirect=/tiddlers");
$(form).ajaxForm({
beforeSubmit: function() {
var file = $("[name=file]").val();
var a = file.split('\\');
file = a[a.length - 1];
var val = $("[name=title]").val();
if(!val) {
$("[name=title]").val(file);
}
},
success: function(a) {
var title = $("[name=title]").val;
$('#messageArea').html("Successfully uploaded to ");
$("<a />").attr("href", "/" + encodeURIComponent(title)).text(title).appendTo("#messageArea");
$("[name=title]").val("");
},
error: function() {
$('#messageArea').html("Error uploading file.")
}
});
});
</script>
</head>
<body>
<div id="container">
<div class="settings">
<h1>Upload files to your space</h1>
<div id="messageArea"></div>
<form id="upload" method="POST" enctype="multipart/form-data">
title: <input type="text" name="title" />
<input type="hidden" name="tags" value="excludeLists">
<input type="hidden" name="csrf_token" class="csrf" />
<input type="file" name="file" />
<input type="submit" value="upload" />
</form>
</div>
</div>
</body>
</html>
/***
|''Name''|RevisionsCommandPlugin|
|''Description''|provides access to tiddler revisions|
|''Author''|FND|
|''Contributors''|Martin Budden|
|''Version''|0.3.3|
|''Status''|@@beta@@|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/RevisionsCommandPlugin.js|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/association/plugins/|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.6.0|
|''Keywords''|serverSide|
!Usage
Extend [[ToolbarCommands]] with {{{revisions}}}.
!Revision History
!!v0.1 (2009-07-23)
* initial release (renamed from experimental ServerCommandsPlugin)
!!v0.2 (2010-03-04)
* suppressed wikification in diff view
!!v0.3 (2010-04-07)
* restored wikification in diff view
* added link to side-by-side diff view
!To Do
* strip server.* fields from revision tiddlers
* resolve naming conflicts
* i18n, l10n
* code sanitizing
* documentation
!Code
***/
//{{{
(function($) {
jQuery.twStylesheet(".diff { white-space: pre, font-family: monospace }",
{ id: "diff" });
var cmd = config.commands.revisions = {
type: "popup",
hideShadow: true,
text: "revisions",
tooltip: "display tiddler revisions",
revTooltip: "", // TODO: populate dynamically?
loadLabel: "loading...",
loadTooltip: "loading revision list",
selectLabel: "select",
selectTooltip: "select revision for comparison",
selectedLabel: "selected",
compareLabel: "compare",
linkLabel: "side-by-side view",
revSuffix: " [rev. #%0]",
diffSuffix: " [diff: #%0 #%1]",
dateFormat: "YYYY-0MM-0DD 0hh:0mm",
listError: "revisions could not be retrieved",
handlePopup: function(popup, title) {
title = this.stripSuffix("rev", title);
title = this.stripSuffix("diff", title);
var tiddler = store.getTiddler(title);
var type = _getField("server.type", tiddler);
var adaptor = new config.adaptors[type]();
var limit = null; // TODO: customizable
var context = {
host: _getField("server.host", tiddler),
workspace: _getField("server.workspace", tiddler)
};
var loading = createTiddlyButton(popup, cmd.loadLabel, cmd.loadTooltip);
var params = { popup: popup, loading: loading, origin: title };
adaptor.getTiddlerRevisionList(title, limit, context, params, this.displayRevisions);
},
displayRevisions: function(context, userParams) {
removeNode(userParams.loading);
if(context.status) {
var callback = function(ev) {
var e = ev || window.event;
var revision = resolveTarget(e).getAttribute("revision");
context.adaptor.getTiddlerRevision(tiddler.title, revision, context,
userParams, cmd.displayTiddlerRevision);
};
var table = createTiddlyElement(userParams.popup, "table");
for(var i = 0; i < context.revisions.length; i++) {
var tiddler = context.revisions[i];
var row = createTiddlyElement(table, "tr");
var timestamp = tiddler.modified.formatString(cmd.dateFormat);
var revision = tiddler.fields["server.page.revision"];
var cell = createTiddlyElement(row, "td");
createTiddlyButton(cell, timestamp, cmd.revTooltip, callback, null,
null, null, { revision: revision });
cell = createTiddlyElement(row, "td", null, null, tiddler.modifier);
cell = createTiddlyElement(row, "td");
createTiddlyButton(cell, cmd.selectLabel, cmd.selectTooltip,
cmd.revisionSelected, null, null, null,
{ index:i, revision: revision, col: 2 });
cmd.context = context; // XXX: unsafe (singleton)!?
}
} else {
$("<li />").text(cmd.listError).appendTo(userParams.popup);
}
},
revisionSelected: function(ev) {
var e = ev || window.event;
e.cancelBubble = true;
if(e.stopPropagation) {
e.stopPropagation();
}
var n = resolveTarget(e);
var index = n.getAttribute("index");
var col = n.getAttribute("col");
while(!index || !col) {
n = n.parentNode;
index = n.getAttribute("index");
col = n.getAttribute("col");
}
cmd.revision = n.getAttribute("revision");
var table = n.parentNode.parentNode.parentNode;
var rows = table.childNodes;
for(var i = 0; i < rows.length; i++) {
var c = rows[i].childNodes[col].firstChild;
if(i == index) {
if(c.textContent) {
c.textContent = cmd.selectedLabel;
} else {
c.text = cmd.selectedLabel;
}
} else {
if(c.textContent) {
c.textContent = cmd.compareLabel;
} else {
c.text = cmd.compareLabel;
}
c.onclick = cmd.compareSelected;
}
}
},
compareSelected: function(ev) {
var e = ev || window.event;
var n = resolveTarget(e);
var context = cmd.context;
context.rev1 = n.getAttribute("revision");
context.rev2 = cmd.revision;
context.tiddler = context.revisions[n.getAttribute("index")];
context.format = "unified";
context.adaptor.getTiddlerDiff(context.tiddler.title, context,
context.userParams, cmd.displayTiddlerDiffs);
},
displayTiddlerDiffs: function(context, userParams) {
var tiddler = context.tiddler;
tiddler.title += cmd.diffSuffix.format([context.rev1, context.rev2]);
tiddler.text = "{{diff{\n" + context.diff + "\n}}}";
tiddler.tags = ["diff"];
tiddler.fields.doNotSave = "true"; // XXX: correct?
if(!store.getTiddler(tiddler.title)) {
store.addTiddler(tiddler);
}
var src = story.getTiddler(userParams.origin);
var tiddlerEl = story.displayTiddler(src, tiddler);
var uri = context.uri.replace("format=unified", "format=horizontal");
var link = $('<a target="_blank" />').attr("href", uri).text(cmd.linkLabel);
$(".viewer", tiddlerEl).prepend(link);
},
displayTiddlerRevision: function(context, userParams) {
var tiddler = context.tiddler;
tiddler.title += cmd.revSuffix.format([tiddler.fields["server.page.revision"]]);
tiddler.fields.doNotSave = "true"; // XXX: correct?
if(!store.getTiddler(tiddler.title)) {
store.addTiddler(tiddler);
}
var src = story.getTiddler(userParams.origin);
story.displayTiddler(src, tiddler);
},
stripSuffix: function(type, title) {
var str = cmd[type + "Suffix"];
var i = str.indexOf("%0");
i = title.indexOf(str.substr(0, i));
if(i != -1) {
title = title.substr(0, i);
}
return title;
}
};
var _getField = function(name, tiddler) {
return tiddler.fields[name] || config.defaultCustomFields[name];
};
})(jQuery);
//}}}
//In response to [[fnd|06e8fb78cc67ffbd963f2571b1b2a910]]@fnd.//
I think, unfortunately that Paul is correct, not leastwise because he usually is. And yes the critical problem is the people of the web. However, there's nothing special about the people of the web. It is just people. The web happens to make it easy for them to be like that and to make it easy for other people to see it.
I think it is the price we pay to get the secondary effects.
Contention is one of the fundamental aspects of innovative culture.
/***
|''Name''|BinaryTiddlersPlugin|
|''Description''|renders base64-encoded binary tiddlers as images or links|
|''Author''|FND|
|''Version''|0.3.2|
|''Status''|@@beta@@|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/BinaryTiddlersPlugin.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5|
!Code
***/
//{{{
(function($) {
var ctfield = "server.content-type";
var plugin = config.extensions.BinaryTiddlersPlugin = {
isWikiText: function(tiddler) {
var ctype = tiddler.fields[ctfield];
if(ctype) {
return !this.isBinary(tiddler) && !this.isTextual(ctype);
} else {
return true;
}
},
// NB: pseudo-binaries are considered non-binary here
isBinary: function(tiddler) {
var ctype = tiddler.fields[ctfield];
return ctype ? !this.isTextual(ctype) : false;
},
isTextual: function(ctype) {
return ctype.indexOf("text/") == 0
|| this.endsWith(ctype, "+xml")
|| ctype == 'application/json'
|| ctype == 'application/javascript';
},
endsWith: function(str, suffix) {
return str.length >= suffix.length &&
str.substr(str.length - suffix.length) == suffix;
},
isLink: function(tiddler) {
return this.isBinary(tiddler) && tiddler.text.indexOf("<html>") != -1
}
};
// Disable edit for linked tiddlers (for now)
// This will be changed to a GET then PUT
config.commands.editTiddler.isEnabled = function(tiddler) {
var existingTest = config.commands.editTiddler.isEnabled;
if (existingTest) {
return existingTest && !plugin.isLink(tiddler);
} else {
return !plugin.isLink(tiddler);
}
};
// hijack text viewer to add special handling for binary tiddlers
var _view = config.macros.view.views.wikified;
config.macros.view.views.wikified = function(value, place, params, wikifier,
paramString, tiddler) {
var ctype = tiddler.fields["server.content-type"];
if(params[0] == "text" && ctype && !tiddler.tags.contains("systemConfig") && !plugin.isLink(tiddler)) {
var el;
if(plugin.isBinary(tiddler)) {
var uri = "data:%0;base64,%1".format([ctype, tiddler.text]); // TODO: fallback for legacy browsers
if(ctype.indexOf("image/") == 0) {
el = $("<img />").attr("alt", tiddler.title).attr("src", uri);
} else {
el = $("<a />").attr("href", uri).text(tiddler.title);
}
} else {
el = $("<pre />").text(tiddler.text);
}
el.appendTo(place);
} else {
_view.apply(this, arguments);
}
};
// hijack edit macro to disable editing of binary tiddlers' body
var _editHandler = config.macros.edit.handler;
config.macros.edit.handler = function(place, macroName, params, wikifier,
paramString, tiddler) {
if(params[0] == "text" && plugin.isBinary(tiddler)) {
return false;
} else {
_editHandler.apply(this, arguments);
}
};
// hijack autoLinkWikiWords to ignore binary tiddlers
var _autoLink = Tiddler.prototype.autoLinkWikiWords;
Tiddler.prototype.autoLinkWikiWords = function() {
return plugin.isWikiText(this) ? _autoLink.apply(this, arguments) : false;
};
})(jQuery);
//}}}
!URL
http://neversaw.us/2010/5/20/py-a-la-node/
!Description
Have you heard about Node.js? It's pretty awesome. Evented IO for servers! All of the promise of erlang*, with a syntax that you probably already know. But, you know, it'd be really nice if I could take my various django applications with me when I leave on this coffee-themed rapture. Bonus points if I can take all of the muscle memory I developed using python libraries with me as a carry-on.
!URL
http://devinterviews.pen.io/
!Description
This should have been the first warning sign that maybe we weren't exactly testing for skills that were most relevant to our requirements.
!Notes
The give them a programming quiz school of interview thought is dying. Long past due.
It is cold. I need a treat. So a mocha.
!URL
http://themanthursday.com/where-is-tiddlywiki-community/
!Description
I’ve spent my recent hours trying to discover the Internet residence of the TiddlyWiki community. It’s exhausting. They’re like an on-line version of some elusive band of trans-European vagabonds.
!Notes
Sounds familiar. Interesting comments about TiddlySpace in there too.
Unless you're delighted with the default scheme you can make some quick changes by generating a new random color palette, hit this button to cycle through some alternatives.
<<RandomColorPaletteButton saturation_pale:0.67 saturation_light:0.53
saturation_mid:0.43 saturation_dark:0.06 pale:0.99 light:0.85 mid:0.5 dark:0.31>>
<html><hr><html>
!URL
http://www.staynalive.com/2011/05/twitter-and-facebook-both-quietly-kill.html
!Description
It seems in 2011 and the era of Facebook and Twitter we've completely lost any care for open standards. Maybe it's not just RSS that is dying - it's the entire premise of open standards that is dying, and I think that's really sad, and really bad for not just developers, but users in general.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="14pt"
height="14pt"
viewBox="918 510 14 14"
id="svg3070">
<metadata
id="metadata3089">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs3072">
<radialGradient
cx="0"
cy="0"
r="1"
id="Gradient"
gradientUnits="userSpaceOnUse">
<stop
id="stop3075"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3077"
style="stop-color:#2b2b2b;stop-opacity:1"
offset="1" />
</radialGradient>
<radialGradient
id="Obj_Gradient"
xlink:href="#Gradient"
gradientTransform="matrix(11.473944,0,0,11.473944,922.3752,513.7837)" />
</defs>
<g
id="g3080"
style="fill:none;stroke:none">
<g
id="g3082">
<path
d="m 929.6952,512.9018 c -2.5384,-2.53843 -6.654,-2.53843 -9.1924,0 -2.5384,2.5384 -2.5384,6.654 0,9.19238 2.5384,2.53839 6.654,2.53839 9.1924,0 2.5384,-2.53838 2.5384,-6.65398 0,-9.19238 m -4.5962,2.8407 2.07733,-2.07734 1.75547,1.75549 -2.0773,2.07735 2.0773,2.07732 -1.75547,1.75548 -2.07733,-2.07732 -2.07733,2.07732 -1.75547,-1.75548 2.0773,-2.07732 -2.0773,-2.07735 1.75547,-1.75549 z"
id="path3084"
style="fill:url(#Obj_Gradient)" />
<path
d="m 927.61447,515.38354 a 4.51205,4.2590378 0 1 1 -9.0241,0 4.51205,4.2590378 0 1 1 9.0241,0 z"
transform="matrix(1.0218069,0,0,1.0462046,-18.063694,-21.648443)"
id="path2394"
style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:none;stroke-width:5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
</g>
</g>
</svg>
totally digging SiteIcon@z1jerry
!URL
http://hbr.org/2010/04/the-myth-of-shareholder-capitalism/ar/1
!Description
And yet, in an important 2007 article in the Journal of Business Ethics, 31 of 34 directors surveyed (each of whom served on an average of six Fortune 200 boards) said they’d cut down a mature forest or release a dangerous, unregulated toxin into the environment in order to increase profits. Whatever they could legally do to maximize shareholder wealth, they believed it was their duty to do.
!Notes
Shares are bad, mmmkay?
!URL
http://substance.io/
!Description
Substance is a web-based document authoring and publishing platform.
!Notes
Oh shit the bed, this is sweet.
!URL
http://www.koransky.com/shownav.php?information=http://www.koransky.com/Trip/Rig.html
!Description
In the past few days I've deactivated both my Facebook and Twitter accounts. It's difficult to explain the reasons as there's not just one that did it. The driving force in both cases is the services are centralized rather than federated. They are not just systems you participate in, but also places you go to. Such a thing runs contrary to everything I've ever wanted the web to be. I want the entire web to be the place we are and the system we are participating in. Not just parts of it. My identity on the web should be the aggregate of many sources.
(This leads to some very conflicted feelings about TiddlySpace which is itself becoming a place, not just a source. Thus my interest in TiddlyFed.)
But there's more to it than that. Twitter and Facebook encourage a style of discourse and interaction that I've never liked, whether mediated or in person: inane smalltalk. Talk that is small.
On top of that, so much of the talk is cruel, capricious, callow and crass. This, of course, makes me appear an old person. And perhaps I am, but since I was a wee small thing, I've wanted [[depth and meaning in my interactions|http://blog.tommorris.org/post/3216687621]] and been intensely bored by what I experience as filler.
There's a cost, of course, to my deactivation: Facebook is the first internet service to have thoroughly reached my non-technical family and friends. For many of them, Facebook //is// the internet. Which brings us right back round to the first point:
The web for me is deeply tied to many small diverse pieces, loosely joined as a network of independent, equal nodes, every participant a voice from which we can learn and with whom we can share. Services like Facebook create something like a monoculture, a shallow sea of fairly stinky bacteria breeding away.
(I say this in full awareness of the utility that Facebook and the like provide to the blossoming changes in the mideast and northern Africa. I'm glad of all that, but it's not a sign that Facebook itself is the engine of change, nor that it is the best solution for communication and concerted action. It was in the right place at the right time.)
us bound: heathrow -> detroit -> cincy
There are a lot of interesting people using ~TiddlySpace that you might like to keep track of and interact with. There are two main ways of doing this.
Firstly, if you see a number in the speech bubble in one of your tiddlers, it means that someone is writing about the same thing as you. You can find out what they're saying by clicking on it.
Secondly, if you find anyone interesting, or you find an interesting looking space and you'd like to know when it's changed, you can "follow" that space. To do this, simply create a tiddler with the title: {{{@space-name}}} and tag it {{{follow}}}. If you want, you can store some notes about that space in the body of the tiddler.
If you then want to know what happening, simply [[include|How do I include/exclude spaces?]]@docs the @tivity space and then visit your activity stream at [[/activity|/activity]], or just visit the @tapas space directly.
!Not sure who to follow?
Here's a few suggestions:
* @fnd
* @cdent
* @pmario
* @bengillies
* @dickon
Added PurpleNumbers to my HTML representation on TiddlySpace: http://cdent.tiddlyspace.com/bags/cdent_public/tiddlers/20110615#4364133ea5f9bd838cda7a6ca766ca51
<<<
From the end user perspective, purple number rendering is the same for PMWX version 0.9 and 1.6.01. Latest PMWX release consists of bug fixes and enhancements that provides the wiki administrator with greater flexibility in configuring PMWX extension. (1B2)
<<<
[[PMWX Release Notes - Project|http://project.cim3.net/wiki/PMWX_Release_Notes]]
New release of PurplenNumbers for media wiki! \o/
[[StyleSheetTiddlySpace]]
/*{{{*/
body {
font-size: 1em;
font-family: helvetica, arial, sans-serif;
background-color: #fff;
color: [[ColorPalette::Foreground]];
}
body ul { margin: 0; }
#popup {
background-color: [[ColorPalette::TertiaryPale]];
}
#popup.confirmationPopup, .followList {
font-size: 0.8em;
padding: 1em;
border: solid 1px [[ColorPalette::SecondaryMid]];
background-color: [[ColorPalette::SecondaryPale]];
}
.followList .listTitle {
text-decoration: underline;
}
#popup .followTiddlersList a {
display: inline;
padding: 0;
}
#popup li a {
color: [[ColorPalette::PrimaryMid]];
font-weight: bold;
}
#popup li a:hover {
color: [[ColorPalette::PrimaryPale]];
background: [[ColorPalette::PrimaryMid]];
}
#popup li.listTitle {
border-bottom: 1px solid #000;
font-weight: bold;
margin-bottom: 10px;
}
#popup.followList {
margin-left: 50px;
margin-top: -30px;
}
.followTiddlersList .label {
display: block;
left: 10px;
top: 0px;
line-height: 16px;
position: relative;
}
#popup .followTiddlersList .siteIcon{
height: auto;
}
#popup .followTiddlersList li{
clear: both;
display: block;
height: 48px;
margin-bottom: 8px;
position: relative;
}
#popup .followTiddlersList a{
display: inline;
}
#displayArea {
margin: 0;
top: 0px;
left: 0px;
width: 100%;
position: relative;
}
.revisionCloak {
position: absolute;
position: fixed !important;
height: 100%;
width: 100%;
top: 0;
left: 0;
border: 0;
margin: 0;
padding: 0;
opacity: 0.5;
filter: alpha(opacity=50);
background-color: #000;
}
/* *** Header *** */
.header {
position: relative;
background-color: [[ColorPalette::PrimaryMid]];
_width: 100%; /* ie 6 demands */
}
.headerForeground {
background-color: [[ColorPalette::PrimaryMid]];
float: left;
margin: 24px 16px 0px 72px;
padding: 0;
position: relative;
top: 0;
_width: 70%; /*ie6: needed for the background to actually be transparent*/
_background-color: transparent; /*ie6: needed to show the search box*/
}
.clearFloat {
clear: both;
}
#contentWrapper {
position: relative;
padding-top: 1px;
top: -1px;
}
#tiddlerDisplay {
_position: relative; /* ie 6*/
}
.siteTitle {
clear: both;
display: block;
font-size: 32px;
font-weight: bold;
line-height: 32px;
}
.siteSubtitle {
display: block;
font-size: 14px;
height: 16px;
margin-bottom: 8px;
}
#sidebarSearch {
padding: 0;
position: absolute;
right: 80px;
top: 8px;
width: 176px;
}
#sidebarSearch .txtOptionInput {
width: 100%;
margin-top: 5px;
_color: #bbb; /* ie6 danger */
}
#sidebarSearch .txtOptionInput:focus {
color: #000;
}
#sidebarSearch .searchButton {
display: none;
}
/* *** Menu Bar *** */
#mainMenu {
position: static;
text-align: left;
margin-left: 72px;
float: left;
width: auto;
padding: 0;
font-size: 1em;
line-height: normal;
}
#mainMenu a {
color: #fff;
padding: 8px;
font-size: 0.9em;
margin-right: 16px;
}
#mainMenu a:hover {
background-color: [[ColorPalette::PrimaryMid]];
color: [[ColorPalette::Background]]
}
#sidebarOptions {
margin-right: 72px;
float: right;
font-size: 1.1em;
line-height: 1.6em;
min-height: 1em;
padding-top: 0;
}
#sidebarOptions a {
margin-right: 8px;
}
.confirmationPopup .button,
#sidebarOptions .button {
cursor: pointer;
line-height: 1.4em;
text-align: center;
margin-right: 8px;
margin-left:-2px;
}
.confirmationPopup .button {
font-size: 0.9em;
padding: 2px;
}
#sidebarOptions .button {
font-size: 0.7em;
float: left;
width: 80px;
padding: 0px;
color: #fff;
}
.confirmationPopup a.button,
#sidebarOptions a {
border: none;
margin: 0 0.2em;
padding: 0.6em 0.25em;
display: inline;
color: #666;
}
.confirmationPopup a.button:hover,
#sidebarOptions a:hover {
color: #000;
}
.confirmationPopup a.button:active,
#sidebarOptions a:active {
border: solid 1px [[ColorPalette::PrimaryMid]];
background-color: #fff;
background: -webkit-gradient( linear, left bottom, left top, color-stop(0.1,rgb(200,200,200)), color-stop(1, rgb(100,100,100)));
background: -moz-linear-gradient(center bottom , rgb(200,200,200) 10%,rgb(100,100,100) 100%) repeat scroll 0 0 transparent;
}
/* *** Sidebar *** */
#sidebar .wizard table {
margin: 0px;
}
.tabContents .listTitle:first-child {
margin-top: 0px;
}
#menuBar {
background: [[ColorPalette::PrimaryLight]];
left: 0;
right: 0;
position: relative;
margin: 0;
padding: 0.5em 0 0.5em 0;
min-height: 1em;
overflow: hidden;
_width: 100%; /* for ie 6 */
}
#sidebarOptions a.button:hover {
color: [[ColorPalette::PrimaryPale]];
background: [[ColorPalette::PrimaryMid]];
}
#tiddlerDisplay, #searchResults {
margin: 16px 448px 0 72px;
}
#sidebarTabs {
position: absolute;
right: 72px;
width: 352px;
top: 0;
}
#sidebarTabs .tabsetWrapper .tabset {
width: 87px;
border-top: 1px solid [[ColorPalette::PrimaryPale]];
border-left: 1px solid [[ColorPalette::PrimaryPale]];
border-bottom: 1px solid [[ColorPalette::PrimaryPale]];
height: auto;
float: left;
word-wrap: break-word;
top: 0;
padding: 0;
}
#sidebarTabs .tabsetWrapper .tabContents {
background-color: [[ColorPalette::PrimaryPale]];
border: 3px solid [[ColorPalette::PrimaryMid]];
width: 242px;
_width: 238px;
left: -3px;
_left: -5px;
position: relative;
min-height: 34em;
padding: 8px;
font-size: 0.8em;
}
/* ---- Side style --- */
#sidebarTabs .tabsetWrapper .tabset .tab {
font-size: 0.9em;
padding: 0.7em 8px 0.5em;
color: #fff;
background: [[ColorPalette::PrimaryLight]];
border: none;
line-height: 16px;
position: relative;
display: block;
margin: 0;
}
#sidebarTabs .tabsetWrapper .tabset .tabSelected {
color: [[ColorPalette::PrimaryMid]];
background: [[ColorPalette::PrimaryPale]];
border-top: 3px solid [[ColorPalette::PrimaryMid]];
border-bottom: 3px solid [[ColorPalette::PrimaryMid]];
border-left: 3px solid [[ColorPalette::PrimaryMid]];
z-index: 10;
margin-top: -1px;
font-weight: bold;
}
#sidebarTabs .tabContents li {
border: none;
margin-left: 0;
word-wrap: break-word;
}
.tabContents .timeline {
background: [[ColorPalette::PrimaryPale]];
margin-bottom: 8px;
}
#sidebarTabs .timeline li.listTitle {
color: #132E43;
margin-left: 8px 0;
padding: 0.3em 0.11em;
font-size: 1em;
border-bottom: none;
}
#sidebarTabs .tabContents li a {
display: block;
text-align: left;
margin: 0 0 1px 0;
padding: 0.3em 1em;
background: [[ColorPalette::PrimaryPale]];
}
#sidebarTabs .tabsetWrapper .tabset a:hover,
#sidebarTabs .tabContents li a:hover {
color: [[ColorPalette::PrimaryPale]];
background: [[ColorPalette::PrimaryMid]];
}
/* Activity Stream */
#sidebarTabs .tabContents .activityStream .feedItem a {
display: inline-block;
padding: 0;
background: none;
}
/* ---- Tagging box --- */
.tagInfo {
border: 1px solid #cccccc;
padding: 10px 15px;
-moz-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2);
box-shadow: 0 2px 2px rgba(0,0,0,0.2);
color: [[ColorPalette::TertiaryMid]];
background: -moz-linear-gradient(100% 100% 90deg, #f4f4f4, #e5e5e5);
background: -webkit-gradient(linear, left top, right top, from(#e5e5e5), to(#f4f4f4));
margin-top: 1em;
font-size: 13px;
margin: 0 0 0 56px;
}
.tagInfo ul {
list-style: none;
padding-left: 2.2em;
}
.tagInfo ul li {
display: inline;
}
.tagInfo ul li.listTitle,
.tagInfo .tagging ul li.listTitle {
color: [[ColorPalette::PrimaryMid]];
font-size: 13px;
}
.tagInfo ul li a {
border: none;
}
.tagInfo .tagging ul li {
float: none;
display: inline-block;
}
.tagInfo .tagging {
padding: 0;
}
.viewRevision .toolbar {
right: 48px;
top: 8px;
}
.viewRevision .modifierIcon img,
.viewRevision .modifierIcon svg {
margin-right: 8px;
}
.viewRevision .toolbar svg {
width: 32px;
height: 32px;
}
/* --- IE hacks from lattice --- */
/* ie hacks */
* html #menuBar {
margin-bottom: 8px;
}
.toolbar .svgIconText {
*display: inline;
}
div.tiddler .toolbar a {
cursor: pointer;
float: left\9;
display: inline\9;
}
* html .toolbar {
right: 8px;
}
* html .followButton a {
margin-top: 0px;
margin-right: 8px;
}
* html #tiddlerDisplay {
margin-top: 0px;
}
/* for printing purposes */
@media print {
#mainMenu,
#sidebar,
#messageArea,
.toolbar,
.followPlaceHolder,
#backstageButton,
#backstageArea,
#sidebarTabs,
#sidebarSearch .txtOptionInput,
#sidebarOptions {
display: none !important;
}
#displayArea {
margin: 1em 1em 0em;
}
noscript {
display:none; /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
}
#tiddlerDisplay {
margin: 16px 16px;
}
}
@media all and (max-width: 960px){
#tiddlerDisplay,
#searchResults {
margin: 16px 366px 0 16px;
}
#mainMenu {
margin-left: 16px;
}
.headerForeground {
margin-left: 16px;
}
#sidebarSearch {
right: 16px;
}
#sidebarOptions {
margin-right: 16px;
}
#sidebarTabs {
right: 16px;
width: 326px;
}
#sidebarTabs .tabsetWrapper .tabset {
font-size: 0.9em;
width: 77px;
}
#sidebarTabs .tabsetWrapper .tabContents {
width: 226px;
_width: 222px;
}
#sidebarTabs .tabContents li a {
font-size: 0.9em;
}
}
/*}}}*/
[[StyleSheetTiddler]]
!URL
http://www.blog.pythonlibrary.org/2011/03/09/pycon-2011-advanced-python-1-tutorial/
!Description
You can check out the slides for the tutorial in Powerpointor PDF.
!Notes
Author of the post didn't seem to like the presentation, and some of the things in it seem out of wack, but also in there are some real gems for making more interesting and faster Python.
http://www.blog.pythonlibrary.org/wp-content/uploads/2011/03/AdvancedPython_PartI.pdf
!URL
http://www.windstormcreative.com/littleblue/23771.htm
!Description
The book Beth illustrated.
!URL
http://www.adsafe.org/
!Description
JavaScript, the programming language of the web browser, is not a secure language. Any script in a page has intimate access to all of the information and relationships of the page. This makes use of mashups and scripted advertising unacceptably risky.
I don't take a bath to clean my body, I take a bath to clean my mind.
!URL
http://www.djangoproject.com/weblog/2011/feb/08/security/
!Description
Recently, engineers at Google made members of the Ruby on Rails development team aware of a combination of browser plugins and redirects which can allow an attacker to provide custom HTTP headers on a request to any website. This can allow a forged request to appear to be an AJAX request, thereby defeating CSRF protection which trusts the same-origin nature of AJAX requests.
!Notes
More on CSRF protection, this time for AJAX requests.
!URL
http://groups.google.com/group/tiddlyweb/msg/2b2b9649cdbd26b2
!Description
Some days ago I asked for "Fast query for a tag (tsScan)" [1]
The old scan needed about 30 seconds to display something.
Now it takes about 2.7 seconds. Factor 10 is nice :)
Good work.
!URL
http://www.abyssandapex.com/200710-wikihistory.html
!Description
rewriting history every day
body {
font-family: "helvetica neue";
font-size: 16px;
}
#TSbar {
background: #000;
background: -moz-linear-gradient(center bottom,#222 0%, #333 50%, #555 100%);
background: -webkit-gradient(linear,left bottom,left top,color-stop(0, #222),color-stop(0.5, #333),color-stop(1, #555));
border-bottom: 1px solid black;
height: 24px;
}
#main-content {
margin: 0 auto;
padding-top: 2em;
width: 960px;
}
#space-details {
height: 100px;
margin: 0 0 5em;
}
#space-details img {
border-radius: 2px;
float: left;
margin-right: 2em;
}
#title-subtitle {
color: #79757A;
}
.spaceaddress {
height: 62px;
line-height: 62px;
}
#title-subtitle p {
font-size: 1.3em;
line-height: 38px;
}
.managespaces {
background: #D0D5D6;
color: #F0F4F8;
border-radius: 4px;
float: right;
padding: 0 0.7em;
text-decoration: none;
-webkit-transition: all 0.4s ease-in-out;
-moz-transition: all 0.4s ease-in-out;
-o-transition: all 0.4s ease-in-out;
-ms-transition: all 0.4s ease-in-out;
transition: all 0.4s ease-in-out;
}
#space-details:hover .managespaces {
background: #ADD1DD;
}
#space-details .managespaces:hover {
background: #0082AF;
}
h1 {
color: #B8B6BD;
font-size: 2em;
}
h1 span {
color: #0059AF;
color: #0082AF;
font-size: 1.5em;
}
#holder {
background: #DCE7F1;
border-radius: 2px;
border: 1px solid #ADD1DD;
box-shadow: 1px 2px 3px 0px rgba(0,0,0,0.25);
}
#appswitcher {
background: #F0F4F8;
border-radius: 2px;
box-shadow: 1px 2px 3px 0px rgba(0,0,0,0.25), -1px 0px 3px 0px rgba(0,0,0,0.25);
margin-top: -40px;
margin-right: 10px;
margin-bottom: -10px;
float: right;
width: 60%;
}
#appswitcher h2 {
color: #4C4A54;
color: #8C9DA7;
font-size: 2em;
font-weight: 500;
line-height: 1.8em;
text-shadow: 0 1px 0 #fff;
margin-left: 1em;
}
#app-list {
background: #F0F4F8;
}
#app-list li {
background: url('http://colmjude.tiddlyspace.com/double_angle_lightblue_42x42.png') no-repeat 88% #F0F4F8;
border-top: 1px solid #fff;
border-bottom: 1px solid #C3D3DD;
height: 4.25em;
line-height: 3.125em;
-webkit-transition: background 0.4s linear;
-moz-transition: background 0.4s linear;
-o-transition: background 0.4s linear;
-ms-transition: background 0.4s linear;
transition: background 0.4s linear;
}
#app-list li:hover {
background: url('http://colmjude.tiddlyspace.com/double_angle_darkpink_bevel_42x42.png') no-repeat 90% #F3F9FF;
border-top: 1px solid #F0F4F8;
cursor: pointer;
line-height: 3.25em;
}
#app-list li:hover:last-child {
line-height: 3.125em;
}
#app-list li a {
display: block;
color: #BC4378;
font-size: 2.5em;
text-decoration: none;
height: 100%;
width: 100%;
-webkit-transition: color 0.4s linear;
-moz-transition: color 0.4s linear;
-o-transition: color 0.4s linear;
-ms-transition: color 0.4s linear;
transition: color 0.4s linear;
}
#app-list li:hover a {
color: #E56AA0;
}
#app-list li a img {
position: relative;
top: 0.2125em;
margin: 0 1em;
height: 1.25em;
width: 1.25em;
}
#app-list li a span.comingsoon {
color: #B8B6BD;
font-size: 0.5em;
}
#app-list li a span.comingsoon.highlight {
color: #BC4378;
}
#app-desc {
float: left;
width: 35%;
}
#app-desc ul {
/* use as faded color ? */
color: #C3D3DD;
color: #8C9DA7;
font-size: 0.9em;
font-style: italic;
margin-top: 18px;
margin-right: -1em;
text-align: right;
}
#app-desc ul li {
display: table;
border-bottom: 1px dashed #F0F4F8;
height: 70px;
padding-left: 1em;
-webkit-transition: color 0.4s linear;
-moz-transition: color 0.4s linear;
-o-transition: color 0.4s linear;
-ms-transition: color 0.4s linear;
transition: color 0.4s linear;
}
#app-desc ul li.highlightdesc {
color: #D65C8C;
}
#app-desc ul li:first-of-type {
border-top: 1px dashed #F0F4F8;
}
#app-desc ul li p {
display: table-cell;
vertical-align: middle;
}
#addapp {
margin: 1.5em 0 1em;
padding: 10px;
text-align: center;
}
#addapp button {
background: #E7DFE3;
background: rgba(206,199,203, 0.8);
color: #F0F4F8;
border: none;
border-radius: 4px;
font-size: 2em;
padding: 16px 24px 12px;
-webkit-transition: all 0.4s ease-in-out;
-moz-transition: all 0.4s ease-in-out;
-o-transition: all 0.4s ease-in-out;
-ms-transition: all 0.4s ease-in-out;
transition: all 0.4s ease-in-out;
}
#addapp:hover button {
background: #BC4378;
}
#addapp button:hover {
cursor: pointer;
}
#footer {
background: #1A1F1E;
margin-top: 3em;
padding: 0.3em 0;
clear: both;
}
#footer-content {
color: #B2AAA4;
font-size: 0.8em;
line-height: 1.3em;
margin: 0 auto;
width: 960px;
}
#footer .links {
float: right;
}
#footer .links a {
margin-left: 10px;
}
#footer-content a {
color: #B2AAA4;
text-decoration: none;
}
#footer-content a:hover {
color: #80a7c1;
text-decoration: underline;
}
!URL
http://www.phethean.clara.net/index.htm
!Description
has some evening courses, send him email
!URL
http://www.javu.co.uk/Climbing/Guides/DartmoorRoutes/Haytor/Lowman.shtml
!Description
!URL
http://blog.thesuperfluid.com/2011/07/sequels-studio-production-model/
!Description
A new option is emerging between these two extremes – the studio production model
!Notes
Collaboration and partnership. Not corporations and employment.
!URL
http://sentra.ischool.utexas.edu/~adillon/blog/archives/58
!Description
read this because I'm pretty dillon has predicated one of my key ideas. I need to get back to writing.
(function($){$.jQTouch=function(_2){$.support.WebKitCSSMatrix=(typeof WebKitCSSMatrix=="object");$.support.touch=(typeof Touch=="object");$.support.WebKitAnimationEvent=(typeof WebKitTransitionEvent=="object");var _3,$head=$("head"),hist=[],newPageCount=0,jQTSettings={},hashCheck,currentPage,orientation,isMobileWebKit=RegExp(" Mobile/").test(navigator.userAgent),tapReady=true,lastAnimationTime=0,touchSelectors=[],publicObj={},extensions=$.jQTouch.prototype.extensions,defaultAnimations=["slide","flip","slideup","swap","cube","pop","dissolve","fade","back"],animations=[],hairextensions="";init(_2);function init(_4){var _5={addGlossToIcon:true,backSelector:".back, .cancel, .goback",cacheGetRequests:true,cubeSelector:".cube",dissolveSelector:".dissolve",fadeSelector:".fade",fixedViewport:true,flipSelector:".flip",formSelector:"form",fullScreen:true,fullScreenClass:"fullscreen",icon:null,touchSelector:"a, .touch",popSelector:".pop",preloadImages:false,slideSelector:"body > * > ul li a",slideupSelector:".slideup",startupScreen:null,statusBar:"default",submitSelector:".submit",swapSelector:".swap",useAnimations:true,useFastTouch:true};jQTSettings=$.extend({},_5,_4);if(jQTSettings.preloadImages){for(var i=jQTSettings.preloadImages.length-1;i>=0;i--){(new Image()).src=jQTSettings.preloadImages[i];}}if(jQTSettings.icon){var _7=(jQTSettings.addGlossToIcon)?"":"-precomposed";hairextensions+="<link rel=\"apple-touch-icon"+_7+"\" href=\""+jQTSettings.icon+"\" />";}if(jQTSettings.startupScreen){hairextensions+="<link rel=\"apple-touch-startup-image\" href=\""+jQTSettings.startupScreen+"\" />";}if(jQTSettings.fixedViewport){hairextensions+="<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;\"/>";}if(jQTSettings.fullScreen){hairextensions+="<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />";if(jQTSettings.statusBar){hairextensions+="<meta name=\"apple-mobile-web-app-status-bar-style\" content=\""+jQTSettings.statusBar+"\" />";}}if(hairextensions){$head.append(hairextensions);}$(document).ready(function(){for(var i in extensions){var fn=extensions[i];if($.isFunction(fn)){$.extend(publicObj,fn(publicObj));}}for(var i in defaultAnimations){var _a=defaultAnimations[i];var _b=jQTSettings[_a+"Selector"];if(typeof (_b)=="string"){addAnimation({name:_a,selector:_b});}}touchSelectors.push("input");touchSelectors.push(jQTSettings.touchSelector);touchSelectors.push(jQTSettings.backSelector);touchSelectors.push(jQTSettings.submitSelector);$(touchSelectors.join(", ")).css("-webkit-touch-callout","none");$(jQTSettings.backSelector).tap(liveTap);$(jQTSettings.submitSelector).tap(submitParentForm);_3=$("body");if(jQTSettings.fullScreenClass&&window.navigator.standalone==true){_3.addClass(jQTSettings.fullScreenClass+" "+jQTSettings.statusBar);}_3.bind("touchstart",handleTouch).bind("orientationchange",updateOrientation).trigger("orientationchange").submit(submitForm);if(jQTSettings.useFastTouch&&$.support.touch){_3.click(function(e){var _d=$(e.target);if(_d.attr("target")=="_blank"||_d.attr("rel")=="external"||_d.is("input[type=\"checkbox\"]")){return true;}else{return false;}});_3.mousedown(function(e){var _f=(new Date()).getTime()-lastAnimationTime;if(_f<200){return false;}});}if($("body > .current").length==0){currentPage=$("body > *:first");}else{currentPage=$("body > .current:first");$("body > .current").removeClass("current");}$(currentPage).addClass("current");location.hash=$(currentPage).attr("id");addPageToHistory(currentPage);scrollTo(0,0);dumbLoopStart();});}function goBack(to){if(hist.length>1){var _11=Math.min(parseInt(to||1,10),hist.length-1);if(isNaN(_11)&&typeof (to)==="string"&&to!="#"){for(var i=1,length=hist.length;i<length;i++){if("#"+hist[i].id===to){_11=i;break;}}}if(isNaN(_11)||_11<1){_11=1;}var _13=hist[0].animation;var _14=hist[0].page;hist.splice(0,_11);var _15=hist[0].page;animatePages(_14,_15,_13,true);return publicObj;}else{console.error("No pages in history.");return false;}}function goTo(_16,_17){var _18=hist[0].page;if(typeof (_16)==="string"){_16=$(_16);}if(typeof (_17)==="string"){for(var i=animations.length-1;i>=0;i--){if(animations[i].name===_17){_17=animations[i];break;}}}if(animatePages(_18,_16,_17)){addPageToHistory(_16,_17);return publicObj;}else{console.error("Could not animate pages.");return false;}}function getOrientation(){return orientation;}function liveTap(e){var $el=$(e.target);if($el.attr("nodeName")!=="A"){$el=$el.parent("a");}var _1c=$el.attr("target"),hash=$el.attr("hash"),animation=null;if(tapReady==false||!$el.length){console.warn("Not able to tap element.");return false;}if($el.attr("target")=="_blank"||$el.attr("rel")=="external"){return true;}for(var i=animations.length-1;i>=0;i--){if($el.is(animations[i].selector)){animation=animations[i];break;}}if(_1c=="_webapp"){window.location=$el.attr("href");}else{if($el.is(jQTSettings.backSelector)){goBack(hash);}else{if(hash&&hash!="#"){$el.addClass("active");goTo($(hash).data("referrer",$el),animation);}else{$el.addClass("loading active");showPageByHref($el.attr("href"),{animation:animation,callback:function(){$el.removeClass("loading");setTimeout($.fn.unselect,250,$el);},$referrer:$el});}}}return false;}function addPageToHistory(_1e,_1f){var _20=_1e.attr("id");hist.unshift({page:_1e,animation:_1f,id:_20});}function animatePages(_21,_22,_23,_24){if(_22.length===0){$.fn.unselect();console.error("Target element is missing.");return false;}$(":focus").blur();scrollTo(0,0);var _25=function(_26){if(_23){_22.removeClass("in reverse "+_23.name);_21.removeClass("current out reverse "+_23.name);}else{_21.removeClass("current");}_22.trigger("pageAnimationEnd",{direction:"in"});_21.trigger("pageAnimationEnd",{direction:"out"});clearInterval(dumbLoop);currentPage=_22;location.hash=currentPage.attr("id");dumbLoopStart();var _27=_22.data("referrer");if(_27){_27.unselect();}lastAnimationTime=(new Date()).getTime();tapReady=true;};_21.trigger("pageAnimationStart",{direction:"out"});_22.trigger("pageAnimationStart",{direction:"in"});if($.support.WebKitAnimationEvent&&_23&&jQTSettings.useAnimations){_22.one("webkitAnimationEnd",_25);tapReady=false;_22.addClass(_23.name+" in current "+(_24?" reverse":""));_21.addClass(_23.name+" out"+(_24?" reverse":""));}else{_22.addClass("current");_25();}return true;}function dumbLoopStart(){dumbLoop=setInterval(function(){var _28=currentPage.attr("id");if(location.hash==""){location.hash="#"+_28;}else{if(location.hash!="#"+_28){try{goBack(location.hash);}catch(e){console.error("Unknown hash change.");}}}},100);}function insertPages(_29,_2a){var _2b=null;$(_29).each(function(_2c,_2d){var _2e=$(this);if(!_2e.attr("id")){_2e.attr("id","page-"+(++newPageCount));}_2e.appendTo(_3);if(_2e.hasClass("current")||!_2b){_2b=_2e;}});if(_2b!==null){goTo(_2b,_2a);return _2b;}else{return false;}}function showPageByHref(_2f,_30){var _31={data:null,method:"GET",animation:null,callback:null,$referrer:null};var _32=$.extend({},_31,_30);if(_2f!="#"){$.ajax({url:_2f,data:_32.data,type:_32.method,success:function(_33,_34){var _35=insertPages(_33,_32.animation);if(_35){if(_32.method=="GET"&&jQTSettings.cacheGetRequests&&_32.$referrer){_32.$referrer.attr("href","#"+_35.attr("id"));}if(_32.callback){_32.callback(true);}}},error:function(_36){if(_32.$referrer){_32.$referrer.unselect();}if(_32.callback){_32.callback(false);}}});}else{if($referrer){$referrer.unselect();}}}function submitForm(e,_38){var _39=(typeof (e)==="string")?$(e):$(e.target);if(_39.length&&_39.is(jQTSettings.formSelector)&&_39.attr("action")){showPageByHref(_39.attr("action"),{data:_39.serialize(),method:_39.attr("method")||"POST",animation:animations[0]||null,callback:_38});return false;}return true;}function submitParentForm(e){var _3b=$(this).closest("form");if(_3b.length){evt=jQuery.Event("submit");evt.preventDefault();_3b.trigger(evt);return false;}return true;}function addAnimation(_3c){if(typeof (_3c.selector)=="string"&&typeof (_3c.name)=="string"){animations.push(_3c);$(_3c.selector).tap(liveTap);touchSelectors.push(_3c.selector);}}function updateOrientation(){orientation=window.innerWidth<window.innerHeight?"profile":"landscape";_3.removeClass("profile landscape").addClass(orientation).trigger("turn",{orientation:orientation});}function handleTouch(e){var $el=$(e.target);if(!$(e.target).is(touchSelectors.join(", "))){var _3f=$(e.target).closest("a");if(_3f.length){$el=_3f;}else{return;}}if(event){var _40=null,startX=event.changedTouches[0].clientX,startY=event.changedTouches[0].clientY,startTime=(new Date).getTime(),deltaX=0,deltaY=0,deltaT=0;$el.bind("touchmove",touchmove).bind("touchend",touchend);_40=setTimeout(function(){$el.makeActive();},100);}function touchmove(e){updateChanges();var _42=Math.abs(deltaX);var _43=Math.abs(deltaY);if(_42>_43&&(_42>35)&&deltaT<1000){$el.trigger("swipe",{direction:(deltaX<0)?"left":"right"}).unbind("touchmove touchend");}else{if(_43>1){$el.removeClass("active");}}clearTimeout(_40);}function touchend(){updateChanges();if(deltaY===0&&deltaX===0){$el.makeActive();$el.trigger("tap");}else{$el.removeClass("active");}$el.unbind("touchmove touchend");clearTimeout(_40);}function updateChanges(){var _44=event.changedTouches[0]||null;deltaX=_44.pageX-startX;deltaY=_44.pageY-startY;deltaT=(new Date).getTime()-startTime;}}$.fn.unselect=function(obj){if(obj){obj.removeClass("active");}else{$(".active").removeClass("active");}};$.fn.makeActive=function(){return $(this).addClass("active");};$.fn.swipe=function(fn){if($.isFunction(fn)){return this.each(function(i,el){$(el).bind("swipe",fn);});}};$.fn.tap=function(fn){if($.isFunction(fn)){var _4a=(jQTSettings.useFastTouch&&$.support.touch)?"tap":"click";return $(this).live(_4a,fn);}else{$(this).trigger("tap");}};publicObj={getOrientation:getOrientation,goBack:goBack,goTo:goTo,addAnimation:addAnimation,submitForm:submitForm};return publicObj;};$.jQTouch.prototype.extensions=[];$.jQTouch.addExtension=function(_4b){$.jQTouch.prototype.extensions.push(_4b);};})(jQuery);
created a tiddlyweb filters doc and tutorial space http://tweb-filters.tiddlyspace.com/
!URL
http://pypi.python.org/pypi/Spawning/0.7
!Description
eventlet based http server for pythong
[[Tea|d49c4a6d6091cff8a987667bef20b4cd]] [[yesterday|33052066bdf20781cccd74d5f8d55e1a]] at [[The Cavendish Hotel]] was okay, but not great. For the price (we got a £10.00 special) it was just fine, but the food was just too heavy, too sweet. We had a nice day wandering the shops looking for boots.
noscript {
border: 5px solid red;
display: block;
margin: auto;
padding: 50px;
text-align: center;
width: 300px;
}
.syncButton {
font-size: 2em;
border: solid 1px #CCC;
padding: 5px;
-moz-border-radius: 5px 5px 5px;
-webkit-border-radius: 5px 5px 5px;
width: 48px;
height: 48px;
background-image: url(/bags/common/tiddlers/icon-sync.png);
background-repeat: no-repeat;
background-position: center;
text-indent: -999px;
overflow: hidden;
display: block;
text-align: center;
cursor: pointer;
right: 120px;
top: 80px;
position: absolute;
}
#note.active #deletenote {
display: none;
}
body {
font: 14px/1.4 "Helvetica Neue", "Lucida Grande", "Arial";
margin: 0;
background-image: url(/bags/common/tiddlers/HtmlBackground);
}
#backstage {
width: 100%;
padding: 0px;
background-color: black;
margin: 0px 0px 0px 0px;
height: 32px;
text-align: center;
background: -moz-linear-gradient(center bottom,#222 0%, #333 50%, #555 100%);
background: -webkit-gradient(linear,left bottom,left top,color-stop(0, #222),color-stop(0.5, #333),color-stop(1, #555));
background: -moz-linear-gradient(center bottom,#222 0%, #333 50%, #555 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F5555, endColorstr=#F2222);
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#F5555, endColorstr=#F2222)";
}
#backstage a {
color: white;
padding: 4px;
display: block;
text-decoration: none;
}
#backstage li:first-child {
border-right: solid 1px #777;
}
#backstage li:nth-child(2) {
border-left: solid 1px #555;
}
#backstage a:hover {
background-color: #FFA500;
}
#backstage li {
display: inline-block;
line-height: 18px;
margin-top: 2px;
padding: 0px 10px;
}
#backstage .status {
color: #CCC;
float: right;
font-size: 0.8em;
}
#backstage .status.nonmember {
color: #666;
opacity: 0.5;
}
h2,h3,h4,h5 {
margin-bottom: 0px;
}
a {
color: royalBlue;
}
a:hover {
color:#4169C8;
}
.header {
border-bottom: 7px solid rgba(26, 31, 30, 0.95);
padding-bottom: 20px;
position: relative;
}
.siteheading {
position: relative;
}
.header h1 {
color: #4C4A54;
font-size: 4em;
line-height: 48px;
text-shadow: 0px 2px 2px white;
padding-top: 10px;
margin-top: 0px;
padding-left: 72px;
}
.toolpanel .info,
.toolpanel input,
.toolpanel h2,
.toolpanel ul {
margin-left: 120px;
}
.toolpanel h2 {
text-shadow: 0px 1px 1px white;
}
.toolpanel .section {
border-bottom: 1px solid #DCE7F1;
border-top: 1px solid #F8F8F8;
padding: 24px;
position: relative;
}
.section.searchSection {
background-image: url(/bags/common/tiddlers/icon-search.png);
background-position: 80px 15px;
background-repeat: no-repeat;
}
.section.recentSection {
background-image: url(/bags/common/tiddlers/icon-recent.png);
background-position: 80px 15px;
background-repeat: no-repeat;
}
.section.incompleteSection {
background-image: url(/bags/common/tiddlers/icon-incomplete.png);
background-position: 80px 15px;
background-repeat: no-repeat;
min-height: 100px;
}
.toolpanel .section ul {
list-style: none;
}
.siteicon {
background-image: url(SiteIcon);
height: 56px;
width: 56px;
background-repeat: no-repeat;
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
-o-border-radius: 10px;
border-radius: 10px;
background-size: 56px 56px;
position: absolute;
left: 6px;
top: 8px;
}
.toolbar {
position: absolute;
top: -40px;
width: 100%;
}
.takenotedashboard .footer {
text-align: center;
font-style: italic;
font-size: 0.8em;
color: gray;
font-weight: bold;
border-top: solid 1px #CCC;
}
.takenotedashboard .footer,
#note,
.messageArea {
width: 500px;
}
.note_title {
font-family: Georgia;
line-height: 48px;
color: #4C4A54;
width: 468px; /* 500 - 32 padding */
}
.takenotecontainer {
width: 540px;
background: rgba(255,255,255, 0.7);
}
.takenotedashboard {
width: 540px;
background-color: #F0F4F8;
padding-bottom: 40px;
}
.note_title_container {
width: 556px;
margin-left: -28px;
-webkit-box-shadow: 0px 1px 1px rgb(96,106,115);
position:relative;
background-color: #DCE7F1;
}
@media all and (min-width: 480px) {
.note_title_container:before {
content: "";
position: absolute;
bottom: -8px;
left: 0px;
border-width: 0px 8px 8px 0px;
border-style: solid;
border-color: rgba(0,0,0,0) #3A4955 rgba(0,0,0,0) #3A4955;
background: rgba(0,0,0,0);
display: block;
width: 0;
}
.note_title_container:after {
content: "";
position: absolute;
bottom: -8px;
right: 0px;
border-width: 8px 8px 0px 0px;
border-style: solid;
border-color: #3A4955 rgba(0,0,0,0) rgba(0,0,0,0) #3A4955;
background: rgba(0,0,0,0);
display: block;
width: 0;
}
}
.note_title {
background: none;
width: 500px;
margin-left: 10px;
}
.takenotedashboard,
.takenotecontainer {
margin: auto;
margin-top: 20px;
position: relative;
display: none;
}
.takenotedashboard,
.takenotecontainer.ready {
display: block;
}
#note {
position: relative;
}
.takenotedashboard .footer,
#note,
.messageArea {
margin: 0 auto;
}
.messageArea {
position: relative;
margin-bottom: 20px;
font-family: monospace;
border: solid 1px #ccc;
color: #333;
padding: 10px 0px 20px 0px;
text-indent: 4px;
color: green;
opacity: 0;
}
.messageArea.warning {
color: #B38600;
}
.messageArea.error {
color: red;
}
.messageArea.displayed {
opacity: 1;
-webkit-transition: opacity 0.4s ease-in;
}
.takenotecontainer h1 {
font-size: 3em;
}
#notebody {
position: relative;
border: 1px solid gray;
background: rgba(255,255,255, 0.7);
margin-top: 18px;
padding: 16px;
box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5), -1px -1px 2px rgba(0, 0, 0, 0.5);
}
#newnote {
height: 24px;
width: 30px;
position: absolute;
top: 6px;
right: 4px;
padding: 5px;
background-repeat: no-repeat;
background-image: url(/bags/common/tiddlers/saveTiddler.png);
}
.notedate {
float: right;
color: rgba(0,0,0, 0.5);
margin-left: 32px;
}
#notebody .note_text {
color: #1A1F1E;
background: transparent;
width: 100%;
border: none;
outline: none;
clear: both;
font-family: Georgia;
font-size: 1.3em;
line-height: 1.3em;
}
#tips {
padding: 8px;
background-color: #DDD;
}
.imageTip img {
width: 16px;
height: 16px;
}
.boldTip, .underlineTip, .italicTip {
margin-left: 2px;
margin-right: 2px;
}
.boldTip {
font-weight: bold;
}
.underlineTip {
text-decoration: underline;
}
.italicTip {
font-style: italic;
}
#metabutton {
background: gray;
width: 32px;
height: 32px;
background-repeat: no-repeat;
background-position: center;
opacity: 0.3;
border-radius: 0 0 5px 5px;
padding: 10px;
position: absolute;
bottom: -52px;
left: 224px;
-webkit-transition: height 0.2s ease-in-out, bottom 0.2s ease-in-out, opacity 0.2s ease-in-out;
-moz-transition: height 0.2s ease-in-out, bottom 0.2s ease-in-out, opacity 0.2s ease-in-out;
-o-transition: height 0.2s ease-in-out, bottom 0.2s ease-in-out, opacity 0.2s ease-in-out;
-ms-transition: height 0.2s ease-in-out, bottom 0.2s ease-in-out, opacity 0.2s ease-in-out;
transition: height 0.2s ease-in-out, bottom 0.2s ease-in-out, opacity 0.2s ease-in-out;
}
#metabutton:hover {
opacity: 0.7;
height: 35px;
bottom: -55px;
}
#newnote:hover,
#metabutton:hover {
cursor: pointer;
}
#notemeta .paddedbox {
padding: 10px;
}
#notemeta ul {
list-style: none;
}
.removeTag {
background-image: url(/bags/common/tiddlers/deleteTiddler.png);
background-size: 12px 16px;
background-repeat: no-repeat;
text-indent: -999px;
overflow: hidden;
width: 12px;
height: 16px;
display: inline-block;
margin-left: 8px;
margin-right: 8px;
cursor: pointer;
}
.note_title {
border: none;
font-size: 3em;
outline: none;
padding: 0px 16px;
text-align: center;
text-shadow: 0px 1px 1px white;
}
.note_title:focus {
text-shadow: none;
}
#deletenote {
position: absolute;
top: 4px;
left: 4px;
background-image: url(/bags/common/tiddlers/deleteTiddler.png);
background-repeat: no-repeat;
height: 30px;
width: 20px;
}
#cancelnote {
position: absolute;
top: 4px;
visibility: hidden;
right: 235px; /* 500 / 2 - 15px (half width of cancel button) */
background-image: url(/bags/common/tiddlers/cancelTiddler.png);
background-repeat: no-repeat;
height: 30px;
width: 30px;
}
.validatedNote #cancelnote {
visibility: visible;
}
#cancelnote,
#deletenote,
#newnote {
cursor: pointer;
opacity: 0.3;
overflow: hidden;
text-indent: -9999px;
}
#cancelnote:hover,
#newnote:hover,
#deletenote:hover {
opacity: 1;
}
#backstage a.connectionStatus:hover,
.connectionStatus {
display: block;
position: relative;
-webkit-border-radius: 5px;
background-color: red;
}
.online #backstage a.connectionStatus:hover,
.online .connectionStatus {
display: block;
background-color: green;
}
.connectionStatus:after {
content: "offline";
position: absolute;
top: -6px;
left: 15px;
color: #ccc;
}
.online .connectionStatus:after {
content: "online";
position: absolute;
top: -6px;
left: 15px;
color: #eee;
}
.requiresConnection {
display: none;
}
.online .requiresConnection {
display: block;
}
/* iphone mode */
@media screen and (orientation:portrait) and (max-width: 320px) {
.note_title {
padding: 0px;
}
#backstage {
font-size: 0.8em;
}
.takenotedashboard,
.takenotecontainer {
width: 320px;
font-size: 0.7em;
}
.header h1 {
font-size: 2em;
}
.takenotedashboard .footer,
#note,
.messageArea {
width: 300px;
}
#cancelnote {
right: 145px; /* 320 / 2 - 15px (half width of cancel button) - 16px (padding on note_title) */
}
.note_title,
.note_title_container {
width: 300px;
margin: auto;
}
}
/* portrait mode */
@media screen and (orientation:portrait) and (min-width: 480px) {
.note_title {
padding: 0px;
}
.takenotedashboard,
.takenotecontainer {
width: 480px;
}
.takenotedashboard .footer,
#note,
.messageArea {
width: 460px;
}
#cancelnote {
right: 199px; /* 460 / 2 - 15px (half width of cancel button) - 16px (padding on note_title) */
}
.note_title,
.note_title_container {
width: 460px;
margin: auto;
}
}
/***
|''Name''|TiddlySpaceFollowingSuggestions|
|''Version''|0.2.5dev|
|''Description''|Provides a following macro|
|''Author''|Jon Robson|
|''Requires''|TiddlySpaceFollowingPlugin|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage
!Code
***/
//{{{
(function($) {
var tweb = config.extensions.tiddlyweb;
var tiddlyspace = config.extensions.tiddlyspace;
var followMacro = config.macros.followTiddlers;
var followSuggestions = config.macros.followSuggestions = {
cache: {},
handler: function(place, macroName, params) {
// to do - limit results
place = $('<div class="suggestions" />').appendTo(place)[0];
var currentSpace = tiddlyspace.currentSpace.name;
var user = params[0] || currentSpace;
var pleaseWait = $("<div class='loading' />").text("please wait..").appendTo(place);
tweb.getUserInfo(function(activeUser) {
if(activeUser.name != tiddlyspace.currentSpace.name) {
pleaseWait.hide();
return;
}
followMacro.getFollowers(function(users) {
// suggestions are followers of people that you follow that you don't follow
var bags = followMacro._getFollowerBags(users);
var _bags = [];
for(var i = 0; i < bags.length; i++) {
_bags.push("bag:%0".format([bags[i]]));
}
var bagString = _bags.join(" OR ");
ajaxReq({
beforeSend: followMacro.beforeSend,
url: "/search?q=(%0)&select=title:!%1&select=title:!@%1".format([bagString, activeUser.name]),
dataType: "json",
success: function(tiddlers) {
pleaseWait.hide();
var suggestions = [];
for(var i = 0; i < tiddlers.length; i++) {
var tiddler = tiddlers[i];
if(tiddler.tags.contains("follow")) {
var title = tiddler.title;
if(title.indexOf("@") === 0) {
title = title.substr(1);
}
if(!users.contains(title)) {
suggestions.pushUnique(title);
}
}
}
$(place).append("<div>suggestions:</div>");
var suggestionArea = $("<div class='suggestionArea' />").appendTo(place)[0];
var id = "more_%0".format([Math.random()]);
var more = $("<div class='moreButton' />").text("more...").appendTo(place).attr("id", id);
followSuggestions.cache[id] = suggestions;
var limit = suggestions.length;
more.click(function(ev) {
var suggestions = config.macros.followSuggestions.cache[id];
var newSuggestions = followSuggestions.suggest(place, suggestions, limit);
config.macros.followSuggestions.cache[id] = newSuggestions;
});
followSuggestions.suggest(place, suggestions, limit);
}
});
}, user);
});
},
randomize: function(a, b) {
if(Math.random() < Math.random()) {
return -1;
} else {
return 1;
}
},
suggest: function(place, suggestions, limit) {
var currentSpace = tiddlyspace.currentSpace.name;
suggestions = suggestions.sort(followSuggestions.randomize);
var suggestionsArea = $(".suggestionArea", place)[0];
if(suggestions.length === 0) {
$("<span />").text("no suggestions..").appendTo(suggestionsArea);
return;
}
limit = limit < suggestions.length ? limit : suggestions.length;
for(var j = 0; j < limit; j++) {
var link = $("<span />").appendTo(suggestionsArea)[0];
var title = suggestions[j];
var newTiddler = '@%0 <<newTiddler title:"@%0" fields:"server.workspace:bags/%1_public" tag:follow label:"follow">>\n'.format([title, currentSpace]);
wikify(newTiddler, link);
}
var newSuggestions = suggestions.slice(limit, suggestions.length);
var more = $(".moreButton", place);
if(newSuggestions.length == 0) {
more.remove();
}
return newSuggestions;
}
};
})(jQuery);
//}}}
oh lookie, it's a new year. What now?
!URL
http://theopenphotoproject.org/
!Description
[[IBOC]] for photos?
!URL
http://guterman.com/sandinista/2008/02/greatest-misheard-lyric-video-ever.html
!Description
<!--{{{-->
<div class='toolbar'
macro='toolbar [[ToolbarCommands::ViewToolbar]] icons:yes height:16 width:16 more:popup'>
</div>
<div class='heading'>
<span class='spaceSiteIcon'
macro='tiddlerOrigin label:no spaceLink:yes height:48 width:48 preserveAspectRatio:yes'>
</span>
<span class="titleBar">
<div class='title' macro='view title text'></div>
<span class="subtitle" macro='viewRevisions page:5'>
last modified on
<span macro="view modified date"></span>
</span>
<div macro="view title replyLink"></div>
</span>
<span class='followPlaceHolder' macro='followTiddlers'></span>
<span class='modifierIcon'
macro='view modifier SiteIcon label:no spaceLink:yes height:48 width:48 preserveAspectRatio:yes'>
</span>
<div class='tagClear'></div>
</div>
<div class='content'>
<div class='viewer' macro='view text wikified'></div>
</div>
<div class='tagInfo'>
<div class='tidTags' macro='tags'></div>
<div class='tagging' macro='tagging'></div>
</div>
<!--}}}-->
!URL
http://leonardo.pyworks.org/
!Description
bliki software
[[GettingStarted]] FeedMe
playing with webfinger and tiddlyspace: https://github.com/TiddlySpace/tiddlyspace/commit/67de77ab080592f0c7f54eec16ed5017effb0153
!URL
http://www.bbc.co.uk/news/business-15465538
!Description
The proliferation of complex financial instruments over the last 30 years has brought scarcely any benefit to the economic system - but it has brought considerable extra costs.
!URL
http://webintents.appspot.com/
!Description
A framework for Web-based Inter-app communication and service discovery.
extroversion: ZOMG, ew gross! stop!
<<<
DataTables is a plug-in for the jQuery Javascript library. It is a highly flexible tool, based upon the foundations of progressive enhancement, which will add advanced interaction controls to any HTML table.
<<<
[[DataTables (table plug-in for jQuery)|http://www.datatables.net/]]
prolly need this for some stuff
!URL
https://gist.github.com/843195
!Description
Pull links out of a Wikipedia XML dump, real fast.
!Notes
mnot doing some dom processing with multiprocessing, making for a nice example
!URL
http://onthespiral.com/naive-search-for-anachronistic-progress
!Description
The purveyors of anachronistic progress unwittingly reinforce the notion that the jobless are condemned to uselessness. By focusing myopically on declining institutions, they value proxies for meaning (jobs, incomes, degrees, test scores) ahead of meaning itself. It should be obvious that this logic is perversly backwards.
!URL
http://calebelston.com/why-is-parallel-a-pipe-dream
!Description
The secondary benefit is psychological. Completing an important task feels good. It feels good to ship. It feels good to sign the deal. It feels good to hire. Days and days without that mental satisfaction is grating.
!Notes
It feels good to get shit done.
sometimes I like to start xeyes and bathe in the nostalgia
!URL
http://stackoverflow.com/questions/574691/mysql-great-circle-distance-haversine-formula
!Description
php - MySQL Great Circle Distance (Haversine formula) - Stack Overflow
!URL
http://blog.gdinwiddie.com/2011/07/11/process-standards/
!Description
Effective teams are not created by telling them how to work, but by facilitating their finding their own way to work.
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
<<<
Open plan has its place, but forcing people to work in such environments all day regardless of their task profile and the effect of noise on them is costing business billions in lost productivity, not to mention the immense but currently unmeasured cost for employees and society of lost health and wellbeing through stress, fatigue, restricted neural development and impaired sociability.
<<<
[[The Sound Agency » Blog Archive » More damaging evidence on open plan offices|http://www.thesoundagency.com/2011/sound-news/more-damaging-evidence-on-open-plan-offices/]]
!URL
https://www.varnish-cache.org/docs/trunk/phk/thoughts.html
!Description
The reason I try to write these notes is the chinese wall...If somebody had written some notes, we might have known.
I don't have royal wedding fatigue. I have royal wedding avoidance fatigue.
!URL
http://www.rufusmay.bdct.co.uk/2008/03/28/lets-stop-blaming-our-brains/
!Description
fiddling with redis both cool and insane at the same time
Hi, @fnd I came from tiddlyspace.com
iVBORw0KGgoAAAANSUhEUgAAACwAAAArCAYAAAADgWq5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAk5SURBVFiF1ZlrbBzVFYC/O7Mz+16/vc47tmM7sZOQB5QGAkqiqhE0VKAqrSgJjfiRqpX4UyFaqCLLotDSIrVCoghKSyqSliYgSgpNVSC4SWlSIIoJBGPjPByIE9sbr1/7mp2d2x9jz67j9dp50Krn1+zcO+d+99xzzzn3rpBS8v8kyv8a4HLFdbUKHtzZWqWr1g1SUeqRsh5ENWCCHBEwIpEREIdMQz/4+H03j1zteOJKXKJl9/5QSrq/IRD3AOuZ2UqZCPEelvyLnhFPN29bN3jZA3OZwC07Wz2Gy/oRiAcB76XtLpeKz+tDCDDNDKZpYqQN8gwxBDxpKdovf/rttdEvBPjhXW9/XcCvgOrxd7qmURWuIFxZQcDvR9e1Sd+ZpslAdJCB6CCRgSixWPxS8O2Pblm/55oBf3PvXrUuVf5rYPv4u1AwQG3NQirKShFCzHQsAPojF+k63c3wcNadpeDJi7HQA89sX52+KuAf7D3s9aZSfwJ5B4CmuairqWbunNlcJuck6e3r50R7J2nTHCMRhzO6edvPNn9l6IqAW559zWf4A28i5RqAgN/HqhXL8Ho8V0eaI4lkkrYPP3asLaHV7Y5sbN682Zjqmyl3t+H3PTUOW1pSzI3Xr7ymsABej4cbV6+gorwMAAHrUqnynQKmXL+8wD/e/fZ9SLENoLgoxOoVy3G5rjpk5wdQFK5b1khxUQgAAXc/tPvAD6fqP8klHtrVukhBHge8uq6x5kur8bjdXwhsrqTTaY68f4x4PAEQN4VoePyedZ9f2m+ShRXkDsZi7PKmJZcHKyVKdATX2V6UodHLAtY0jaVLGsZ/+lQpf56v3wQL7/j9gVpLFR2AGq6sYMWyxhkN5jrbi378JEpkCJE2s/y6i0xFCcaqejJVpTPSdfyjds739tlwyJt/smXDvyaMlftDquIhQAWorV4wrXKRNnEfPoHWcTZ/u2HiOtePqydCYmkJxopGFE8xBfYU9XU19PVHyFgWFuL7wARgx8J22pVRwDMT64q0ie/Ph1AG7aVXXCrBcAmeoA/N68aIJ0kOxxmMnKO34g2S3nP2dy4//tpteObcPqXuHCvH9Hissnn7Jic9OhY2NHkzEg9AVbiiICyA+912B9ZXEqSqcQEuj+60+0qDGJkROgJPk7QGnPfSjDHa8RTC5cMdXpdX96yqynFgv+H33wn8YbzN2XRCsmH8ubS4uCCs2hNB+/gMAN4iP3NX1k2AHZeuwX0O7OxZfpY1laFp9pCxT3+DzCTy6i8vK82GUSlvy21zgKUQ64Epi5hc0T86DYBQFMKNC/O6ZCx9gc9HDwFQUe7lyzeEqastYnmTnSQsY5BE90t59QshCPh942D1eYGFlNWAE8ALidpvV4T+8hC6L3/Y64i+jJQWAMuashFi/rwgRSF7NRKfvYKVupj3e59vrHoV1OYFllAEoE1jXRFLIuIpADxBX94+A8lO+uMfADBvboDiouykhIClY1aWmRTxU7vy6vD7HN1lLTtbHR9VAL777FGNsWShqWpBYGUkW89qvny1haQjuhcAVRE0LSklOpii7XiEtuMRTp4eIlzhJVxpWzB54Q3M0TOTtOS6ZVLPOEukAJR5Bh0/UF2Fga0iv/OcjiUntZ+PvcdwqhuA2poifF4Xf3/rM1au3cPKtXu4/wHbr5c2ltklqpTET/5ukp6MmXGePUIdngA8OmSMAhZAMjVlZQeA9LqR/jHrjMQmTkaafBp9BQBdV2mos1cyGMxaKxi0/bcopLNgXhAA4+JR0gNtE3Q5dTLQMxJ0amQF4Mn7b0shOAtceoTJK5lwCQCxyDDJ4Wz/7uG3SJj2JlpcX+yEsGAgG/JCwexz4+JSVNUOMbGu35J7+EunncNHIvckkhuHOwFi8emBjesWgSKQUnLh4zPIjEXainFqaD8Afr9GzcJstAkGtLzPHo9KXa29CuboKVK9B5y26KBj1E9zx86JErIdIB5PYOYsRz7JlBfZ0IARS9L97id09L2CadmTXbqkFEXJBudADmQoNDHB1C8qwu22903s1AtIy8Aw0oyMOu72Vl5gRbIPsK3W118QGCC1qp5M2N68sXQfPYl/AlBa4mHObP+EvrlWzXUJAJdLobHBdjEr2U/ys1e5GM05+Qv5Rl5g16lDrUAPwPkLfdMCoyjEN63BWFVPtOzfSDE5STjAOZC58OOycEHI2Zjx7j30X+gebzIMyzyYF7i5udmS8CLAQHSQkZEZFOCKQmyRJOY/CcCcWX7KSifHZp/X5bjIpRaGsWSyZCyZmHG0i/vsBsmuX2z96oRQNOHEoUr1OSAD0N7ZNT0wEOt6boxd0NQ4dZEe8NsWzA1xuTKrykdFuR0uy2nDSzSjWPKxS/tNAH5k663twDNg79ILvYV9OdX/DumhdgCqF4QcqHyyYnk5DXXFVFZMuuFyZNnYhAUW89l/7pHvbDhZEBhAdxs7kAwAfNLZRSI5OZsBIE3iXTsB0DSFJQ2FS9J/7L+Ttne+xfUrK6fsU1zsZt7cAAAB8fn8l3ZtvGla4ObNGwekkA8ApAyDo20fkk5PDnOJc38lk+gBoKGuGF2fOqWPxtIsvfFFwrXP8+rrpwtOrCknJCpCeWJaYIDHtmx4XiCeADvzHTv+EWZObpeWQfy0fQjweV3U1hQVhHjnyHlOtA8wPGLw4suF94bP62JRVt+al/94+x3TAgM8umXdgyBfAtufD7971Ikc5uAJZNq+XlrcUIKqFL5ou/Wm2dxy0yzmzPZz39bFBfuCvWJO4snI9bltU17nSJAtprLVcEkv8LV4IsGR94/RsKiGSjW7Gf2+6W+EvF4XB/9217T9xkXTFHRNIZnKIATzZgQM0LxtXVLAHQ/vbn0YKVssy1LbO7s45xbUoQAWxz6IUL0whK5fu79L+vsTJFO2C4qxomxcZnyhveOFAxssIZ4H5gNUi9cp5cQ1g5xCzohM+vq77n3TOUfN2CyPbN1wQHdH6oSU3wPOdsuN9Mi1pAl8EaASOCIVuSkXFq70T5m9e3UjVXEvyDsF1q06Q0Fh1/+FJK2SOuiRA69VqUda3SIyRYAHN+7Iprv3RfK1XRFwrrS0trpSZzM3IJRbBLISIYJIAgipC5QzlrA6sUSn5cm0TXe7PhO5auD/tvwHQhyDgtGxXlsAAAAASUVORK5CYII=
!URL
http://www.salon.com/life/feature/story/index.html?story=/mwt/feature/2011/07/27/web_apps_imprint
!Description
But apps are not an ideal format for wide and unmonetized content distribution
I wonder how much moola british retail wastes per year because of the heat they give to the outdoors
/***
|''Name''|TiddlySpaceRevisionView|
|''Description''|Show tiddler revisions in a stack of cards view|
|''Author''|BenGillies|
|''Version''|0.2.0|
|''Status''|beta|
|''Source''|http://github.com/TiddlySpace/tiddlyspace|
|''CodeRepository''|http://github.com/TiddlySpace/tiddlyspace|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.6.0|
|''Requires''|TiddlyWebAdaptor|
!Usage
The viewRevisions macro can be attached to any element, which should be passed
in as a parameter.
For example:
<<viewRevisions page:10 link:"<<view modified date>>">>
would show the revisions "stack of cards" view, 10 at a time, when the modified
date is clicked.
!Code
***/
//{{{
(function($) {
var me = config.macros.viewRevisions = {
revisionTemplate: "RevisionTemplate",
revSuffix: " [rev. #%0]", // text to append to each tiddler title
defaultPageSize: 5, // default number of revisions to show
defaultLinkText: "View Revisions", // when there's nothing else to use
offsetTop: 30, // in px
offsetLeft: 10, // in px
shiftDownDelay: 50, // in ms
visibleSlideAmount: 20, // amount of revisions to show on left hand edge after sliding
zIndex: 100, // default z-index
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
params = paramString.parseParams(null, null, true)[0];
var tiddlerElem = story.findContainingTiddler(place);
var revButton;
var pageSize = parseInt(params.page[0], 10) || me.defaultPageSize;
var linkObj = params.link ? params.link[0] || me.defaultLinkText : false;
if(linkObj) {
revButton = $('<span class="button openRevisions" />')
.appendTo(place);
wikify(linkObj, revButton[0], null, tiddler);
} else {
revButton = place;
}
$(revButton).click(function() {
if (!$(tiddlerElem).hasClass("revisions")) {
me.showRevisions(tiddlerElem, tiddler, pageSize);
} else {
me.closeRevisions(tiddlerElem);
}
});
},
// initialisation for revision view
showRevisions: function(tiddlerElem, tiddler, pageSize) {
var context = {
host: tiddler.fields["server.host"],
workspace: tiddler.fields["server.workspace"]
};
$(tiddlerElem).addClass("revisions").attr("revName", tiddler.title);
// ensure toolbar commands deactivate RevisionsView
$("a", ".toolbar", tiddlerElem).each(function(index, btn) {
var _onclick = btn.onclick;
btn.onclick = function(e) {
me.closeRevisions(tiddlerElem);
_onclick.apply(this, arguments);
};
});
// ensure default action deactivates RevisionsView
var _ondblclick = tiddlerElem.ondblclick;
tiddlerElem.ondblclick = function(e) {
me.closeRevisions(tiddlerElem);
_ondblclick.apply(this, arguments);
};
var type = tiddler.fields["server.type"];
var adaptor = new config.adaptors[type]();
var userParams = {
tiddlerElem: tiddlerElem,
pageSize: pageSize,
title: tiddler.title
};
me.createCloak(tiddlerElem);
adaptor.getTiddlerRevisionList(tiddler.title, null, context, userParams,
function(context, userParams) {
// strip the current revision
context.revisions.shift();
me.expandStack(context, userParams);
});
},
// fetch the actual revision and put it in the tiddler div
showRevision: function(place, revision, callback) {
var context = {
host: revision.fields["server.host"],
workspace: revision.fields["server.workspace"]
};
var userParams = {
revElem: place
};
var type = revision.fields["server.type"];
var adaptor = new config.adaptors[type]();
var revNo = revision.fields["server.page.revision"];
adaptor.getTiddlerRevision(revision.title, revNo, context, userParams,
function(context, userParams) {
var tiddler = context.tiddler;
tiddler.title += me.revSuffix
.format([$(place).attr("revision")]);
tiddler.fields.doNotSave = true;
if (store.getTiddler(tiddler.title)) {
store.deleteTiddler(tiddler.title);
}
store.addTiddler(tiddler);
//now, populate the existing div
var revElem = userParams.revElem;
$(revElem).attr("id", story.tiddlerId(tiddler.title));
$(revElem).attr("refresh", "tiddler");
var getTemplate = function() {
var themeName = config.options.txtTheme;
if (themeName) {
return store.getTiddlerSlice(themeName,
me.revisionTemplate) || me.revisionTemplate ||
"ViewTemplate";
} else {
return (store.getTiddler(me.revisionTemplate)) ?
me.revisionTemplate : "ViewTemplate";
}
};
var template = getTemplate();
story.refreshTiddler(tiddler.title, template, true);
callback(tiddler);
});
},
createCloak: function(promoteElem) {
var el = $(promoteElem);
// cache styles for resetting later
el.data({
top: el.css("top"),
left: el.css("left"),
zIndex: el.css("z-index")
});
$('<div class="revisionCloak" />').css("z-index", me.zIndex)
.click(function() {
me.closeRevisions(promoteElem);
})
.appendTo(document.body);
el.css("z-index", me.zIndex + 1);
},
// clean up, removing all evidence of revision view
closeRevisions: function(promoteElem) {
var el = $(promoteElem);
// revert the original tiddler back to its previous state
el.removeAttr("revName").removeClass("revisions").css({
top: el.data("top"),
left: el.data("left"),
zIndex: el.data("zIndex")
});
// remove any revisions still in the store
var revisions = $(".revisions");
revisions.each(function(index, revision) {
var revAttributes = revision.attributes;
if ((revAttributes.revname) &&
(revAttributes.revision)) {
var revName = revAttributes.revname.value;
var revNo = revAttributes.revision.value;
var title = revName + me.revSuffix.format([revNo]);
if (store.getTiddler(title)) {
store.deleteTiddler(title);
}
}
});
// delete the previous revisions
revisions.remove();
// remove the cloak
$(".revisionCloak").remove();
},
// calback from getting list of revisions
expandStack: function(context, userParams) {
var pageSize = userParams.pageSize;
var from = userParams.from || 0;
var tiddlerElem = userParams.tiddlerElem;
userParams.defaultHeight = $(tiddlerElem).height();
userParams.defaultWidth = $(tiddlerElem).width();
if (from < context.revisions.length) {
me.displayNextRevision(tiddlerElem, userParams, context, from,
from + pageSize - 1);
}
},
// place the next div above and behind the previous one
displayNextRevision: function(tiddlerElem, userParams, context, from, to) {
var revision = context.revisions[from];
var callback = function() {
var revText = revBtn.getRevisionText(tiddlerElem, revision);
tiddlerElem = me.createRevisionObject(tiddlerElem, context,
userParams, revText);
$(tiddlerElem)
.attr("revision", (context.revisions.length - from));
if ((from < to) && ((from + 1) < context.revisions.length)){
me.displayNextRevision(tiddlerElem, userParams, context,
from + 1, to);
} else if ((context.revisions.length - 1) > to) {
me.showMoreButton(tiddlerElem, context, userParams, to + 1);
}
}
me.shiftVisibleDown(userParams.title, callback);
},
createRevisionObject: function(tiddlerElem, context, userParams, text) {
var newPosition = me.calculatePosition(tiddlerElem, context);
return $('<div class="revisions tiddler" />')
.css({
position: "absolute",
top: newPosition.top,
left: newPosition.left,
"z-index": me.zIndex + 1,
height: userParams.defaultHeight,
width: userParams.defaultWidth
})
.attr("revName", userParams.title)
.append(text)
.insertBefore(tiddlerElem);
},
// move the already present revisions down by 1 to fit the next one in
shiftVisibleDown: function(title, callback) {
var revisions = $("[revName='%0'].revisions".format([title]));
var revisionCount = revisions.length;
$(revisions).animate({top: "+=" + me.offsetTop},
me.shiftDownDelay, function() {
revisionCount -= 1;
if ((callback) && (!revisionCount)) {
callback();
}
});
},
// where we put the new revision
calculatePosition: function(elem, context) {
var offset = $(elem).offset();
var currentPosition = $(elem).position();
var newPosition = {
top: currentPosition.top - me.offsetTop
};
if ((context.restrictLeft) ||
((offset.left - me.offsetLeft) <
$("#contentWrapper").offset().left)) {
newPosition.left = $(elem).position().left;
context.restrictLeft = true;
} else {
newPosition.left = currentPosition.left - me.offsetLeft;
}
return newPosition;
},
// equivalent of displayNextRevision, but for the more button
showMoreButton: function(tiddlerElem, context, userParams, moreIndex) {
userParams.from = moreIndex + 1;
me.shiftVisibleDown(userParams.title, function() {
var btn = me.createRevisionObject(tiddlerElem, context, userParams,
"");
var more = createTiddlyButton(btn[0], "more...", "show more revisions",
function() {
if ($(".viewRevision").length) {
return;
}
userParams.tiddlerElem = btn[0];
$(btn).text("")
.append(revBtn
.getRevisionText(btn[0], context.revisions[moreIndex]))
.attr("revision", context.revisions.length - moreIndex);
me.expandStack(context, userParams);
});
$(more).css("float", "right");
});
},
stripRevFromTitle: function(revisionTitle) {
return revisionTitle.split(/ ?\[rev\. #[0-9]+\]$/)[0];
},
onClickRevision: function(revElem, revision, callback) {
// don't do anything if we are still loading
if ($(".revisions").hasClass("loading")) {
return null;
}
var origTitle = me.stripRevFromTitle(revision.title);
if ($(revElem).hasClass("viewRevision")) {
$(".revisions").addClass("loading");
me.slideIn(revElem, revision, origTitle, function() {
store.deleteTiddler(revision.title);
revision.title = origTitle;
$(revElem).text("").append(revBtn.getRevisionText(revElem,
revision))
.removeAttr("tags").removeAttr("tiddler")
.removeAttr("refresh").removeAttr("template")
.removeAttr("id");
$(".revisions").removeClass("loading");
if (callback) {
callback();
}
});
$(revElem).removeAttr("prevPos").removeClass("viewRevision");
} else {
var viewRevision = function() {
var prevPos = $(revElem).position().left;
$(revElem).addClass("viewRevision").attr("prevPos", prevPos);
$(".revisions").addClass("loading");
me.showRevision(revElem, revision, function(rev) {
me.slideOut(revElem, rev, origTitle, function() {
$(".revisions").removeClass("loading");
});
});
};
// make sure another revision isn't already out
if ($(".viewRevision").length) {
var newRevElem = $(".viewRevision")[0];
var newRevision = store.getTiddler($(newRevElem)
.attr("tiddler"));
me.onClickRevision(newRevElem, newRevision, viewRevision);
} else {
viewRevision();
}
}
},
slideOut: function(revElem, revision, title, callback) {
var leftMostPos = $("[revName='%0'].revisions".format([title]))
.offset().left;
var width = $(revElem).width();
var originalLeftPos = $(story.getTiddler(title))
.position().left;
var slideAmount = leftMostPos + width - me.visibleSlideAmount;
$("[revName='%0'].revisions:not(.viewRevision)".format([title]))
.animate({left: "-=" + slideAmount}, 1000);
$(revElem)
.attr("baseHeight", $(revElem).css("height"))
.css("height", "auto")
.animate({left: originalLeftPos}, 1000, callback);
},
slideIn: function(revElem, revision, title, callback) {
var slideAmount = $(revElem).offset().left -
$(story.getTiddler(title)).offset().left;
var origRevPos = $(revElem).attr("prevPos");
$("[revName='%0'].revisions:not(.viewRevision)".format([title]))
.animate({left: "+=" + slideAmount}, 1000);
$(revElem).animate({left: origRevPos}, 1000, function() {
$(revElem)
.css("height", $(revElem).attr("baseHeight"))
.removeAttr("baseHeight");
callback();
});
}
};
var revBtn;
config.macros.slideRevision = revBtn = {
btnText: "created by %0 at %1 on %2",
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
var btn = revBtn.getRevisionText(place, tiddler);
$(place).append(btn);
},
getRevisionText: function(place, revision) {
var text = revBtn.btnText.format([revision.modifier,
revision.modified.formatString("0hh:0mm"),
revision.modified.formatString("0DD MMM YYYY")]);
var btn = $('<a href="javascript:;" class="button revButton" />')
.text(text)
.click(function() {
var revElem = story.findContainingTiddler(this);
me.onClickRevision(revElem, revision);
});
return btn;
}
};
})(jQuery);
//}}}
To london for tea at the cavendish hotel today.
!URL
http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
!Description
Since SQL joins appear to be set-based, the use of Venn diagrams to explain them seems, at first blush, to be a natural fit. However, like the commenters to her post, I found that the Venn diagrams didn't quite match the SQL join syntax reality in my testing.
!Note
I reckon I'll be needing some of this knowledge.
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
<html>
<head></head>
<body>
<img src='/SiteIcon' />
Welcome to the Robson family tree.
The following links may be helpful.
<ul>
<li><a href="http://robsontree.tiddlyspace.com/bags/robsontree_public/tiddlers">list of members of the Robson family tree</a></li>
<li><a href="http://robsontree.tiddlyspace.com/recipes/robsontree_public/tiddlers">a wiki to explore the tree (note this will take time to load)</a></li>
</ul>
<script type='text/javascript' src='http://tiddlyspace.com/bags/console/tiddlers/jquery.min.js'></script>
</body>
</html>
(function($){
$(function(){
$('#app-list li').mouseover(function() {
var me = $(this),
appname = me.attr("class"),
descEl = '.' + appname + 'desc';
$(descEl).addClass("highlightdesc");
}).mouseout(function() {
var me = $(this),
appname = me.attr("class"),
descEl = '.' + appname + 'desc';
$(descEl).removeClass("highlightdesc");
});
$(".inactive").click(function() {
var me = $(this),
oldtext = me.text();
me.text("coming soon").animate({'color':'#fff'}, 400, function() {
setTimeout(function(){
me.text(oldtext);
}, 2000);
});
return false;
});
$(".soon").click(function() {
var me = $(this),
comingsoon = $('.comingsoon', me);
comingsoon.addClass("highlight");
// won't work until jquery ui is included
comingsoon.animate({'color':'#BC4378'}, 600, function() {
comingsoon.animate({'color':'#B8B6BD'}, 600);
});
return false;
});
});
})(jQuery);
!URL
http://www.news.wisc.edu/19190
!Description
To our faculty, I say: Continue to ask difficult questions, explore unpopular lines of thought and exercise your academic freedom, regardless of your point of view. As always, we will take our cue from the bronze plaque on the walls of Bascom Hall. It calls for the "continual and fearless sifting and winnowing" of ideas. It is our tradition, our defining value, and the way to a better society.
!Notes
\o/
my phone is broken, screen is on but black
function printMessage(text) {
$("#messageArea").remove();
var msgArea = $("<div id='messageArea'/>").addClass("error message").
text(text).prependTo(document.body)[0];
$("<button />").click(function(ev) {
$(msgArea).slideUp(1000);
}).text("close").appendTo(msgArea);
}
if(!applicationCache) {
printMessage("Your browser does not support offline mode.");
} else {
window.applicationCache.addEventListener("cached", function() {
printMessage("This page has been downloaded and will now run without an internet connection.");
});
window.applicationCache.addEventListener("downloading", function() {
printMessage("Downloading page for offline use.");
});
window.applicationCache.addEventListener("error", function() {
printMessage("Error caching page. Please refresh and try again.");
});
var success = function() {
printMessage("This page can be used offline.");
};
window.applicationCache.addEventListener("noupdate", success);
window.applicationCache.addEventListener("updateready", success);
}
var space = window.location.hostname.split(".")[0];
var Store = function(tiddlers) {
var tiddlers = tiddlers;
var map = {};
for(var i = 0; i < tiddlers.length; i++) {
var tid = tiddlers[i];
map[tid.title] = tid;
}
function get(title) {
return map[title];
}
function add(tid) {
if(!map[tid.title]) {
map[tid.title] = tid;
tiddlers.push(tid);
}
}
function list() {
return tiddlers;
}
function getText(title) {
var tid = get(title);
return tid ? tid.text : "";
}
function cache() {
var s = this;
window.setTimeout(function() {
localStorage.setItem("tiddlers.json", JSON.stringify(s.getTiddlers()));
}, 0);
}
return {
cache: cache,
addTiddler: add,
getTiddlerText: getText,
getTiddler: get,
getTiddlers: list,
}
};
var store, tiddlers, w;
function activateSliders(el) {
if(!el) {
el = document.body;
}
$(".sliderPanel", el).each(function(i, el) {
$(el).prev("a").addClass("sliderButton").click(function(ev) {
ev.preventDefault();
var panel = $(ev.target).next(".sliderPanel")[0];
loadTiddler($(panel).attr("tiddler"), panel);
$(panel).slideToggle(1000);
});
$(el).hide();
});
}
function loadTiddler(title, place) {
place = place || $("#text-html")[0];
window.location.hash = "#" + title;
var t = store.getTiddler(title);
$("#header h1 a").css("font-style", "auto").empty();
$(place).empty();
if(t) {
if(!t.type) {
w[0](t.text, place);
activateSliders(place);
$("a", place).click(function(ev) {
if(!$(ev.target).hasClass("sliderButton")) {
ev.preventDefault();
loadTiddler($(ev.target).attr("href"));
}
});
} else {
$(place).text("File not available in offline mode.");
}
$("#header h1 a").text(t.title).attr("href", t.uri);
} else {
if(title.indexOf("http") === 0) {
$("<a />").text(title + " (requires connection)").attr("href", title).appendTo("#text-html");
} else {
$("#header h1 a").empty().text(title).css({ "font-style": "italic" })
}
}
activateSliders();
}
function updateStore(title, success) {
$.ajax({
url: "/" + encodeURIComponent(title),
dataType: "json",
data: {
render: "y"
},
success: function(tid) {
tid.text = tid.render;
store.addTiddler(tid);
store.cache();
success(tid);
}
});
}
$("#mainMenu a").live("click", function(ev) {
var title = $(ev.target).attr("href");
var tmp = title.split("/");
title = tmp[tmp.length - 1];
if(title) {
loadTiddler(title);
}
ev.preventDefault();
});
function init() {
var mainmenu = store.getTiddlerText("MainMenu");
if(mainmenu) {
$("#mainMenu").empty().html(mainmenu);
}
updateStore("MainMenu", function(tid) {
$("#mainMenu").empty().html(tid.text);
});
$("#sidebar ul").empty();
var tiddlers = store.getTiddlers();
for(var i = 0; i < tiddlers.length; i++) {
var tid = tiddlers[i];
var link = $("<a />").
data("title", tid.title).
attr("href", tid.uri).
click(function(ev) {
ev.preventDefault();
var title = $(ev.target).data("title");
loadTiddler(title);
}).text(tid.title)[0];
var item = $("<li />").appendTo("#sidebar ul")[0];
$(item).append(link);
}
if(window.location.hash) {
loadTiddler(window.location.hash.substr(1))
}
}
window.setTimeout(function() {
w = createWikifier(window, jQuery, { host: "/", container: "recipes/" + space + "_public" });
d1 = new Date();
tiddlers = localStorage.getItem("tiddlers.json") ? JSON.parse(localStorage.getItem("tiddlers.json")) : null;
store = new Store(tiddlers || []);
d2 = new Date();
$("#sidebar ul").text("Loading...");
if(tiddlers) {
tiddlers = [];
init();
}
// TODO: better filter then this please!
var filter = "select=tag:!systemConfig&select=tag:!excludeLists&select=type:!image/svg+xml&select=type:!image/png&select=type:!image/jpeg&select=type:!image/gif&select=type:!image/jpg&select=type:!text/css&select=type:!text/plain&select=type:!text/javascript&select=type:!text/html&select=type:!text/cache-manifest";
jQuery.ajax({
url: "/recipes/" + space + "_public/tiddlers.json?" + filter + "&fat=y&sort=-modified",
dataType: "json",
success: function(tids) {
store = new Store(tids);
store.cache();
init();
}
});
}, 0);
<!doctype html>
<html>
<head>
<title>TiddlyApp Share</title>
<link rel="stylesheet" href="/bags/common/tiddlers/profile.css" type="text/css"/>
<script src="/bags/common/tiddlers/jquery.js" type="text/javascript"></script>
<script src="/bags/tiddlyspace/tiddlers/chrjs" type="text/javascript"></script>
<script src="/bags/common/tiddlers/chrjs-store.js" type="text/javascript"></script>
<script src="/bags/tiddlyspace/tiddlers/chrjs.users" type="text/javascript"></script>
<script type="text/javascript" src="/bags/common/tiddlers/backstage.js"></script>
<script>
// The templates of the links to display on the page
var links = [
{
title: "Tiddlers",
info: "Show a list of all the tiddlers in this space that a visitor currently has access to.",
href: "{host}/tiddlers"
}, {
title: "Public Tiddlers",
info: "Show a list of all the public tiddlers in this space in alphabetical order.",
href: "{host}/bags/{subdomain}_public/select=tag:!excludeLists;sort=title"
}, {
title: "Atom Feed",
info: "Get the Atom feed of the most recently changed tiddlers.",
href: "{host}/tiddlers.atom?select=tag:!excludeLists;sort=-modified;limit=20"
}, {
title: "Specific Tiddler",
info: "Show a specific tiddler in your space (GettingStarted in this example) as HTML, JSON or just plain text.",
href: ["{host}/GettingStarted", "{host}/GettingStarted.json", "{host}/GettingStarted.txt"],
more: "http://tiddlyweb.peermore.com/wiki/"
}, {
title: "Search for text",
info: "Search tiddlers for some text contained inside a tiddler.",
href: "{host}/search?q={subdomain}"
}, {
title: "List tiddlers with a tag",
info: "Display all the tiddlers that have the tag specified (here the tag is systemConfig).",
href: "{host}/tiddlers?select=tag:systemConfig"
}
];
$(function() {
var subdomain = document.location.host.split(".")[0];
// Filter curly braces to display information
for (var i in links) {
var href = links[i].href;
if (typeof href === "string")
href = [href];
for (var j in href) {
href[j] = href[j].replace("{host}", (document.protocol || "http:") + "//" + document.location.host);
href[j] = href[j].replace("{subdomain}", subdomain);
}
links[i].href = href;
}
// Display links to user
var insertInto = $('#share_links');
for (var i in links) {
var linkBody = $('<div class="share_link"></div>');
var linkDisplay = $('<div class="link_display"></div>');
for (var j in links[i].href) {
var a = $('<a class="link_href" target="_blank"/>');
a.html(links[i].href[j]);
a.attr('href', links[i].href[j]);
linkDisplay.append(a);
linkDisplay.append("<br/>");
}
var linkTitle = $('<b class="link_title"/>');
linkTitle.html(links[i].title);
var linkInfo = $('<div class="link_info"/>');
linkInfo.html(links[i].info);
linkBody.append(linkTitle);
linkBody.append('<br/>');
linkBody.append(linkInfo);
linkBody.append(linkDisplay);
if (links[i].more) {
var linkMore = $('<a class="link_more">Learn more</a>');
linkMore.attr('href', links[i].more);
linkBody.append(linkMore);
}
insertInto.append(linkBody);
}
});
</script>
<style type="text/css">
.link_display {
display: block;
background: #f2f2f2;
border: 1px solid #aaa;
padding: 10px;
margin-top: 4px;
word-wrap: break-word;
}
.link_more {
display: block;
text-align: right;
}
.share_link {
margin-bottom: 10px;
}
</style>
</head>
<body>
<div id="container">
<div id="header">
<h1>Share Space</h1>
</div>
<p>Here are a number of methods that you can use to share this Space and its content in different ways.</p>
<span id="share_links"></span>
</div>
</body>
</html>
this purple stuff at the nyt is downright awesome http://open.blogs.nytimes.com/2011/01/11/emphasis-update-and-source/
!URL
http://www.petapixel.com/2011/10/07/mind-blowing-research-into-inserting-artificial-objects-into-photographs/
!Description
Here’s a fascinating demo into technology that can quickly and realistically insert fake 3D objects into photographs — lighting, shading and all.
!URL
http://www.guardian.co.uk/business/2011/feb/18/barclays-bank-113m-corporation-tax
!Description
Barclays Bank has been forced to admit it paid just £113m in UK corporation tax in 2009 – a year when it rang up a record £11.6bn of profits.
!URL
http://zachholman.com/posts/how-github-works-hours/
!Description
You can’t throw more time at a problem and expect it to get solved. Code is a creative endeavor. You need to be in the right mindset to create high-quality code.
!Notes
The above is correct, but it shocks me that people are even still talking about this. It's been known for years. Why does it take so long for such insights to penetrate?
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="450 366 38 57"
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
<g>
<path d="M 452.1094 421.2422 L 450 421.2422 L 450 423 L 487.9688 423 L 487.9688 421.2422 L 485.8595 421.2422
L 485.8595 377.29688 L 487.9688 377.29688 L 487.9688 375.53906 L 485.8595 375.53906
C 485.8595 375.53906 481.12463 371.59341 473.02023 370.52802 C 472.6824 368.9689 471.72098 366.75 468.9844 366.75
C 466.24783 366.75 465.28638 368.9689 464.94864 370.52802
C 456.84418 371.59341 452.1094 375.53906 452.1094 375.53906 L 450 375.53906 L 450 377.29688 L 452.1094 377.29688
Z M 467.12247 370.32086 L 467.12247 370.32086 C 467.3805 369.42395 467.90762 368.50781 468.9844 368.50781
C 470.0612 368.50781 470.5883 369.42395 470.84634 370.32086
C 470.24136 370.2848 469.62054 370.26562 468.9844 370.26562
C 468.34827 370.26562 467.72748 370.2848 467.12247 370.32086 Z M 454.21875 420.92804 L 454.21875 420.92804
C 455.46762 420.42087 456.32816 419.35281 456.32816 418.11716 L 456.32816 377.29688 L 458.4375 377.29688
L 458.4375 421.2422 L 454.21875 421.2422 Z M 460.5469 420.92804 L 460.5469 420.92804
C 461.79578 420.42087 462.65625 419.35281 462.65625 418.11716 L 462.65625 377.29688 L 464.76566 377.29688
L 464.76566 421.2422 L 460.5469 421.2422 Z M 466.87503 420.92804 L 466.87503 420.92804
C 468.1239 420.42087 468.9844 419.35281 468.9844 418.11716 L 468.9844 377.29688 L 471.09378 377.29688
L 471.09378 421.2422 L 466.87503 421.2422 Z M 473.2032 420.92804 L 473.2032 420.92804
C 474.45203 420.42087 475.31256 419.35281 475.31256 418.11716 L 475.31256 377.29688 L 477.4219 377.29688
L 477.4219 421.2422 L 473.2032 421.2422 Z M 479.5313 420.92804 L 479.5313 420.92804
C 480.78018 420.42087 481.64066 419.35281 481.64066 418.11716 L 481.64066 377.29688 L 483.75006 377.29688
L 483.75006 421.2422 L 479.5313 421.2422 Z" fill="black" class="glyph"/>
</g>
</g>
</svg>
flights for thanksgiving booked
I used the term "repressive desublimation" in an email thread about politics with some friends and a participant wanted to know what I meant. Here's my respones:
It's a theory of politics and society from Herbert Marcuse, who was maybe a neo-Marxist or post-Marxist depending on how you look at such things. With a touch of Freudian analysis. Basically mid 20th century amalgamation of the intellectual explosion that comes about as a result of the world wars.
The basic idea is that "the system" has many techniques by which it can maintain itself some direct some indirect. One is that by controlling desire you can control people. Create desire for cars and
consumer goods to replace desire for liberty.
Taken a bit further, the basic idea is that expressing emotion (notably rage) for something relatively mundane (like a leader getting a blowjob) will debsublimate (bleed off) emotion that actually comes from other things (oh I don't know, say the widening gap between poor and rich).
If the desublimation didn't happen then the rage about the real insult would sublimate (in the Freudian sense) for long enough that it would eventually explode in Revolution™.
While the strict Marcuse stuff has to do with desire in an almost sexual sense, with someone desiring a TV instead of desiring something sensible like housing, the general pattern of having emotion release satisfied by hand waving over //here// when the real bad shit is happening over //there// is where I find it most useful.
It's similar to bread and circuses, but it's the explanatory mechanism that I think is key as it gives a reason for why it works and points to a way to limit the damage done.
/***
|''Name''|TiddlyWebConfig|
|''Description''|configuration settings for TiddlyWebWiki|
|''Author''|FND|
|''Version''|1.3.2|
|''Status''|stable|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/TiddlyWebConfig.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''Requires''|TiddlyWebAdaptor ServerSideSavingPlugin|
|''Keywords''|serverSide TiddlyWeb|
!Code
***/
//{{{
(function($) {
if(!config.extensions.ServerSideSavingPlugin) {
throw "Missing dependency: ServerSideSavingPlugin";
}
if(!config.adaptors.tiddlyweb) {
throw "Missing dependency: TiddlyWebAdaptor";
}
if(window.location.protocol != "file:") {
config.options.chkAutoSave = true;
}
var adaptor = tiddler.getAdaptor();
var recipe = tiddler.fields["server.recipe"];
var workspace = recipe ? "recipes/" + recipe : "bags/common";
var plugin = config.extensions.tiddlyweb = {
host: tiddler.fields["server.host"].replace(/\/$/, ""),
username: null,
status: {},
getStatus: null, // assigned later
getUserInfo: function(callback) {
this.getStatus(function(status) {
callback({
name: plugin.username,
anon: plugin.username ? plugin.username == "GUEST" : true
});
});
},
hasPermission: function(type, tiddler) {
var perms = tiddler.fields["server.permissions"];
if(perms) {
return perms.split(", ").contains(type);
} else {
return true;
}
}
};
config.defaultCustomFields = {
"server.type": tiddler.getServerType(),
"server.host": plugin.host,
"server.workspace": workspace
};
// modify toolbar commands
config.shadowTiddlers.ToolbarCommands = config.shadowTiddlers.ToolbarCommands.
replace("syncing ", "revisions syncing ");
config.commands.saveTiddler.isEnabled = function(tiddler) {
return plugin.hasPermission("write", tiddler) && !tiddler.isReadOnly();
};
config.commands.deleteTiddler.isEnabled = function(tiddler) {
return !readOnly && plugin.hasPermission("delete", tiddler);
};
// hijack option macro to disable username editing
var _optionMacro = config.macros.option.handler;
config.macros.option.handler = function(place, macroName, params, wikifier,
paramString) {
if(params[0] == "txtUserName") {
params[0] = "options." + params[0];
var self = this;
var args = arguments;
args[0] = $("<span />").appendTo(place)[0];
plugin.getUserInfo(function(user) {
config.macros.message.handler.apply(self, args);
});
} else {
_optionMacro.apply(this, arguments);
}
};
// hijack isReadOnly to take into account permissions and content type
var _isReadOnly = Tiddler.prototype.isReadOnly;
Tiddler.prototype.isReadOnly = function() {
return _isReadOnly.apply(this, arguments) ||
!plugin.hasPermission("write", this);
};
var getStatus = function(callback) {
if(plugin.status.version) {
callback(plugin.status);
} else {
var self = getStatus;
if(self.pending) {
if(callback) {
self.queue.push(callback);
}
} else {
self.pending = true;
self.queue = callback ? [callback] : [];
var _callback = function(context, userParams) {
var status = context.serverStatus || {};
for(var key in status) {
if(key == "username") {
plugin.username = status[key];
config.macros.option.propagateOption("txtUserName",
"value", plugin.username, "input");
} else {
plugin.status[key] = status[key];
}
}
for(var i = 0; i < self.queue.length; i++) {
self.queue[i](plugin.status);
}
delete self.queue;
delete self.pending;
};
adaptor.getStatus({ host: plugin.host }, null, _callback);
}
}
};
(plugin.getStatus = getStatus)(); // XXX: hacky (arcane combo of assignment plus execution)
})(jQuery);
//}}}
!URL
http://blueoxen.com/blog/2009/03/responsibility-and-collective-leadership/
!Description
I’ve often observed a kind of paralysis symptomatic of the “missing chef” within communities that are attempting some form of shared or consensus leadership. No one wants to step on anyone’s toes, and hence, no one steps at all.
<<<
The difference between mediocrity and excellence is attention to detail.
<<<
[[The difference between mediocrity and excellence is attention to detail.|http://www.flickr.com/photos/vanderwal/6359570499/]]
I've submitted http://iboc.tiddlyspace.com to http://d-cent.org/fsw2011/
!URL
http://ivory.idyll.org/articles/twill-and-wsgi_intercept.html
!Description
how to use wsgi_intercept with twill
R0lGODlhEAAQAPIAAAAAAP///zw8PLy8vP///5ycnHx8fGxsbCH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==
!URL
http://www.sierrawireless.com/estore/Default.aspx?SKU=6000284&CID=6
!Description
antenna for 875u. i prolly want one of these
This is your boomarklet. Drag it into your bookmarks and use it whenever you find a site that you want to keep:
<<bookmarklet>>
!My Bookmarks
<<list filter [tag[bookmark]][sort[-modified]]>>
!URL
http://stevenf.com/2007/04/announcing_coda_10.php
!Description
oh my, integrated web editing from panic. I bet this will be good.
!URL
http://edition.cnn.com/2011/BUSINESS/03/01/business.blindness.heffernan/index.html?hpt=C2
!Description
Often a lot of really bad decisions aren't taken in a giant leap. It's lots of tiny decisions, not one of which seems to make any big difference, none of them big enough to argue about. You should think hard about asking -- where are these baby steps taking us?
Wow that was a lot of fiddling about to get urllib2 to behave any way close to correctly.
!URL
http://developer.appleseedproject.org/profile/michael.chisari/journal/dec5c92b2301f4a1c5f5cf7a43ea5db6
!Description
This is a story about… Wait for it… Server-side software implementations and open, documented protocols.
It’s not easy to write an article about how there won’t be another Facebook. It’s more of a challenge to write an article about how Facebook will be brought down by an RPC or a REST API.
// Get characters from the right end of a string
String.prototype.right = function(n)
{
return n < this.length ? this.slice(this.length-n) : this;
};
// Trim whitespace from both ends of a string
String.prototype.trim = function()
{
return this.replace(/^\s*|\s*$/g,"");
};
// Convert a string from a CSS style property name to a JavaScript style name ("background-color" -> "backgroundColor")
String.prototype.unDash = function()
{
var s = this.split("-");
if(s.length > 1) {
for(var t=1; t<s.length; t++)
s[t] = s[t].substr(0,1).toUpperCase() + s[t].substr(1);
}
return s.join("");
};
// Substitute substrings from an array into a format string that includes '%1'-type specifiers
String.prototype.format = function(s)
{
var substrings = s && s.constructor == Array ? s : arguments;
var subRegExp = /(?:%(\d+))/mg;
var currPos = 0;
var r = [];
do {
var match = subRegExp.exec(this);
if(match && match[1]) {
if(match.index > currPos)
r.push(this.substring(currPos,match.index));
r.push(substrings[parseInt(match[1])]);
currPos = subRegExp.lastIndex;
}
} while(match);
if(currPos < this.length)
r.push(this.substring(currPos,this.length));
return r.join("");
};
// Escape any special RegExp characters with that character preceded by a backslash
String.prototype.escapeRegExp = function()
{
var s = "\\^$*+?()=!|,{}[].";
var c = this;
for(var t=0; t<s.length; t++)
c = c.replace(new RegExp("\\" + s.substr(t,1),"g"),"\\" + s.substr(t,1));
return c;
};
// Convert "\" to "\s", newlines to "\n" (and remove carriage returns)
String.prototype.escapeLineBreaks = function()
{
return this.replace(/\\/mg,"\\s").replace(/\n/mg,"\\n").replace(/\r/mg,"");
};
// Convert "\n" to newlines, "\b" to " ", "\s" to "\" (and remove carriage returns)
String.prototype.unescapeLineBreaks = function()
{
return this.replace(/\\n/mg,"\n").replace(/\\b/mg," ").replace(/\\s/mg,"\\").replace(/\r/mg,"");
};
// Convert & to "&", < to "<", > to ">" and " to """
String.prototype.htmlEncode = function()
{
return this.replace(/&/mg,"&").replace(/</mg,"<").replace(/>/mg,">").replace(/\"/mg,""");
};
// Convert "&" to &, "<" to <, ">" to > and """ to "
String.prototype.htmlDecode = function()
{
return this.replace(/</mg,"<").replace(/>/mg,">").replace(/"/mg,"\"").replace(/&/mg,"&");
};
// Parse a space-separated string of name:value parameters
//# where:
//# - the name or the value can be optional (in which case separate defaults are used instead)
//# - in case of ambiguity, a lone word is taken to be a value
//# - if 'cascadeDefaults' is set to true, then the defaults are modified by updated by each specified name or value
//# - name prefixes are not allowed if the 'noNames' parameter is true
//# - if both the name and value are present they must be separated by a colon
//# - the name and the value may both be quoted with single- or double-quotes, double-square brackets
//# - names or values quoted with {{double-curly braces}} are evaluated as a JavaScript expression
//# - as long as the 'allowEval' parameter is true
// The result is an array of objects:
// result[0] = object with a member for each parameter name, value of that member being an array of values
// result[1..n] = one object for each parameter, with 'name' and 'value' members
String.prototype.parseParams = function(defaultName,defaultValue,allowEval,noNames,cascadeDefaults)
{
var parseToken = function(match,p) {
var n;
if(match[p]) // Double quoted
n = match[p];
else if(match[p+1]) // Single quoted
n = match[p+1];
else if(match[p+2]) // Double-square-bracket quoted
n = match[p+2];
else if(match[p+3]) // Double-brace quoted
try {
n = match[p+3];
if(allowEval && config.evaluateMacroParameters != "none") {
if(config.evaluateMacroParameters == "restricted") {
if(window.restrictedEval) {
n = window.restrictedEval(n);
}
} else {
n = window.eval(n);
}
}
} catch(ex) {
throw "Unable to evaluate {{" + match[p+3] + "}}: " + exceptionText(ex);
}
else if(match[p+4]) // Unquoted
n = match[p+4];
else if(match[p+5]) // empty quote
n = "";
return n;
};
var r = [{}];
var dblQuote = "(?:\"((?:(?:\\\\\")|[^\"])+)\")";
var sngQuote = "(?:'((?:(?:\\\\\')|[^'])+)')";
var dblSquare = "(?:\\[\\[((?:\\s|\\S)*?)\\]\\])";
var dblBrace = "(?:\\{\\{((?:\\s|\\S)*?)\\}\\})";
var unQuoted = noNames ? "([^\"'\\s]\\S*)" : "([^\"':\\s][^\\s:]*)";
var emptyQuote = "((?:\"\")|(?:''))";
var skipSpace = "(?:\\s*)";
var token = "(?:" + dblQuote + "|" + sngQuote + "|" + dblSquare + "|" + dblBrace + "|" + unQuoted + "|" + emptyQuote + ")";
var re = noNames ? new RegExp(token,"mg") : new RegExp(skipSpace + token + skipSpace + "(?:(\\:)" + skipSpace + token + ")?","mg");
var params = [];
do {
var match = re.exec(this);
if(match) {
var n = parseToken(match,1);
if(noNames) {
r.push({name:"",value:n});
} else {
var v = parseToken(match,8);
if(v == null && defaultName) {
v = n;
n = defaultName;
} else if(v == null && defaultValue) {
v = defaultValue;
}
r.push({name:n,value:v});
if(cascadeDefaults) {
defaultName = n;
defaultValue = v;
}
}
}
} while(match);
// Summarise parameters into first element
for(var t=1; t<r.length; t++) {
if(r[0][r[t].name])
r[0][r[t].name].push(r[t].value);
else
r[0][r[t].name] = [r[t].value];
}
return r;
};
// Process a string list of macro parameters into an array. Parameters can be quoted with "", '',
// [[]], {{ }} or left unquoted (and therefore space-separated). Double-braces {{}} results in
// an *evaluated* parameter: e.g. {{config.options.txtUserName}} results in the current user's name.
String.prototype.readMacroParams = function(notAllowEval)
{
var p = this.parseParams("list",null,!notAllowEval,true);
var n = [];
for(var t=1; t<p.length; t++)
n.push(p[t].value);
return n;
};
// Process a string list of unique tiddler names into an array. Tiddler names that have spaces in them must be [[bracketed]]
String.prototype.readBracketedList = function(unique)
{
var p = this.parseParams("list",null,false,true);
var n = [];
for(var t=1; t<p.length; t++) {
if(p[t].value)
n.pushUnique(p[t].value,unique);
}
return n;
};
// Returns array with start and end index of chunk between given start and end marker, or undefined.
String.prototype.getChunkRange = function(start,end)
{
var s = this.indexOf(start);
if(s != -1) {
s += start.length;
var e = this.indexOf(end,s);
if(e != -1)
return [s,e];
}
};
// Replace a chunk of a string given start and end markers
String.prototype.replaceChunk = function(start,end,sub)
{
var r = this.getChunkRange(start,end);
return r ? this.substring(0,r[0]) + sub + this.substring(r[1]) : this;
};
// Returns a chunk of a string between start and end markers, or undefined
String.prototype.getChunk = function(start,end)
{
var r = this.getChunkRange(start,end);
if(r)
return this.substring(r[0],r[1]);
};
// Static method to bracket a string with double square brackets if it contains a space
String.encodeTiddlyLink = function(title)
{
return title.indexOf(" ") == -1 ? title : "[[" + title + "]]";
};
// Static method to encodeTiddlyLink for every item in an array and join them with spaces
String.encodeTiddlyLinkList = function(list)
{
if(list) {
var results = [];
for(var t=0; t<list.length; t++)
results.push(String.encodeTiddlyLink(list[t]));
return results.join(" ");
} else {
return "";
}
};
// Convert a string as a sequence of name:"value" pairs into a hashmap
String.prototype.decodeHashMap = function()
{
var fields = this.parseParams("anon","",false);
var r = {};
for(var t=1; t<fields.length; t++)
r[fields[t].name] = fields[t].value;
return r;
};
// Static method to encode a hashmap into a name:"value"... string
String.encodeHashMap = function(hashmap)
{
var r = [];
for(var t in hashmap)
r.push(t + ':"' + hashmap[t] + '"');
return r.join(" ");
};
// Static method to left-pad a string with 0s to a certain width
String.zeroPad = function(n,d)
{
var s = n.toString();
if(s.length < d)
s = "000000000000000000000000000".substr(0,d-s.length) + s;
return s;
};
String.prototype.startsWith = function(prefix)
{
return !prefix || this.substring(0,prefix.length) == prefix;
};
// Returns the first value of the given named parameter.
//#
//# @param params
//# as returned by parseParams or null/undefined
//# @return [may be null/undefined]
//#
function getParam(params,name,defaultValue)
{
if(!params)
return defaultValue;
var p = params[0][name];
return p ? p[0] : defaultValue;
}
// Returns the first value of the given boolean named parameter.
//#
//# @param params
//# as returned by parseParams or null/undefined
//#
function getFlag(params,name,defaultValue)
{
return !!getParam(params,name,defaultValue);
}
I hate the tiddlyspace ControlView thing so damn much...
<html>
<head>
<title>nearby tiddlers</title>
<link href="/bags/common/tiddlers/profile.css" type='text/css' rel='stylesheet' >
<link href="/jquery-ui.css" type='text/css' rel='stylesheet' >
</style>
<script type="text/javascript" src="/bags/common/tiddlers/backstage.js"></script>
</head>
<body>
<div id="container">
<div id="header">
<h1>nearby tiddlers</h1>
</div>
<h2>Tiddlers recently created near you</h2>
Tiddlers that are geotagged and near your current location (within <span id="radius">1</span>km <button id="radius-increase">+</button>, <button id="radius-decrease">-</button>) are listed below.
<ul id="near"></ul>
</div>
<script type='text/javascript' src='/bags/common/tiddlers/jquery.js'></script>
<script type='text/javascript' src='http://htmljs.tiddlyspace.com/htmljs-prettydates'></script>
<script type='text/javascript' src='/bags/common/tiddlers/jquery-json.js'></script>
<script type='text/javascript' src='/bags/tiddlyspace/tiddlers/chrjs'></script>
<script type="text/javascript">
$("#radius-increase").click(function(ev) {
$("#radius").text(parseInt($("#radius").text(), 10) + 1);
check();
});
$("#radius-decrease").click(function(ev) {
var newRadius = parseInt($("#radius").text(), 10) - 1;
if(newRadius === 0) {
newRadius = 1;
}
$("#radius").text(newRadius);
check();
})
$.ajaxSetup({
beforeSend: function(xhr) {
xhr.setRequestHeader("X-ControlView", "false");
}
});
var host = "http://tiddlyspace.com";
// TODO: what about running from homepage?
var list = $("#near");
function check() {
navigator.geolocation.getCurrentPosition(function(a) {
list.empty();
var coords = a.coords;
var lat = coords.latitude;
var lng = coords.longitude;
var radius = parseInt($("#radius").text(), 10) * 1000;
var search = new tiddlyweb.Search("near:" + lat + "," + lng + "," + radius, "/");
search.get(function(tiddlers) {
tiddlers.sort(function(a, b) {
return a.modified < b.modified ? 1 : -1;
});
for(var i = 0; i < tiddlers.length; i++) {
var tiddler = tiddlers[i];
var item = $("<li />").appendTo(list);
$("<a />").attr("href",
host + "/bags/" + encodeURIComponent(tiddler.bag.name) + "/tiddlers/" + encodeURIComponent(tiddler.title)).text(tiddler.title).appendTo(item);
$("<span />").text(" " + simpleDate(tiddler.modified)).appendTo(item);
$("<span />").text(" from ").appendTo(item);
// TODO: hacky
$("<a />").attr("href", "http://" + tiddler.modifier + ".tiddlyspace.com").appendTo(item).text(tiddler.modifier);
}
if(tiddlers.length === 0) {
$("<li />").appendTo(list).text("no tiddlers nearby");
}
}, function() {
$("<li />").text("Unable to retrieve tiddlers nearby").appendTo(list);
});
}, function() {
$("<li />").text("Unable to get your current location").appendTo(list);
});
}
check();
</script>
</body>
</html>
/*
* jQuery Autocomplete plugin 1.1
*
* Copyright (c) 2009 Jörn Zaefferer
*
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
* Revision: $Id: jquery.autocomplete.js 15 2009-08-22 10:30:27Z joern.zaefferer $
*/
//{{{
(function($){$.fn.extend({autocomplete:function(urlOrData,options){var isUrl=typeof urlOrData=="string";options=$.extend({},$.Autocompleter.defaults,{url:isUrl?urlOrData:null,data:isUrl?null:urlOrData,delay:isUrl?$.Autocompleter.defaults.delay:10,max:options&&!options.scroll?10:150},options);options.highlight=options.highlight||function(value){return value;};options.formatMatch=options.formatMatch||options.formatItem;return this.each(function(){new $.Autocompleter(this,options);});},result:function(handler){return this.bind("result",handler);},search:function(handler){return this.trigger("search",[handler]);},flushCache:function(){return this.trigger("flushCache");},setOptions:function(options){return this.trigger("setOptions",[options]);},unautocomplete:function(){return this.trigger("unautocomplete");}});$.Autocompleter=function(input,options){var KEY={UP:38,DOWN:40,DEL:46,TAB:9,RETURN:13,ESC:27,COMMA:188,PAGEUP:33,PAGEDOWN:34,BACKSPACE:8};var $input=$(input).attr("autocomplete","off").addClass(options.inputClass);var timeout;var previousValue="";var cache=$.Autocompleter.Cache(options);var hasFocus=0;var lastKeyPressCode;var config={mouseDownOnSelect:false};var select=$.Autocompleter.Select(options,input,selectCurrent,config);var blockSubmit;$.browser.opera&&$(input.form).bind("submit.autocomplete",function(){if(blockSubmit){blockSubmit=false;return false;}});$input.bind(($.browser.opera?"keypress":"keydown")+".autocomplete",function(event){hasFocus=1;lastKeyPressCode=event.keyCode;switch(event.keyCode){case KEY.UP:event.preventDefault();if(select.visible()){select.prev();}else{onChange(0,true);}break;case KEY.DOWN:event.preventDefault();if(select.visible()){select.next();}else{onChange(0,true);}break;case KEY.PAGEUP:event.preventDefault();if(select.visible()){select.pageUp();}else{onChange(0,true);}break;case KEY.PAGEDOWN:event.preventDefault();if(select.visible()){select.pageDown();}else{onChange(0,true);}break;case options.multiple&&$.trim(options.multipleSeparator)==","&&KEY.COMMA:case KEY.TAB:case KEY.RETURN:if(selectCurrent()){event.preventDefault();blockSubmit=true;return false;}break;case KEY.ESC:select.hide();break;default:clearTimeout(timeout);timeout=setTimeout(onChange,options.delay);break;}}).focus(function(){hasFocus++;}).blur(function(){hasFocus=0;if(!config.mouseDownOnSelect){hideResults();}}).click(function(){if(hasFocus++>1&&!select.visible()){onChange(0,true);}}).bind("search",function(){var fn=(arguments.length>1)?arguments[1]:null;function findValueCallback(q,data){var result;if(data&&data.length){for(var i=0;i<data.length;i++){if(data[i].result.toLowerCase()==q.toLowerCase()){result=data[i];break;}}}if(typeof fn=="function")fn(result);else $input.trigger("result",result&&[result.data,result.value]);}$.each(trimWords($input.val()),function(i,value){request(value,findValueCallback,findValueCallback);});}).bind("flushCache",function(){cache.flush();}).bind("setOptions",function(){$.extend(options,arguments[1]);if("data"in arguments[1])cache.populate();}).bind("unautocomplete",function(){select.unbind();$input.unbind();$(input.form).unbind(".autocomplete");});function selectCurrent(){var selected=select.selected();if(!selected)return false;var v=selected.result;previousValue=v;if(options.multiple){var words=trimWords($input.val());if(words.length>1){var seperator=options.multipleSeparator.length;var cursorAt=$(input).selection().start;var wordAt,progress=0;$.each(words,function(i,word){progress+=word.length;if(cursorAt<=progress){wordAt=i;return false;}progress+=seperator;});words[wordAt]=v;v=words.join(options.multipleSeparator);}v+=options.multipleSeparator;}$input.val(v);hideResultsNow();$input.trigger("result",[selected.data,selected.value]);return true;}function onChange(crap,skipPrevCheck){if(lastKeyPressCode==KEY.DEL){select.hide();return;}var currentValue=$input.val();if(!skipPrevCheck&¤tValue==previousValue)return;previousValue=currentValue;currentValue=lastWord(currentValue);if(currentValue.length>=options.minChars){$input.addClass(options.loadingClass);if(!options.matchCase)currentValue=currentValue.toLowerCase();request(currentValue,receiveData,hideResultsNow);}else{stopLoading();select.hide();}};function trimWords(value){if(!value)return[""];if(!options.multiple)return[$.trim(value)];return $.map(value.split(options.multipleSeparator),function(word){return $.trim(value).length?$.trim(word):null;});}function lastWord(value){if(!options.multiple)return value;var words=trimWords(value);if(words.length==1)return words[0];var cursorAt=$(input).selection().start;if(cursorAt==value.length){words=trimWords(value)}else{words=trimWords(value.replace(value.substring(cursorAt),""));}return words[words.length-1];}function autoFill(q,sValue){if(options.autoFill&&(lastWord($input.val()).toLowerCase()==q.toLowerCase())&&lastKeyPressCode!=KEY.BACKSPACE){$input.val($input.val()+sValue.substring(lastWord(previousValue).length));$(input).selection(previousValue.length,previousValue.length+sValue.length);}};function hideResults(){clearTimeout(timeout);timeout=setTimeout(hideResultsNow,200);};function hideResultsNow(){var wasVisible=select.visible();select.hide();clearTimeout(timeout);stopLoading();if(options.mustMatch){$input.search(function(result){if(!result){if(options.multiple){var words=trimWords($input.val()).slice(0,-1);$input.val(words.join(options.multipleSeparator)+(words.length?options.multipleSeparator:""));}else{$input.val("");$input.trigger("result",null);}}});}};function receiveData(q,data){if(data&&data.length&&hasFocus){stopLoading();select.display(data,q);autoFill(q,data[0].value);select.show();}else{hideResultsNow();}};function request(term,success,failure){if(!options.matchCase)term=term.toLowerCase();var data=cache.load(term);if(data&&data.length){success(term,data);}else if((typeof options.url=="string")&&(options.url.length>0)){var extraParams={timestamp:+new Date()};$.each(options.extraParams,function(key,param){extraParams[key]=typeof param=="function"?param():param;});$.ajax({mode:"abort",port:"autocomplete"+input.name,dataType:options.dataType,url:options.url,data:$.extend({q:lastWord(term),limit:options.max},extraParams),success:function(data){var parsed=options.parse&&options.parse(data)||parse(data);cache.add(term,parsed);success(term,parsed);}});}else{select.emptyList();failure(term);}};function parse(data){var parsed=[];var rows=data.split("\n");for(var i=0;i<rows.length;i++){var row=$.trim(rows[i]);if(row){row=row.split("|");parsed[parsed.length]={data:row,value:row[0],result:options.formatResult&&options.formatResult(row,row[0])||row[0]};}}return parsed;};function stopLoading(){$input.removeClass(options.loadingClass);};};$.Autocompleter.defaults={inputClass:"ac_input",resultsClass:"ac_results",loadingClass:"ac_loading",minChars:1,delay:400,matchCase:false,matchSubset:true,matchContains:false,cacheLength:10,max:100,mustMatch:false,extraParams:{},selectFirst:true,formatItem:function(row){return row[0];},formatMatch:null,autoFill:false,width:0,multiple:false,multipleSeparator:", ",highlight:function(value,term){return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)("+term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi,"\\$1")+")(?![^<>]*>)(?![^&;]+;)","gi"),"<strong>$1</strong>");},scroll:true,scrollHeight:180};$.Autocompleter.Cache=function(options){var data={};var length=0;function matchSubset(s,sub){if(!options.matchCase)s=s.toLowerCase();var i=s.indexOf(sub);if(options.matchContains=="word"){i=s.toLowerCase().search("\\b"+sub.toLowerCase());}if(i==-1)return false;return i==0||options.matchContains;};function add(q,value){if(length>options.cacheLength){flush();}if(!data[q]){length++;}data[q]=value;}function populate(){if(!options.data)return false;var stMatchSets={},nullData=0;if(!options.url)options.cacheLength=1;stMatchSets[""]=[];for(var i=0,ol=options.data.length;i<ol;i++){var rawValue=options.data[i];rawValue=(typeof rawValue=="string")?[rawValue]:rawValue;var value=options.formatMatch(rawValue,i+1,options.data.length);if(value===false)continue;var firstChar=value.charAt(0).toLowerCase();if(!stMatchSets[firstChar])stMatchSets[firstChar]=[];var row={value:value,data:rawValue,result:options.formatResult&&options.formatResult(rawValue)||value};stMatchSets[firstChar].push(row);if(nullData++<options.max){stMatchSets[""].push(row);}};$.each(stMatchSets,function(i,value){options.cacheLength++;add(i,value);});}setTimeout(populate,25);function flush(){data={};length=0;}return{flush:flush,add:add,populate:populate,load:function(q){if(!options.cacheLength||!length)return null;if(!options.url&&options.matchContains){var csub=[];for(var k in data){if(k.length>0){var c=data[k];$.each(c,function(i,x){if(matchSubset(x.value,q)){csub.push(x);}});}}return csub;}else
if(data[q]){return data[q];}else
if(options.matchSubset){for(var i=q.length-1;i>=options.minChars;i--){var c=data[q.substr(0,i)];if(c){var csub=[];$.each(c,function(i,x){if(matchSubset(x.value,q)){csub[csub.length]=x;}});return csub;}}}return null;}};};$.Autocompleter.Select=function(options,input,select,config){var CLASSES={ACTIVE:"ac_over"};var listItems,active=-1,data,term="",needsInit=true,element,list;function init(){if(!needsInit)return;element=$("<div/>").hide().addClass(options.resultsClass).css("position","absolute").appendTo(document.body);list=$("<ul/>").appendTo(element).mouseover(function(event){if(target(event).nodeName&&target(event).nodeName.toUpperCase()=='LI'){active=$("li",list).removeClass(CLASSES.ACTIVE).index(target(event));$(target(event)).addClass(CLASSES.ACTIVE);}}).click(function(event){$(target(event)).addClass(CLASSES.ACTIVE);select();input.focus();return false;}).mousedown(function(){config.mouseDownOnSelect=true;}).mouseup(function(){config.mouseDownOnSelect=false;});if(options.width>0)element.css("width",options.width);needsInit=false;}function target(event){var element=event.target;while(element&&element.tagName!="LI")element=element.parentNode;if(!element)return[];return element;}function moveSelect(step){listItems.slice(active,active+1).removeClass(CLASSES.ACTIVE);movePosition(step);var activeItem=listItems.slice(active,active+1).addClass(CLASSES.ACTIVE);if(options.scroll){var offset=0;listItems.slice(0,active).each(function(){offset+=this.offsetHeight;});if((offset+activeItem[0].offsetHeight-list.scrollTop())>list[0].clientHeight){list.scrollTop(offset+activeItem[0].offsetHeight-list.innerHeight());}else if(offset<list.scrollTop()){list.scrollTop(offset);}}};function movePosition(step){active+=step;if(active<0){active=listItems.size()-1;}else if(active>=listItems.size()){active=0;}}function limitNumberOfItems(available){return options.max&&options.max<available?options.max:available;}function fillList(){list.empty();var max=limitNumberOfItems(data.length);for(var i=0;i<max;i++){if(!data[i])continue;var formatted=options.formatItem(data[i].data,i+1,max,data[i].value,term);if(formatted===false)continue;var li=$("<li/>").html(options.highlight(formatted,term)).addClass(i%2==0?"ac_even":"ac_odd").appendTo(list)[0];$.data(li,"ac_data",data[i]);}listItems=list.find("li");if(options.selectFirst){listItems.slice(0,1).addClass(CLASSES.ACTIVE);active=0;}if($.fn.bgiframe)list.bgiframe();}return{display:function(d,q){init();data=d;term=q;fillList();},next:function(){moveSelect(1);},prev:function(){moveSelect(-1);},pageUp:function(){if(active!=0&&active-8<0){moveSelect(-active);}else{moveSelect(-8);}},pageDown:function(){if(active!=listItems.size()-1&&active+8>listItems.size()){moveSelect(listItems.size()-1-active);}else{moveSelect(8);}},hide:function(){element&&element.hide();listItems&&listItems.removeClass(CLASSES.ACTIVE);active=-1;},visible:function(){return element&&element.is(":visible");},current:function(){return this.visible()&&(listItems.filter("."+CLASSES.ACTIVE)[0]||options.selectFirst&&listItems[0]);},show:function(){var offset=$(input).offset();element.css({width:typeof options.width=="string"||options.width>0?options.width:$(input).width(),top:offset.top+input.offsetHeight,left:offset.left}).show();if(options.scroll){list.scrollTop(0);list.css({maxHeight:options.scrollHeight,overflow:'auto'});if($.browser.msie&&typeof document.body.style.maxHeight==="undefined"){var listHeight=0;listItems.each(function(){listHeight+=this.offsetHeight;});var scrollbarsVisible=listHeight>options.scrollHeight;list.css('height',scrollbarsVisible?options.scrollHeight:listHeight);if(!scrollbarsVisible){listItems.width(list.width()-parseInt(listItems.css("padding-left"))-parseInt(listItems.css("padding-right")));}}}},selected:function(){var selected=listItems&&listItems.filter("."+CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);return selected&&selected.length&&$.data(selected[0],"ac_data");},emptyList:function(){list&&list.empty();},unbind:function(){element&&element.remove();}};};$.fn.selection=function(start,end){if(start!==undefined){return this.each(function(){if(this.createTextRange){var selRange=this.createTextRange();if(end===undefined||start==end){selRange.move("character",start);selRange.select();}else{selRange.collapse(true);selRange.moveStart("character",start);selRange.moveEnd("character",end);selRange.select();}}else if(this.setSelectionRange){this.setSelectionRange(start,end);}else if(this.selectionStart){this.selectionStart=start;this.selectionEnd=end;}});}var field=this[0];if(field.createTextRange){var range=document.selection.createRange(),orig=field.value,teststring="<->",textLength=range.text.length;range.text=teststring;var caretAt=field.value.indexOf(teststring);field.value=orig;this.selection(caretAt,caretAt+textLength);return{start:caretAt,end:caretAt+textLength}}else if(field.selectionStart!==undefined){return{start:field.selectionStart,end:field.selectionEnd}}};})(jQuery);
//}}}
!URL
http://en.wikipedia.org/wiki/Anti-nationalism
!Description
When tweaking systems of the real world we must always be aware of the [[the law of unintended consequences|http://en.wikipedia.org/wiki/Unintended_consequences]], a warning:
>that an intervention in a complex system always creates unanticipated and often undesirable outcomes
The common example is when some species is introduced an ecosystem to control a pest but whose presence throws the system out of balance, destroying some other part of the system. Rabbits. Kudzu.
Curiously, when designing systems for what can be called the artifact world -- the world of data and information -- it is exactly the unintended and unexpected that we want to encourage. An API shows its strength when it is used to create systems completely outside the expectations of the original builders.
The success of the web is built on this principle. HTTP makes no assertions about what is at a URI, only that there are URIs and a small number of operations that may be done with them. Good APIs built on HTTP are similarly constrained: a small number of URI forms representing a small number of entities, with only the HTTP verbs declaring actions. The API provides access to the entities, the systems using the API decide what to do with them.
Although it doesn't hew perfectly to these guidelines, TiddlyWeb tries to follow them. A small number of entities: recipes, bags, policies, tiddlers. Operated by HTTP verbs: GET, POST, PUT, DELETE. No expectation of what the client might do with the entities. People use tiddlers in TiddlyWeb for all kinds of things. I use tiddlers to store and track:
* my weight
* exercise stats
* blog-list postings like this
* tweet-like things
* bookmarks
* timesheets
* simple todos
* traditional wiki pages
When building TiddlyWeb I didn't know I was going to do any of those things but the last; however, the name is what it is to announce TiddlyWeb's contract: Tiddlers on the web.
sticking to my guns on the ie6 rejection, I've created http://blockie6.tiddlyspace.com/
!URL
http://www.whitakerblackall.com/blog/music-theory-for-beginners/
!Description
This is a long post. But if you can get through it, you will know a lot of important basics about music theory and production.
!Notes
Haven't read this yet but looks worth reading.
A [[SiteIcon|SiteIcon tiddler]]@glossary helps provide some identity to your space. Ideally it'd be a square and a minimum of 48*48 pixels size. You can upload your site icon using the uploader below.
<<binaryUploadPublic title:SiteIcon>>
<html><hr><html>
!URL
http://stevehanov.ca/blog/index.php?id=115
!Description
Some web pages call it a DAWG (Direct Acyclic Word Graph). But computer scientists have adopted the name "Minimal Acyclic Finite State Automaton", because some papers were already using the name DAWG for something else.
!Notes
I used a trie when I was experimenting with my boggle solver (which I can't find) but it looks like a DAWG would have been better.
A @cdent collaboration rule of thumb: Read; more, faster, often.
!URL
http://www.corprew.org/content/lolcat-wasteland
!Description
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<title>Account</title>
<link href="/bags/common/tiddlers/profile.css" type='text/css' rel='stylesheet' >
<link href="/bags/common/tiddlers/admin.css" type='text/css' rel='stylesheet' >
<link href="/bags/common/tiddlers/jquery-ui.custom.css" type='text/css' rel='stylesheet' >
<script type="text/javascript" src="/bags/common/tiddlers/backstage.js"></script>
</head>
<body>
<div id="container">
<div class="main section">
<a class="app" href="/apps">back to apps</a>
<div class="left">
<div id="siteiconArea">
<h2>Site Icon</h2>
<div>
<img id="siteicon" class="siteicon">
<form id="upload" method="POST" enctype="multipart/form-data">
<input type="hidden" name="title" value="SiteIcon" />
<input type="hidden" name="tags" value="excludeLists">
<input type="hidden" name="csrf_token" class="csrf" />
<input type="file" name="file" />
<input type="submit" value="upload" />
</form>
</div>
</div>
<h2>Find Space</h2>
<form class="spaceSearch">
<input class="inputBox" type="text" placeholder="find space" />
<a href="http://docs.tiddlyspace.com/What%20is%20a%20Space%3F" class="help"
title="What is a space?">What is a space?</a>
<button>view all</button>
</form>
<div class='list-container'>
You are a member of the following spaces:
<ul class='ts-space-search'>
</ul>
</div>
<h2>Create New Space</h2>
<form class="ts-spaces">
<input class="inputBox" type="text" name="spacename" placeholder="space name"><span class="hostSuffix">.tiddlyspace.com</span>
<input type="submit" value="Create Space" />
</form>
</div>
<div class="right">
<h2>Change Password</h2>
<form class="ts-password">
<input class="inputBox" placeholder="existing password" type="password" name="password">
<input class="inputBox" placeholder="new password" type="password" name="new_password">
<input class="inputBox" placeholder="new password" type="password" name="new_password_confirm">
<input type="submit" value="Change password">
</form>
<h2>OpenID</h2>
<h3>Why OpenID?</h3>
<a href="http://openid.net/"><img src="/bags/common/tiddlers/openid.png" alt="openid" ></a><br />
Use just one username and password across hundreds of OpenID-enabled sites.<br />
It's an open standard.<br />
<a href="http://openid.net/what/">learn more</a>
<ul class="ts-identities"></ul>
<form class="ts-openid" target="_top">
<div>
Add an openid:
</div>
<input class="inputBox" type="text" name="openid" placeholder="your openid" />
<input type="submit" value="Register" />
<a href="http://openid.net/get-an-openid/" class="help"
title="What is an open id?">What is an open id?</a>
</form>
</div>
<div class="clear"></div>
</div>
</div>
<script type='text/javascript' src='/bags/common/tiddlers/jquery.js'></script>
<script type='text/javascript' src='/bags/tiddlyspace/tiddlers/chrjs'></script>
<script type='text/javascript' src='/bags/common/tiddlers/chrjs.space'></script>
<script type='text/javascript' src='/bags/common/tiddlers/chrjs.users'></script>
<script type='text/javascript' src='/bags/common/tiddlers/chrjs.identities'></script>
<script type='text/javascript' src="/bags/common/tiddlers/jquery-ui.custom.js"></script>
<script type='text/javascript' src='/bags/common/tiddlers/jquery-form.js'></script>
<script type='text/javascript' src="/bags/common/tiddlers/siteiconupload.js"></script>
<script type='text/javascript' src='/bags/common/tiddlers/ts.js'></script>
<script type="text/javascript">
/*
* jQuery UI Autocomplete HTML Extension
*
* Copyright 2010, Scott González (http://scottgonzalez.com)
* Dual licensed under the MIT or GPL Version 2 licenses.
*
* http://github.com/scottgonzalez/jquery-ui-extensions
*/
(function( $ ) {
var proto = $.ui.autocomplete.prototype,
initSource = proto._initSource;
function filter( array, term ) {
var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
return $.grep( array, function(value) {
return matcher.test( $( "<div>" ).html( value.label || value.value || value ).text() );
});
}
$.extend( proto, {
_initSource: function() {
if ( this.options.html && $.isArray(this.options.source) ) {
this.source = function( request, response ) {
response( filter( this.options.source, request.term ) );
};
} else {
initSource.call( this );
}
},
_renderItem: function( ul, item) {
return $( "<li></li>" )
.data( "item.autocomplete", item )
.append( $( "<a></a>" )[ this.options.html ? "html" : "text" ]( item.label ) )
.appendTo( ul );
}
});
})( jQuery );
/***
_accounts application specific javascript
***/
var link;
ts.init(function(ts) {
if(ts.user.anon) { // redirect to homepage when user not logged in
window.location = ts.getHost();
} else if(ts.user.name === ts.currentSpace){
initSiteIconUpload(ts.user.name);
} else {
link = $("<a />").attr("href", ts.getHost(ts.user.name) + "/_account").text("Change SiteIcon");
$("#siteiconArea div").empty().append(link);
}
$(".hostSuffix").text("." + ts.getHost("").split("//")[1]);
ts.getSpaces(function(spaces) {
$("<div class='info' />").text("You have " + spaces.length + " spaces.").insertBefore($(".spaceSearch")[0]);
$("form.spaceSearch input").autocomplete({
html: true,
source: function(req, response) {
ts.getSpaces(function(spaces) {
var selected = [];
for(var i = 0; i < spaces.length; i++) {
var space = spaces[i];
if(space.name.indexOf(req.term) > -1) {
var host = ts.getHost(space.name) ;
var img = host + "/SiteIcon";
selected.push({
value: space.name,
label: '<a href="' + host + '" target="_parent" class="autocompleteLink"><img src="' + img + '" style="height:24px;width:auto;max-height:24px;max-width:24px;"/>' + space.name + '</a>'
});
}
}
response(selected);
});
},
select: function(event, ui) {
window.top.location = ts.getHost(ui.item.value);
}
});
var $ul = $('.ts-space-search');
$.each(spaces, function(i, space) {
$ul.append($('<li/>').html($('<a/>').attr('href', space.uri)
.text(space.name)));
});
$('form.spaceSearch button').click(function(ev) {
$('.list-container').slideToggle('fast');
ev.preventDefault();
return false;
});
});
});
if(window != window.top) {
$("html").addClass("iframeMode");
$("a").live("click",function(ev) {
$(ev.target).attr("target", "_parent");
});
}
</script>
<!--[if lt IE 8]>
<script type="text/javascript" src="/bags/common/tiddlers/json2.js"></script>
<![endif]-->
</body>
</html>
the shining sun + monday = wanna nap
!URL
http://wiki.openid.net/Introduction
!Description
<html>
<head>
<title>Bulk Deletion Application</title>
<link rel="stylesheet" href="/bags/common/tiddlers/profile.css" type="text/css">
<script src="/bags/common/tiddlers/jquery.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="container">
<div id="header">
<h1>Bulk Deletion Application</h1>
</div>
<div class="main section">
Please take care when using this space as it can delete everything in your private and public bags. To use simply select the tiddlers you want to delete and click the delete all button.
<form id="filter" style="display:none;">
<p>Note you can filter this list using <a href="http://tweb-filters.tiddlyspace.com/GettingStarted">tiddlyweb filters</a>.</p>
<h2>Filter this list:</h2>
<input name="value" type='text' placeholder='select=tag:systemConfig'>
<button>Apply Filter</button>
</form>
<h2>Select tiddlers to delete</h2>
<table id='bulk'>
</table>
</div>
</div>
<script type='text/javascript'>
var space = window.location.host.split(".")[0];
var tableObj = {};
var url = "/recipes/" + space + "_private/tiddlers";
var hash = window.location.hash;
if(hash.indexOf("?") === 1) {
url += hash.substr(1, hash.length);
}
$("#filter").submit(onSubmit).show();
var onSubmit = function(ev) {
var filterVal = $("#filter [name=value]").val();
if(filterVal.indexOf("?") === 0) {
filterVal = filterVal.substr(1, filterVal.length);
}
window.location.hash = "#?" + filterVal;
window.location.reload();
ev.preventDefault();
};
if(window.location.hash.indexOf("#?") > -1) {
$("#filter [name=value]").val(window.location.hash.substr(2));
}
$("#filter button").click(onSubmit);
$.ajax({ url: url,
dataType: "json", success: function(tiddlers) {
var table = $("#bulk")[0];
$("<tr><th>Title</th><th>Status</th><th>Select <input type='checkbox' class='batchSelect' /></th></tr>").appendTo(table);
$(".batchSelect").click(function(ev) {
var ch = $(ev.target).attr("checked") ? true : false;
$("input.tidCheckBox:visible").attr("checked", false).each(function(i, el) {
$(el).attr("checked", ch);
});
});
$("<button />").text("delete all selected tiddlers").insertBefore(table).click(function(ev) {
if(!confirm("DELETE all the tiddlers that have been selected before? Be warning that this is irreversable!")) {
return;
}
var tiddlers = [];
$("input.tidCheckBox:checked:visible").each(function(i, el) {
var tid = $(el).data("tiddler");
if(tid) {
tiddlers.push(tid);
}
});
function deletetid(tid) {
$.ajax({ url: "/bags/" + tid.bag + "/tiddlers/" + encodeURIComponent(tid.title),
type: "DELETE",
success: function(r) {
var el = tableObj[tid.title];
$(el).animate({ opacity: 0}, {
complete: function(el) {
$(this).remove();
}
});
}
});
}
for(var i = 0; i < tiddlers.length; i++) {
var tid = tiddlers[i];
deletetid(tid);
}
});
for(var i = 0; i < tiddlers.length; i++) {
var tiddler = tiddlers[i];
if(tiddler.bag.indexOf(space) === 0) {
var row = $("<tr />").appendTo(table)[0];
$("<td />").text(tiddler.title).appendTo(row);
var status = tiddler.bag.split("_")[1];
$("<td />").text(status).appendTo(row);
var deletecol = $("<td />").appendTo(row)[0];
tableObj[tiddler.title] = row;
$("<input />").addClass("tidCheckBox").attr("type", "checkbox").data("tiddler", tiddler).appendTo(deletecol);
}
}
}
});
</script>
</body>
</html>
Have turned off @tiddlywiki on my main @cdent space, now presenting with progressively enhanced HTML and editing with @takenote.
!URL
http://wrongingrights.blogspot.com/2011/08/if-hollywood-made-biopic-of-my-last.html
!Description
I am consistently amazed at how big a deal class is there, and I still don't completely understand it. However, I'm pretty sure that if you're going to construct your society around a set of sometimes-arcane rules for social behavior and status, and rely on them for everyday stability, you probably need to make sure that everyone has an incentive to buy into the aforementioned byzantine set of rules. I have no idea about the specifics of the rioters' lives - I'm sure that some of them were poor, and that plenty of others were doing fine, economically. But it doesn't shock me that they didn't feel much allegiance to a society that's not really set up to benefit them in any way.
!URL
http://blogs.wsj.com/tech-europe/2012/04/05/one-third-of-o2-staff-say-they-are-more-productive-working-from-home/?mod=WSJBlog
!Description
Afterward, the vast majority of staff, 88%, said they were at least equally productive working from home. But, 36% said they were actually more productive.
!URL
http://jobs.ning.com/engineering/director-of-application-develo-2.html
!Description
interesting organizational structure based on technical architecture
<<<
Hyperspace Hashing is a new technique for determining how to distribute objects onto nodes in a cluster. Specifically, it maps objects with multiple attributes into points in a multidimensional hyperspace, which has in turn been divided into zones assigned to servers. Search queries on secondary object attributes can therefore be mapped to small, hyperspace regions representing the set of feasible locations for the matching objects. This geometric mapping enables efficient searches that do not require enumerating across every object in the system.
<<<
[[Concepts — HyperDex 0.2b9 documentation|http://hyperdex.org/doc/concepts/]]
[[The homepage|http://hyperdex.org/]].
Similar to redis but faster and more flexible.
The quote above makes me think I've found home.
!URL
http://twitter.com/#!/XavierVerges/status/29479053488553984
!Description
I liked these microposts http://goo.gl/auz7i by @FND and @cdent on windows/iOS/bad web vs unix/good web: the app is it vs the file/uri is it
/***
|''Name''|TiddlyTagCloudPlugin|
|''Author''|Jon Robson|
|''Version''|0.3.11|
!Usage
{{{ <<tagcloud>> }}} creates a tag cloud of all content.
!Parameters
exclude: name a tag you want to exclude from the tag cloud.
filter: provide a filter to run the tag cloud on a subset of tiddlers see SiteInfo@filters and [[filters syntax]]@docs
threshold:2 - will ignore any tags that occur less than 2 times.
sortOrder: <-,+,""> - sort the resulting tags in descending, ascending or no order
***/
//{{{
(function($) {
var stylesheet = "StyleSheetTagCloud";
config.shadowTiddlers[stylesheet] = ['.tagcloudTag { display: inline-block; border : none; margin-right: 8px; '].join("\n");
store.addNotification(stylesheet, refreshStyles);
var macro = config.macros.tagcloud = {
locale: {
tooltip: "see the %0 occurrences of %1"
},
cache: {},
options: {
fontSize: {
small: 10,
large: 48,
},
threshold: 1,
sortOrder: "+"
},
_cleanup: function() {
for(var i in macro.cache) {
if($(i).length === 0) {
delete macro.cache[i];
}
}
},
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
var id = "tagcloud"+Math.random();
var container = $("<div />").attr("params", paramString).addClass("tagcloud").
attr("id", id).appendTo(place)[0];
macro.refresh(container);
},
refresh: function(container) {
macro._cleanup();
var tags, tag;
var locale = macro.locale;
var paramString = $(container).attr("params");
var args = paramString.parseParams("anon")[0];
var exclude = args.exclude || [];
var tiddlers = args.filter ? store.filterTiddlers(args.filter[0]) : store.getTiddlers();
var count = {};
var lookup = {};
var options = macro.options;
var threshold = args.threshold ? parseInt(args.threshold[0], 10) : options.threshold;
for(var i = 0; i < tiddlers.length; i++) {
var tiddler = tiddlers[i];
tags = tiddler.tags;
for(var j = 0; j < tags.length; j++) {
tag = tags[j];
if(!exclude.contains(tag)) {
lookup[tag] = lookup[tag] || [];
lookup[tag].push(tiddler);
if(!count[tag]) {
count[tag] = 1;
} else {
count[tag] += 1;
}
}
}
}
tags = [];
var largest, smallest, c;
for(var k in count) {
tags.push(k);
if(count[k] < threshold) {
delete count[k];
}
}
var sort = options.sortOrder;
tags = tags.sort(function(i, j) {
if(sort == "+") {
return i < j ? -1 : 1;
} else if(sort == "-") {
return i < j ? 1 : -1;
} else {
return 0;
}
});
for(var l in count) {
if(true) {
c = count[l];
if(!largest) {
largest = c;
} else if(c > largest) {
largest = c;
}
if(!smallest) {
smallest = c;
} else if(c < smallest) {
smallest = c;
}
}
}
var id = $(container).attr("id");
macro.cache[id] = lookup;
for(var l = 0; l < tags.length; l++) {
var tag = tags[l];
if(true) {
c = count[tag];
if(c) {
var size = macro.determineFontSize({ largest: largest, smallest:smallest, occurrences: c });
var btn = createTagButton(container,"[_tagcloud[%0-:-%1]]".format(id, tag),
null,tag,locale.tooltip.format(c, tag));
$(btn).addClass("tagcloudTag").attr("tag", tag).css({ "font-size": size + "px" }).
addClass("button size%0".format(size)).click(function(ev) {
var tag = $(ev.target).attr("tag");
window.setTimeout(function() {
var items = $(".popup li a");
var lastLink = items[items.length - 1];
$(lastLink).text("Open tag " + tag).attr("tiddlylink", tag);
}, 10);
});
// the last line is rather hacky but gets the required result of making it possible to open the tag
}
}
}
},
determineFontSize: function(args) {
var options = macro.options;
var deltaFontSize = options.fontSize.large - options.fontSize.small;
var delta = args.occurrences / (args.largest - args.smallest + 1);
return options.fontSize.small + parseInt(delta * deltaFontSize, 10);
}
};
config.filters._tagcloud = function(results, match) {
var args = match[3] ? match[3].split("-:-") : false;
if(args) {
var id = args[0];
var lookup = macro.cache[id] || {};
var tag = args[1];
var tiddlers = lookup[tag] || [];
return tiddlers;
} else {
return [];
}
};
})(jQuery);
//}}}
ColorPalette
StyleSheet
SiteSubtitle
GettingStarted
SiteTitle
MainMenu
SiteIcon
DefaultTiddlers
ViewTemplate
PageTemplate
SideBarOptions
EditTemplate
SiteInfo
SideBarTabs
ToolbarCommands
So, badgeville.com has apparently decided that since one of their employees vaguely knows me they have a right to spam me. Plonk.
Is it wrong that when I am near someone I don't want to smell them? It matters not if they smell bad or good, I just do not want to smell them.
!URL
http://www.nytimes.com/2011/03/13/business/13hire.html?_r=1&ref=technology&pagewanted=all
!Description
Their mission was to devise something far more important to the future of Google Inc. than its next search algorithm or app.
They wanted to build better bosses.
!Notes
The eight good behaviors are obvious, but are supported by data, which I suppose means something. Despite being obvious the behaviors are not often present.
You can change the title and subtitle of your space, this will be visible to people visiting your space as well as being what is shown the browser tabs. The content these are stored in two tiddlers, clicking on the links below will open up these tiddlers which you can edit to make changes.
* [[SiteTitle]]
* [[SiteSubtitle]]
<html><hr><html>
!URL
https://github.com/klbostee/dumbo
!Description
Dumbo is a Python module that makes writing and running Hadoop
Streaming programs very easy. More generally, Dumbo can be considered
to be a convenient Python API for writing MapReduce programs.
<!DOCTYPE HTML>
<html>
<body style="display:none">
topics: <ul id="topics"></ul>
<button id='addtopic'>add topic</button>
stream:
<ul id="stream"></ul>
<script type='text/javascript' src='/bags/common/tiddlers/jquery.js'></script>
<script type='text/javascript' src='/bags/tiddlyspace/tiddlers/chrjs'></script>
<script src="/twikifier.js" type="text/javascript" charset="utf-8"></script>
<script type='text/javascript'>
$.ajaxSetup({
beforeSend: function(xhr) {
xhr.setRequestHeader("X-ControlView", "false");
}
});
function renderTopic(topic) {
var item = $("<li />").appendTo("#topics");
$("<button class='show' />").text(topic).appendTo(item);
$("<button class='delete'>x</button>").appendTo(item);
return item[0];
}
var host = '/';
var space = "jon";
var active_topics = [];
var current_topic, offset;
function renderTopics() {
var topics = active_topics;
$("#topics").empty();
for(var i = 0; i < topics.length; i++) {
var topic = topics[i];
if(topic) {
renderTopic(topic);
}
}
$("body").show();
}
// Array Remove - By John Resig (MIT Licensed)
Array.prototype.remove = function(from, to) {
var rest = this.slice((to || from) + 1 || this.length);
this.length = from < 0 ? this.length + from : from;
return this.push.apply(this, rest);
};
var topicList = new tiddlyweb.Tiddler("Topics", new tiddlyweb.Bag(space + "_public", host));
topicList.get(function(tid) {
active_topics = tid.text.split("\n");
renderTopics(active_topics);
$("#topics .show:first").trigger("click");
},
function() {
active_topics = ["tiddlyspace"];
renderTopics(active_topics)
}
);
$("#addtopic").click(function(ev) {
var text = prompt("What topic would you like to watch?");
if(active_topics.indexOf(text) === -1) {
active_topics.push(text);
}
var el = renderTopic(text);
topicList.text = active_topics.join("\n");
topicList.put(function() {
$("button.show", el).trigger("click");
}, function() {
alert("eek!")
});
});
$("#topics .delete").live("click",function(ev) {
var topic = $(".show", this.parentNode).text();
active_topics.remove(active_topics.indexOf(topic));
renderTopics();
topicList.text = active_topics.join("\n");
topicList.put(function() {}, function() {
alert("eek!")
});
});
w = createWikifier(window, jQuery, { host: host, container: "recipes/" + space + "_public" });
$("#topics .show").live("click",function(ev) {
var tag = $(this).text();
current_topic = tag;
offset = 0;
$("#stream").empty();
var search = new tiddlyweb.Search('tag:"' + tag + '" &fat=y', host);
search.get(function(tiddlers) {
for(var i = 0; i < tiddlers.length; i++) {
var tiddler = tiddlers[i];
var item = $("<li />").appendTo("#stream")[0];
$("<h2 />").text(tiddler.title + ": ").appendTo(item);
$("<div class='text' />").text(tiddler.text).appendTo(item);
$("<div class='author' />").text(tiddler.modifier).appendTo(item);
}
}, function() {
$("<li>no topics :-(</li>").appendTo("#stream");
});
});
$(window).scroll(function(){
if($(window).scrollTop() == $(document).height() - $(window).height()) {
offset += 10;
// find a way to get all tiddlers created before the ones above
console.log("loadMore();");
}
});
</script>
</body>
</html>
my superpower is stubborn tolerance for extreme tedium
[is[local]][sort[-modified]]
<!DOCTYPE html>
<html manifest="/manifest.mf">
<head>
<title>takenote</title>
<link rel="stylesheet" href="/notabene.css" />
<link rel="apple-touch-icon" href="/touchicon_takenote.png"/>
<link rel="apple-touch-icon-precomposed" href="/touchicon_takenote.png"/>
<meta name="viewport" content="width=device-width,minimum-scale=1,maximum-scale=1,user-scalable=0,initial-scale=1.0">
</head>
<body>
<ul id="backstage">
<!-- no not add a newline between li elements or you will get a margin with inline blocks -->
<li><a href="/dashboard">dashboard</a></li><li><a href="/takenote">takenote</a></li>
<li><a class='connectionStatus'></a></li>
</ul>
<div class="takenotecontainer">
<div class='messageArea'></div>
<div id="note">
<div class="toolbar">
<a id="cancelnote" title="cancel this note">cancel</a>
<a id="deletenote" title="delete this note">delete</a>
<a id="newnote" title="complete this note">complete</a>
</div>
<div class="note_title_container">
<textarea class="note_title" placeholder="Note Title"></textarea>
</div>
<div id="notebody">
<span class="notedate"></span>
<textarea class="note_text" placeholder="Write here..."></textarea>
</div>
<div id="tips">
<div>Tips for cleverer notes:
''<span class="boldTip">bold</span>'' //<span class="italicTip">italic</span>// _<span class="underlineTip">underline</span>_ #tag</div>
<div>[[<a href="http://tiddlyspace.com">Link Name</a>|http://tiddlyspace.com]]
[[<a href="/Note title">Note title</a>]] <span class="imageTip">[img[/SiteIcon<img src="/SiteIcon" />]]</span></div>
</div>
<div id="notemeta"></div>
<div style="display:none">
<a class="syncButton"></a>
</div>
</div>
</div>
<noscript>
Takenote requires javascript to work correctly. Sorry!
</noscript>
<script src="/bags/common/tiddlers/backstage.js" type="text/javascript" charset="utf-8"></script>
<script src="/bags/common/tiddlers/bookmark_bubble.js" type="text/javascript" charset="utf-8"></script>
<script src="/bags/common/tiddlers/jquery.js" type="text/javascript" charset="utf-8"></script>
<script src="/bags/tiddlyspace/tiddlers/chrjs" type="text/javascript" charset="utf-8"></script>
<script src="/bags/common/tiddlers/chrjs-store.js" type="text/javascript" charset="utf-8"></script>
<script src="/bags/common/tiddlers/jquery-json.js" type="text/javascript" charset="utf-8"></script>
<script src="/notabene.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
var takenote, space = window.location.hostname.split(".")[0];
takenote = notes($(".takenotecontainer")[0], {
bag: space + "_public",
host: "/"
});
</script>
</body>
</html>
<<<
It assumes that coding is the goal. Software developers tend to be software addicts who think their job is to write code. But it's not. Their job is to solve problems. Don't celebrate the creation of code, celebrate the creation of solutions. We have way too many coders addicted to doing just one more line of code already.
<<<
[[Coding Horror: Please Don't Learn to Code|http://www.codinghorror.com/blog/2012/05/please-dont-learn-to-code.html]]
!URL
http://www.nytimes.com/2011/02/15/science/15essay.html?_r=1&ref=technology&pagewanted=all
!Description
“The essence of being human involves asking questions, not answering them,” he said.
!URL
http://mark-elliott.net/view/Dissertation/WebHome
!Description
mark elliot's collaboration thesis
[[Black Swan]]: pretty much completely awesome.
/***
|''Name''|TiddlySpaceBackstage|
|''Version''|0.8.0|
|''Description''|Provides a TiddlySpace version of the backstage and a homeLink macro|
|''Status''|@@beta@@|
|''Contributors''|Jon Lister, Jon Robson, Colm Britton|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceBackstage.js|
|''Requires''|TiddlySpaceConfig ImageMacroPlugin TiddlySpaceViewTypes|
!StyleSheet
.publicLightText {
color: #C0E5FC;
}
.privateLightText {
color: #E2C1D6;
}
.tiddler .error.annotation .button{
display: inline-block;
}
#backstageArea #backstageToolbar a.task_tiddlyspace {
margin: 0px auto auto -75px;
font-weight: bold;
width: 150px;
line-height:24px;
font-size: 1.2em;
padding: 0;
top: 0;
position: absolute;
left: 50%;
}
.task_tiddlyspace .image,
.task_tiddlyspace .svgIcon {
display: inline;
}
.task_tiddlyspace .svgIconText {
display: none;
}
.task_tiddlyspace .logoText {
position: absolute;
top: 0px;
margin-left: 5px;
}
#backstageArea {
z-index: 49;
color: white;
background-color: black;
background: -webkit-gradient(linear,left bottom,left top,color-stop(0, #222),color-stop(0.5, #333),color-stop(1, #555));
background: -moz-linear-gradient(center bottom,#222 0%, #333 50%, #555 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ff555555, endColorstr=#ff222222);
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#ff555555, endColorstr=#ff222222)";
height: 25px;
padding: 0;
}
.backstageBackground {
fill: black;
}
#backstageButton {
overflow: hidden;
}
#backstageButton #backstageShow,
#backstageButton #backstageHide {
margin: 0px;
padding: 0px;
}
#backstageButton #backstageShow:hover,
#backstageButton #backstageHide:hover {
background: none;
color: none;
}
#backstageButton img,
#backstageButton svg {
width: 24px;
height: 24px;
}
#messageArea {
top: 50px;
}
#backstageToolbar {
position: relative;
}
#backstageArea a {
padding: 0px;
margin-left: 0px;
color: white;
background: none;
}
#backstageArea a:hover {
background-color: white;
}
#backstage .tabContents ol,
#backstage .tabContents ul {
padding: auto;
}
#backstageButton a {
margin: 0;
}
.backstagePanelBody .tabContents ul {
padding: 5px;
margin: 5px;
}
#backstage #backstagePanel {
margin-left: 5%;
padding: 0em;
margin-right: 5%;
text-align: center;
}
#backstageToolbar a {
position: relative;
}
#backstageArea a.backstageSelTab,
#backstageToolbar .backstageTask {
line-height: 25px;
color: #767676;
}
.backstageTask .externalImage,
.backstageTask .image {
display: inline;
}
.backstageTask .txtUserName,
.backstageTask .spaceName {
color: #fff;
}
.backstageSelTab .txtUserName,
.backstageSelTab .spaceName,
a:hover .txtUserName,
a:hover .spaceName {
color: #000;
}
.spaceSiteIcon {
margin-right: 10px;
}
.userSiteIcon {
margin-left: 10px;
}
#backstageToolbar .task_space {
position: absolute;
top: 0px;
left: 0%;
}
#backstageToolbar .task_user,
#backstageToolbar .task_login {
display: block;
position: absolute;
top: 0px;
right: 5%;
}
#backstageToolbar .task_login img {
position: relative;
display: inline;
}
#backstageToolbar .task_login img,
#backstageToolbar .task_user img {
float: right;
}
#backstageToolbar .task_space .svgIcon {
float: left;
position: relative;
z-index: 2;
}
#backstageToolbar a span {
z-index: 2;
}
#backstageToolbar .spaceSiteIcon {
float: left;
}
a.backstageTask {
display: block;
}
#backstageToolbar a span.txtUserName,
#backstageToolbar a .txtUserName span {
display: inline;
float: none;
}
#backstage .deleteButton {
margin-left: 0.3em;
font-weight: bold;
color: red;
font-size: 1.6em;
}
#backstage .deleteButton:hover {
background: none;
}
#backstageArea .siteIcon {
display: inline;
}
#backstagePanel .TiddlySpaceLogin {
display: inline;
}
.backstagePanelBody .tabContents .button {
display: inline-block;
margin-right: 10px;
}
.backstagePanelBody .tab {
margin: 0 0 0 0.6em;
padding: 0.4em 0.5em 1px 0.5em;
}
#backstage .tabContents {
padding: 1.5em;
text-align: left;
}
#backstage table {
margin: auto;
}
#backstage .wizard table {
border: 0px;
margin: 0;
}
#backstage .txtSpaceTab li {
border: 1px solid #ddd;
background: #eee;
list-style: none;
margin: 0.5em;
padding: 0.5em;
width: 80%;
}
#backstage .txtSpaceTab li.annotation {
border: 2px solid [[ColorPalette::SecondaryMid]];
}
#backstage div li.listLink {
border: 0px;
width: 78%;
font-size: 0.7em;
}
#backstage div li.listTitle {
font-weight: bold;
text-decoration: underline;
font-size: 1em;
background: #ccc;
width: 100%;
}
#backstage div.txtSpaceTab li .deleteButton {
float: right;
}
#backstage fieldset {
border: solid 1px [[ColorPalette::Background]];
}
#backstage .viewer table,#backstage table.twtable {
border: 0px;
}
#backstageToolbar img {
padding: 0;
}
#backstage .wizard,
#backstage .wizardFooter {
background: none;
}
.viewer td, .viewer tr, .twtable td, .twtable tr {
border: 1px solid #eee;
}
#backstage .inlineList ul li {
background-color: [[ColorPalette::Background]];
border: solid 1px [[ColorPalette::TertiaryMid]];
display: block;
float: left;
list-style: none;
margin-right: 1em;
padding: 0.5em;
}
.backstageClear, .inlineList form {
clear: both;
display: block;
margin-top: 3em;
}
.tiddlyspaceMenu {
text-align: center;
}
span.chunkyButton {
display: inline-block;
padding: 0;
margin: 0;
border: solid 2px #000;
background-color: #04b;
}
span.chunkyButton a.button, span.chunkyButton a:active.button {
white-space: nowrap;
font-weight: bold;
font-size: 1.8em;
color: #fff;
text-align: center;
padding: 0.5em 0.5em;
margin: 0;
border-style: none;
display: block;
}
span.chunkyButton:hover {
background-color: #014;
}
span.chunkyButton a.button:hover {
border-style: none;
background: none;
color: #fff;
}
a.baskstageTask.task_login,
a.baskstageTask.task_user {
_width: 200px;
_text-align: right;
}
#backstageArea #backstageToolbar .task_login img,
#backstageArea #backstageToolbar .task_user img {
_display: inline;
_float: none;
}
#backstage .unpluggedSpaceTab .wizard,
.unpluggedSpaceTab .wizard {
background: white;
border: 2px solid #CCC;
padding: 5px;
}
.syncKey .keyItem {
border: 1px solid black;
display: inline-block;
margin: 0.2em;
padding: 0.1em 0.1em 0.1em 0.1em;
}
.keyHeading {
font-size: 2em;
font-weight: bold;
margin: 0.4em 0em -0.2em;
}
.unpluggedSpaceTab .putToServer,
.unpluggedSpaceTab .notChanged {
display: none;
}
.tiddlyspaceMenu ul {
margin: 0;
padding: 0;
}
.tiddlyspaceMenu ul li {
list-style: none;
}
.unsyncedChanges .unsyncedList {
display: block;
}
.unsyncedList {
display: none;
}
#backstage iframe {
height: 600px;
width: 100%;
border: none;
}
!Code
***/
//{{{
(function($) {
var name = "StyleSheet" + tiddler.title;
config.shadowTiddlers[name] = "/*{{{*/\n%0\n/*}}}*/".
format(store.getTiddlerText(tiddler.title + "##StyleSheet")); // this accesses the StyleSheet section of the current tiddler (the plugin that contains it)
store.addNotification(name, refreshStyles);
if(!config.extensions.tiddlyweb.status.tiddlyspace_version) { // unplugged
config.extensions.tiddlyweb.status.tiddlyspace_version = "<unknown>";
config.extensions.tiddlyweb.status.server_host = {
url: config.extensions.tiddlyweb.host }; // TiddlySpaceLinkPlugin expects this
}
var disabled_tabs_for_nonmembers = ["PluginManager", "Backstage##FileImport",
"Backstage##BatchOps", "Backstage##SpaceMembers",
"TiddlySpaceTabs##Private", "TiddlySpaceTabs##Drafts"];
var tweb = config.extensions.tiddlyweb;
var tiddlyspace = config.extensions.tiddlyspace;
var currentSpace = tiddlyspace.currentSpace.name;
var imageMacro = config.macros.image;
if(config.options.chkBackstage === undefined) {
config.options.chkBackstage = true;
}
config.tasks.user = {
text: "user: ",
tooltip: "user control panel",
unpluggedText: "unplugged user",
content: "<html><iframe frameBorder='0' src='" + config.extensions.tiddlyweb.host + "/_account'></iframe></html>"
};
config.tasks.space = {
text: "space: ",
tooltip: "space control panel",
className: "right"
};
config.tasks.tiddlyspace = {
text: "",
tooltip: "",
content: "<<tiddler Backstage##Menu>>"
};
if(window.location.protocol == "file:") {
config.unplugged = true; // TODO: move into extensions.tiddly{web/space} namespace!?
config.tasks.space.content = "<<tiddler Backstage##SpaceUnplugged>>";
} else {
config.tasks.space.content = "<html><iframe frameBorder='0' src='/_space'></iframe></html>";
}
config.backstageTasks = ["tiddlyspace", "user", "space"];
config.messages.backstage.prompt = "";
// initialize state
var _show = backstage.show;
backstage.show = function() {
// selectively hide backstage tasks and tabs based on user status
var tasks = $("#backstageToolbar .backstageTask").show();
if(!config.unplugged) {
tweb.getUserInfo(function(user) {
if(user.anon) {
$(".task_user", tasks).hide();
tiddlyspace.disableTab(disabled_tabs_for_nonmembers);
} else {
$(".task_login", tasks).hide();
}
});
}
// display backstage
return _show.apply(this, arguments);
};
if(readOnly) {
tiddlyspace.disableTab(disabled_tabs_for_nonmembers);
}
var tasks = config.tasks;
var commonUrl = "/bags/common/tiddlers/%0";
// mock out renderAvatar if unavailable -- XXX: temporary hotfix, not a permanent solution!
tiddlyspace.renderAvatar = tiddlyspace.renderAvatar || function() {};
backstage.tiddlyspace = {
locale: {
member: "You are a member of this space.",
nonmember: "You are not a member of this space.",
loggedout: "You are currently logged out of TiddlySpace.",
unplugged: "You are unplugged."
},
checkSyncStatus: function(tiddler) {
var bs = backstage.tiddlyspace;
var t = store.filterTiddlers("[is[unsynced]]");
var unsyncedList = $("#backstage .tiddlyspaceMenu .unsyncedList");
if(t.length > 0 && !readOnly) {
bs.tweakMiddleButton("unsyncedIcon");
$("#backstage").addClass("unsyncedChanges");
} else {
bs.tweakMiddleButton();
$("#backstage").removeClass("unsyncedChanges");
}
refreshElements($("#backstage")[0]);
if(tiddler) {
var title = typeof(tiddler) === "string" ? tiddler : tiddler.title;
var el = story.getTiddler(title) || false;
if(el) {
refreshElements(el);
}
}
},
userButton: function(backstageArea, user) {
// override user button (logged in) to show username
var userBtn = $("[task=user]", backstageArea).empty();
if(config.unplugged && user.anon) {
$("<span />").text(tasks.user.unpluggedText).appendTo(userBtn);
} else if(!config.unplugged && user.anon) {
userBtn.remove();
} else {
$("<span />").text(tasks.user.text).appendTo(userBtn);
$("<span />").addClass("txtUserName").text(user.name).appendTo(userBtn);
var container = $("<span />").appendTo(userBtn)[0];
tiddlyspace.renderAvatar(container, user.name,
{ imageOptions: { imageClass:"userSiteIcon", height: 24, width: 24 },
labelOptions: { include: false } });
}
},
showButton: function() {
var showBtn = $("#backstageShow")[0];
var altText = $(showBtn).text();
$(showBtn).empty();
imageMacro.renderImage(showBtn, "backstage.svg",
{ altImage: commonUrl.format("backstage.png"), alt: altText});
},
hideButton: function() {
var hideBtn = $("#backstageHide")[0];
altText = $(hideBtn).text();
$(hideBtn).empty();
imageMacro.renderImage(hideBtn, "close.svg",
{ altImage: commonUrl.format("close.png"), alt: altText, width: 24, height: 24 });
},
middleButton: function(backstageArea, user) {
var bs = backstage.tiddlyspace;
var backstageToolbar = $("#backstageToolbar", backstageArea)[0];
if(config.unplugged) {
config.messages.memberStatus = bs.locale.unplugged;
} else if(!user.anon) {
config.messages.memberStatus = readOnly ? bs.locale.nonmember : bs.locale.member;
} else {
config.messages.memberStatus = bs.locale.loggedout;
}
// construct the tiddlyspace logo
var backstageLogo = $("#[task=tiddlyspace]").empty()[0];
$("<span />").addClass("iconContainer").appendTo(backstageLogo);
$('<span class="logoText"><span class="privateLightText">tiddly</span>' +
'<span class="publicLightText">space</span></span>').
appendTo(backstageLogo);
bs.tweakMiddleButton();
},
tweakMiddleButton: function(iconName) {
var backstageLogo = $("#[task=tiddlyspace] .iconContainer").empty()[0];
var backstageToolbar = $("#backstageToolbar");
var plugin = backstage.tiddlyspace;
if(!iconName) {
iconName = readOnly ? "publicIcon" : "privateAndPublicIcon";
}
config.macros.image.renderImage(backstageLogo, iconName, { width: 24, height: 24 });
},
spaceButton: function(backstageArea, user) {
// override space button to show SiteIcon
var btn = $("[task=space]", backstageArea).show();
if(user && user.anon && config.unplugged) {
btn.hide();
return;
}
btn.empty();
tiddlyspace.renderAvatar(btn[0], currentSpace,
{ imageOptions: { imageClass:"spaceSiteIcon", height: 24, width: 24 },
labelOptions: { include: false } });
$("<span />").text(tasks.space.text).appendTo(btn);
$("<span />").addClass("spaceName").text(currentSpace).appendTo(btn);
},
addClasses: function(backstageArea) {
var tasks = $(".backstageTask", backstageArea);
for(var i = 0; i < tasks.length; i++) {
var btn = $(tasks[i]);
var taskName = btn.attr("task");
btn.addClass("task_%0".format(taskName));
}
}
};
var _init = backstage.init;
backstage.init = function() {
_init.apply(this, arguments);
var init = function(user) {
var backstageArea = $("#backstageArea")[0];
var bs = backstage.tiddlyspace;
store.addNotification(null, bs.checkSyncStatus);
bs.userButton(backstageArea, user);
bs.showButton();
bs.hideButton();
bs.middleButton(backstageArea, user);
bs.spaceButton(backstageArea, user);
bs.addClasses(backstageArea); // for IE styling purposes
bs.checkSyncStatus();
};
tweb.getUserInfo(init);
};
var home = config.macros.homeLink = {
locale: {
linkText: "your home space"
},
handler: function(place) {
var container = $("<span />").appendTo(place)[0];
tweb.getUserInfo(function(user) {
if(!user.anon && user.name != currentSpace) {
createSpaceLink(container, user.name, null, home.locale.linkText);
}
});
}
};
config.macros.exportSpace = {
handler: function(place, macroName, params) {
var filename = params[0] ||
"/tiddlers.wiki?download=%0.html".format(currentSpace);
$('<a class="button">download</a>'). // XXX: i18n
attr("href", filename).appendTo(place);
}
};
$.extend(config.messages, {
syncExplanation: "You are currently viewing an offline version of this TiddlySpace. From here you can sync your offline copy with the online version.",
syncListHeading: "Unsaved tiddlers listed below"});
config.extensions.ServerSideSavingPlugin.reportSuccess = function(msg, tiddler) {
backstage.tiddlyspace.checkSyncStatus(tiddler);
msg = config.extensions.ServerSideSavingPlugin.locale[msg];
var link = "/" + encodeURIComponent(tiddler.title);
displayMessage(msg.format([tiddler.title]), link);
};
})(jQuery);
//}}}
when I reach inbox zero in all my inboxes I'm lost for what to do
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
<<<
I wouldn't hire this person under any circumstances. No, really. I've hired and interviewed enough people in my life that I want nothing to do with someone who fails to comprehend reality. Heck I've never made anyone write code in an interview and probably wouldn't hire someone who demanded to do so.
<<<
[[The Codist|http://thecodist.com/article/interviews_can_be_a_terrible_way_to_identify_good_programmers]]
!URL
http://www.mediaite.com/tv/jon-stewart-feels-better-about-america-afternews-of-the-world-fiasco-recap/
!Description
Oliver detailed the collapse of News of the World one step at a time, with Stewart challenging him every step of the way with American media travesties, like Casey Anthony being paid by ABC News for exclusives, but he couldn’t win against what the News of the World had been doing.
!Notes
Woot!
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
/***
|''Name''|ImageMacroPlugin|
|''Version''|0.9.4|
|''Description''|Allows the rendering of svg images in a TiddlyWiki|
|''Author''|Osmosoft|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''Notes''|Currently only works in modern browsers (not IE)|
|''Requires''|BinaryTiddlersPlugin|
!Usage
{{{<<image SVG>>}}} will render the text of the tiddler with title SVG as an SVG image (but not in ie where it will fail silently)
!!Parameters
width/height: specify width/height parameters
link: make the image link to a given location
tiddlyLink: link to a tiddler
!Notes
Binary tiddlers in TiddlyWeb when passed through the wikifier will be shown as images.
eg. {{{<<view text wikified>>}}} on a binary tiddler will show the image.
{{{<<view fieldname image>>}}}
will render the value of the tiddler field 'fieldname' as an image. This field can contain a tid
{{{<<image SiteIcon>>}}}
will create an image tag where the tiddler has content type beginning image and not ending +xml
will attempt to create svg object in other scenarios
{{{<<image /photos/x.jpg>>}}}
will create an image tag with src /photos/x.jpg as long as there is not a tiddler called /photos/x.jpg in
which case it will render that tiddler as an image. Note for the case of svg files it will attempt to render as an svg if possible via the image
tag. It doesn't embed the svg in the dom for security reasons as svg code can contain javascript.
!Code
***/
//{{{
(function($) {
var macro = config.macros.image = {
shim: "/bags/common/tiddlers/shim",
ieVersion: config.browser.isIE ? parseInt(config.browser.ieVersion[1], 10) : false,
svgns: "http://www.w3.org/2000/svg",
xlinkns: "http://www.w3.org/1999/xlink",
svgAvailable: document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"),
_fixPrefix: 1,
_external_cache: {},
_image_tag_cache: {},
_image_dimensions: {},
locale: {
badImage: "This image cannot be displayed."
},
handler: function(place, macroName, params, wikifier, paramString, tiddler){
var imageSource = params[0];
// collect named arguments
var args = macro.getArguments(paramString, params);
this.renderImage(place, imageSource, args);
},
init: function() {
var startupImages = store.getTaggedTiddlers("systemImage");
var place = $("<div />").attr("id", "systemImageArea").appendTo("body").hide()[0];
for(var i = 0; i < startupImages.length; i++) {
var image = startupImages[i];
macro.renderImage(place, image.title, { idPrefix: "" });
}
var data = new Image();
data.onload = function() {
// note ie 8 only supports data uris up to 32k so cannot be relied on
macro.supportsDataUris = this.width != 1 || this.height != 1 ? false : true;
macro.supportsDataUris = macro.ieVersion && macro.ieVersion < 9 ? false : macro.supportsDataUris;
};
data.onerror = data.onload;
data.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
},
refreshImage: function(src) {
var elements = macro._image_tag_cache[src] ? macro._image_tag_cache[src] : [];
if(macro._image_dimensions[src]) {
macro._image_dimensions[src] = false;
}
for(var i = 0; i < elements.length; i++) {
var el = $(elements[i]);
var newSrc = "%0?nocache=%1".format(src, Math.random());
el.attr("src", newSrc); // force reload
}
},
isBinaryImageType: function(contentType) {
return (contentType && contentType.indexOf("image") === 0 &&
contentType.indexOf("+xml") != contentType.length - 4) ? true : false;
},
isImageTiddler: function(tiddler) {
return macro.isSVGTiddler(tiddler) || macro.isBinaryImageTiddler(tiddler);
},
isSVGTiddler: function(tiddler) {
var type = tiddler ? tiddler.fields['server.content-type'] : false;
return type == "image/svg+xml";
},
isBinaryImageTiddler: function(tiddler) {
return macro.isBinaryImageType(tiddler.fields['server.content-type']);
},
renderImage: function(place, imageSource, options) {
var imageTiddler = store.getTiddler(imageSource);
var container;
var classes = ["image"];
if(options.link) {
classes = classes.concat(["imageLink", "externalLink"]);
container = $("<a />").attr("href", options.link).appendTo(place)[0];
} else if(options.tiddlyLink) {
classes.push("imageLink");
container = createTiddlyLink(place, options.tiddlyLink, false);
} else {
container = $("<span />").appendTo(place)[0];
}
$(container).addClass(classes.join(" "));
options = options ? options : {};
if(imageTiddler && macro.isBinaryImageTiddler(imageTiddler)) { // handle the case where we have an image url
return macro._renderBinaryImageTiddler(container, imageTiddler, options);
} else if(imageTiddler){ // handle the case where we have a tiddler
return macro._renderSVGTiddler(container, imageTiddler, options);
} else { // we have a string representing a url
return macro._renderBinaryImageUrl(container, imageSource, options);
}
},
_renderAlternateText: function(container, options) {
var img;
var src = options.src || "";
if(options.width && options.height) {
img = $("<img />").attr("src", src).addClass("svgImageText").attr("width", options.width).
attr("height", options.height).appendTo(container);
}
var alt = options.alt;
if(img && alt) {
img.attr("alt", alt).attr("title", alt);
} else if(alt) {
$(container).addClass("svgImageText").text(alt);
}
macro._image_tag_cache[src] = img;
},
_renderSVGTiddler: function(place, tiddler, options) {
if(!options) {
options = {};
}
merge(options, { tiddler: tiddler, fix: true});
if(macro.svgAvailable) {
this._importSVG(place, options); // display the svg
} else if(options.altImage) {
var image = options.altImage;
delete options.altImage;
this._renderBinaryImageUrl(place, image, options);
} else {
this._renderAlternateText(place, options); // instead of showing the image show the alternate text.
}
},
_renderBinaryImageTiddler: function(place, tiddler, options) {
var resourceURI;
var fields = tiddler.fields;
if(fields["server.type"] == "tiddlyweb") { // construct an accurate url for the resource
resourceURI = "%0/%1/tiddlers/%2".format(config.defaultCustomFields["server.host"],
fields["server.workspace"], encodeURI(fields["server.title"]));
} else { // guess the url for the resource
resourceURI = tiddler.title;
}
var ctype = fields["server.content-type"] || tiddler.type;
var text = tiddler.text;
if(macro.supportsDataUris && ctype && text.indexOf("<html") == -1) {
var uri = "data:%0;base64,%1".format(ctype, text);
options.src = resourceURI;
return macro._renderBinaryImageUrl(place, uri, options);
} else if(options.src) {
return macro._renderBinaryImageUrl(place, options.src, options);
} else {
return macro._renderBinaryImageUrl(place, resourceURI, options);
}
},
_renderImageTag: function(container, src, width, height, options) {
var img;
img = $("<img />").appendTo(container);
if(height) {
img.attr("height", height);
}
if(width) {
img.attr("width", width);
}
if(macro.ieVersion && macro.ieVersion < 7 && macro.shim && options.ie6png) {
$(img).css({width: userW, height: userH,
filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%0', sizingMethod='scale')".format(src)
}).attr("src", macro.shim);
} else {
img.attr("src", src);
}
if(!macro._image_tag_cache[options.srcUrl]) {
macro._image_tag_cache[options.srcUrl] = [];
}
img = $(img).addClass(options.imageClass)[0];
macro._image_tag_cache[options.srcUrl].push(img);
return img;
},
_getDimensions: function(realDimensions, reqDimensions, preserve) {
var w = realDimensions.width;
var h = realDimensions.height;
var reqh = reqDimensions.height;
var reqw = reqDimensions.width;
var finalw = w, finalh = h;
var ratiow = reqw / w, ratioh = reqh / h;
var scaledw = ratioh * w;
var scaledh = ratiow * h;
if(!reqw && reqh) {
finalw = scaledw;
finalh = reqh;
} else if(reqw && !reqh) {
finalw = reqw;
finalh = scaledh;
} else if(reqh && reqw) {
var preserveWidth = w > h ? true : false;
if(preserve) {
if(preserveWidth && scaledh < reqh) {
finalh = scaledh;
finalw = reqw;
} else {
finalh = reqh;
finalw = scaledw;
}
} else {
finalw = reqw;
finalh = reqh;
}
}
return { width: parseInt(finalw, 10), height: parseInt(finalh, 10) };
},
_renderBinaryImageUrl: function(container, src, options) {
var srcUrl = options.src ? options.src : src;
srcUrl = srcUrl.indexOf("/") === -1 ? "/%0".format(srcUrl) : srcUrl; // for IE.
var image_dimensions = macro._image_dimensions[srcUrl];
var image = new Image(); // due to weird scaling issues where you use just a width or just a height
var createImageTag = function(dimensions, error) {
if(error) {
var altImage = options.altImage;
if(altImage) {
delete options.altImage;
macro._renderBinaryImageUrl(container, altImage, options);
} else {
options.src = src;
macro._renderAlternateText(container, options);
}
} else {
var dim = macro._getDimensions(dimensions, {
width: options.width, height: options.height }, options.preserveAspectRatio);
options.srcUrl = srcUrl;
macro._renderImageTag(container, src, dim.width, dim.height, options);
}
};
if(!image_dimensions) {
image.onload = function() {
var dimensions = { width: image.width, height: image.height};
macro._image_dimensions[srcUrl] = dimensions;
createImageTag(dimensions);
};
image.onerror = function() {
createImageTag(null, true);
};
image.src = src;
} else {
createImageTag(image_dimensions);
}
},
_generateIdPrefix: function(){
return "twsvgfix_" + (this._fixPrefix++).toString() + "_";
},
_fixSVG: function(childNodes, idPrefix) {
var urlPattern = /url\(\#([^\)]*)\)*/ig;
var fixes = [
{ attr: "id", pattern: /^(.*)$/ig },
{ attr: "href", namespace: macro.xlinkns, pattern: /^#(.*)$/ig }
];
var url_fixes = ["filter", "fill", "mask", "stroke", "style"];
for(var i = 0; i < url_fixes.length; i++) {
fixes.push({ attr: url_fixes[i], pattern: urlPattern });
}
for(var t = 0; t < childNodes.length; t++) {
var node = childNodes[t];
for(var a = 0; a < fixes.length; a++) {
var fix = fixes[a];
var attr = fix.attr;
var ns = fix.namespace || "";
if(node.hasAttributeNS && node.hasAttributeNS(ns, attr)) {
var v = node.getAttributeNS(ns, attr);
fix.pattern.lastIndex = 0;
var match = fix.pattern.exec(v);
if(match) {
// Make sure replacement string doesn't contain any single dollar signs
var toReplace = match[1];
if(toReplace.indexOf(idPrefix) !== 0 && toReplace.indexOf("twglobal_") !== 0) {
var replacement = (idPrefix + toReplace).replace("$", "$$$$");
v = v.replace(match[1], replacement);
}
node.setAttributeNS(ns, attr,v);
}
}
}
var children = node.childNodes;
if(children.length > 0) {
this._fixSVG(children, idPrefix);
}
}
},
_importSVG: function(place, options){
options = options ? options : {};
var svgDoc, tiddlerText = options.tiddler.text;
if (window.DOMParser) {
svgDoc = new DOMParser().parseFromString(tiddlerText, "application/xml").documentElement;
var idPrefix = options.idPrefix || this._generateIdPrefix();
this._fixSVG([svgDoc], idPrefix);
var el = document.importNode(svgDoc, true);
var svgHolder = document.createElementNS(macro.svgns,"svg");
var width = options.width;
var height = options.height;
if(width || height) {
if(width && height) { // set view box of containing svg element based on the svg viewbox and width and height.
var viewBox = el.getAttribute("viewBox");
var topLeft = "0 0";
if(viewBox) {
topLeft = viewBox.replace(/([0-9]*) +([0-9]*) +([0-9]*) +([0-9]*) */gi,"$1 $2");
}
svgHolder.setAttributeNS(macro.svgns, "viewBox", "0 0 %0 %1".format(width, height));
} else {
if(!width) {
width = el.getAttribute("width");
}
if(!height) {
height = el.getAttribute("height");
}
}
svgHolder.setAttribute("width", width);
svgHolder.setAttribute("height", height);
el.setAttribute("width", "100%");
el.setAttribute("height", "100%");
svgHolder.setAttribute("class", "svgImage svgIcon %0".format(options.imageClass || ""));
svgHolder.appendChild(el);
place.appendChild(svgHolder);
}
else {
var existing = el.className ? el.className.baseVal : "";
el.setAttribute("class","svgImage %0".format(existing));
place.appendChild(el);
}
// if a tiddler attribute is set this is read as a link
$("[tiddler], [tiddlyLink]", place).attr("refresh", "link").click(function(ev) {
var tiddler = $(ev.target).attr("tiddlyLink");
if(tiddler) {
story.displayTiddler(ev.target, tiddler);
}
});
}
},
getArguments: function(paramString, params) {
var args = paramString.parseParams("name", null, true, false, true)[0];
var options = {};
for(var id in args) {
if(true) {
var p = args[id];
if(id == "def") {
options[id] = p;
} else {
options[id] = p[0];
}
}
}
var width = isNaN(params[1]) ? false : parseInt(params[1], 10);
var height = isNaN(params[2]) ? false : parseInt(params[2], 10);
options.width = macro.lookupArgument(options, "width", width);
options.height = macro.lookupArgument(options, "height", height);
options.preserveAspectRatio = args.preserveAspectRatio &&
args.preserveAspectRatio[0] == "yes" ? true : false;
options.tiddlyLink = macro.lookupArgument(options, "tiddlyLink", false);
options.link = macro.lookupArgument(options, "link", false);
return options;
},
lookupArgument: function(args, id, ifEmpty) {
return args[id] ? args[id] : ifEmpty;
}
};
// update views
var _oldwikifiedview = config.macros.view.views.wikified;
// update wikifier to check tiddler type before rendering
merge(config.macros.view.views, {
wikified: function(value, place, params, wikifier, paramString, tiddler) {
if(macro.isImageTiddler(tiddler) && params[0] == "text") {
var newplace = $("<div />").addClass("wikifiedImage").appendTo(place)[0];
macro.renderImage(newplace, tiddler.title, { alt: macro.locale.badImage });
} else {
_oldwikifiedview.apply(this, arguments);
}
},
image: function(value, place, params, wikifier, paramString, tiddler) {
// a field can point to another tiddler whereas text is the current tiddler.
var title = params[0] == "text" ? tiddler.title : value;
var args = macro.getArguments(paramString, params);
macro.renderImage(place, title, args);
}
});
config.shadowTiddlers.StyleSheetImageMacro = [".wikifiedImage svg, .wikifiedImage .image { width: 80%; }",
".svgImageText { background-color:[[ColorPalette::Error]]; color:#ddd; display: inline-block; }",
"span.svgImageText { display: inline-block; overflow: hidden; }"
].join("");
store.addNotification("StyleSheetImageMacro", refreshStyles);
})(jQuery);
//}}}
<<<
By contrast, Benefit Corporations such as Patagonia must commit to creating an overarching “general public benefit.” Companies that incorporate as Benefit Corps must consider an array of stakeholders beyond shareholders, including workers, suppliers, the environment and the local community. They must measure their progress toward that goal against a third-party standard.
<<<
[[Patagonia Road Tests New Sustainability Legal Status - Bloomberg|http://www.bloomberg.com/news/2012-01-04/patagonia-road-tests-new-sustainability-legal-status.html]]
Background:rgb(240,240,240)
Foreground:rgb(4,36,16)
PrimaryPale:rgb(255,255,255)
PrimaryLight:rgb(198,198,198)
PrimaryMid:rgb(50,50,50)
PrimaryDark:rgb(29,29,29)
SecondaryPale:rgb(255,255,255)
SecondaryLight:rgb(213,213,213)
SecondaryMid:rgb(113,113,113)
SecondaryDark:rgb(90,90,90)
TertiaryPale:rgb(255,255,255)
TertiaryLight:rgb(245,245,245)
TertiaryMid:rgb(108,108,108)
TertiaryDark:rgb(29,29,29)
Error:#f87
!URL
http://stackoverflow.com/questions/260335/proximity-search/260347#260347
!Description
Proximity Search - Stack Overflow
!URL
http://www.washingtonclimbers.org/Climbing/sehome.htm
!Description
overzealous caching can eat you
!URL
http://www.nytimes.com/2008/06/17/science/17mund.html?_r=1&partner=rssnyt&emc=rss&oref=slogin
!Description
It seems likely that my antipathy toward facebook is in large part due to the way in which it does such a stellar job of exposing the banality of existence.
(function() {
var getCSRFToken = function(window) {
// XXX: should not use RegEx - cf.
// http://www.quirksmode.org/js/cookies.html
// https://github.com/TiddlySpace/tiddlyspace/commit/5f4adbe009ed4bda3ce39058a3fb07de1420358d
var regex = /^(?:.*; )?csrf_token=([^(;|$)]*)(?:;|$)/;
var match = regex.exec(document.cookie);
var csrf_token = null;
if (match && (match.length === 2)) {
csrf_token = match[1];
}
return csrf_token;
};
if (typeof config !== 'undefined' && config.extensions &&
config.extensions.tiddlyspace &&
config.extensions.tiddlyspace.getCSRFToken === null) {
config.extensions.tiddlyspace.getCSRFToken = getCSRFToken;
} else {
window.getCSRFToken = getCSRFToken;
}
})(window);
!URL
http://google-opensource.blogspot.com/2011/11/introducing-closure-stylesheets.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+GoogleOpenSourceBlog+%28Google+Open+Source+Blog%29
!Description
As the existing Closure Tools have done for JavaScript and HTML, Closure Stylesheets will help you write CSS in a maintainable way, while also empowering you to deliver optimized code to your users.
!Notes
Maintainable is nice, but "deliver[ing] optimized code to your users" is code for "destroying the view source experience." Please stop encouraging this behavior google.
<<<
Finally, I'd like to tell you that the best way to get good at something is to not attach your identity to the activity. I do say I am a programmer, but really I mean I'm a person who writes code (and does a bunch of other stuff). The skill of coding is not who I am, it's just one of the many things that makes me the complex interesting person I am. Who am I? I don't know, or I at least can't describe it in words.
<<<
[[Learn Code The Hard Way -- Books And Courses To Learn To Code|http://learncodethehardway.org/blog/MAY_15_2012.html]]
/***
!Description
Updates the html serialization in TiddlySpace to provide routes to the takenote tool
***/
$(document).ready(function() {
var place = $("#container").length > 0 ? $("#container")[0] : document.body;
var space = window.location.host.split(".")[0]
var bag = $(".bag").first().text() || space + "_public";
var title = $("#title").text();
// add edit link to notabene
$.ajax({ url: "/spaces/" + space + "/members",
success: function(r) {
var isTiddler = $(".tiddler").length > 0;
if(r) {
if(bag == space + "_public") {
if(isTiddler) {
$("<a id='editLink' />").attr("href", "/takenote#!/quickedit/tiddler/" + title).
text("edit note").prependTo(place);
} else { // when viewing a collection add link to create new note in collection
$("<a id='editLink' />").attr("href", "/takenote").
text("take note").prependTo(place);
}
} else if(bag == space + "_private") {
if(isTiddler) {
$("<a id='editLink' />").attr("href", "/takenote#!/quickedit/bags/" + bag + "/tiddler/" + title).
text("edit note").prependTo(place);
}
}
if($("#backstage").length === 0) {
$(['<ul id="backstage">',
'<li><a href="/dashboard">dashboard</a></li><li><a href="/takenote">takenote</a></li>',
'</ul>'].join("")).prependTo(document.body);
}
}
}
});
});
!URL
http://www.bbc.co.uk/news/education-12596596
!Description
Actress Joanna Lumley has claimed that British children are being brought up with "slack" morals.
!Notes
The irony here is incredibly amusing but at the same time it's hard not to agree with her after taking a walk around any UK town.
I miss research. In libraries. With books.
A guy just accosted me for OpenOffice support while I was sitting in a cafe. Getting accosted for support isn't that unusual, but I guess OpenOffice is getting some penetration. He just assumed I knew what it was.
<<<
Most schools and workplaces now organize workers and students into groups, believing that creativity and productivity comes from a gregarious place. This is nonsense, of course. From Darwin to Picasso to Dr. Seuss, our greatest thinkers have often worked in solitude, and in my book I examine lots of research on the pitfalls of groupwork.
<<<
[[The Power of Introverts: A Manifesto for Quiet Brilliance: Scientific American|http://www.scientificamerican.com/article.cfm?id=the-power-of-introverts&print=true]]
!URL
http://blog.jonudell.net/2011/05/17/awakened-grains-of-sand/
!Description
In the virtual dimension none of these laws apply.
!Notes
What happens when things are links with descriptors, instead of physical things.
> I strongly suspect the things people believe in are usually just what they instinctively feel is right; the excuses, the justifications, the things you're supposed to argue about, come later. They're the least important part of the the belief. That's why you can destroy them, win an argument, prove the other person wrong, and still they believe what they did in the first place.
-- From //Use of Weapons// by Iain M Banks
/***
|''Name:''|TiddlySpaceIntraSpaceInclusion|
|''Description:''|Provides support for {{{<<tiddler Foo@bar>>}}} and {{{<<tiddler [[Foo]]@bar>>}}}|
|''Author:''|Jon Robson|
|''Source:''|https://github.com/jdlrobson/TiddlyWikiPlugins/raw/master/plugins/TiddlySpaceIntraSpaceInclusion/TiddlySpaceIntraSpaceInclusion.js|
|''Version:''|0.3.8a|
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''~CoreVersion:''|2.4|
***/
//{{{
(function() {
var _tidtext = TiddlyWiki.prototype.getTiddlerText;
var cache = {};
// allmost the same regExp as in TiddlySpaceLinkPlugin but .. no "mg" parameter, because it didn't work for this usecase.
config.textPrimitives.spacenameLinkRegExp = new RegExp(config.textPrimitives.unWikiLink +
"?(" + config.textPrimitives.bareTiddlerLetter + "*)@(" + config.textPrimitives.spaceName + ")", "");
config.textPrimitives.tiddlyLinkSpacenameLinkRegExp = new RegExp("\\[\\[(.*?)(?:\\|(.*?))?\\]\\]@(" + config.textPrimitives.spaceName + ")", "");
TiddlyWiki.prototype.getTiddlerText = function(title, defaultText) {
var ct = config.textPrimitives;
var match = ct.spacenameLinkRegExp.exec(title); // foo@bar
var match2 = ct.tiddlyLinkSpacenameLinkRegExp.exec(title); // [[foo]]@bar
if(match || match2) {
// console.log('inner: ', 'spacename: ', match, 'tiddlyLink: ', match2, 'place: ');
var tidtitle, space;
if(match[1] && match.length === 3) {
tidtitle = match[1];
space = match[2];
} else if(match2 && match2.length === 4) {
tidtitle = match2[1];
space = match2[3];
}
var newtitle = tidtitle + "@" + space;
if(tidtitle && space) {
title = newtitle;
}
if(tidtitle && space && !store.getTiddler(newtitle)) {
var tiddler = new Tiddler(title);
// get the tiddler, where the macro is rendered. //XXX will need more testing
var el = story.findContainingTiddler(place);
var refreshTitle = (el) ? el.getAttribute('tiddler') : null;
tiddler.text = "//retrieving from server//";
tiddler.fields.doNotSave = "true";
tiddler.tags = ["excludeLists", "excludeSearch", "excludeMissing"];
merge(tiddler.fields, config.defaultCustomFields);
tiddler.fields["server.bag"] = space + "_public";
tiddler = store.addTiddler(tiddler);
ajaxReq({ url: "/bags/" + space + "_public/tiddlers/" + tidtitle,
dataType: "json",
success: function(tid) {
var tiddler = store.getTiddler(title);
tiddler.text = tid.text;
store.addTiddler(tiddler);
// store.notify(title,true);
story.refreshTiddler(refreshTitle,null,true);
// story.refreshAllTiddlers(); // hacky but above link doesn't always seem to work!
},
error: function() {
var tiddler = store.getTiddler(title);
tiddler.text = "//error retrieving tiddler {{{" + title + "}}} from space @" + space + "//";
store.addTiddler(tiddler);
// store.notify(title,true);
story.refreshTiddler(refreshTitle,null,true);
// story.refreshAllTiddlers(); // hacky but above link doesn't always seem to work!
}
});
}
}
return _tidtext.apply(this, [title, defaultText]);
}
})();
//}}}
/***
|Name|BetterTimelineMacro|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#BetterTimelineMacro|
|Version|0.5 beta|
|Requires|~TW2.x|
//This version slightly modified by @cdent to support tag handling better.//
!!!Description:
A replacement for the core timeline macro that offers more features:
*list tiddlers with only specfic tag
*exclude tiddlers with a particular tag
*limit entries to any number of days, for example one week
*specify a start date for the timeline, only tiddlers after that date will be listed.
!!!Installation:
Copy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.
Edit the ViewTemplate to add the fullscreen command to the toolbar.
!!!Syntax:
{{{<<timeline better:true>>}}}
''the param better:true enables the advanced features, without it you will get the old timeline behaviour.''
additonal params:
(use only the ones you want)
{{{<<timeline better:true onlyTag:Tag1 excludeTag:Tag2 sortBy:modified/created firstDay:YYYYMMDD maxDays:7 maxEntries:30>>}}}
''explanation of syntax:''
onlyTag: only tiddlers with this tag will be listed. Default is to list all tiddlers.
excludeTag: tiddlers with this tag will not be listed.
sortBy: sort tiddlers by date modified or date created. Possible values are modified or created.
firstDay: useful for starting timeline from a specific date. Example: 20060701 for 1st of July, 2006
maxDays: limits timeline to include only tiddlers from the specified number of days. If you use a value of 7 for example, only tiddlers from the last 7 days will be listed.
maxEntries: limit the total number of entries in the timeline.
!!!History:
*28-07-06: ver 0.5 beta, first release
!!!Code
***/
//{{{
// Return the tiddlers as a sorted array
TiddlyWiki.prototype.getTiddlers = function(field,excludeTag,includeTag)
{
var results = [];
this.forEachTiddler(function(title,tiddler)
{
if(excludeTag == undefined || !tiddler.tags.contains(excludeTag))
if(includeTag == undefined || tiddler.tags.contains(includeTag))
results.push(tiddler);
});
if(field)
results.sort(function (a,b) {if(a[field] == b[field]) return(0); else return (a[field] < b[field]) ? -1 : +1; });
return results;
}
//this function by Udo
function getParam(params, name, defaultValue)
{
if (!params)
return defaultValue;
var p = params[0][name];
return p ? p[0] : defaultValue;
}
window.old_timeline_handler= config.macros.timeline.handler;
config.macros.timeline.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
var args = paramString.parseParams("list",null,true);
var betterMode = getParam(args, "better", "false");
if (betterMode == 'true')
{
var sortBy = getParam(args,"sortBy","modified");
var excludeTag = getParam(args,"excludeTag",undefined);
var includeTag = getParam(args,"onlyTag",undefined);
var tiddlers = store.getTiddlers(sortBy,excludeTag,includeTag);
var firstDayParam = getParam(args,"firstDay",undefined);
var firstDay = (firstDayParam!=undefined)? firstDayParam: "00010101";
var lastDay = "";
var field= sortBy;
var maxDaysParam = getParam(args,"maxDays",undefined);
var maxDays = (maxDaysParam!=undefined)? maxDaysParam*24*60*60*1000: (new Date()).getTime() ;
var maxEntries = getParam(args,"maxEntries",undefined);
var last = (maxEntries!=undefined) ? tiddlers.length-Math.min(tiddlers.length,parseInt(maxEntries)) : 0;
for(var t=tiddlers.length-1; t>=last; t--)
{
var tiddler = tiddlers[t];
var theDay = tiddler[field].convertToLocalYYYYMMDDHHMM().substr(0,8);
if ((theDay>=firstDay)&& (tiddler[field].getTime()> (new Date()).getTime() - maxDays))
{
if(theDay != lastDay)
{
var theDateList = document.createElement("ul");
place.appendChild(theDateList);
createTiddlyElement(theDateList,"li",null,"listTitle",tiddler[field].formatString(this.dateFormat));
lastDay = theDay;
}
var theDateListItem = createTiddlyElement(theDateList,"li",null,"listLink",null);
theDateListItem.appendChild(createTiddlyLink(place,tiddler.title,true));
}
}
}
else
{
window.old_timeline_handler.apply(this,arguments);
}
}
//}}}
!URL
http://groups.google.com/group/tiddlywikidev/browse_frm/thread/542342c4533da8f1#
!Description
Time for TW 2.6.3? Also improving www.tiddlywiki.com? - TiddlyWikiDev | Google Groups
oh bejebus it is november already
after I don't know how many years apache's encoding of / in PATH_INFO is still completely wrong
!URL
http://sentra.ischool.utexas.edu/~adillon/blog/archives/29
!Description
i love it when dillion uses words like poverty
twikifier@cdent now running live on http://tiddlyspace.com
!URL
http://effbot.org/zone/simple-top-down-parsing.htm
!Description
!URL
http://adrianhosey.blogspot.com/2011/06/seo-changes-forever-or-so-ive-read.html
!Description
If Panda transforms "SEO consultants" to become "user experience consultants" that's probably not a bad thing.
!Notes
SEO is dead, long live UX.
/*!
|''Name:''|NiceTaggingPlugin|
|''Description:''|Creates a nicer interface for adding and removing TiddlyWiki. Ideal for tiddly novices. |
|''Version:''|0.6.6|
|''Date:''|October 2010|
|''Source:''|http://svn.tiddlywiki.org/Trunk/contributors/JonRobson/plugins/niceTagging/plugins/NiceTaggingPlugin.js|
|''Author:''|Jon Robson|
|''License:''|[[BSD open source license]]|
|''CoreVersion:''|2.3|
|''Dependencies:''||
!Usage
{{{<<niceTagger tags>>}}} or {{{<<niceTagger field>>}}}
!!Additional Parameters
splitOn: <character>
valuesSource: <tiddler title>
textcase: <lower>
!StyleSheet
.tip {font-style:italic;font-weight:bold;}
input.dp-applied {width: 140px; float: left;}
.niceTagger input {width:200px; float:left;}
.deleter {color:red; font-weight:bold; padding:2px; cursor:pointer;}
.ac_results {padding: 0px;border: 1px solid black;background-color: white;overflow: hidden;z-index: 99999;}
.ac_results ul {width: 100%;list-style-position: outside;list-style: none;padding: 0;margin: 0;}
.ac_results li {margin: 0px;padding: 2px 5px;cursor: default;display: block;font: menu;font-size: 12px;line-height: 16px;overflow: hidden;}
.ac_loading {background: white url('indicator.gif') right center no-repeat;}
.niceTaggerAdder input {width:auto; display: inline;}
.ac_odd {background-color: #eee;}
.ac_over {background-color: #0A246A;color: white;}
*/
//{{{
(function($) {
config.shadowTiddlers.NiceTaggingStyle = store.getTiddlerText(tiddler.title + "##StyleSheet");
store.addNotification("NiceTaggingStyle", refreshStyles);
String.prototype.toJSON = function(){
var namedprms = this.parseParams(null, null, true);
var options ={};
for(var i=0; i < namedprms.length;i++){
var nameval = namedprms[i];
if(nameval.name) {
options[nameval.name] = nameval.value;
}
}
return options;
};
var macro = config.macros.niceTagger = {
lingo:{
add: "add"
},
twtags: {},
initialised:{},
init: function(field){
field = !field ? 'tags' : field;
if(this.initialised[field]){
if(field == 'tags') {
var numTags = store.getTags();
if(numTags.length == this.twtags[field].length) {
return;
}
} else {
return;
}
}
var tiddlers= store.getTiddlers();
macro.twtags[field] = [];
var uniqueSuggestions = [];
for(var i=0; i < tiddlers.length; i++){
var tid = tiddlers[i];
var values;
if(field=='tags') {
values = tid.tags;
} else {
values= tid.fields[field];
values = values ? values : "";
values = values.readBracketedList();
}
for(var j=0; j < values.length; j++){
uniqueSuggestions.pushUnique(values[j]);
}
}
macro.twtags[field] = uniqueSuggestions;
this.initialised[field] =true;
},
save: function(title, field, listvalues, place, autosavechanges) {
var tiddler = store.getTiddler(title);
var tiddlerEl = story.getTiddler(title);
var valueToSave;
valueToSave = String.encodeTiddlyLinkList(listvalues);
var el = $("[edit=%0]".format([field]), tiddlerEl);
if(el.length === 0) {
el = $("<input />").attr("type", "hidden").attr("edit", field).appendTo(place);
}
el.val(valueToSave);
var dummy = new Tiddler(title);
if(field == "tags") {
dummy.tags = listvalues;
} else {
dummy.fields[field] = valueToSave;
}
return dummy;
},
refreshFieldDisplay: function(place, tiddler, field) {
var container = $(".niceTagger", place);
container.empty();
var values;
if(!field || field == 'tags') {
values = tiddler.tags;
} else {
values = tiddler.fields[field] ? tiddler.fields[field].readBracketedList() : [];
}
for(var t = 0; t < values.length; t++){
var tag = values[t];
$("<span />").addClass("tag").text(tag).appendTo(container);
$("<span />").addClass("deleter").text("x").attr("deletes", escape(tag)).appendTo(container);
}
$(".deleter", place).click(function(ev){
var todelete = $(ev.target).attr("deletes");
var newValues = [];
for(var i = 0; i < values.length; i++){
var value = values[i];
if(escape(value) != todelete) {
newValues.push(value);
}
}
tiddler = macro.save(tiddler.title, field, newValues, place, tiddler.autosavechanges);
macro.refreshFieldDisplay(place, tiddler, field);
});
},
saveNewValue: function(tiddler, field, value, container, splitChar) {
var tiddlerEl = story.getTiddler(tiddler.title);
var editEl = $("[edit=%0]".format([field]), tiddlerEl);
var adder = $(".niceTaggerAdder input[type=text]", container);
var saveThis;
if(editEl.length > 0) {
saveThis = editEl.val() || "";
saveThis = saveThis.readBracketedList();
} else {
if(field == 'tags') {
saveThis = tiddler.tags;
} else {
var val = tiddler.fields[field];
val = val ? val : "";
saveThis = val.readBracketedList();
}
}
value = typeof(value) == 'string' ? value.trim() : value;
if(value.length === 0) {
return;
}
var newValues;
if(splitChar && value && value.indexOf(splitChar) != -1){
newValues = value.split(splitChar);
} else {
newValues = [value];
}
for(var i = 0; i < newValues.length;i++){
var svalue = newValues[i];
saveThis.pushUnique(svalue);
}
tiddler = macro.save(tiddler.title, field, saveThis, container, tiddler.autosavechanges);
macro.refreshFieldDisplay(container, tiddler, field);
$(adder).val("");
},
getSuggestionsFromTiddler: function(srcTiddler, textcase){
var suggestions = [];
if(srcTiddler){
var src = store.getTiddler(srcTiddler);
var text = src.text;
var tempdiv = document.createElement("div");
wikify(text, tempdiv, null, src);
var html = $(tempdiv).html();
suggestions = html.split(/<br\/?>/gi);
}
var finalSuggestions = [];
for(var i=0; i < suggestions.length; i++){
var val = suggestions[i].trim();
if(textcase && textcase == "lower") {
val = val.toLowerCase();
}
finalSuggestions.pushUnique(val);
}
return finalSuggestions;
},
removeFromList: function(list,removeList){
var uniqueSuggestions = [];
for(var i=0; i < list.length; i++){
var s =list[i];
if(s && typeof(s) == 'string'){
if(uniqueSuggestions.indexOf(s) ==-1 && removeList.indexOf(s) ==-1){
uniqueSuggestions.push(s);
}
}
}
return uniqueSuggestions;
},
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
var options = paramString.toJSON();
var args = paramString.parseParams("anon")[0];
if(options.autoSaveChanges) {
tiddler.autosavechanges = true;
}
if(!options.field) {
options.field = args.anon ? args.anon[0] : "tags";
}
this.init(options.field);
var container = $("<div />").addClass("niceTaggerContainer").attr("field", options.field).
appendTo(place)[0];
var displayer = $("<div />").addClass("niceTagger").appendTo(container)[0];
macro.refreshFieldDisplay(container, tiddler, options.field);
var tagplace = $("<div />").addClass("niceTaggerAdder").appendTo(container)[0];
var splitChar = options.splitOn;
var adder;
if($().autocomplete){
params = paramString.parseParams("anon", null, true, false, false);
var textcase = getParam(params, "case");
var srcTiddler = getParam(params, "valuesSource");
var suggestions;
if(srcTiddler) {
suggestions = macro.getSuggestionsFromTiddler(srcTiddler, textcase);
} else {
suggestions = [];
}
var tagsoff = getParam(params,"nostoretags");
if(!tagsoff) {
suggestions = suggestions.concat(macro.twtags[options.field]);
}
var ignoreList = paramString.parseParams("exclude", null, true, false, true);
if(ignoreList && ignoreList[0] && ignoreList[0].exclude) {
ignoreList = ignoreList[0].exclude;
} else {
ignoreList = ["excludeList"];
}
suggestions = macro.removeFromList(suggestions, ignoreList);
var addtaghandler = function(v) {
macro.saveNewValue(tiddler, options.field, $(v).val(), container, splitChar);
};
$("<input type='text' name=\""+options.field+"\" value=\"\"/>").autocomplete(suggestions,{ matchContains: true, selectFirst:false }).result(addtaghandler).appendTo(tagplace);
adder = $("input", tagplace)[0];
} else {
adder = document.createElement("input");
tagplace.appendChild(adder);
}
$(adder).keypress(function (ev) {
ev.stopPropagation();
if(ev.which == 13){
var results = $(".ac_over",".ac_results"); //is anything highlighted in autocomplete plugin ?
var value;
if(results.length === 0) {
value = $(ev.target).val();
} else {
value = $(results[0]).val();
}
macro.saveNewValue(tiddler, options.field, value, container, splitChar);
}
});
var addbutton = document.createElement("input");
addbutton.type = "button";
addbutton.value = macro.lingo.add;
addbutton.className = "adder";
tagplace.appendChild(addbutton);
$(addbutton).click(function(e){
var val = $(adder).val() || "";
macro.saveNewValue(tiddler, options.field, val, container, splitChar);
});
}
};
_setTiddlerField = Story.prototype.setTiddlerField;
Story.prototype.setTiddlerField = function(title, value, mode, field) {
var tiddler = store.getTiddler(title) || new Tiddler(title);
var container = $(".niceTaggerContainer[field=%0]".format([field]),
story.getTiddler(title));
if(container.length > 0) {
macro.saveNewValue(tiddler, field, value, container[0]);
} else {
_setTiddlerField.apply(this, arguments);
}
};
})(jQuery); //end alias
//}}}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="301 225 48 52"
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
<g>
<path d="M 333.00003 234 L 306 258.75003 L 301.5 270 L 312.75 265.50003 L 339.75 240.74998 Z M 337.5 229.50002
L 335.24988 231.75008 L 341.99997 238.50003 L 344.24997 236.24995 Z M 342 225.00003 L 339.74988 227.25009
L 346.5 234.00005 L 348.75 231.75003 Z M 301.5 273.9719 C 301.5 273.9719 309.59888 277.99927 317.70013 273.97183
C 325.80066 269.94437 341.99997 276.65686 341.99997 276.65686 L 341.99997 273.97195
C 341.99997 273.97195 325.80014 267.2594 317.70013 271.28687 C 309.6 275.31451 301.5 271.28683 301.5 271.28683 Z"
fill="#101010" class="glyph"/>
</g>
</g>
</svg>
!URL
http://web21c.bt.com/
!Description
|''Name''|BookmarkletTheme|
|''Description''|A minimal theme designed to be used with the bookmarklet plugin|
|''PageTemplate''|##PageTemplate|
|''StyleSheet''|##StyleSheet|
!PageTemplate
<!--{{{-->
<div class='topMenu'>
<ul class='topMenuList'>
<li class='topMenuItem'><span macro='newTiddler'></span></li>
<li id="searchMenuItem" class='topMenuItem'><span macro='search'></span></li>
</ul>
</div>
<div class='displayHolder'>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
</div>
<!--}}}-->
!StyleSheet
/*{{{*/
#displayArea {
margin: 0px 0px 0px 0px;
display: block;
max-width: 95%;
overflow: hidden;
}
.displayHolder {
position: fixed !important;
position: absolute;
overflow-y: auto;
top: 2.5em;
bottom: 0em;
z-index: 1;
max-width: 100%;
}
#mainMenu {
padding: 0px;
margin-bottom: 2px;
text-align: left;
width: auto;
}
#sidebarTabs, .tabContent {
background-color: #B0C2ED;
left: 0;
}
#sidebar {
left: -60px;
}
#sidebar ul {
list-style-type: none;
margin: 0;
padding: 0;
}
#sidebar ul li {
list-style: none outside none;
}
#sidebar ul li.listLink {
margin-left: 0.75em;
}
.topMenu {
display: block;
height: 2em;
position: fixed !important;
position: absolute;
top: 0;
left: 0;
width: 100%;
background-color: #6D94ED;
padding-bottom: 5px;
padding-top: 5px;
padding-left: 2px;
padding-right: 2px;
border-bottom: 1px solid black;
z-index: 10;
}
body {
position: absolute;
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}
#contentWrapper {
height: 100%;
width: 100%;
}
#backstageButton, #backstageArea {
display: none !important;
}
.topMenu ul.topMenuList {
list-style-type: none;
padding-left: 0px;
width: 100%;
display: block;
position: absolute;
margin-top: 0;
}
.topMenu ul.topMenuList li.topMenuItem {
position: relative;
float: left;
padding: 5px;
display: inline-block;
}
.topMenu ul.topMenuList li.topMenuItem div {
visibility: hidden;
position: absolute;
padding: 10px 5px 5px 5px;
border: 1px solid black !important;
}
.topMenu .button {
cursor: pointer;
border: 0;
padding-left: 2px;
padding-right: 2px;
}
.topMenu .button:hover {
background-color: #FFCC65;
border-color: #FFAA00;
}
.topMenu ul.topMenuList li.topMenuItem:hover {
background-color: #FFCC65;
border-color: #FFAA00;
}
.topMenu ul.topMenuList li.topMenuItem:hover div {
visibility: visible;
}
.topMenu ul.topMenuList li.topMenuItem div {
background-color: #B0C2ED !important;
}
.footerMenu {
background-color: #6D94ED;
padding-bottom: 5px;
padding-top: 5px;
border-top: 1px solid black;
height: 2em;
position: fixed !important;
position: absolute;
bottom: 0;
padding-left: 2px;
padding-right: 2px;
width: 100%;
z-index: 10;
}
.footerHolder {
width: 98%;
}
#searchMenuItem {
float: right;
padding: 0;
margin: 0 1em 0 0;
}
/*}}}*/
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Bookmark</title>
<link rel="stylesheet" href="http://twitter.github.com/bootstrap/1.3.0/bootstrap.min.css">
<style>
html,
body {
overflow: hidden;
background-color: transparent;
}
.modal-footer {
position: absolute;
bottom: 0;
left: 0;
right: 0;
}
.modal-footer input.btn {
width: auto;
}
h1 {
margin-bottom: 9px;
margin-top: 9px;
}
body {
width: 100%;
height: 100%;
position: absolute;
}
.modal {
margin: 10px;
top: 0;
left: 0;
bottom: 0;
width: 510px;
position: absolute;
}
label em {
cursor: pointer;
}
.modal-body {
overflow: auto;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin-top: 65px;
margin-bottom: 67px;
}
fieldset > label {
margin-top: 18px;
}
@media all and (max-width: 550px) {
.modal {
width: 95%;
}
fieldset input[type=text],
fieldset textarea {
width: 95% !important;
}
}
</style>
</head>
<body>
<div id="container">
<form action="#" class="span-one-third modal">
<div class="modal-header">
<h1>Bookmark this page</h1>
</div>
<fieldset class="form-stacked modal-body">
<div class="clearfix">
<label for="titleInput">Title</label>
<div class="input">
<input type="text" id="titleInput" class="span8" name="title">
</div>
</div>
<div class="clearfix">
<label for="urlInput">URL</label>
<div class="input">
<input type="text" id="urlInput" class="span8" name="url">
</div>
</div>
<div class="clearfix">
<label for="textInput">Description</label>
<div class="input">
<textarea id="textInput" class="span8" name="text" rows="5"></textarea>
</div>
</div>
<div class="clearfix">
<label for="tagsInput">Tags</label>
<div class="input">
<input type="text" id="tagsInput" class="span8" name="tags" value="bookmark">
</div>
</div>
<label for="privateInput">
<input type="checkbox" name="private" id="privateInput" val="private">
keep private
</label>
</fieldset>
<div class="modal-footer">
<input type="submit" class="btn primary large" value="Done">
<input type="button" class="btn large closeBtn" value="Cancel">
</div>
</form>
</div>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
<script type="text/javascript" src="http://ace-ide.tiddlyspace.com/chrjs"></script>
<script type="text/javascript" src="http://sandben.tiddlyspace.com/bookmark.js"></script>
</body>
</html>
<<<
APIs and documents on the web are the same thing; how you represent them behind the scenes is up to you, and that's been a core principle of the web since shortly after its inception. Suggesting otherwise profoundly misunderstands how implementation of web services happens
<<<
[[Re: [OAUTH-WG] Web Finger vs. Simple Web Discovery (SWD)|http://www.ietf.org/mail-archive/web/oauth/current/msg08736.html]]
@blaine kicks some righteous ass, but gets caught out later in the thread for being perhaps a little too defensive. Whatever, his comments are great.
On the way to London, the man on the train bemoans modern sissy attitudes to 'dog feces'.
!URL
http://www.rockrun.com/products-Avon-Cheddar_PB-GU-AVCH.htm
!Description
probably gonna want this
!URL
http://effbot.org/zone/simple-iterator-parser.htm
!Description
!URL
http://www.trailrunnerx.com/
!Description
My ability to not work while wedding preparing is confounded by the fact that spending some time alone working on a puter is good therapy from people over saturation.
!URL
http://www.bbc.co.uk/foi/docs/freedom_of_information/selected_requests_and_responses/2006/SR2006000623_TV_Licence_Requirements.pdf
!Description
!URL
http://www.lightbird.net/py-by-example/
!Description
<html>
<head>
<title>Sign up</title>
<script type='text/javascript' src='/backstage.js'></script>
<link href="/bags/common/tiddlers/profile.css" type='text/css' rel='stylesheet' >
</head>
<body>
<div id="container">
<div id="header">
<h1>Sign up to TiddlySpace</h1>
</div>
<div class="main section">
<h2>Get Your Own TiddlySpace!</h2>
<form class="ts-registration" action="" autocomplete="off">
<div>
<input type="text" name="username" placeholder="username" />.tiddlyspace.com
</div>
<div>
<input name="password" placeholder="password" />
<input name="password_confirm" placeholder="and again" />
</div>
<div>
<input type="submit" value="SIGN ME UP!" />
</div>
</form>
</div>
</div>
</div>
<script type='text/javascript' src='/bags/common/tiddlers/jquery.js'></script>
<script type='text/javascript' src='/bags/common/tiddlers/jquery-json.js'></script>
<script type='text/javascript' src='/bags/tiddlyspace/tiddlers/chrjs'></script>
<script type='text/javascript' src='/bags/tiddlyspace/tiddlers/chrjs.space'></script>
<script type='text/javascript' src='/bags/tiddlyspace/tiddlers/chrjs.users'></script>
<script src="/bags/common/tiddlers/ts.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
ts.init(function() {});
</body>
</html>
<html>
<head>
<link rel="stylesheet" href="/bags/common/tiddlers/profile.css" type="text/css">
</head>
<body>
<div id="container"></div>
<script type="text/javascript" src="bags/common/tiddlers/jquery.js"></script>
<script type="text/javascript" src="Date.js"></script>
<script type="text/javascript" src="Strings.js"></script>
<script type="text/javascript" src="file_import.js"></script>
</body>
</html>
|~ViewToolbar|+editTiddler +cloneTiddler > fields refreshTiddler changeToPublic changeToPrivate revisions syncing permalink references jump closeOthers < closeTiddler|
|~EditToolbar|+saveTiddler saveDraft -cancelTiddler deleteTiddler|
|~RevisionToolbar|> fields revert|
!URL
http://darcs.idyll.org/~t/projects/figleaf/doc/
!Description
<<<
Software that really is software is about being copied, and changed, and reused, and remade – something communicated and mutated by the network. That is what information means.
This is the real distinction: free-software / open-source web-integrated software is living software, closed-source restricted productised ‘app-store’ software is dead software.
<<<
[[Living software and dead software - (note-20120115T1141Z) - HXA7241|http://www.hxa.name/notes/note-hxa7241-20120115T1141Z.html]]
drilled 20 holes through 20 plates
<<<
What if the server-side of the equation was simply a RESTful, schema-less API?
<<<
[[Northern Tree — Backend-as-a-service?|http://davewasmer.tumblr.com/post/14952823756/backend-as-a-service]]
I responded suggesting that tiddlystuff was BaaS. Which it is sort of, but not at first glance.
!URL
http://krow.livejournal.com/507091.html
!Description
make http GET PUT and DELETE requests in sql through mysql
!URL
http://tiddlyprocessing-simon.tiddlyspot.com/
!Description
Simon tweaks psd's TiddlyWiki hack to get Processing.js in tiddlywiki.
!URL
http://xorswap.com/
!Description
Programming, Software, and Technical Interview Questions
!Notes
I reckon I right code every day and I never think about the things in these questions. How can they be a measure of a productivity and quality?
the upgrade took a good deal longer than it should have. i blame virtual machines and their complete lack of io speed.
the hamster to ammonia ratio has reached critical
!URL
http://whatever.scalzi.com/2011/01/19/and-now-for-no-particular-reason-a-rant-about-facebook/
!Description
Facebook is what happens to the Web when you hit it with the stupid stick. It’s a dumbed-down version of the functionality the Web already had, just not all in one place at one time.
Facebook has made substandard versions of everything on the Web, bundled it together and somehow found itself being lauded for it, as if AOL, Friendster and MySpace had never managed the same slightly embarrassing trick.
!URL
http://www.shiftspace.org/what-is-shiftspace
!Description
/***
|''Name''|TSHealth|
|''Version''|0.2.3|
|''Description''|Checks and informs you if you have overwritten core plugins|
***/
//{{{
(function($) {
var tshealth = function() {
if(!readOnly) {
this.init();
}
};
tshealth.prototype = {
init: function() {
var bags = ["system-plugins_public", "system", "tiddlyspace"];
$.ajax({
// assume no more than 100 core plugins
url: "/search?q=(bag:system-plugins_public OR bag:system OR bag:tiddlyspace) AND tag:systemConfig _limit:100",
dataType: "text",
success: function(r) {
var dirty = [];
var titles = r.split("\n");
for(var i = 0; i < titles.length; i++) {
var title = titles[i];
var tid = store.getTiddler(title);
if(tid && tid.fields) {
if(bags.indexOf(tid.fields['server.bag']) === -1) {
dirty.push(title);
}
}
}
if(dirty.length > 0) {
var msgArea = $('<div class="annotation" />').prependTo(document.body)[0];
var msg = [dirty.length, " tiddlers have been copied locally.",
" This copied tiddlers could cause problems with your wiki in future: ",
];
for(var i = 0; i < dirty.length; i++) {
msg.push("[[" + dirty[i] + "]]");
if(i !== dirty.length - 1) {
msg.push(", ");
} else {
msg.push(". ");
}
}
wikify(msg.join(""), msgArea);
$("<a class='button'>revert to originals</a>").data("dirty", dirty).click(function(ev) {
var dirty = $(ev.target).data("dirty");
var tids = [];
for(var i = 0; i < dirty.length; i++) {
tids.push(store.removeTiddler(dirty[i]));
}
autoSaveChanges(null, tids);
$(ev.target).parent().hide();
}).appendTo(msgArea);
$("<a class='button'>hide message</a>").click(function(ev) {
$(ev.target).parent().hide(1000);
}).appendTo(msgArea);
}
}
})
}
}
new tshealth();
})(jQuery);
//}}}
You can, if you're brave, subscribe to your tiddlyspace user from http://identi.ca. Ask me for details.
!URL
http://computinged.wordpress.com/2011/11/15/no-more-swikis-end-of-the-constructionist-web-at-georgia-tech/
!Description
The folks at GT responsible for oversight of FERPA realized that a student’s name in a website that references a course is evidence of enrollment. Yesterday, in one stroke, every Swiki ever used for a course was removed. None of those uses I described can continue.
!URL
http://xkcd.com/951/
!Description
xkcd: Working
!Notes
"If you spend nine minutes of your time to save a dollar, you're working for less than minimum wage."
!URL
http://blog.sontek.net/2008/05/11/python-with-a-modular-ide-vim/
!Description
http://www.imdb.com/title/tt0947798/
[[Darren Aronofsky]] movie. Seeing as I've liked most of his other stuff, it didn't surprise me that I enjoyed this one.
Thinking about these as possible readings at the wedding.
* [[The Good Morrow]]
* [[For a Wedding]]
!URL
http://news.ycombinator.com/item?id=2328217
!Description
[[Dudes, this is so not REST|http://jens.mooseyard.com/2011/03/dudes-this-is-so-not-rest/]] (mooseyard.com)
!Notes
There's so much misinformation in the comments here I don't even know where to start. Despite my rep I'm not even remotely a purist but some of these people are talking out their ass.
I feel so naked. My anklet with a shell broke. My necklace broke.
Click the "new tiddler" button towards the top right of the screen to write something in your space. You'll need to give it a title, some content and, optionally, some tags that will help you identify it later.
!Stuck for ideas?
Not sure what to write about? Not sure what to keep in your space? Other people use ~TiddlySpace for almost anything. How about some of the following:
* [[Save interesting sites|http://bookmarks.tiddlyspace.com]], images or articles from around the web so that you can refer back to them.
* [[Record your family tree|http://familytree.tiddlyspace.com]], store notes on long lost relatives or ancestors and map their relationship to you.
* [[Make up a pocketbook|http://pocketbook.tiddlyspace.com]] to store some useful information in, then print it out, [[fold it up|http://www.pocketmod.com/]], and take it with you.
* [[Plan your holiday|http://the-web-is-your-oyster.tiddlyspace.com/]], record where you're planning to go, note down places of interest and refer back to it later.
* [[Create a mindmap|http://mindmaps.tiddlyspace.com/]] to visualise your inner thoughts and see how they relate to each other.
* [[Set up a questionnaire|http://questionnaire.tiddlyspace.com/]] and get all your friends to answer it.
If you don't like any of those ideas, you can still use this space directly to keep notes and link them together, make a todo list and keep track of everything you're doing, or any one of a hundred million other things.
Still stuck? Check out the @featured space for more suggestions.
You can also [[socialise with others|How to socialise]].
<html>
<head>
<title>Customise your space</title>
<style type="text/css">
input,
textarea {
border: solid 1px #00A800;
font-family: Georgia;
line-height: 1.3em;
font-size: 0.8em;
padding: 8px;
}
textarea {
width: 450px;
height: 400px;
}
textarea.error,
input.error {
border: solid 1px red;
}
textarea.saving,
input.saving {
border: solid 1px yellow;
}
#text-html dt {
float: none;
}
</style>
<link href="/bags/common/tiddlers/profile.css" type='text/css' rel='stylesheet' >
<script type='text/javascript' src='http://tiddlyspace.com/bags/ts_public/tiddlers/jquery.min.js'></script>
<script type='text/javascript' src='http://tiddlyspace.com/bags/ts_public/tiddlers/jquery-json.min.js'></script>
<script type='text/javascript' src='/TiddlySpaceCSRF'></script>
<script type='text/javascript' src='/jquery.form.js'></script>
<script type='text/javascript' src='/backstage.js'></script>
<script type='text/javascript' src='http://tiddlyspace.com/bags/tiddlyspace/tiddlers/chrjs'></script>
<script type="text/javascript">
$(document).ready(function() {
var space = window.location.hostname.split(".")[0];
var recipe = new tiddlyweb.Recipe(space + "_private", "/");
var siteTitle = new tiddlyweb.Tiddler("SiteTitle", recipe);
var siteInfo = new tiddlyweb.Tiddler("SiteInfo", recipe);
var csrf = window.getCSRFToken();
var progress = 0;
var complete = function() {
progress += 1;
if(progress == 2) {
$(".settings").show();
}
};
siteTitle.get(function(st_tid) {
$("#edit-sitetitle").val(st_tid.text);
complete();
}, function(xhr) {
if(xhr.status !== 404) {
window.location.href = "/challenge?tiddlyweb_redirect=%2Fconfigure";
} else {
complete();
}
});
siteInfo.get(function(si_tid) {
$("#edit-siteinfo").val(si_tid.text);
complete();
}, function(xhr) {
if(xhr.status !== 404) {
window.location.href = "/challenge?tiddlyweb_redirect=%2Fconfigure";
} else {
complete();
}
});
var form = $('#edit-siteicon')[0];
$(form).attr("action", "/bags/" + space + "_public/tiddlers?csrf_token=" + csrf + "&redirect=/tiddlers");
$(form).ajaxForm({
beforeSubmit: function() {
$("#edit-siteicon").addClass("saving");
},
success: function() {
$('#edit-siteicon').removeClass("saving error");
$("#edit-siteicon img").attr("src", "");
$("#edit-siteicon img").attr("src", "/SiteIcon?r=" + Math.random()); // refresh icon
},
error: function() {
$("#edit-siteicon").addClass("error");
}
});
$("#edit-sitetitle").blur(function(ev) {
$(ev.target).addClass("saving");
siteTitle.text = $(ev.target).val();
siteTitle.put(function() {
$(ev.target).removeClass("saving error");
}, function() {
$(ev.target).addClass("error");
})
});
$("#edit-siteinfo").blur(function(ev) {
$(ev.target).addClass("saving");
siteInfo.text = $(ev.target).val();
siteInfo.put(function() {
$(ev.target).removeClass("saving error");
}, function() {
$(ev.target).addClass("error");
})
});
});
</script>
</head>
<body>
<div id="container">
<div style="display:none;" class="settings">
<div id="header">
<h1>Customise your space</h1>
</div>
<p>Tell us a bit about your space!</p>
<div id="text-html">
<dl>
<dt>SiteIcon:</dt><dd>
<form id="edit-siteicon" method="POST" enctype="multipart/form-data">
<img src="/SiteIcon" width="48" height="48" />
<input type="hidden" name="title" value="SiteIcon" />
<input type="hidden" name="csrf_token" class="csrf" />
<input type="file" name="file" />
<input type="submit" value="upload" />
</form>
</dd>
<dt>Title:</dt><dd><input type="text" id="edit-sitetitle" /></dd><dt>Description:</dt><dd><textarea id="edit-siteinfo"></textarea></dd>
</dl>
</div>
</div>
</div>
</body>
</html>
!URL
http://www.dabeaz.com/generators/index.html
!Description
very good description of python generators, including co-routines
/***
|''Name''|TiddlySpaceViewTypes|
|''Version''|0.5.6|
|''Status''|@@beta@@|
|''Description''|Provides TiddlySpace specific view types|
|''Author''|Jon Robson|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceViewTypes.js|
|''Requires''|TiddlySpaceConfig TiddlySpaceTiddlerIconsPlugin|
!Usage
Provides replyLink, spaceLink and SiteIcon view types.
!!SiteIcon view parameters
* labelPrefix / labelSuffix : prefix or suffix the label with additional text. eg. labelPrefix:'modified by '
* spaceLink: if set to "yes" will make any avatars link to the corresponding space. {{{<<originMacro spaceLink:yes>>}}}
!Code
***/
//{{{
(function($) {
var tiddlyspace = config.extensions.tiddlyspace;
var originMacro = config.macros.tiddlerOrigin;
var tweb = config.extensions.tiddlyweb;
config.macros.view.replyLink = {
locale: {
label: "Reply to this tiddler"
}
};
config.macros.view.views.replyLink = function(value, place, params, wikifier,
paramString, tiddler) {
var valueField = params[0];
var imported;
if(valueField == "title") { // special casing for imported tiddlers
var localTitle = tiddler.title;
var serverTitle = tiddler.fields["server.title"];
if(serverTitle && localTitle != serverTitle) {
value = serverTitle ? serverTitle : localTitle;
imported = true;
}
} else {
title = tiddler[valueField] ? tiddler[valueField] : tiddler.fields[valueField];
}
var args = paramString.parseParams("anon")[0];
var label = (args.label) ? args.label : config.macros.view.replyLink.locale.label;
var space;
if(tiddler) {
var bag = tiddler.fields["server.bag"];
space = tiddlyspace.resolveSpaceName(bag);
}
var container = $('<span class="replyLink" />').appendTo(place)[0];
tweb.getUserInfo(function(user) {
if(!user.anon) {
if((space && user.name != space &&
user.name != tiddlyspace.currentSpace.name) || imported) {
createSpaceLink(container, user.name, value, label);
tweb.getStatus(function(status) { // force callback to run after existing callbacks
var url = config.extensions.tiddlyspace.getHost(status.server_host, user.name) + "#[[" + encodeURIComponent(value) + "]]";
jQuery("a", container).attr("href", url);
});
}
}
});
};
config.macros.view.views.spaceLink = function(value, place, params, wikifier,
paramString, tiddler) {
var spaceName = tiddlyspace.resolveSpaceName(value);
var isBag = params[0] == "server.bag" && value === spaceName ? true : false;
var args = paramString.parseParams("anon")[0];
var titleField = args.anon[2];
var labelField = args.labelField ? args.labelField[0] : false;
var label;
if(labelField) {
label = tiddler[labelField] ? tiddler[labelField] : tiddler.fields[labelField];
} else {
label = args.label ? args.label[0] : false;
}
var title = tiddler[titleField] ? tiddler[titleField] : tiddler.fields[titleField];
var link = createSpaceLink(place, spaceName, title, label, isBag);
if(args.external && args.external[0] == "no") {
$(link).click(function(ev) {
var el = $(ev.target);
var title = el.attr("tiddler");
var bag = el.attr("bag");
var space = el.attr("tiddlyspace");
bag = space ? space + "_public" : bag;
if(title && bag) {
ev.preventDefault();
tiddlyspace.displayServerTiddler(el[0], title,
"bags/" + bag);
}
return false;
});
}
};
config.macros.view.views.SiteIcon = function(value, place, params, wikifier,
paramString, tiddler) {
var options = originMacro.getOptions(paramString);
if(!tiddler || value == "None") { // some core tiddlers lack modifier
value = false;
}
var field = params[0];
if(field == "server.bag") {
options.notSpace = !originMacro._isSpace(value);
}
tiddlyspace.renderAvatar(place, value, options);
};
})(jQuery);
//}}}
today I will register my intent to wed
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="78 222 60 60"
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
<g>
<path d="M 107.92718 244.14815 L 86.651474 222.89253 L 78.85206 230.69925 L 100.120415 251.9476 L 78.774 273.27396
L 86.57342 281.08075 L 107.927216 259.74707 L 129.39981 281.19946 L 137.19922 273.39267 L 115.73397 251.94763
L 137.121155 230.58054 L 129.32175 222.77374 Z" fill="black" class="glyph"/>
</g>
</g>
</svg>
!URL
http://www.swaygogear.com/articles/truckcamping/default.html
!Description
!URL
http://www.tbray.org/ongoing/When/201x/2011/09/19/4G-performance#p-1
!Description
I want wireless data and I want it to be fast enough; but just as important, I want it to be reliably there, with a low consistent ping time, wherever I am. Also, I want it unfiltered and unchoked and network-neutral. Can we please benchmark those things instead?
A little while ago I finished [[Surface Detail|http://www.amazon.co.uk/Surface-Detail-Iain-M-Banks/dp/1841498939]] and I'm just a few pages from the end of [[The Evolutionary Void|http://www.amazon.co.uk/Evolutionary-Void-Peter-F-Hamilton/dp/140508894X]]. Both very enjoyable, engrossing reads with huge scope, tons of characters, and mind numbing technological hooha. I feel, however, that I'm supposed to enjoy Hamilton's works more than I do.
I consistently enjoy the Culture novels from Banks. I think I like his politics. He's a realistic optimist, by which I mean he's aware that people have the power to be utter jerks while at the same time having incredible potential. //Surface Detail// is based on a fairly ridiculous premise but it hangs together very well. Characterization is excellent: details shown through action not exposition. When Ping excoriates the senator I felt like I was witnessing the heart of the book.
Hamilton's politics make me nervous. He's extremely keen on family relations and exercises inherited traits as the keystone in resolving conflicts. I'm not sure why but that instantly makes me think "fascist" in much the same way that phrases like "family values" and "homeland" do. Hamilton's characters are enjoyable not so much in and of themselves, but because we've been with them for so long (is it five books for some of them?). Fondness from familiarity.
If I had to choose one, //Surface Detail// by a mile. Banks is an extremely talented writer, far above the usual standard for "speculative" fiction. It's clear that Hamilton pushed the boat out for //The Evolutionary Void// -- the structure is a good deal more interesting and engaging than the previous two books in the trilogy -- but the writing is only good not //great//.
This choice largely reflects my own bias in reading: When I read, in addition to the story and characters pulling me along, I also want to be pulled along by the writing. I like being aware of it, having moments of "damn, this is good stuff". Others prefer the writing to disappear and to be absorbed by the story and the characters.
var user, userbag;
var host = "http://tiddlyspace.com";
var app = {
friends: [],
tiddlers: {}
}
$.ajaxSetup({
beforeSend: function(xhr) {
xhr.setRequestHeader("X-ControlView", "false");
}
});
$("#message").hide();
function printMessage(txt) {
$("#message").show().removeClass("error").text(txt);
}
function printError(txt) {
$("#message").show().addClass("error").text(txt);
}
var simpleDate = (function() {
var measures = {
second: 1,
minute: 60,
hour: 3600,
day: 86400,
week: 604800,
month: 2592000,
year: 31536000
};
var chkMultiple = function(amount, type) {
return (amount > 1) ? amount + " " + type + "s":"a " + type;
};
return function(thedate) {
var dateStr, amount,
current = new Date().getTime(),
diff = (current - thedate.getTime()) / 1000; // work with seconds
if(diff > measures.year) {
amount = Math.round(diff/measures.year);
dateStr = "about " + chkMultiple(amount, "year") + " ago";
} else if(diff > measures.month) {
amount = Math.round(diff/measures.month);
//if(typeof amount == "")
dateStr = "about " + chkMultiple(amount, "month") + " ago";
} else if(diff > measures.week) {
amount = Math.round(diff/measures.week);
dateStr = "about " + chkMultiple(amount, "week") + " ago";
} else if(diff > measures.day) {
amount = Math.round(diff/measures.day);
dateStr = "about " + chkMultiple(amount, "day") + " ago";
} else if(diff > measures.hour) {
amount = Math.round(diff/measures.hour);
dateStr = "about " + chkMultiple(amount, "hour") + " ago";
} else if(diff > measures.minute) {
amount = Math.round(diff/measures.minute);
dateStr = "about " + chkMultiple(amount, "minute") + " ago";
} else {
dateStr = "a few seconds ago";
}
return dateStr;
};
})();
function prettyDate(t) {
var date = new Date(Date.UTC(
parseInt(t.substr(0, 4), 10),
parseInt(t.substr(4, 2), 10) - 1,
parseInt(t.substr(6, 2), 10),
parseInt(t.substr(8, 2), 10),
parseInt(t.substr(10, 2), 10),
parseInt(t.substr(12, 2) || "0", 10),
parseInt(t.substr(14, 3) || "0", 10)
));
return simpleDate(date);
}
function endsWith(str, suffix) {
return str.indexOf(suffix) == str.length - suffix.length;
}
function isShadow(tid) {
var shadows = ["MarkupPreHead", "DefaultTiddlers", "PageTemplate", "SideBarTabs",
"GettingStarted", "MainMenu", "SiteTitle", "SiteSubtitle", "ColorPalette",
"SiteIcon", "ViewTemplate", "EditTemplate", "ServerSettings", "MarkupPostHead",
"MarkupPostBody", "MarkupPreBody"];
return tid.title.indexOf("StyleSheet") === 0 ||
tid.title.indexOf("SideBar") === 0 ||
shadows.indexOf(tid.title) > -1 || endsWith(tid.title, "SetupFlag") ? true : false;
}
function isPlugin(tid) {
return tid.tags.indexOf("systemConfig") > -1 ? true : false;
}
function isArtifact(tid) {
var follow = tid.tags.indexOf("follow") > -1;
var type = tid.type;
if(follow || type) {
return true;
} else {
return false;
}
}
function chooseTiddlers(tiddlers) {
var _tiddlers = [];
for(var i = 0; i < tiddlers.length; i++) {
var tid = tiddlers[i];
if(!isPlugin(tid) && !isShadow(tid) && !isArtifact(tid)) {
_tiddlers.push(tid);
}
}
return _tiddlers;
}
var tiddlers = {};
function collectTiddlers(friend) {
$.ajax({ dataType: "json",
url: "/search?q=modifier:" + friend + "&select=modified:>3d&sort=-modified",
error: function() {
$(container).addClass("errorFriend");
oncompletion();
},
success: function(tiddlers) {
app.tiddlers[friend] = tiddlers;
renderFriends();
}
});
}
function removeFriend(friend) {
var tiddler = new tiddlyweb.Tiddler("@" + friend, userbag);
var success = function() {
printMessage("User removed from friends");
var newFriends = [];
var friends = app.friends;
for(var i = 0; i < friends.length; i++) {
var f = friends[i];
if(f !== friend) {
newFriends.push(f);
}
}
app.friends = newFriends;
$("#friend-" + friend).hide(2000);
};
tiddler["delete"](success, function() {
var old = new tiddlyweb.Tiddler(friend, userbag);
old["delete"](success, function() {
printError("Unable to remove friend " + friend);
})
})
}
function showTiddlers(friend) {
var tiddlers = app.tiddlers[friend];
var container = $("#displayArea").empty()[0];
$("<h3 />").text(friend + "'s Tiddlers").appendTo(container);
if(!tiddlers) {
$("<span />").text("Tiddlers not yet loaded. Please try again later.").appendTo(container);
} else {
var tidList = $("<ul />").appendTo(container)[0];
for(var i=0; i < tiddlers.length; i++) {
var tiddler = tiddlers[i];
var item = $("<li />").appendTo(tidList)[0];
var win;
var space = tiddler.bag.split("_")[0];
var spaceUrl = "http://" + space + ".tiddlyspace.com";
var path = "/bags/" + tiddler.bag + "/tiddlers/" + encodeURIComponent(tiddler.title);
var link = $("<a />").text(tiddler.title).
attr("href", spaceUrl + path).
data("path", path).
click(function(ev) {
var win = $(ev.target).data("win");
if($(ev.target).hasClass("active")) {
$(win).toggle(1000);
} else {
$(ev.target).addClass("active");
$(".text", win).text("loading...");
$(win).show();
$.ajax({
url: $(ev.target).data("path"),
data: {
render: "y"
},
dataType: "json",
success: function(tiddler) {
if(tiddler.render) {
$(".text",win).html(tiddler.render);
} else {
$(".text",win).text("Cannot view tiddler here.");
}
$(win).show(1000);
},
error: function() {
$(".text", win).text("error loading that tiddler");
}
});
}
ev.preventDefault();
}).
appendTo(item)[0];
var space = tiddler.bag.split("_")[0];
$("<span />").text(" in ").appendTo(item);
$("<a />").attr("href", spaceUrl).text(space).appendTo(item);
$("<span />").text(" (" + prettyDate(tiddler.modified) + ")").appendTo(item);
win = $("<div />").addClass("tiddler section main").appendTo(item)[0];
$("<div />").addClass("text").appendTo(win);
var toolbar = $("<div />").addClass("toolbar").appendTo(win)[0];
var extra = $("<div />").addClass("extra").appendTo(win)[0];
$("<button />").data("bag", tiddler.bag).data("title", tiddler.title).text("give feedback").
data("revision", tiddler.revision).click(function(ev) {
var title = $(ev.target).data("title");
var revision = $(ev.target).data("revision");
var bag = $(ev.target).data("bag");
var revisionURL = host + "/bags/" + bag + "/tiddlers/" + encodeURIComponent(title) + "/revisions/" + revision;
var space = bag.split("_")[0];
var area = $(ev.target).parents(".tiddler").children(".extra")[0];
$(area).hide();
$("<textarea />").appendTo(area);
$("<button />").text("save feedback").click(function(ev) {
var tid = new tiddlyweb.Tiddler("Feedback for " + title, userbag);
tid.tags = ["feedback", "@" + space];
tid.text = ["In reply to [[", title, "]]@", space,
" (revision [[", revision, "|", revisionURL, "]])\n\n"].join("") + $("textarea", area).val();
tid.put(function(tiddler) {
$(area).empty();
$("<span />").text("your comment: ").appendTo(area);
$("<a />").attr("href", "/" + encodeURIComponent(tiddler.title)).text(tiddler.title).appendTo(area);
}, function() {
printError("error commenting!");
});
}).appendTo(area);
$(area).show(1000);
ev.preventDefault();
$(ev.target).remove();
return false;
}).appendTo(toolbar);
$(win).hide();
$(link).data("win", win);
}
}
}
var cache = {};
function renderFriend(list, friend) {
var bag = friend + "_public";
var srcImage = host + "/bags/" + bag + "/tiddlers/SiteIcon";
if(!cache[srcImage]) {
var img = new Image()
img.src = srcImage;
cache[srcImage] = img;
}
var item = $("<li />").addClass("friend").attr("id", "friend-" + friend).appendTo(list)[0];
$(cache[srcImage]).attr("alt", friend).attr("title", friend).
css({ width: 48, height: 48 }).appendTo(item);
var heading = $("<h2>").appendTo(item)[0];
$("<a />").attr("href", "#friend-" + friend).attr("name", "friend-" + friend).text(friend).appendTo(heading);
$("<button />").data("who", friend).text("remove from friends").
click(function(ev) {
if(confirm("Are you sure you want to remove " + friend + " as a friend?")) {
removeFriend($(ev.target).data("who"));
}
}).appendTo(item)[0];
var tids = app.tiddlers[friend] ? app.tiddlers[friend] : false;
if(tids !== false) {
if(tids.length === 0) {
$(item).addClass("inactiveFriend");
}
$("<a href='#displayArea' class='tiddlers' />").html("<span class='count'>" + tids.length + "</span> recent tiddlers.").
data("who", friend).
click(function(ev) {
console.log($(ev.target), $(ev.target).data("who"))
$(ev.target).parents(".friend").removeClass("active");
$(ev.target).addClass("active");
showTiddlers($(ev.target).data("who"));
}).appendTo(item)[0];
} else {
$(item).addClass("inactiveFriend");
}
$(item).mouseover(function(ev) {
if($(ev.target).hasClass("friend")) {
$(ev.target).addClass("hover");
}
}).mouseout(function(ev) {
if($(ev.target).hasClass("friend")) {
$(ev.target).removeClass("hover");
}
});
return item;
}
function renderFriends() {
$("#friends ul").remove();
var list = $("<ul />").appendTo("#friends")[0];
var friends = app.friends;
if(friends.length === 0) {
$("<li />").text("No friends.").appendTo(list);
}
for(var i = 0; i < friends.length; i++) {
var friend = friends[i];
renderFriend(list, friend);
}
}
function followWidget() {
$("#friends").empty();
var container = $("<div />").addClass("addfriends").appendTo("#friends")[0];
$("<input />").attr("name", "friend").appendTo(container);
$("<button />").text("add friend").click(function(ev) {
var friend = $(ev.target).parent().children("[name='friend']").val();
if(app.friends.indexOf(friend) > -1) {
return printError("You already follow " + friend + "!");
}
var title;
if(friend.indexOf("@") !== 0) {
title = "@" + friend;
} else {
title = friend;
}
$.ajax({ dataType: "text", url: "/users/" + friend,
success: function() {
var tid = new tiddlyweb.Tiddler(title, userbag);
tid.tags = ["follow", "excludeLists"];
tid.put(function(tiddler) {
printMessage("Added friend " + friend);
renderFriend($("#friends ul")[0], friend);
window.location.hash = "#friend-" + friend;
}, function() {
printError("Failed to add friend " + friend);
})
},
error: function() {
printError("No one with name " + friend + " exists!");
}
});
}).appendTo(container);
var friends = app.friends;
for(var i = 0; i < friends.length; i++) {
collectTiddlers(friends[i]);
}
window.setTimeout(function() {
renderFriends();
}, 1000);
}
// initialise by loading friends
$.ajax({
url: "/status",
dataType: "json",
success: function(status) {
user = status.username;
userbag = new tiddlyweb.Bag(user + "_public", "/");
userbag.tiddlers().get(function(tiddlers) {
for(var i = 0; i < tiddlers.length; i++) {
var title = tiddlers[i].title;
if(title.indexOf("@") === 0) {
title = title.substr(1, title.length);
}
app.friends.push(title);
}
app.friends.sort();
followWidget();
}, function() {
}, "select=tag:follow");
}
})
!URL
http://www.cluetrust.com/LoadMyTracks.html
!Description
gps software
this is one of those days where I put the knife in the dirty dishes before finishing buttering the toast. i should go back to bed.
I WONDER by my troth, what thou and I
Did, till we loved ? were we not wean'd till then ?
But suck'd on country pleasures, childishly ?
Or snorted we in the Seven Sleepers' den ?
'Twas so ; but this, all pleasures fancies be ;
If ever any beauty I did see,
Which I desired, and got, 'twas but a dream of thee.
And now good-morrow to our waking souls,
Which watch not one another out of fear ;
For love all love of other sights controls,
And makes one little room an everywhere.
Let sea-discoverers to new worlds have gone ;
Let maps to other, worlds on worlds have shown ;
Let us possess one world ; each hath one, and is one.
My face in thine eye, thine in mine appears,
And true plain hearts do in the faces rest ;
Where can we find two better hemispheres
Without sharp north, without declining west ?
Whatever dies, was not mix'd equally ;
If our two loves be one, or thou and I
Love so alike that none can slacken, none can die.
[[John Donne|http://www.luminarium.org/sevenlit/donne/goodmorrow.htm]]
!URL
http://bitworking.org/news/285/atompubbase-An-AtomPub-Python-Client-Library
!Description
!URL
http://www.bbc.co.uk/news/magazine-12664772
!Description
"Plus, I can't relate to Kate. I don't know why anyone would marry into that family, for a start."
!Notes
Bastards are stealing my wedding thunder.
/***
|''Name''|ErrorHandlerPlugin|
|''Version''|0.4.3|
|''Author''|Jon Robson|
|''Description''|Localised tiddler save errors including edit conflict resolution.|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig|
***/
//{{{
(function($) {
var tiddlyspace = config.extensions.tiddlyspace;
var currentSpace = tiddlyspace.currentSpace.name;
tiddlyspace.getLocalTitle = function(title, workspace, suffix) {
var endsWith = config.extensions.BinaryTiddlersPlugin.endsWith;
if(!suffix) {
var isPublic = endsWith(workspace, "_public");
suffix = tiddlyspace.resolveSpaceName(workspace);
if(currentSpace == suffix) {
suffix = isPublic ? "public" : "private";
} else {
suffix = "@%0".format(suffix);
}
}
return "%0 *(%1)*".format(title, suffix);
};
var sssp = config.extensions.ServerSideSavingPlugin;
var msgs = config.messages.editConflict = {
loading: "Loading..",
resolve: "[[Edit Conflict]]@glossary: this tiddler may have been changed by someone else.",
reviewDiff: "review (recommended)",
reviewDiffTooltip: "review changes made to this tiddler",
reviewDiffError: "error retrieving revision.",
save: "overwrite",
saveTooltip: "make this revision the top revision of this tiddler",
discard: "cancel",
discardTooltip: "undo changes to this tiddler and get most recent version",
diffTitle: "%0",
diffFieldTitle: "%0 - fields",
diffTextTitle: "%0 - text",
updating: "updating your version...",
diffHeader: ["Review the changes that have been made whilst you were editing this tiddler. ",
"Fold relevant changes back into your version.\n",
"{{removed{Red}}} highlight shows content removed. ",
"{{added{Green}}} highlight shows content added.\n"].join(""),
diffTextHeader: "View changes in text",
diffFieldsHeader: "View changes in fields"
};
var plugin = config.extensions.errorHandler = {
diffTags: ["excludeLists", "excludeMissing", "excludeSearch"],
displayMessage: function(message, tiddler, context) {
var desc = context && context.httpStatus ? context.statusText :
sssp.locale.connectionError;
var reportArea = plugin.reportError(tiddler.title);
var msg = $("<div />").appendTo(reportArea);
if(message == "saveConflict") {
wikify(msgs.resolve, msg[0]);
var choiceArea = $("<div />").appendTo(reportArea)[0];
plugin.editConflictHandler(choiceArea, tiddler);
} else {
msg.text(sssp.locale[message].format(tiddler.title, desc));
}
},
editConflictHandler: function(container, tiddler) {
var title = tiddler.title;
var myrev = tiddler.fields["server.page.revision"];
// note user now needs to edit, fix problem and save.
// TODO: make sure this gets reset in save callback
store.getTiddler(title).fields["server.page.revision"] = "false";
var diffBtn = createTiddlyButton(container, msgs.reviewDiff, msgs.reviewDiffTooltip, function(ev) {
var title = $(ev.target).data("title");
plugin.displayDiff(ev.target, store.getTiddler(title), myrev);
});
var saveBtn = createTiddlyButton(container, msgs.save, msgs.saveTooltip, function(ev) {
var title = $(ev.target).data("title");
var tid = store.saveTiddler(store.getTiddler(title));
autoSaveChanges(null, [tid]);
});
var ignoreBtn = createTiddlyButton(container, msgs.discard, msgs.discardTooltip, function(ev) {
var title = $(ev.target).text(msgs.updating).data("title");
plugin.resetToServerVersion(store.getTiddler(title));
});
$([diffBtn, ignoreBtn, saveBtn]).data("title", title);
},
getDiffTiddlerTexts: function(diffText) {
var chunks = diffText.split("\n \n");
if(chunks.length < 2) {
return [chunks[0], ""];
} else {
var diffFieldsText = "{{diff{\n%0\n}}}".format(chunks[0]);
diffText = '{{diff{\n%0\n}}}'.format(chunks.splice(1, chunks.length).join("\n"));
return [diffText, diffFieldsText];
}
},
makeDiffTiddler: function(title, diff) {
var newTiddler = new Tiddler(title);
var tags = plugin.diffTags;
newTiddler.text = msgs.loading;
newTiddler.fields.doNotSave = true;
newTiddler.tags = diff ? tags.concat(["diff"]) : tags;
newTiddler = store.saveTiddler(newTiddler);
$.extend(store.getTiddler(title).fields,
config.defaultCustomFields); // allow option to save it
return newTiddler;
},
displayDiff: function(src, tiddler, latestRevision) {
var adaptor = tiddler.getAdaptor();
var title = tiddler.title;
var ts = new Date().formatString("0hh:0mm:0ss");
var suffix = "edit conflict %0".format(ts);
var diffTitle = tiddlyspace.getLocalTitle(msgs.diffTitle.format(title), "", suffix);
var diffTextTitle = tiddlyspace.getLocalTitle(msgs.diffTextTitle.format(title), "", suffix);
var diffFieldsTitle = tiddlyspace.getLocalTitle(msgs.diffFieldTitle.format(title), "", suffix);
plugin.makeDiffTiddler(diffTextTitle, true);
plugin.makeDiffTiddler(diffFieldsTitle, true);
var newTiddler = plugin.makeDiffTiddler(diffTitle, false);
newTiddler.text = ['%0\n<<slider chkViewDiffText "%1" "%2">>\n',
'<<slider chkViewDiffField "%3" "%4">>'].join("").
format(msgs.diffHeader, diffTextTitle, msgs.diffTextHeader,
diffFieldsTitle, msgs.diffFieldsHeader);
store.saveTiddler(newTiddler);
var callback = function(r) {
var text = plugin.getDiffTiddlerTexts(r);
store.getTiddler(diffTextTitle).text = text[0];
store.getTiddler(diffFieldsTitle).text = text[1];
story.refreshTiddler(diffTitle, null, true);
};
var workspace = "bags/%0".format(tiddler.fields["server.bag"]);
ajaxReq({
type: "get",
dataType: "text",
url: "/diff?format=unified&rev1=%0/%1/%2&rev2=%0/%1".format(workspace, title, latestRevision),
success: callback,
error: function() {
displayMessage(msgs.reviewDiffError);
}
});
story.displayTiddler(src, diffTitle);
},
resetToServerVersion: function(tiddler) {
var adaptor = tiddler.getAdaptor();
var ctx = {
host: tiddler.fields["server.host"],
workspace: "bags/" + tiddler.fields["server.bag"]
};
adaptor.getTiddler(tiddler.title, ctx, null, function(context) {
store.saveTiddler(context.tiddler);
story.refreshTiddler(tiddler.title);
store.setDirty(false);
});
},
reportError: function(title) {
var el = story.getTiddler(title);
if(!el) {
el = story.displayTiddler(null, title);
}
return $("<div />").addClass("error annotation").prependTo(el)[0];
}
};
sssp.reportFailure = function(message, tiddler, context) {
config.options.chkViewDiffText = config.options.chkViewDiffText === undefined ?
true : config.options.chkViewDiffText;
config.options.chkViewDiffFields = config.options.chkViewDiffFields || false;
plugin.displayMessage(message, tiddler, context);
};
})(jQuery);
//}}}
First stab at doing some social blogging in TiddlySpace. See: http://cdent.tumblr.com/post/1350976279/bye-bye-facebook-hello-tiddlyspace
!URL
http://blog.jonudell.net/2011/07/18/distracting-chatter-is-useful-but-thanks-to-rss-remember-that-its-optional/
!Description
The price has gone too high. So I’m rediscovering what made the blog network so thrilling to me a decade ago: unmediated access to people writing for the love of it in their own online spaces. Distracting chatter has its uses. But it’s optional.
!Notes
Yay feeds!
!URL
http://www.plaxo.com/api/openid_recipe
!Description
/*!
|''Name''|notabene|
|''Version''|0.6.4|
|''License''|BSD (http://en.wikipedia.org/wiki/BSD_licenses)|
|''Source''|https://github.com/jdlrobson/notabene/blob/master/src/notabene.js|
!*/
var APP_PATH = "/takenote";
var RESERVED_TITLES = ["takenote", "dashboard", "manifest.mf",
"notabene.css", "jquery-ui.min.js", "jquery-json.min.js"];
var config;
// some helper functions
var notabene = {
defaultFields: {},
loadConfig: function() {
config = localStorage.getItem("_takeNoteConfig") ? JSON.parse(localStorage.getItem("_takeNoteConfig")) : {};
if(config.noGeoTiddlers) {
if(new Date().getTime() - config.noGeoTiddlers > 1000*60*60*24) {
// more than a day old so flush
notabene.saveConfig("noGeoTiddlers", false);
}
}
},
saveConfig: function(name, value) {
if(typeof(name) != "undefined" && typeof(value) != "undefined") {
config[name] = value;
}
localStorage.setItem("_takeNoteConfig", JSON.stringify(config));
},
watchPosition: function(handler) {
if(!!navigator.geolocation && !config.noGeoTiddlers) {
navigator.geolocation.watchPosition(handler, function() {
notabene.saveConfig("noGeoTiddlers", new Date().getTime());
});
}
},
supports_local_storage: function() {
try {
return 'localStorage' in window && window['localStorage'] !== null;
} catch(e) {
return false;
}
},
getRecentChanges: function(bag) {
var recentLocalStorageId = "takenote-recent-" + bag;
var recent = localStorage.getItem(recentLocalStorageId);
recent = recent ? $.parseJSON(recent) : [];
return recent;
},
addRecentChange: function(bag, title) {
var recent = notabene.getRecentChanges(bag);
var newrecent = [];
for(var i = 0; i < recent.length; i++) {
var thisTitle = typeof(recent[i]) === "string" ? recent[i] : recent[i].title;
if(thisTitle !== title) {
newrecent.push(recent[i]);
}
}
newrecent.push({ title: title, bag: bag });
newrecent = newrecent.length > 5 ?
newrecent.slice(newrecent.length - 5) : newrecent;
localStorage.setItem("takenote-recent-" + bag, $.toJSON(newrecent));
}
};
notabene.loadConfig();
function autoResize(el, options) {
options = options || {};
var resize = function(ev) {
el = ev.target;
var div = $('<div />').addClass($(el).attr("class")).hide().
css({ "word-wrap": "break-word" }).insertBefore($(el)[0]);
var value = $(el).val() || "";
var lines = value.split("\n");
for(var i = 0; i < lines.length; i++) {
$("<span />").text(lines[i]).appendTo(div);
$("<br />").appendTo(div);
}
var h = $(div).height();
if(options.minHeight && h < options.minHeight) {
h = options.minHeight;
}
if(options.buffer) {
h += options.buffer;
}
$(ev.target).height(h);
$(div).remove();
};
$(el).focus(resize).keyup(resize).blur(resize);
$(el).focus();
}
function setup_store(options) {
// configure notabene
options = options || {};
var bagname = options.bag;
var host = options.host;
var bag = new tiddlyweb.Bag(bagname, host);
var store = new tiddlyweb.Store();
// retrieve last created note
store.retrieveCached();
return {
store: store,
bag: bag,
host: host
}
}
function notes(container, options) {
backstage();
// setup onleave event
window.onbeforeunload = function() {
// TODO: chrjs.store should probably provide a helper method for this situation
if(!notabene.supports_local_storage() && store().dirty().length) {
return ["There are unsynced changes. Are you sure you want to leave?\n\n",
"Please upgrade your browser if possible to make sure you never lose a note."
].join("");
}
}
var instance = setup_store(options);
var store = instance.store;
var bag = instance.bag;
var host = instance.host;
var tiddlers = store().sort(function(a, b) {
return a.fields._modified < b.fields._modified ? 1 : -1;
});
var note, tempTitle;
// print the fields associated with the current note
function printMetaData(tiddler) {
// print meta information
var fieldInfo = {
_created: { label: "created on" },
_modified: { label: "last modified on" }
};
$("#notemeta").empty();
var container = $('<div class="paddedbox" />').appendTo("#notemeta")[0];
var list = $("<ul />").appendTo(container)[0];
for(var fieldname in tiddler.fields) {
if(fieldname.indexOf("_") !== 0) {
var val = tiddler.fields[fieldname];
if(val) {
var label = fieldInfo[fieldname] ? fieldInfo[fieldname].label : fieldname;
$("<li />").text(label + ": " + val).appendTo(list);
}
}
}
var tags = tiddler.tags || [];
if(tags.length > 0) {
var tagArea = $("<li />").appendTo(list);
$("<span />").text("tags : ").appendTo(tagArea);
for(var i = 0; i < tags.length; i++) {
$("<span />").text(tags[i]).appendTo(tagArea);
$('<a class="removeTag">remove</a>').data("tag", tags[i]).click(function(ev) {
var tag = $(ev.target).data("tag");
removeTag(tag);
storeNote();
ev.preventDefault();
}).appendTo(tagArea);
}
}
}
// load the current note into the display
function loadNote() {
$(".note_text").val(note.text);
if(note.title != tempTitle && note.fields._title_set) {
$(".note_title").val(note.title);
}
if(note.fields._title_validated) {
$(".note_title").blur().attr("disabled", true);
$(document.body).addClass("validatedNote");
} else {
$(document.body).removeClass("validatedNote");
}
printMetaData(note);
notabene.watchPosition(function(data) {
// if note has existing geo data exit to prevent overwriting
if(note.fields['geo.lat'] && note.fields['geo.long']) {
return;
}
if(data) {
var coords = data.coords;
note.fields['geo.lat'] = String(coords.latitude);
note.fields['geo.long'] = String(coords.longitude);
}
});
}
function getTitle() {
return "untitled note " + Math.random();
}
// creates a new note with a randomly generated title and loads it into the ui
function newNote() {
tempTitle = getTitle();
note = new tiddlyweb.Tiddler(tempTitle, bag);
note.fields = {};
note.tags = [];
note.fields._created = new Date();
loadNote();
}
// prints a message to the user. This could be an error or a notification.
function printMessage(html, className, fadeout) {
var area = $(".messageArea", container);
area = area.length > 0 ? area : $("<div class='messageArea' />").appendTo(container);
area.attr("class", "messageArea displayed").html("<div>" + html + "</div>");
$(".messageArea div").stop(false, false).show();
if(fadeout) {
$(".messageArea div").css({ opacity: 1 }).fadeOut(3000);
}
if(className) {
$(area).addClass(className);
}
}
// tell the user what the current state of the store is
function syncStatus() {
var area = $(".syncButton");
var unsynced = store().dirty();
$(area).text(unsynced.length);
renderIncomplete(store, bag.name);
}
// this loads the note with the given title from the active bag and loads it into the display
function loadServerNote(title, bagname) {
note = new tiddlyweb.Tiddler(title);
note.fields = {};
note.bag = new tiddlyweb.Bag(bagname || bag.name, host);
store.get(note, function(tid, msg, xhr) {
var is404 = xhr ? xhr.status === 404 : false;
if(tid) {
delete tid.fields.created;
delete tid.fields.modified;
note = tid;
} else if(!is404) {
resetNote();
}
// TODO: replace with chrjs-store method i.e. store.isPresent(tid)
if(!localStorage.getItem(bag.name + "/" + encodeURIComponent(note.title))) {
if(is404 || tid) {
note.fields._title_validated = "yes";
}
}
if(is404 || tid) {
note.fields._title_set = "yes";
}
$(container).addClass("ready");
loadNote();
});
}
// this initialises notabene, loading either the requested note, the last worked on note or a new note
function init() {
var syncButton = $(".syncButton");
syncButton = syncButton.length > 0 ? syncButton :
$("<div class='syncButton' />").prependTo(container);
syncStatus();
syncButton.click(function(ev) {
var error, synced = 0, invalid = [];
var dirty = store().dirty();
printMessage("Syncing to server");
var giveFeedback = function(tid) {
if(tid) {
notabene.addRecentChange(tid.bag.name, tid.title);
}
if(synced === 0) {
if(dirty.length > 0) {
printMessage("Finish your note '" + note.title + "' before syncing.", "warning");
} else {
printMessage("Nothing to sync.", "warning");
}
} else {
if(invalid.length > 0) {
printMessage("Sync failed. Please rename some of your notes.", "error");
} else if(tid && !error) {
printMessage("Sync completed.", "", true);
} else {
error = true;
printMessage("Unable to fully sync at current time.", "warning");
}
}
syncStatus();
};
var currentNote = $(".note_title").val();
dirty.each(function(tid) {
if(tid.title !== currentNote) {
synced += 1;
validateNote(tid, function(newtid, isValid) {
if(isValid) {
store.save(newtid, giveFeedback);
} else {
invalid.push(newtid);
giveFeedback(false);
}
});
} else {
giveFeedback(false);
}
});
});
var currentUrl = decodeURIComponent(window.location.hash);
var match = currentUrl.match(/tiddler\/([^\/]*)$/);
if(match && match[1]) {
var matchbag = currentUrl.match(/bags\/([^\/]*)\//);
var noteBag = matchbag && matchbag[1] ? matchbag[1] : undefined;
if(currentUrl.indexOf("quickedit/") > -1) {
$("#newnote").addClass("quickedit");
}
loadServerNote(match[1], noteBag);
} else {
if(tiddlers[0]) {
note = tiddlers[0];
loadNote();
} else {
newNote();
}
$(container).addClass("ready");
}
}
// this stores the note locally (but not on the server)
function isEmpty(note) {
var emptyText = !note.text ? true : false;
var noTitle = note.fields && note.fields._title_set ? false : true;
return noTitle && emptyText ? true: false;
}
function storeNote() {
note.fields._modified = new Date();
if(!isEmpty(note)) {
store.add(note);
}
syncStatus();
}
function renameNote(newtitle) {
var old = note.title;
if(newtitle !== old && !isEmpty(note)) {
note.title = newtitle;
store.add(note);
store.remove(new tiddlyweb.Tiddler(old, bag));
}
}
/* the callback is passed true if the title is unique on the server,
false if the title already exists and null if it is not known */
function validateNote(tiddler, callback) {
var tid = new tiddlyweb.Tiddler(tiddler.title, bag);
if(RESERVED_TITLES.indexOf(tiddler.title) > -1) {
callback(tiddler, false, true);
} else if(tiddler.fields._title_validated) {
callback(tiddler, true);
} else {
tid.get(function() {
callback(tiddler, false);
}, function(xhr) {
if(xhr.status == 404) {
tiddler.fields._title_validated = "yes";
callback(tiddler, true);
} else {
callback(tiddler, null, null, xhr);
}
});
}
}
var renaming;
function validateCurrentNoteTitle(title, callback) {
callback = callback || function() {};
var fixTitle = function() {
if(renaming) {
printMessage("Note title set.", "", true);
renaming = false;
}
$(".note_title").attr("disabled", true);
};
validateNote(note, function(tiddler, valid, reserved, xhr) {
//note = tiddler;
if(valid) {
fixTitle();
} else if(valid === false) {
renaming = true;
var msg = reserved ? "This name is reserved and cannot be used. Please provide another."
: "A note with this name already exists. Please provide another name."
printMessage(msg, "error");
}
callback(valid, xhr);
});
}
$(document).ready(function() {
autoResize($("textarea.note_title")[0], { buffer: 0 });
autoResize($(".note_text")[0], { minHeight: 250 });
// on a blur event fix the title.
$(".note_title").blur(function(ev){
var val = $(ev.target).val();
var trimmed = $.trim(val);
if(trimmed.length > 0) {
note.fields._title_set = "yes";
renameNote(trimmed);
storeNote();
} else {
delete note.fields._title_set;
renameNote(getTitle());
}
}).keydown(function(ev) {
if(ev.keyCode === 13) {
ev.preventDefault();
}
});
});
function removeTag(tag) {
var tags = note.tags || [];
var newtags = [];
for(var i = 0; i < tags.length; i++) {
if(tags[i] !== tag) {
newtags.push(tags[i]);
}
}
note.tags = newtags;
printMetaData(note);
}
function addTagToCurrentNote(tag) {
var tags = note.tags || [];
tag = tag.toLowerCase();
if(tags.indexOf(tag) === -1) {
tags.push(tag);
}
note.tags = tags;
printMetaData(note);
}
function findTags(note) {
var tags = note.text.match(/#([^ \n#]+)/gi);
var unique = [];
for(var i = 0; i < tags.length; i++) {
var tag = tags[i].substr(1);
if(unique.indexOf(tag) === -1) {
unique.push(tag);
}
}
return unique;
}
function addTags() {
var newtags = findTags(note);
for(var i = 0; i < newtags.length; i++) {
addTagToCurrentNote(newtags[i]);
}
}
// every key press triggers a 'local' save
var tag = [];
var tagHandler = function(key) {
if(key === 8) {
tag.pop();
} else if(key === 32 || key === 13) { // space or new line terminates tag
if(tag.length > 1) {
addTags();
}
tag = [];
} else if(key === 35) { // hash symbol
if(tag.length > 1) {
addTags();
tag = ["#"];
} else {
tag = ["#"];
}
} else if(tag.length > 0) {
tag.push(String.fromCharCode(key));
}
};
$(".note_text").keydown(function(ev) {
note.text = $(ev.target).val();
if(ev.keyCode === 8) {
tagHandler(ev.keyCode);
}
storeNote();
}).keypress(function(ev) {
note.text = $(ev.target).val();
tagHandler(ev.keyCode);
}).keyup(function(ev) {
note.text = $(ev.target).val();
storeNote();
}).blur(function(ev) {
if(tag.length > 0) {
addTags();
}
tag = [];
}).click(function(ev) {
tag = [];
}).focus(function(ev) {
tag = [];
});
function resetNote() {
$("#note").removeClass("active");
$(".note_title, .note_text").val("").attr("disabled", false);
// reset url
window.location.hash = "";
newNote();
syncStatus();
}
// on clicking the "clear" button provide a blank note
$("#newnote").click(function(ev) {
printMessage("Saving note...");
var quickedit = $(ev.target).hasClass("quickedit");
validateCurrentNoteTitle(note.title, function(valid, xhr) {
if(valid) {
store.save(note, function(tid, options) {
if(tid) {
notabene.addRecentChange(tid.bag.name, note.title);
$("#note").addClass("active");
if(quickedit) { // if quick edit has been signalled
window.location = "/" + encodeURIComponent(note.title);
} else {
printMessage("Saved successfully.", null, true);
}
resetNote();
} else {
// TODO: give more useful error messages (currently options doesn't provide this)
if(xhr && xhr.status === 403) {
printMessage("You are not logged into takenote." +
"Please <a href='/challenge'>login</a> to post notes to the web.", "warning");
} else {
printMessage("Saved locally. Unable to post to web at current time.", "warning");
}
resetNote();
}
});
} else if(valid == null) {
printMessage("Saved locally. Unable to post to web at current time.", "warning");
resetNote();
}
});
});
//tie delete button to delete event
$("#deletenote").click(function(ev) {
var ok = confirm("Delete this note?");
if(!ok) {
return;
}
printMessage("Deleting note...");
if(note) {
var _server = note.fields._title_validated ? true : false;
store.remove({ tiddler: note, server: _server }, function(tid, msg, xhr) {
syncStatus();
if(xhr && xhr.status === 0) {
printMessage("Could not delete from server at current time.", "warning", true);
storeNote();
resetNote();
} else if(tid) {
$("#note").addClass("deleting");
printMessage("Note deleted.", null, true);
$("#note").removeClass("deleting");
$(".note_title, .note_text").val("").attr("disabled", false);
resetNote();
} else {
printMessage("Error deleting note. Please try again.", "error");
}
}); // TODO: ideally I would like to call store.removeTiddler(note) and not worry about syncing
}
});
$("#cancelnote").click(function(ev) {
var ok = confirm("Cancel editing this note and revert to previous online version?");
if(ok) {
store.remove(note.title);
resetNote();
}
});
init();
return {
init: init,
resetNote: resetNote,
findTags: findTags,
tagHandler: tagHandler,
printMessage: printMessage,
newNote: newNote,
loadNote: loadNote,
addTag: addTagToCurrentNote,
removeTag: removeTag,
store: store,
printMetaData: printMetaData,
validateCurrentNoteTitle: validateCurrentNoteTitle,
getNote: function() {
return note;
},
tempTitle: tempTitle,
loadServerNote: loadServerNote
};
}
function backstage() {
var internet, _checking, initialised;
function checkConnection() {
if(_checking) {
return;
} else {
_checking = true;
$.ajax({ url: "/status",
success: function(status) {
internet = true;
_checking = false;
$("body").addClass("online");
if(!initialised) {
initialised = true;
}
},
error: function() {
internet = false;
_checking = false;
$("body").removeClass("online");
}
});
}
}
checkConnection();
window.setInterval(checkConnection, 60000);
}
function renderIncomplete(store, bagname) {
var tiddlers = store().dirty().sort(function(a, b) {
return a.title < b.title ? -1 : 1;
});
var listIncomplete = $("#incomplete").empty()[0];
if(listIncomplete) {
for(var i = 0; i < tiddlers.length; i++) {
var item = $("<li />").appendTo(listIncomplete)[0];
var title = tiddlers[i].title;
$("<a />").attr("href", APP_PATH + "#!/tiddler/" + title).
text(title).appendTo(item);
}
if(tiddlers.length === 0) {
$("<li />").text("None.").appendTo(listIncomplete)[0];
}
}
}
function dashboard(container, options) {
notes(container, options);
var list = $("#recentnotes");
if(list.length > 0) {
var sortRecent = function(a, b) {
var title1 = typeof(a) === "string" ? a : a.title;
var title2 = typeof(b) === "string" ? b : b.title;
return title1 < title2 ? -1 : 1;
};
var recent = options.space ? notabene.getRecentChanges(options.space + "_private").
concat(notabene.getRecentChanges(options.space + "_public")) :
notabene.getRecentChanges(options.bag);
function printRecentItems(recent) {
if(recent.length === 0) {
$("<li />").text("No recently created notes.").appendTo(list)[0];
}
for(var i = 0; i < recent.length; i++) {
var li = $("<li />").appendTo(list)[0];
var tid = recent[i];
if(typeof(tid) === "string") {
tid = { title: tid };
}
var bag = tid.bag || options.bag;
$("<a />").attr("href",
"/bags/" + bag + "/tiddlers/" + encodeURIComponent(tid.title)).
text(tid.title).appendTo(li);
}
}
printRecentItems(recent.sort(sortRecent));
}
var throbspeed = 500;
var throb = window.setInterval(function() {
var searching = $(".searching");
if(searching.length > 0) {
var opacity = searching.css("opacity");
opacity = opacity ? parseFloat(opacity, 10) : 1;
if(opacity > 0.7) {
searching.animate({ opacity: 0.6 }, throbspeed)
} else {
searching.animate({ opacity: 1 }, throbspeed)
}
}
}, throbspeed);
var terms = {}, all_note_titles = [];
// preload titles
$.ajax({
dataType: "text",
url: "/bags/" + options.bag + "/tiddlers?select=tag:!excludeLists",
success: function(r) {
all_note_titles = r.split("\n");
}
});
function matchNotes(term, exclude) {
term = term.toLowerCase();
var results = [];
for(var i = 0; i < all_note_titles.length; i++) {
var title = all_note_titles[i];
if(title.toLowerCase().indexOf(term) > -1 && exclude.indexOf(title) === -1) {
results.push({ value: title, label: title, bag: options.bag });
}
}
return results;
}
// allow user to search for a tiddler
$(".findnote").autocomplete({
source: function(req, response) {
var el = $(this.element);
el.addClass("searching");
var term = req.term;
if(terms[term]) {
return response(terms[term]);
}
response(matchNotes(term, []));
$.ajax({
url: "/search?q=bag:" + options.bag + " \"" + term + " \"&select=tag:!excludeLists",
dataType: "json",
success: function(r) {
el.removeClass("searching").css({ opacity: 1 });
var data = [];
var exclude = [];
for(var i = 0; i < r.length; i++) {
var tiddler = r[i];
var bag = tiddler.bag;
var space = bag.split("_");
var spacename = space[0];
var spacetype = space[1];
var type = tiddler.type;
exclude.push(tiddler.title);
if(!type) { // only push "tiddlers" without a type
data.push({ value: tiddler.title, label: tiddler.title, bag: tiddler.bag })
}
}
data = data.concat(matchNotes(term, exclude));
if(data.length === 0) {
data.push({ label: "No notes found" });
}
terms[term] = data;
response(data);
},
error: function() {
var data = [];
data.concat(matchNotes(term, []));
if(data.length === 0) {
data.push({ label: "Unable to search at current time" });
}
el.removeClass("searching").css({ opacity: 1 });
response(data);
}
});
},
select: function(event, ui) {
if(ui.item.value && ui.item.bag) {
window.location = "/bags/" + ui.item.bag + "/tiddlers/" + encodeURIComponent(ui.item.value);
}
}
});
// TODO: refactor - some of this code is a repeat of that in the notes function
var instance = setup_store(options);
renderIncomplete(instance.store, instance.bag.name);
}
// show bookmark bubble if supported
window.addEventListener('load', function() {
window.setTimeout(function() {
var bubble = new google.bookmarkbubble.Bubble();
var BUBBLE_STORAGE_KEY = 'bubble';
bubble.setHashParameter = function() {
localStorage.setItem(BUBBLE_STORAGE_KEY, "yes");
};
bubble.hasHashParameter = function() {
return localStorage.getItem(BUBBLE_STORAGE_KEY) ? true : false;
};
bubble.getViewportHeight = function() {
return window.innerHeight;
};
bubble.getViewportScrollY = function() {
return window.pageYOffset;
};
bubble.registerScrollHandler = function(handler) {
window.addEventListener('scroll', handler, false);
};
bubble.deregisterScrollHandler = function(handler) {
window.removeEventListener('scroll', handler, false);
};
bubble.showIfAllowed();
}, 1000);
}, false);
addEventListener("load", function() {
setTimeout(hideURLbar, 0);
}, false);
function hideURLbar() {
window.scrollTo(0, 1);
}
!URL
http://code.google.com/apis/chart/
!Description
this is brilliant in its hacky simplicity
!URL
http://the-hub.net/
!Description
/***
|''Name''|TiddlySpaceTiddlerIconsPlugin|
|''Version''|0.8.10|
|''Status''|@@beta@@|
|''Author''|Jon Robson|
|''Description''|Provides ability to render SiteIcons and icons that correspond to the home location of given tiddlers|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceTiddlerIconsPlugin.js|
|''Requires''|TiddlySpaceConfig BinaryTiddlersPlugin ImageMacroPlugin TiddlySpacePublishingCommands|
!Notes
{{{<<tiddlerOrigin>>}}} shows the origin of the tiddler it is being run on.
In TiddlySpace terms this means it will determine whether the tiddler is external, public or private.
Where private it will analyse whether a public version exists and distinguish between the different scenarios.
If a tiddler is external, the SiteIcon of that external space will be shown
!Parameters
width / height : define a width or height of the outputted icon
label: if label parameter is set to yes, a label will accompany the icon.
!Code
***/
//{{{
(function($) {
if(!config.macros.image) {
throw "Missing dependency: ImageMacroPlugin";
}
var imageMacro = config.macros.image;
var tiddlyspace = config.extensions.tiddlyspace;
var tweb = config.extensions.tiddlyweb;
var cmds = config.commands;
var cmd = cmds.publishTiddler;
tiddlyspace.resolveSpaceName = function(value) {
var endsWith = config.extensions.BinaryTiddlersPlugin.endsWith;
if(value) {
value = value.indexOf("bags/") === 0 ? value.substr(5) : value;
value = value.indexOf("recipes/") === 0 ? value.substr(8) : value;
if(value.indexOf("@") === 0) {
value = value.substr(1);
}
if(endsWith(value, "_public")) {
value = value.substr(0, value.length - 7);
} else if(endsWith(value, "_private")) {
value = value.substr(0, value.length - 8);
}
value = value.toLowerCase();
}
return value;
};
tiddlyspace.renderAvatar = function(place, value, options) {
options = options ? options : {};
options.labelOptions = options.labelOptions ? options.labelOptions : { include: false, height: 48, width: 48 };
options.imageOptions = options.imageOptions ? options.imageOptions : {};
options.imageOptions.altImage = "/bags/common/tiddlers/defaultUserIcon";
var container = $('<div class="siteIcon" />').appendTo(place);
value = tiddlyspace.resolveSpaceName(value);
tweb.getStatus(function(status) {
var link, noLabel;
if(!value || value == config.views.wikified.defaultModifier ||
value == config.views.wikified.shadowModifier) {
var icon = config.views.wikified.shadowModifier == value ? "shadowIcon" : "missingIcon";
if(store.tiddlerExists(icon)) {
imageMacro.renderImage(container, icon, options.imageOptions);
} else {
noLabel = true;
}
} else {
var spaceURI;
if(value != tiddlyspace.currentSpace.name) {
spaceURI = options.notSpace ? tiddlyspace.getHost(status.server_host) :
tiddlyspace.getHost(status.server_host, value);
}
link = spaceURI ? $("<a />").attr("href", spaceURI) : $("<span />");
link.text(value);
var imageOptions = options.imageOptions;
if(options.spaceLink && !imageOptions.link) {
imageOptions.link = spaceURI;
}
var avatar = options.notSpace ? false : value;
var uri = tiddlyspace.getAvatar(status.server_host, avatar);
imageMacro.renderImage(container, uri, options.imageOptions);
if(!value) {
value = "tiddlyspace";
}
}
if(!noLabel && options.labelOptions.include) {
var prefix = $("<span />").text(options.labelOptions.prefix || "")[0];
var suffix = $("<span />").text(options.labelOptions.suffix || "")[0];
$('<div class="label" />').append(prefix).append(link).
append(suffix).appendTo(container);
}
});
if(value) {
var prefix = options.labelOptions.prefix || "";
var suffix = options.labelOptions.suffix || "";
var label = "%0%1%2".format(prefix, value, suffix);
$(container).attr("title", label);
}
};
var originMacro = config.macros.tiddlerOrigin = {
locale: {
"shadow": "shadow tiddler",
"missing": "missing tiddler",
"private": "private",
"unknown": "unknown state",
"public": "public",
"unsyncedPrivate": "unsynced and private",
"unsyncedPublic": "unsynced and public",
externalPrefix: "from ",
externalBagSuffix: " bag",
externalSuffix: " space",
publishPrivateDeletePrivate: "Are you sure you want to make this tiddler public?",
moveToPrivate: "Are you sure you want to make this tiddler private? Only members will be able to see it.",
pleaseWait: "please wait..",
keepPublic: "keep public",
cannotPublishDirtyTiddler: "The current tiddler is unsaved so cannot be published. Please save the tiddler first.",
keepPrivate: "keep private",
makePublic: "make public",
makePrivate: "make private"
},
handler: function(place, macroName, params,wikifier, paramString, tiddler){
var adaptor = tiddler.getAdaptor();
var btn = $("<div />").addClass("originButton").attr("params", paramString).
attr("refresh", "macro").attr("macroName", macroName).appendTo(place)[0];
$(btn).data("tiddler", tiddler);
originMacro.refresh(btn);
},
refresh: function(btn) {
$(btn).empty();
var paramString = $(btn).attr("params");
var tiddler = $(btn).data("tiddler");
var options = originMacro.getOptions(paramString);
var type = tiddlyspace.getTiddlerStatusType(tiddler);
originMacro.renderIcon(tiddler, type, btn, options);
},
getOptions: function(paramString) {
paramString = "%0 label:no width:48 height:48 spaceLink:yes preserveAspectRatio:yes".format(paramString);
var parsedParams = paramString.parseParams("name");
var params = parsedParams[0].name;
var options = {
labelOptions: originMacro._getLabelOptions(parsedParams),
imageOptions: imageMacro.getArguments(paramString, []),
noclick: parsedParams[0].interactive &&
parsedParams[0].interactive[0] == "no" ? true : false
};
if(!options.noclick) {
var spaceLink = parsedParams[0].spaceLink;
options.spaceLink = spaceLink && spaceLink[0] == "no" ? false : true;
} else {
options.spaceLink = false;
}
return options;
},
_getLabelOptions: function(parsedParams) {
parsedParams = parsedParams[0];
var includeLabel = !parsedParams.label || ( parsedParams.label && parsedParams.label[0] == "yes" );
var prefix = parsedParams.labelPrefix ? parsedParams.labelPrefix[0] : false;
var suffix = parsedParams.labelSuffix ? parsedParams.labelSuffix[0] : false;
return { include: includeLabel, suffix: suffix, prefix: prefix };
},
_isSpace: function(value) {
value = value ? value : "";
var endsWith = config.extensions.BinaryTiddlersPlugin.endsWith;
if(endsWith(value, "_private") || endsWith(value, "_public")) {
return true;
} else {
return false;
}
},
renderIcon: function(tiddler, type, button, options) {
var locale = originMacro.locale;
originMacro.annotateTiddler(button, type);
if(type != "external") {
originMacro.showPrivacyRoundel(tiddler, type, button,
options);
} else {
var prefix = options.labelOptions.prefix, suffix = options.labelOptions.suffix;
var space = tiddler.fields["server.bag"];
options.notSpace = !originMacro._isSpace(space);
options.labelOptions.prefix = prefix ? prefix : locale.externalPrefix;
options.labelOptions.suffix = suffix ? suffix : (options.notSpace ? locale.externalBagSuffix : locale.externalSuffix);
tiddlyspace.renderAvatar(button, space, options);
}
},
showPrivacyRoundel: function(thisTiddler, privacyType, button, options) {
// there is a public tiddler as well as the current tiddler!
// TODO: not this is not enough.. we also need to check if the public tiddler is the same as..
// .. the private tiddler to determine whether this is a draft
// use of hashes would be useful here.
$(button).empty();
var icon = "%0Icon".format(privacyType);
if(privacyType.indexOf("unsynced") === 0 && !store.tiddlerExists(icon)) {
icon = "unsyncedIcon";
}
if(privacyType == "shadow") {
if(!store.tiddlerExists(icon)) {
icon = "bags/tiddlyspace/tiddlers/SiteIcon";
}
}
if(privacyType == "missing" && !store.tiddlerExists(icon)) {
return; // the user is not making use of the missingIcon
} else {
imageMacro.renderImage(button, icon, options.imageOptions);
originMacro.showLabel(button, privacyType, options.labelOptions);
var cmd = originMacro.iconCommands[privacyType];
if(cmd && thisTiddler && !options.noclick) {
$(button).click(function(ev) {
cmd(ev, thisTiddler);
});
}
}
},
annotateTiddler: function(place, type) {
var tidEl = $(story.findContainingTiddler(place));
tidEl.
removeClass("private public external privateAndPublic privateNotPublic shadow").
addClass(type);
},
showLabel: function(button, type, options) {
var locale = originMacro.locale;
var label = options.label ? options.label : locale[type];
label = label ? label : locale.unknown;
if(options && options.include) {
$('<div class="roundelLabel" />').html(label).appendTo(button);
}
$(button).attr("title", label);
},
confirm: function(ev, msg, onYes, options) {
options = options ? options : {};
onYes = onYes ? onYes : function(ev) {};
var btn = $(".originButton", $(ev.target).parents())[0];
var popup = Popup.create(btn);
$(popup).addClass("confirmationPopup");
$("<div />").addClass("message").text(msg).appendTo(popup);
$("<button />").addClass("button").text(options.yesLabel || "yes").appendTo(popup).click(onYes);
$("<button />").addClass("button").text(options.noLabel || "no").click(function(ev) {
Popup.remove();
}).appendTo(popup);
Popup.show();
ev.stopPropagation();
return false;
},
alert: function(ev, msg) {
var popup = Popup.create(ev.target);
$(popup).addClass("confirmationPopup alert");
$("<div />").addClass("message").text(msg).appendTo(popup);
Popup.show();
ev.stopPropagation();
},
reportDirty: function(el) {
originMacro.alert(el, originMacro.locale.cannotPublishDirtyTiddler);
},
iconCommands: {
"public": function(ev, tiddler) {
if(!readOnly) {
var locale = originMacro.locale;
var msg = locale.moveToPrivate;
if(story.isDirty(tiddler.title)) {
originMacro.reportDirty(ev);
} else {
originMacro.confirm(ev, msg, function(ev) {
var target = $(ev.target);
var onComplete = function(info) {};
var privateBag = cmd.toggleBag(tiddler, "private");
cmd.moveTiddler(tiddler, {
title: tiddler.title,
fields: { "server.bag": privateBag }
}, onComplete);
}, { yesLabel: locale.makePrivate, noLabel: locale.keepPublic });
}
}
},
"private": function(ev, tiddler) {
if(!readOnly) {
var locale = originMacro.locale;
var adaptor = tiddler.getAdaptor();
var publishTo = tiddler.fields["publish.name"] || tiddler.title;
var workspace = "bags/%0".format(tiddler.fields["server.bag"]);
tiddler.fields["server.workspace"] = workspace;
var publicBag = cmd.toggleBag(tiddler, "public");
var msg;
msg = locale.publishPrivateDeletePrivate;
var title = tiddler.title;
var newTitle = publishTo || tiddler.title;
tiddler.fields["server.page.revision"] = "false";
store.addTiddler(tiddler);
if(story.isDirty(tiddler.title)) {
originMacro.reportDirty(ev);
} else {
originMacro.confirm(ev, msg, function(ev) {
var onComplete = function(info) {};
cmd.moveTiddler(tiddler, {
title: newTitle,
fields: { "server.bag": publicBag }
}, onComplete);
}, { yesLabel: locale.makePublic, noLabel: locale.keepPrivate });
}
}
}
}
};
})(jQuery);
//}}}
!URL
http://markbernstein.org/Nov0701/Whatsawiki.html
!Description
nails it
<html>
<head><title>stream</title></head>
<body>
<h1>Stream</h1>
<div id="social"></div>
<script type='text/javascript' src='/bags/common/tiddlers/jquery.js'></script>
<script type='text/javascript' src='/bags/tiddlyspace/tiddlers/chrjs'></script>
<script type='text/javascript' src='/_stream.js'></script>
</body>
</html>
THATCHER GAINING STRENGTH FROM NATION'S MISERY
!URL
http://www.bbc.co.uk/news/business-12406495
!Description
In a nutshell, the banks have committed to lending more money in 2011, especially to small businesses, to pay less in bonuses than they did last year and to be more transparent about their pay packages.
!Notes
This hardly seems a win for anybody but the banks. That's a tiny increase in funds for loans, and the conditions are sure to be rapacious. If the BofE keeps interest rates low, then finance should be available dirt cheap. That is not at all the case at the moment. And the bonuses. If that's constraint I'd like a constrained raise please.
/***
|''Name''|GroupByPlugin|
|''Description''|Mimics allTags macro to provide ways of creating lists grouping tiddlers by any field|
|''Version''|0.6.1|
|''Author''|Jon Robson|
|''Status''|beta|
!Usage
{{{<<groupBy tags>>}}}
mimics allTags macro
{{{<<groupBy server.bag>>}}}
groups by the server.bag field (this version contains TiddlySpace specific code for turning a bag into a space name)
{{{groupBy modified dateFormat:"YYYY"}}}
group tiddlers by year.
{{{<<groupBy tags exclude:excludeLists exclude:systemConfig>>}}}
group tiddlers by tag but exclude the tags with values excludeLists and systemConfig
Within that group you can also exclude things by filter
{{{groupBy modifier filter:[tag[film]]}}}
will group tiddlers tagged with film by modifier.
***/
//{{{
(function($) {
var taglocale = config.views.wikified.tag;
var macro = config.macros.groupBy = {
locale: {
tooltip: "all tiddlers in group %0",
noTiddlers: "no tiddlers",
openAllText: taglocale.openAllText,
openAllTooltip: taglocale.openAllTooltip,
openTiddler: "open tiddler with title %0"
},
morpher: {
// TODO: note currently the following 2 morphers are TiddlySpace specific and probably should be in separate plugin
"server.workspace": function(value, options) {
return macro.morpher["server.bag"](value.replace("bags/", "").replace("recipes/", ""));
},
"server.bag": function(value, options) {
if(typeof(value) !== "string") {
return false;
} else if(value.indexOf("_public") === -1 && value.indexOf("_private") === -1) {
value = "*%0".format(value); // add star for non-space bags.
}
return value.replace("_public", "").replace("_private", "");
},
created: function(value, options) {
return value.formatString(options.dateFormat || "DD MMM YYYY");
},
modified: function(value, options) {
return macro.morpher.created(value, options);
}
},
handler: function(place, macroName, params, wikifier, paramString) {
var field = params[0] || "server.workspace";
var dateFormat = params[1] || "DD MMM YYYY";
var container = $("<div />").attr("macroName", macroName).addClass("groupBy").
attr("refresh", "macro").attr("fieldName", field).
attr("paramString", paramString).
attr("dateFormat", dateFormat).appendTo(place)[0];
macro.refresh(container);
},
isTypeArray: function(value) {
var valueType = typeof value;
if(valueType === "object" && typeof value.length === "number" &&
!(value.propertyIsEnumerable("length")) &&
typeof value.splice === "function") { //is Array
return true;
} else {
return false;
}
},
_onClickGroup: function(ev, options) {
var i, target = ev.target, locale = macro.locale;
var tiddlers = $(target).closest(".templateContainer").data("tiddlers");
var popup = $(Popup.create(target)).addClass("taggedTiddlerList")[0];
var value = $(target).attr("value");
var openAll = createTiddlyButton($("<li />").appendTo(popup)[0],
locale.openAllText.format(value), locale.openAllTooltip);
$(openAll).click(function(ev) {
story.displayTiddlers(ev.target, tiddlers);
return false;
});
var listBreak = $("<li />").addClass("listBreak").html("<div />").appendTo(popup);
for(i = 0; i < tiddlers.length; i++) {
var item = $("<li />").appendTo(popup)[0];
var template = store.getTiddlerText(options.template) || macro.template;
wikify(template, item, null, tiddlers[i]);
}
listBreak.clone().appendTo(popup);
$(createTiddlyLink($("<li />").appendTo(popup)[0], value, false)).
text(locale.openTiddler.format(value));
Popup.show();
ev.stopPropagation();
return false;
},
_refresh: function(container, tiddlers, options) {
var totalGroups = 0, locale = macro.locale, i, j;
var excludeValues = options.exclude;
var values = {}, value_ids = [];
var field = options.field;
var morpher = macro.morpher[field] || function(value) {
return value;
};
for(i = 0; i < tiddlers.length; i++) {
var tiddler = tiddlers[i];
var value = tiddler[field] || tiddler.fields[field];
value = macro.isTypeArray(value) ? value : [ value ];
for(j = 0; j < value.length; j++) {
var v = morpher(value[j], options);
if(v && excludeValues.indexOf(v) === -1) {
totalGroups += 1;
if(!values[v]) {
values[v] = [];
}
values[v].push(tiddler);
value_ids.pushUnique(v);
}
}
}
var ul = $("<ul />").appendTo(container)[0];
if(totalGroups === 0) {
$("<li />").addClass("listTitle").text(locale.noTiddlers);
}
value_ids = value_ids.sort();
var groupTemplate = store.getTiddlerText(options.groupTemplate);
var onClick = function(ev) {
macro._onClickGroup(ev, options);
};
for(i = 0; i < value_ids.length; i++) {
var title = value_ids[i];
var info = getTiddlyLinkInfo(title);
tiddlers = values[title];
var btn = createTiddlyButton($("<li />").appendTo(ul)[0],
"%0 (%1)".format(title, tiddlers.length), locale.tooltip.format(title), null, info.classes);
if(groupTemplate) {
$(btn).empty();
wikify(groupTemplate, btn, null, tiddlers[0]);
}
$(btn).click(onClick).attr("value", title).attr("refresh", "link").attr("tiddlyLink", title);
$(btn).addClass("templateContainer").data("tiddlers", tiddlers);
}
},
refresh: function(container) {
container = $(container).empty();
var paramString = container.attr("paramString");
var args = paramString.parseParams("name", null, true, false, true)[0];
var options = { field: container.attr("fieldName"), dateFormat: container.attr("dateFormat"), exclude: args.exclude || [],
template: args.template ? args.template[0] : false, groupTemplate: args.groupTemplate ? args.groupTemplate[0] : "" };
var tiddlers = args.filter ? store.filterTiddlers(args.filter[0]) : store.getTiddlers("title");
macro._refresh(container, tiddlers, options);
},
template: "<<view title link>>"
};
}(jQuery));
//}}}
/***
|''Name''|TiddlySpaceFilters|
|''Description''|provide TiddlySpace-specific filter extensions|
|''Author''|Jon Robson|
|''Version''|0.6.1|
|''Status''|@@beta@@|
|''CoreVersion''|2.6.2|
|''Requires''|TiddlySpaceConfig|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage
{{{
<<tsList Private>>
<<tsList Public>>
<<tsList Draft>>
}}}
!Code
***/
//{{{
(function($) {
var tiddlyspace = config.extensions.tiddlyspace;
var privateBag = tiddlyspace.getCurrentBag("private");
var publicBag = tiddlyspace.getCurrentBag("public");
config.filterHelpers = {
is: {
"private": function(tiddler) {
var bag = tiddler.fields["server.bag"];
return bag == privateBag;
},
"public": function(tiddler) {
var bag = tiddler.fields["server.bag"];
return bag == publicBag;
},
draft: function(tiddler) {
var fields = tiddler.fields;
var bag = fields["server.bag"];
return (privateBag == bag && fields["publish.name"]) ? true : false;
},
local: function(tiddler) {
return config.filterHelpers.is["public"](tiddler) ||
config.filterHelpers.is["private"](tiddler);
},
unsynced: function(tiddler) {
return tiddler ? tiddler.isTouched() : false;
}
}
};
config.filters.is = function(results, match) {
var candidates = store.getTiddlers("title");
var type = match[3];
for (var i = 0; i < candidates.length; i++) {
var tiddler = candidates[i];
var helper = config.filterHelpers.is[type];
if(helper && helper(tiddler)) {
results.pushUnique(tiddler);
}
}
return results;
};
})(jQuery);
//}}}
.ts-loading {
background-image: url(/ajax-loader.gif);
background-repeat: no-repeat;
height: 30px;
width: 30px;
}
Tiddlers tagged tweet are similar to tweets on [[Twitter|http://twitter.com/]]: Short blurbs of what's going on. Different from those, though, I hope to link them into the hypertext network of this space.
I create them using a [[script|TweetScript]].
Comments from other people:
* titles no good
* permalinks not findable (need repview macro or similar)
* people want them to show up in twitter and/of facebook
/***
|''Name''|DiffFormatter|
|''Description''|highlighting of text comparisons|
|''Author''|FND|
|''Version''|0.9.0|
|''Status''|beta|
|''Source''|http://svn.tiddlywiki.org/Trunk/contributors/FND/formatters/DiffFormatter.js|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/contributors/FND/|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''Keywords''|formatting|
!Description
Highlights changes in a unified [[diff|http://en.wikipedia.org/wiki/Diff#Unified_format]].
!Notes
Based on Martin Budden's [[DiffFormatterPlugin|http://svn.tiddlywiki.org/Trunk/contributors/MartinBudden/formatters/DiffFormatterPlugin.js]].
!Usage
The formatter is applied to blocks wrapped in <html><code>{{{diff{..}}}</code></html> within tiddlers tagged with "diff".
!Revision History
!!v0.9 (2010-04-07)
* initial release; fork of DiffFormatterPlugin
!StyleSheet
.diff { white-space: pre; font-family: monospace; }
.diff ins, .diff del { display: block; text-decoration: none; }
.diff ins { background-color: #dfd; }
.diff del { background-color: #fdd; }
.diff .highlight { background-color: [[ColorPalette::SecondaryPale]]; }
!Code
***/
//{{{
(function() {
config.shadowTiddlers.StyleSheetDiffFormatter = store.getTiddlerText(tiddler.title + "##StyleSheet");
store.addNotification("StyleSheetDiffFormatter", refreshStyles);
var formatters = [{
name: "diffWrapper",
match: "^\\{\\{diff\\{\n", // XXX: suboptimal
termRegExp: /(.*\}\}\})$/mg,
handler: function(w) {
var el = createTiddlyElement(w.output, "div", null, "diff");
w.subWikifyTerm(el, this.termRegExp);
}
}, {
name: "diffRange",
match: "^(?:@@|[+\\-]{3}) ",
lookaheadRegExp: /^(?:@@|[+\-]{3}) .*\n/mg,
handler: function(w) {
createTiddlyElement(w.output, "div", null, "highlight").
innerHTML = "…";
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
}, {
name: "diffAdded",
match: "^\\+",
termRegExp: /(\n)/mg,
handler: function(w) {
var el = createTiddlyElement(w.output, "ins", null, "added");
w.subWikifyTerm(el, this.termRegExp);
}
}, {
name: "diffRemoved",
match: "^-",
termRegExp: /(\n)/mg,
handler: function(w) {
var el = createTiddlyElement(w.output, "del", null, "removed");
w.subWikifyTerm(el, this.termRegExp);
}
}
];
config.parsers.diffFormatter = new Formatter(formatters);
config.parsers.diffFormatter.format = "diff";
config.parsers.diffFormatter.formatTag = "diff";
})();
//}}}
!URL
http://arstechnica.com/journals/apple.ars/2007/04/08/have-your-mac-say-bonjour-to-tout-le-monde
!Description
wide area bonjour. something to try.
<<<
Allow comms towers to be shared between providers
<<<
[[The Mobile Network - a more competitive and fair approach - Adrian Hollister|http://www.adrianhollister.com/archives/236-The-Mobile-Network-a-more-competitive-and-fair-approach.html]]
yes, duh
!URL
http://www.expeditionguide.com/
!Description
Guy in wales, does climbing courses
!URL
http://www.nytimes.com/2011/10/10/opinion/panic-of-the-plutocrats.html?_r=2&src=mv&ref=general
!Description
The way to understand all of this is to realize that it’s part of a broader syndrome, in which wealthy Americans who benefit hugely from a system rigged in their favor react with hysteria to anyone who points out just how rigged the system is.
I don't understand bonuses. You should get paid if you do your job well and fired otherwise. Dividends on equity (all employees should have equity) is a different matter.
You can get a feed of everything I've recently modified on TiddlySpace:
http://tiddlyspace.com/search.atom?q=modifier:cdent
This is in response to [[a thread in the tiddlywiki group|http://groups.google.com/group/tiddlywiki/browse_thread/thread/5182cd720fb5e9f6/7807a2881c8bdb74]]:
Thank you, I'm glad its useful.
I've been making contributions to open source software since around '93 or so, back before it was even called that. And while, as I explained [[elsewhere|http://groups.google.com/group/tiddlywikidev/browse_thread/thread/ec5159b363a7e0d6 ]], I like to see code as the engine of activity in an open source project what I've leared from all that time is that neither the activity nor the code can come anywhere close to being correct without active dialog, feedback and information sharing.
Basically: people can't make stuff, together, unless they are all talking about the same thing.
As people, we reach a consensus by first building up a shared language about the context we are working in.
That shared language comes, essentially, from telling stories where the details are not yet clear but there are paths for participants to ask questions, do research and feed back their own thoughts into the mix. The stories enable dialog: between people and between individuals and existing information.
I see facillitating dialog (whether it be pleasant or contentious) as the number one role of an open source project leader. As the guy who is responsible for TiddlyWeb, it's my job to make sure that it is possible for interested people to get on and stay on the learning curve and be involved in the dialog. To do that I have to tell stories.
When I first heard about TiddlyWiki (when it first came out) I had recently co-founded what we planned to be a collaboration think tank. We were focused on high performance tools that augument asynchronous collaboration. TiddlyWiki was right in alignment with some of the ideas we had been pondering: access to small bits of micro-content can help you think about things, and communicate about those things. Stuff that goes back to Doug Engelbart (who was the inspiration for the think tank, and on the board).
Since then my professional focus has been on creating tools that allow granular access and reuse of information. PurpleWiki, the REST API at Socialtext and now TiddlyWeb. Each of these has the same basic premise: first class access, on an open web, to small pieces of information supports the kind of dialog and synthesis that move people from ignorance to action. The TiddlySpace buzzword for that is "social discourse".
Of course, spreading a bunch of small tidbits of information around the internet is meaningless if there is no human narrative which associates it all; places it in a context that adds meaning. That narrative comes from one place and one place only: Communicating with one another. Not just tossing information out there and hoping it lands well, but rather a consciousness of a community of people who are interested, invested, curious learners and participants. That consciousness comes from being an engaged listener and storyteller.
!URL
http://theconversation.edu.au/princeton-bans-academics-from-handing-all-copyright-to-journal-publishers-3596
!Description
Academics will also be encouraged to place their work in open access data stores such as Arxiv or campus-run data repositories.
!Notes
I hope this is the start of a trend.
<<<
Is your website too boring, functional and usable? Want to make it more exciting and “responsive”? Just include awfulness.js and you can benefit from all these new features.
<<<
[[Tom Morris - Introducing awfulness.js|http://blog.tommorris.org/post/21073443312/introducing-awfulness-js]]
Cousin, I think the shape of a marriage
is like the shelves my parents have carried
through Scotland to London, three houses;
is not distinguished, fine, French-polished,
but plywood and tatty, made
in the first place for children to batter,
still carrying markings in green felt-tip,
but always, where there are books
and a landing, managing to fit;
that marriage has lumps like
their button-backed sofa, constantly;
shortly, about to be stuffed;
and that love grows fat
as their squinting cat, swelling
round as a loaf from her basket.
I wish you years that shape, that form,
and a pond in a Sunday, urban garden;
where you’ll see your joined reflection tremble,
stand and watch the waterboatmen
skate with ease across the surface tension.
[[Kate Clanchy|http://www.weddingreads.com/for_a_wedding-kate_clancmy/]]
markdown tiddlers now render properly in the atom feeds
!URL
http://www.sixtostart.com/joinus/
!Description
i bet these people need people who move data from here ... to here
<<tagcloud filter:"[is[local]]" exclude:excludeLists exclude:excludeSearch exclude:excludePublisher>>
/***
|''Name''|TiddlyFileImporter|
|''Version''|0.3.8|
|''Author''|Ben Gillies|
|''Type''|plugin|
|''Description''|Upload a TiddlyWiki file to TiddlyWeb, and import the tiddlers.|
!Usage
Upload a TiddlyWiki file to TiddlyWeb, and import the tiddlers.
!Requires
tiddlyweb
tiddlywebplugins.reflector
!Code
***/
//{{{
(function($){
if(!version.extensions.TiddlyFileImporter)
{ //# ensure that the plugin is only installed once
version.extensions.TiddlyFileImporter = { installed: true };
}
config.macros.fileImport = {
reflectorURI: '/reflector?csrf_token=%0',
incorrectTypeError: 'Incorrect File Type. You must upload a TiddlyWiki',
uploadLabel: 'Upload',
uploadLabelPrompt: 'Import tiddlers from this TiddlyWiki',
step1FileText: 'File:',
step1URLText: 'URL:',
step1PostText: 'In the next screen you will select the tiddlers to import.',
step1Title: 'Step 1: Pick a TiddlyWiki to import',
step1TypeChooser: 'Import From:',
step3Html: ['<input type="hidden" name="markList" />',
'<input type="hidden" checked="true" name="chkSync" />',
'<input type="hidden" name="chkSave" />',
'<input type="hidden" name="txtSaveTiddler" />'].join(),
handler: function(place, macroName, params, wikifier, paramString) {
var wizard = new Wizard();
wizard.createWizard(place, 'Import a TiddlyWiki');
this.restart(wizard);
},
restart: function(wizard) {
var me = config.macros.fileImport;
wizard.addStep(me.step1Title, ['<input type="hidden" ',
'name="markList" />'].join(""));
var markList = wizard.getElement('markList');
var uploadWrapper = document.createElement('div');
markList.parentNode.insertBefore(uploadWrapper, markList);
uploadWrapper.setAttribute('refresh', 'macro');
uploadWrapper.getAttribute('macroName', 'fileImport');
var iframeName = 'reflectorImporter' + Math.random().toString();
me.createForm(uploadWrapper, wizard, iframeName);
$(uploadWrapper).append('<p>' + me.step1PostText + '</p>');
wizard.setValue('serverType', 'tiddlyweb');
wizard.setValue('adaptor', new config.adaptors.file());
wizard.setValue('host', config.defaultCustomFields['server.host']);
wizard.setValue('context', {});
var iframe = $(['<iframe name="' + iframeName + '" ',
'style="display: none" />'].join("")).appendTo(uploadWrapper);
var onSubmit = function(ev) {
var uploadType = $('select[name=uploadtype]', wizard.formElem).val();
if (uploadType == "file") {
// set an onload ready to hijack the form
me.setOnLoad(uploadWrapper, wizard, iframe[0]);
wizard.importType = 'file';
wizard.formElem.submit();
} else {
var csrf_token = config.extensions.tiddlyspace.getCSRFToken();
$.ajax({
url: "%0/reflector?csrf_token=%1".format(
config.defaultCustomFields["server.host"], csrf_token),
type: "POST",
dataType: "text",
data: {
uri: $("input", ".importFrom", wizard.formElem).val()
},
success: function(data, txtStatus, xhr) {
wizard.POSTResponse = data;
me.importTiddlers(uploadWrapper, wizard);
},
error: function(xhr, txtStatus, error) {
displayMessage(["There was an error fetching the ",
'url: ', txtStatus].join(""));
me.restart(wizard);
}
});
return false;
}
};
wizard.setButtons([{
caption: me.uploadLabel,
tooltip: me.uploadLabelPrompt,
onClick: onSubmit
}]);
$(wizard.formElem).submit(function(ev) {
onSubmit(ev);
ev.preventDefault();
});
},
createForm: function(place, wizard, iframeName) {
var form = wizard.formElem;
var me = config.macros.fileImport;
form.action = me.reflectorURI.format(
config.extensions.tiddlyspace.getCSRFToken());
form.enctype = 'multipart/form-data';
form.encoding = 'multipart/form-data';
form.method = 'POST';
form.target = iframeName;
onSelectChange = function(e) {
var changeTo = $(this).val();
if (changeTo == "file") {
$(".importFrom").html('%0 <input type="file" name="file" />'.
format(me.step1FileText));
} else {
$(".importFrom").html('%0 <input type="text" name="uri" />'.
format(me.step1URLText));
}
};
$(place).append('<span>%0</span>'.format(me.step1TypeChooser)).
append($(['<select name="uploadtype"><option value="file" selected="selected">file',
'<option value="uri">url</select>'].join("")).change(onSelectChange)).
append('<div class="importFrom">%0<input type="file" name="file" /></div>'.
format(me.step1FileText));
},
setOnLoad: function(place, wizard, iframe) {
var me = config.macros.fileImport;
var loadHandler = function() {
me.importTiddlers.apply(this, [place, wizard, iframe]);
};
iframe.onload = loadHandler;
completeReadyStateChanges = 0;
iframe.onreadystatechange = function() {
if (++(completeReadyStateChanges) == 5) {
loadHandler();
}
};
},
importTiddlers: function(place, wizard, iframe) {
var tmpStore = new TiddlyWiki();
var POSTedWiki = "";
if (wizard.importType == "file") {
try {
POSTedWiki= iframe.contentWindow
.document.documentElement.innerHTML;
} catch(e) {
displayMessage(config.macros.fileImport.incorrectTypeError);
config.macros.fileImport.restart(wizard);
return;
}
// now we are done, so remove the iframe
$(iframe).remove();
} else {
POSTedWiki = wizard.POSTResponse;
}
tmpStore.importTiddlyWiki(POSTedWiki);
var newTiddlers = tmpStore.getTiddlers();
var workspace = config.defaultCustomFields['server.workspace'];
var context = {
status: true,
statusText: 'OK',
httpStatus: 200,
adaptor: wizard.getValue('adaptor'),
tiddlers: newTiddlers
};
context.adaptor.store = tmpStore;
wizard.setValue('context', context);
wizard.setValue('workspace', workspace);
wizard.setValue('inFileImport', true);
config.macros.importTiddlers.onGetTiddlerList(context, wizard);
}
};
var _onGetTiddler = config.macros.importTiddlers.onGetTiddler;
config.macros.importTiddlers.onGetTiddler = function(context, wizard) {
if (wizard.getValue('inFileImport')) {
var me = config.macros.importTiddlers;
if(!context.status)
displayMessage("Error in importTiddlers.onGetTiddler: " + context.statusText);
var tiddler = context.tiddler;
var fields = tiddler.fields;
merge(fields, config.defaultCustomFields);
fields["server.workspace"] = wizard.getValue('workspace');
delete fields['server.permissions'];
delete fields['server.bag'];
fields['server.page.revision'] = 'false';
delete fields['server.recipe'];
fields.changecount = 1;
store.suspendNotifications();
store.saveTiddler(tiddler.title, tiddler.title, tiddler.text,
tiddler.modifier, tiddler.modified, tiddler.tags, tiddler.fields,
false, tiddler.created);
store.resumeNotifications();
var remainingImports = wizard.getValue("remainingImports")-1;
wizard.setValue("remainingImports",remainingImports);
if(remainingImports === 0) {
if(context.isSynchronous) {
store.notifyAll();
refreshDisplay();
}
wizard.setButtons([
{caption: me.doneLabel, tooltip: me.donePrompt, onClick: me.onClose}
],me.statusDoneImport);
autoSaveChanges();
}
} else {
_onGetTiddler.apply(this, arguments);
}
};
var _onCancel = config.macros.importTiddlers.onCancel;
config.macros.importTiddlers.onCancel = function(e)
{
var wizard = new Wizard(this);
if (!wizard.getValue('inFileImport')) {
return _onCancel.apply(this, arguments);
}
var place = wizard.clear();
config.macros.fileImport.restart(wizard);
return false;
};
var _step3Html = config.macros.importTiddlers.step3Html;
var _onGetTiddlerList = config.macros.importTiddlers.onGetTiddlerList;
config.macros.importTiddlers.onGetTiddlerList = function(context, wizard) {
var fileImport = config.macros.fileImport;
var importTiddlers = config.macros.importTiddlers;
if (wizard.getValue('inFileImport')) {
importTiddlers.step3Html = fileImport.step3Html;
} else {
importTiddlers.step3Html = _step3Html;
}
_onGetTiddlerList.apply(this, arguments);
};
})(jQuery);
//}}}
!URL
http://www.allaboutyou.com/country/Bluebell-walks/v1
!Description
!URL
http://blog.tommorris.org/post/3216687621/im-not-an-experience-seeking-user-im-a
!Description
This is why I’m sceptical about gamification: there’s enough fucking pointless distractions in life already, we don’t need more of them, however beautiful the user experiences are. But what we do need more of is people making a commitment to doing something meaningful and building a shared pool of common value.
Everyone has, and should accept, their capacity to be an asshole and an angel.
!URL
http://blog.jackvinson.com/archives/2008/05/11/necessary_but_not_sufficient_2nd_pass.html
!Description
The old learned rules can limit the opportunities provided by advances.
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
/***
|''Name''|TiddlySpaceConfig|
|''Version''|0.7.7|
|''Description''|TiddlySpace configuration|
|''Status''|stable|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceConfig.js|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlyWebConfig ServerSideSavingPlugin TiddlyFileImporter|
!Code
***/
//{{{
(function($) {
var tweb = config.extensions.tiddlyweb;
var recipe = config.defaultCustomFields["server.workspace"].split("recipes/")[1];
var currentSpace; // assigned later
var disabledTabs = [];
var coreBags = ["system", "tiddlyspace"];
var systemSpaces = ["plugins", "info", "images", "theme"];
systemSpaces = $.map(systemSpaces, function(item, i) {
return "system-%0_public".format(item);
});
// hijack search macro to add custom attributes for mobile devices
var _search = config.macros.search.handler;
config.macros.search.handler = function(place, macroName, params) {
_search.apply(this, arguments);
$(".searchField:input", place).
attr({ autocapitalize: "off", autocorrect: "off" });
};
// arg is either a container name or a tiddler object
// if fuzzy is truthy, space may be inferred from workspace (for new tiddlers)
// returns space object or false
var determineSpace = function(arg, fuzzy) {
if(typeof arg == "string") { // container name
var space = split(arg, "_", "r");
return ["public", "private"].contains(space.type) ? space : false;
} else if(arg) { // tiddler
var container = determineContainer(arg, fuzzy);
return container ? determineSpace(container.name, fuzzy) : false;
} else {
return false;
}
};
// if fuzzy is truthy, container may be inferred from workspace for new tiddlers
// returns container object or false
var determineContainer = function(tiddler, fuzzy) { // TODO: expose?
var bag = tiddler.fields["server.bag"];
var recipe = tiddler.fields["server.recipe"]; // XXX: unused/irrelevant/redundant!?
if(bag) {
return { type: "bag", name: bag };
} else if(recipe) {
return { type: "recipe", name: recipe };
} else if(fuzzy) { // new tiddler
var workspace = tiddler.fields["server.workspace"];
if(workspace) {
var container = split(workspace, "/", "l");
return ["bags", "recipes"].contains(container.type) ? container : false;
} else {
return false;
}
} else {
return false;
}
};
// hijack removeTiddlerCallback to restore tiddler from recipe cascade -- TODO: move into TiddlyWebWiki?
var sssp = config.extensions.ServerSideSavingPlugin;
var _removeTiddlerCallback = sssp.removeTiddlerCallback;
sssp.removeTiddlerCallback = function(context, userParams) {
var title = context.tiddler.title;
var recipe = context.tiddler.fields["server.recipe"];
_removeTiddlerCallback.apply(this, arguments);
if(recipe) {
context.workspace = "recipes/" + recipe;
var callback = function(context, userParams) {
if(context.status) {
var dirty = store.isDirty();
store.saveTiddler(context.tiddler).clearChangeCount();
store.setDirty(dirty);
} else {
store.notify(title, true);
}
};
context.adaptor.getTiddler(title, context, null, callback);
}
};
// splits a string once using delimiter
// mode "l" splits at the first, "r" at the last occurrence
// returns an object with members type and name
var split = function(str, sep, mode) {
mode = mode == "r" ? "pop" : "shift"; // TODO: use +/-1 instead of "l"/"r"?
var arr = str.split(sep);
var type = arr.length > 1 ? arr[mode]() : null;
return { type: type, name: arr.join(sep) };
};
var plugin = config.extensions.tiddlyspace = {
currentSpace: determineSpace(recipe),
coreBags: coreBags.concat(systemSpaces),
determineSpace: determineSpace,
isValidSpaceName: function(name) {
return name.match(/^[a-z][0-9a-z\-]*[0-9a-z]$/) ? true : false;
},
getCurrentBag: function(type) {
return "%0_%1".format(currentSpace, type);
},
getCurrentWorkspace: function(type) {
return "bags/" + this.getCurrentBag(type);
},
// returns the URL for a space's avatar (SiteIcon) based on a server_host
// object and an optional space name
// optional nocors argument prevents cross-domain URLs from being generated
getAvatar: function(host, space, nocors) {
if(space && typeof space != "string") { // backwards compatibility -- XXX: deprecated
space = space.name;
}
var subdomain = nocors ? currentSpace : space;
host = host ? this.getHost(host, subdomain) : "";
var bag = space ? "%0_public".format(space) : "tiddlyspace";
return "%0/bags/%1/tiddlers/SiteIcon".format(host, bag);
},
// returns the URL based on a server_host object (scheme, host, port) and an
// optional subdomain
getHost: function(host, subdomain) {
if(host === undefined) { // offline
tweb.status.server_host = {}; // prevents exceptions further down the stack -- XXX: hacky workaround, breaks encapsulation
return null;
}
subdomain = subdomain ? subdomain + "." : "";
var url = "%0://%1%2".format(host.scheme, subdomain, host.host);
var port = host.port;
if(port && !["80", "443"].contains(port)) {
url += ":" + port;
}
return url;
},
disableTab: function(tabTiddler) {
if(typeof(tabTiddler) == "string") {
disabledTabs.push(tabTiddler);
} else {
for(var i = 0; i < tabTiddler.length; i++) {
plugin.disableTab(tabTiddler[i]);
}
}
},
isDisabledTab: function(tabTitle) {
var match = new RegExp("(?:\\[\\[([^\\]]+)\\]\\])", "mg").exec(tabTitle);
var tabIdentifier = match ? match[1] : tabTitle;
return disabledTabs.contains(tabIdentifier);
},
getCSRFToken: window.getCSRFToken || null // this may not have been processed yet
};
currentSpace = plugin.currentSpace.name;
tweb.serverPrefix = tweb.host.split("/")[3] || ""; // XXX: assumes root handler
tweb.getStatus(function(status) {
var url = plugin.getHost(status.server_host);
tweb.status.server_host.url = url;
config.messages.tsVersion = status.version;
});
if(window.location.protocol == "file:") {
// enable AutoSave by default
config.options.chkAutoSave = config.options.chkAutoSave === undefined ?
true : config.options.chkAutoSave;
} else {
// set global read-only mode based on membership heuristics
var indicator = store.getTiddler("SiteTitle") || tiddler;
readOnly = !(recipe.split("_").pop() == "private" ||
tweb.hasPermission("write", indicator));
// replace TiddlyWiki's ImportTiddlers due to cross-domain restrictions
if(config.macros.fileImport) {
$.extend(config.macros.importTiddlers, config.macros.fileImport);
}
}
// hijack saveChanges to ensure SystemSettings is private by default
var _saveChanges = saveChanges;
saveChanges = function(onlyIfDirty, tiddlers) {
if(tiddlers && tiddlers.length == 1 &&
tiddlers[0] && tiddlers[0].title == "SystemSettings") {
var fields = tiddlers[0].fields;
delete fields["server.recipe"];
fields["server.bag"] = plugin.getCurrentBag("private");
fields["server.workspace"] = plugin.getCurrentWorkspace("private");
}
return _saveChanges.apply(this, arguments);
};
// ensure backstage is always initialized
// required to circumvent TiddlyWiki's read-only based handling
config.macros.backstageInit = {
init: function() {
showBackstage = true;
}
};
// disable evaluated macro parameters for security reasons
config.evaluateMacroParameters = "none";
var _parseParams = String.prototype.parseParams;
String.prototype.parseParams = function(defaultName, defaultValue, allowEval,
noNames, cascadeDefaults) {
if(config.evaluateMacroParameters == "none") {
arguments[2] = false;
}
return _parseParams.apply(this, arguments);
};
var _tabsMacro = config.macros.tabs.handler;
config.macros.tabs.handler = function(place, macroName, params) {
var newParams = [params[0]]; // keep cookie name
for(var i = 1; i < params.length; i += 3) {
var tabTitle = params[i + 2];
if(!plugin.isDisabledTab(tabTitle)){
newParams = newParams.concat(params[i], params[i + 1], tabTitle);
}
}
_tabsMacro.apply(this, [place, macroName, newParams]);
};
// disable ControlView for XHRs by default
$.ajaxSetup({
beforeSend: function(xhr) {
xhr.setRequestHeader("X-ControlView", "false");
}
});
// TiddlyWeb adaptor currently still uses httpReq, which needs extra magic -- XXX: obsolete this!
var _httpReq = httpReq;
httpReq = function(type, url, callback, params, headers, data, contentType,
username, password, allowCache) {
headers = headers || {};
headers["X-ControlView"] = "false";
_httpReq.apply(this, arguments);
};
// register style sheet for backstage separately (important)
store.addNotification("StyleSheetBackstage", refreshStyles);
// option for default privacy setting
config.optionsDesc.chkPrivateMode = "Set your default privacy mode to private";
config.optionsSource.chkPrivateMode = "setting";
config.options.chkPrivateMode = config.options.chkPrivateMode || false;
saveSystemSetting("chkPrivateMode", true);
config.defaultCustomFields["server.workspace"] = plugin.
getCurrentWorkspace(config.options.chkPrivateMode ? "private" : "public");
config.paramifiers.follow = {
onstart: function(v) {
if(!readOnly) {
var bag = "%0_public".format(currentSpace);
story.displayTiddler(null, v, DEFAULT_EDIT_TEMPLATE, null, null,
"server.bag:%0 server.workspace:bags/%0".format(bag));
story.setTiddlerTag(v, "follow", 1);
story.focusTiddler(v, "text");
}
}
};
var fImport = config.macros.fileImport;
if(fImport) {
fImport.uploadTo = "Upload to: ";
var _createForm = config.macros.fileImport.createForm;
config.macros.fileImport.createForm = function(place, wizard, iframeName) {
var container = $("<div />").text(fImport.uploadTo).appendTo(place);
var select = $('<select name="mode" />').appendTo(container)[0];
$('<option value="private" selected>private</a>').appendTo(select);
$('<option value="public">public</a>').appendTo(select);
wizard.setValue("importmode", select);
_createForm.apply(this, [place, wizard, iframeName]);
};
var _onGet = config.macros.importTiddlers.onGetTiddler;
config.macros.importTiddlers.onGetTiddler = function(context, wizard) {
var type = $(wizard.getValue("importmode")).val();
var ws = plugin.getCurrentWorkspace(type);
wizard.setValue("workspace", ws);
_onGet.apply(this, [context, wizard]);
};
}
})(jQuery);
//}}}
us chinese spicy actually is
<<<
I confess that I hate using wikis. They’re a mess. I like more fundamental structure, like posts on a group blog, or explicit interviews, and old style long-form writing.
<<<
[[Stowe Boyd • I Hate Wikis|http://www.stoweboyd.com/post/18494763749/i-hate-wikis]]
!Heresy!
!URL
https://github.com/simplegeo/python-oauth2
!Description
A fully tested, abstract interface to creating OAuth clients and servers.
!Notes
Will be wanting this
<<<
It not only partially inspires Agile and other lightweight software development methods, it reinforces a theme big companies are often unintentionally trying to forget: hacking is important.
<<<
[[Rands In Repose: Hacking is Important|http://www.randsinrepose.com/archives/2012/03/13/hacking_is_important.html]]
Nice bit of writing on what it takes to innovate and be disruptive: be outsiders.
finally deactivated my facebook
A public-facing, social networking-ish TiddlySpace for @cdent
//This is one of what I hope will become a series describing how I get stuff done. The series is tagged <<tag asimaywork>>.//
One of the ways in which I figure out what to do on any given day is by looking in the log files of the services I work with. If the log files have errors in them, show a problem with performance, or indicate a misuse that gives me a clear statement of:
* something is happening //now//
* on a service that is being used //now//
* so matters
There's no ambiguity about the impact of the anomalous condition: It's happening in real life, so I better attend to it. If you want to get stuff done, and done effectively work to factor out ambiguity.
Once the situation is fixed and the service updated, the log file is now cleaner. If different situations come up, their context is more clear than before I fixed the other situation.
So if one wants to follow this system for motivation and decision making it implies a few things:
* Services need to be logged.
* You need to decide what you will consider as a log.
The latter point deserves some expansion. In the simple case we can look at the {{{tiddlyweb.log}}} file of a TidldyWeb server and easily say it is a log file and that errors that show up in there need to be dealt with. But what about a new message in an email folder, or a feed, of a commit message?
First you have to be able to discern whether the message requires action. If so, then maybe.
If you claim too many inputs as LogFiles then you will be too interrupt driven, however if you [[read well|db7df998d76078a02ba162b072f99966]] you can filter quickly and cleanly.
!URL
http://london.usembassy.gov/dhs/uscis/abandon.html
!Description
If you wish to abandon your permanent residence and relinquish your Permanent Resident Card or "Green Card", please download the I-407 Form and complete only those items that are highlighted in yellow
!Notes
In case I need to do this.
I seem to be a bit poorly. Just want to light the fire and snooze.
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
/***
|''Name''|ActivityStreamPlugin|
|''Version''|0.5.4|
|''Description''|Provides a following macro|
|''Author''|Jon Robson|
|''Requires''|TiddlySpaceFollowingPlugin|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''Source''|https://github.com/jdlrobson/TiddlyWiki/raw/master/plugins/TiddlySpaceInstaller/ActivityStreamPlugin.js|
!Usage
{{{<<activity>>}}}
!!Supressing activity
You can supress notifications by id:
"plugin", "shadow", "standard", "follow", "followYou", "siteInfo", "siteIcon", "ownSiteIcon", "notify", "reply"
e.g. {{{ <<activity supress:siteIcon>> }}} will hide siteIcon activity from you.
!!Supressing people
{{{<<activity ignore:person}}} will ignore all activity where person is the subject of the activity. eg. person followed other-person will not appear in the feed.
!!Controlling displayed dates.
{{{<<activity timestampFormat:"<0hh o' clock>" headingFormat:"0DD/0MM" >>}}} will display date headings as date/month eg.
3rd of January would be displayed as 03/01. This particular timestamp example gives you the hour of the activity.
!!Even more content
{{{<<activity limit:no>>}}} will show you all possible activity in the last X days where X is set at a macro level (advanced developers should see config.macros.activity.RECENTNESS).
!StyleSheet
.activityStream .externalImage, .activityStream .image {
display: inline;
}
.feedItem .siteIcon {
display: inline;
}
.activityStream .error {
background-color: red;
color: white;
font-weight: bold;
}
.activityStream .feedItem {
list-style: none;
}
.activityStream .notification {
background-color: yellow;
color: black;
}
.activityStream .activityGroupTitle {
font-weight: bold;
margin-top: 8px;
}
.activityStream .feedItem {
margin-left: 8px;
}
!Code
***/
//{{{
(function($) {
var name = "StyleSheetActivityStream";
config.shadowTiddlers[name] = store.getTiddlerText(tiddler.title +
"##StyleSheet");
store.addNotification(name, refreshStyles);
var followMacro = config.macros.followTiddlers;
var tweb = config.extensions.tiddlyweb;
var tiddlyspace = config.extensions.tiddlyspace;
var scanMacro = config.macros.tsScan;
var modifierSpaceLink = "<<view modifier spaceLink>>";
var spaceTiddlyLink = "<<view server.bag spaceLink server.title>>";
var bagSpaceLink = "<<view server.bag spaceLink>>";
var bagSiteIcon = "<<view server.bag SiteIcon width:24 height:24 label:no preserveAspectRatio:yes>>";
var modifierSiteIcon = "<<view modifier SiteIcon width:24 height:24 label:no preserveAspectRatio:yes>>";
var timestamp = "[<<view modified date '0hh:0mm'>>]";
var replyLink = "<<view server.title replyLink>>";
config.shadowTiddlers.ActivityStreamTemplates = [
"!notify\n%3 {{notification{%0 %1 has modified %2 in %0 %1 and flagged it for your attention!}}} %8\n",
"!reply\n%3 {{notification{%0 %1 replied with %2 to your %4 %5 post.}}} %8\n",
"!userSiteIcon\n%3 %6 %7 has a new ~SiteIcon.\n",
"!spaceSiteIcon\n%3 %6 %7 updated the SiteIcon for the %0 %1 space.\n",
"!image\n%3 %6 %7 drew the image %2 in the %1 space.\n",
"!plugin\n%3 %6 %7 modified a plugin called %2 in the %0 %1 space.\n",
"!shadow\n%3 %6 %7 modified a shadow tiddler %2 in the %0 %1 space.\n",
"!geo\n%3 %6 %7 modified a geo tiddler called %2 in the %0 %1 space <<view title maplink 'view on map'>>. %8\n",
"!followYou\n%3 %0 %1 is now following you.\n",
"!follow\n%3 %0 %1 is now following %4 %5 <<view server.title link follow>>\n",
"!siteInfo\n%3 %6 %7 <<view server.bag spaceLink server.title label:described>> the %0 %1 space.\n",
"!video\n%3 %6 %7 modified a video entitled %2 in the %0 %1 space. %8\n",
"!standard\n%3 %6 %7 modified %2 in the %0 %1 space. %8\n"
].join("").format(bagSiteIcon, bagSpaceLink, spaceTiddlyLink, timestamp,
"<<view server.title SiteIcon width:24 height:24 label:no preserveAspectRatio:yes>>", "<<view server.title spaceLink>>",
modifierSiteIcon, modifierSpaceLink, replyLink);
story.refreshTiddler("ActivityStreamTemplates", null, true);
config.annotations.ActivityStreamTemplates = "This is a special tiddler used by the ActivityStreamPlugin. It is used for templating notifications. Templates at the top have preference over templates at the bottom.";
var macro = config.macros.activity = {
default_limit: 50,
templates: [],
init: function() {
var templates = [];
var regex = new RegExp(/^!(.*)\n/gm);
var text = store.getTiddlerText("ActivityStreamTemplates");
var match = regex.exec(text);
while(match) {
templates.push(match[1]);
match = regex.exec(text);
}
macro.templates = templates;
},
// order matters - earlier templates override older ones
RECENTNESS: 2, // in days
TIMESTAMP_FORMAT: "<0hh:0mm>",
info: {},
locale: {
pleaseWait: "please wait while we load your stream...",
errorLoading: "The activity stream failed to load. Please make sure you have an internet connection and try again.",
userHeading: "Below is the activity stream for spaces that this space follows with the follow tag. (%0/%1 spaces have been loaded)",
emptyStream: "Activity stream currently empty. (%0/%1 loaded)"
},
getTimeStamp: function() {
var today = new Date();
macro._lastRun = today.getTime();
var previous = new Date(today.setDate(today.getDate() - macro.RECENTNESS));
return previous.convertToYYYYMMDDHHMM();
},
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
var container = $("<div />").text(macro.locale.pleaseWait).appendTo(place).
attr("refresh", "macro").attr("macroName", macroName).attr("paramString", paramString);
var space = tiddlyspace.currentSpace.name;
var options = macro.getOptions(paramString);
$(container).attr("activity-limit", options.limit);
macro._session = Math.random();
var activityType;
var sourceActivity = function(user) {
macro.CURRENT_USER = user.name;
macro.USER_AT_TAG = "@%0".format(user.name);
followMacro.getFollowers(function(users) {
macro.getActivity(container, users, activityType, options);
}, macro.CURRENT_USER);
container.attr("activity-type", activityType);
macro._renderStream(container, activityType, options);
};
if(options.user) {
sourceActivity({name: options.user});
} else {
sourceActivity({ name: tiddlyspace.currentSpace.name });
}
},
getOptions: function(paramString) {
var options = {};
var args = paramString.parseParams("name")[0];
var toMap = ["timestampFormat", "headingFormat", "limit", "user"];
var i;
for(i = 0; i < toMap.length; i++) {
var map = toMap[i];
options[map] = args[map] ? args[map][0] : false;
}
var supress = args.supress || [];
var templates = [];
var show = args.show ? args.show : macro.templates;
for(i = 0; i < show.length; i++) {
var template = show[i];
if(supress.indexOf(template) === -1) {
templates.push(template);
}
}
options.ignore = args.ignore || [];
options.templates = templates;
return options;
},
_getActivityQuery: function(user, timestamp) {
timestamp = timestamp || macro.getTimeStamp();
if(user) {
return "/bags/%0_public/tiddlers?select=modified:>%1".format(user, timestamp);
} else {
return false;
}
},
refresh: function(container) {
var type = $(container).attr("activity-type");
var limit = $(container).attr("activity-limit");
var options = macro.getOptions($(container).attr("paramString"));
options.limit = parseInt(limit, 10);
macro.renderStream(container, type, options);
},
getActivity: function(place, users, type, options) {
var i;
var timestamp = macro.activityTimestamp;
var firstRun = timestamp ? false : true;
macro.info.loaded = firstRun ? 0 : macro.info.loaded;
var afterAjax = function(tiddlers) {
if(firstRun) {
macro.info.loaded += 1;
}
macro.updateStream(tiddlers, type, options);
macro.renderStream(place, type, options);
};
var success = function(tiddlers) {
afterAjax(tiddlers);
};
var error = function() {
afterAjax([]);
};
if(macro._lastRun > new Date().getTime() - 300000) { // leave 5 minutes between calls
afterAjax([]);
return;
}
macro.info.queries = users.length;
for(i = 0; i < users.length; i++) {
var user = users[i];
ajaxReq({
url: macro._getActivityQuery(user, timestamp),
dataType: "json", success: success, error: error
});
}
macro.activityTimestamp = new Date().convertToYYYYMMDDHHMM();
},
reportError: function(place) {
var error = $("<div />").addClass("error").text(locale.errorLoading);
$(place).empty().append(error);
},
createFeedEntry: function(container, tiddler, options) {
var item = $("<li />").addClass("feedItem");
var content = $("<div />").appendTo(item);
var wikifyPlace = $("<span />").appendTo(content)[0];
var author = tiddler.modifier;
if(author && !options.ignore.contains(author)) {
$(container).append(item);
config.macros.view.views.activityItem(null, wikifyPlace, null, null, null, tiddler);
return item;
}
return false;
},
renderStream: function(place, type, options) {
window.clearTimeout(macro._renderTimeout);
macro._renderTimeout = window.setTimeout(function() {
macro._renderStream(place, type, options);
}, 100);
},
_renderStream: function(place, type, options) {
$(place).empty();
var limit = options.limit;
var container = $("<ul />").addClass("activityStream").appendTo(place);
var textHeading = macro.locale.userHeading.format(macro.info.loaded, macro.info.queries);
$("<li />").addClass("listTitle").text(textHeading).appendTo(container);
var tiddlers = store.sortTiddlers(store.filterTiddlers("[server.activity[true]]"), "-modified"); // TODO: sort headings instead if possible (conflicts with limit)
var headings = [];
var groups = {};
var processed = 0, i, j;
var atEndOfActivityFeed = true;
for(i = 0; i < tiddlers.length; i++) {
var tiddler = tiddlers[i];
if(options.templates.contains(tiddler.fields["server.activity.type"])) {
if(!limit || processed < limit) {
var modified = tiddler.modified;
if(modified) {
// format date.
var modifiedString = modified.formatString(options.headingFormat || config.macros.timeline.dateFormat);
if(headings.contains(modifiedString)) {
groups[modifiedString].push(tiddler);
} else {
headings.push(modifiedString);
groups[modifiedString] = [ tiddler ];
}
}
processed += 1;
} else {
atEndOfActivityFeed = false;
}
}
}
var somethingRendered;
for(i = 0; i < headings.length; i++) {
var heading = headings[i];
var _tiddlers = store.sortTiddlers(groups[heading], "-modified");
var headingEl;
if(_tiddlers.length > 0) {
headingEl = $("<li />").addClass("listTitle activityGroupTitle").text(heading).appendTo(container);
}
var rendered = [];
for(j = 0; j < _tiddlers.length; j++) {
var item = macro.createFeedEntry(container, _tiddlers[j], options);
if(item) {
rendered.push(item);
}
}
if(rendered.length === 0) {
headingEl.remove();
} else {
somethingRendered = true;
}
}
if(!somethingRendered) {
var msg;
if(macro.gotActivity) { // it has been run before
msg = macro.locale.emptyStream.format(macro.info.loaded, macro.info.queries);
} else {
msg = macro.locale.pleaseWait;
}
$(container).text(msg);
}
if(!atEndOfActivityFeed) { // show more button
$("<input />").attr("type", "button").val("more").click(function(ev) {
var currentLimit = $(place).attr("activity-limit");
var newLimit = parseInt(currentLimit, 10) + 50;
macro.default_limit = newLimit;
$(place).attr("activity-limit", newLimit);
macro.refresh(place);
}).appendTo(place);
}
this.gotActivity = true;
},
updateStream: function(jstiddlers, type, options) {
// assume already sorted.
var tiddlers = scanMacro._tiddlerfy(jstiddlers, options);
var _dirty = store.isDirty();
$.each(tiddlers, function(i, tid) {
var info = config.macros.view.activity.getActivityInfo(tid, options);
tid.fields["server.activity.type"] = info.type;
tid.fields["server.activity"] = "true";
if(!tid.tags.contains("excludeLists")) {
tid.title = tiddlyspace.getLocalTitle(tid.title, tid.fields["server.workspace"]);
tid.tags = tid.tags.concat(["excludeLists", "excludeMissing", "excludeSearch"]);
tid.fields.doNotSave = "true";
store.addTiddler(tid); // save caused unsaved changes alert and slowdown
}
});
store.setDirty(_dirty);
}
};
config.macros.view.views.activityItem = function(value, place, params, wikifier,
paramString, tiddler) {
var info = config.macros.view.activity.getActivityInfo(tiddler, {});
wikify(info.template, place, null, tiddler);
};
var helper = config.macros.view.activity = {
_isNotification: function(tiddler) {
return tiddler.tags.contains(macro.USER_AT_TAG) || tiddler.tags.contains("@all");
},
_repliesOn: function() {
return tiddlyspace.currentSpace.name === macro.CURRENT_USER;
},
types: {
video: function(tiddler) {
return tiddler.tags.contains("video");
},
geo: function(tiddler) {
return tiddler.fields["geo.lat"] && tiddler.fields["geo.long"];
},
siteInfo: function(tiddler) {
var title = tiddler.fields["server.title"];
return title === "SiteInfo";
},
userSiteIcon: function(tiddler) {
var modifierBag = "%0_public".format(tiddler.modifier);
var title = tiddler.fields["server.title"];
return title === "SiteIcon" && modifierBag === tiddler.fields["server.bag"];
},
spaceSiteIcon: function(tiddler) {
var title = tiddler.fields["server.title"];
return title === "SiteIcon"; // note userSiteIcon above does the bag check
},
shadow: function(tiddler) {
var title = tiddler.fields["server.title"];
return title in config.shadowTiddlers;
},
plugin: function(tiddler) {
return tiddler.tags.contains("systemConfig");
},
followYou: function(tiddler) {
var title = tiddler.fields["server.title"];
title = title.indexOf("@") === 0 ? title.substr(1) : title;
return tiddler.tags.contains("follow") && title === macro.USER_AT_TAG;
},
follow: function(tiddler) {
return tiddler.tags.contains("follow");
},
reply: function(tiddler) {
var title = tiddler.fields["server.title"];
var myTiddler = store.getTiddler(tiddler.title);
var myTiddlerIsOlder = myTiddler && myTiddler.modified < tiddler.modified;
return store.tiddlerExists(title) && myTiddlerIsOlder && helper._repliesOn(tiddler);
},
notify: function(tiddler) {
var title = tiddler.fields["server.title"];
var myTiddler = store.getTiddler(title);
var myTiddlerIsNewer = myTiddler && myTiddler.modified > tiddler.modified;
return helper._isNotification(tiddler) && helper._repliesOn(tiddler) && !myTiddlerIsNewer;
},
standard: function(tiddler) {
return true;
},
image: function(tiddler) {
return config.macros.image.isImageTiddler(tiddler);
}
},
// each type should point to a slice in ActivityStreamTemplates tiddler
getActivityInfo: function(tiddler, options) {
var repliesOn = tiddlyspace.currentSpace.name === macro.CURRENT_USER;
var activityType, i;
if(tiddler) {
for(i = 0; i < macro.templates.length; i++) {
var type = macro.templates[i];
if(!activityType && helper.types[type]) {
if(helper.types[type](tiddler)) {
activityType = type;
}
}
}
}
template = store.getTiddlerText("ActivityStreamTemplates##" + activityType) || locale.standardTemplate;
return activityType ? { template: template, type: activityType } : false;
}
};
config.macros.view.views.link = function(value, place, params, wikifier,
paramString, tiddler) {
var el = createTiddlyLink(place,value,true);
if(params[2]) {
$(el).text(params[2]);
}
};
config.macros.view.views.maplink = function(value, place, params, wikifier,
paramString, tiddler) {
var lat = tiddler.fields["geo.lat"];
var lng = tiddler.fields["geo.long"];
var label = params[2] || value;
if(lat && lng) {
$("<a />").attr("href", "http://maps.google.com/maps?saddr=%0,%1".format(lat, lng)).text(label).appendTo(place);
}
};
var _displayS = tiddlyspace.displayServerTiddler;
tiddlyspace.displayServerTiddler = function(src, title, workspace, callback) {
var localTitle = tiddlyspace.getLocalTitle(title, workspace);
var localTiddler = store.getTiddler(localTitle);
var _callback = function(src, tiddler) {
if(callback) {
callback(src, tiddler);
}
if(localTiddler) {
tiddler.fields["server.activity"] = "true";
tiddler.fields["server.activity.type"] = localTiddler.fields["server.activity.type"];
}
};
return _displayS.apply(this, [ src, title, workspace, _callback ]);
};
}(jQuery));
//}}}
!URL
http://www.tbray.org/ongoing/When/201x/2011/02/04/Moving-Left
!Description
Ideologies matter. We need one that respects the market and isn’t afraid of talking about class interests and is fiercely intolerant of all forms of civic corruption.
!URL
https://github.com/willconant/flow-js
!Description
Flow-JS provides a continuation-esque construct that makes it much easier to express multi-step asynchronous logic in non-blocking callback-heavy environments like Node.js or javascript in the web browser.
!Notes
Looks pleasant enough.
!URL
http://www.ir35calc.co.uk/how_to_prepare_an_invoice.aspx
!Description
!URL
http://www.parade.com/celebrate/faq.html
!Description
!URL
http://alistapart.com/articles/mountaintop/
!Description
clean corners for css
My coffee plan goes something like this: drink coffee between the fall and spring equinox, do not drink coffee in the other six months.
today we visit the caterers, [[Dine With Style]], in Bath
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="100%" width="100%" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 40 40"><metadata><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:title/></cc:Work></rdf:RDF></metadata><defs><linearGradient id="lG3826" x1="7.0996" gradientUnits="userSpaceOnUse" y1="18.829" gradientTransform="matrix(1.5858347,0,0,1.8078238,1098.1851,351.13716)" x2="1.5461" y2="-0.95166"><stop stop-color="#000" offset="0"/><stop stop-color="#9c9b99" offset="1"/></linearGradient><linearGradient id="lG3828" y2="372.44" gradientUnits="userSpaceOnUse" y1="375.7" x2="1111.7" x1="1097.7"><stop style="stop-color:#ac9393;" offset="0"/><stop style="stop-color:#c8b7b7;" offset="1"/></linearGradient></defs><g transform="translate(-1080.9375,-357.3329)"><path style="stroke-width:0;stroke-miterlimit:4;fill:url(#lG3826);" d="m1080.9,357.32,39.996-0.0426-0.01,40.008c-15.507-25.519-15.36-25.95-39.988-39.965z"/><path style="stroke-dashoffset:0;stroke:#7aa3be;stroke-linecap:round;stroke-miterlimit:4;stroke-width:1.49999988;fill:#c1e6fd;" d="m1091.9,363.55c6.5716-6.4925,16.576-7.3925,23.147-0.90003,6.5717,6.4925,6.5717,17.019,0,23.511-4.4424-8.6113-12.288-15.713-23.147-22.611z"/><path style="stroke-dashoffset:0;stroke:#ce81b0;stroke-linecap:round;stroke-miterlimit:4;stroke-width:1.5;fill:#f4c4e2;" d="m1110.2,367.62c3.217,3.2168,3.217,8.4323,0,11.649-3.8194-4.2357-8.3307-8.1824-11.649-11.649,3.217-3.2168,8.4325-3.2168,11.649-0.00002z"/><path style="stroke-linejoin:bevel;stroke:#000000;stroke-linecap:round;stroke-dasharray:none;stroke-miterlimit:4;stroke-width:0.80000001;fill:url(#lG3828);" d="m1081,357.34c18.79,6.4752,32.53,16.56,39.894,39.892-11.19-17.028-14.878-19.19-27.352-14.96,6.2984-12.098,3.9371-13.19-12.542-24.932z"/></g></svg>
!URL
http://googlewebmastercentral.blogspot.com/2011/11/get-post-and-safely-surfacing-more-of.html
!Description
to surface more content on the web, Googlebot may now perform POST requests when we believe it’s safe and appropriate
!Notes
This seems like a pretty horrible idea. How can I tell Googlebot to never POST to my server. POST means something on the server is going to change and I don't want Googlebot making changes please and thank you.
!URL
https://github.com/audreyt/socialcalc/wiki/Lessons-Learned#___top
!Description
A chief designer with a clear vision worked really well
In his book The Design of Designs, Fred Brooks argues that when building complex systems, the conversation is much more direct if we focus on a coherent Design Concept, rather than derivative representations.
!URL
http://lucene.apache.org/hadoop/
!Description
mapreduce for folk
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
Got my wedding wear sorted. Traditional morning wear with sort of wedgewood colored extra bits.
/***
|''Name''|TiddlySpaceFollowingPlugin|
|''Version''|0.7.1|
|''Description''|Provides a following macro|
|''Author''|Jon Robson|
|''Requires''|TiddlySpaceConfig TiddlySpaceTiddlerIconsPlugin ErrorHandler|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage
Tag a tiddler with "follow" to express a list of followers.
Using the {{{<<followTiddlers X>>}}}
will reveal the number of tiddlers with name X in the set of spaces the *current* user viewing your space follows.
{{{<<following jon>>}}} will list all the users following Jon.
{{{<<followers jon>>}}} will list all the followers of jon.
{{{<linkedTiddlers>>}}} will list all tiddlers across TiddlySpace linked to the current tiddler
{{{<linkedTiddlers follow:yes>>}}} will list all tiddlers across TiddlySpace that come from your list of followers
adds spaceLink view type {{{<<view server.bag spaceLink>>}}} creates a link to the space described in server.bag
{{{<<view server.bag spaceLink title>>}}} makes a link to the tiddler with title expressed in the field title in space server.bag
If no name is given eg. {{{<<following>>}}} or {{{<<follow>>}}} it will default the current user.
!StyleSheet
.followTiddlersList li {
list-style:none;
}
.followButton {
width: 2em;
}
.followTiddlersList li .siteIcon {
height:48px;
width: 48px;
}
#sidebarTabs .followers li a,
.followers .siteIcon,
.followers .siteIcon div {
display: inline;
}
.followTiddlersList li .externalImage, .followTiddlersList li .image {
display: inline;
}
.scanResults li {
list-style: none;
}
!Code
***/
//{{{
(function($) {
var LIMIT_FOLLOWING = 100;
var tweb = config.extensions.tiddlyweb;
var tiddlyspace = config.extensions.tiddlyspace;
var currentSpace = tiddlyspace.currentSpace.name;
var shadows = config.shadowTiddlers;
config.annotations.ScanTemplate = "This tiddler is the default template used in the display of tiddlers founding using the tsScan macro. To access attributes use the view macro e.g. {{{<<view title text>>}}}";
shadows.ScanTemplate = "<<view modifier SiteIcon width:24 height:24 spaceLink:yes label:no>> <<view title link>>";
shadows.FollowersTemplate = "<<view server.bag SiteIcon width:24 height:24 spaceLink:yes label:no>> <<view server.bag spaceLink>>";
shadows.FollowingTemplate = "<<view title SiteIcon width:24 height:24 spaceLink:yes label:no>> <<view title spaceLink>>";
shadows.FollowTiddlersBlackList = "";
shadows.FollowTiddlersHeading = "There are tiddlers in spaces you follow using the follow tag which use the title <<view title text>>";
shadows.FollowTiddlersTemplate = ["* <<view server.space SiteIcon width:24 height:24 spaceLink:yes label:no>> ",
"<<view server.space spaceLink title external:no>> modified by <<view modifier spaceLink>> ",
"in the <<view server.space spaceLink>> space (<<view modified date>> @ <<view modified date 0hh:0mm>>).\n"].join("");
var name = "StyleSheetFollowing";
shadows[name] = "/*{{{*/\n%0\n/*}}}*/".
format(store.getTiddlerText(tiddler.title + "##StyleSheet"));
store.addNotification(name, refreshStyles);
// provide support for sucking in tiddlers from the server
tiddlyspace.displayServerTiddler = function(src, title, workspace, callback) {
var adaptor = store.getTiddlers()[0].getAdaptor();
var localTitle = tiddlyspace.getLocalTitle(title, workspace);
var tiddler = new Tiddler(localTitle);
tiddler.text = "Please wait while this tiddler is retrieved...";
tiddler.fields.doNotSave = "true";
store.addTiddler(tiddler);
src = story.displayTiddler(src || null, tiddler.title);
tweb.getStatus(function(status) {
var context = {
host: tweb.host, // TODO: inherit from source tiddler?
workspace: workspace,
headers: { "X-ControlView": "false" }
};
var getCallback = function(context, userParams) {
var tiddler = context.tiddler;
tiddler.title = localTitle;
store.addTiddler(tiddler);
story.refreshTiddler(localTitle, null, true); // overriding existing allows updating
if(callback) {
callback(src, tiddler);
}
};
adaptor.getTiddler(title, context, null, getCallback);
});
};
tiddlyspace.scroller = {
runHandler: function(title, top, bottom, height) {
var i;
var handlers = tiddlyspace.scroller.handlers;
var tidEl = story.getTiddler(title);
if(tidEl) {
var topEl = $(tidEl).offset().top + 20;
if(top === false || (topEl > top && topEl < bottom)) {
var h = handlers[title];
for(i = 0; i < h.length; i++) {
h[i]();
}
tiddlyspace.scroller.clearHandlers(title);
}
} else {
tiddlyspace.scroller.clearHandlers(title);
}
},
clearHandlers: function(title) {
tiddlyspace.scroller.handlers[title] = [];
},
registerIsVisibleEvent: function(title, handler) {
tiddlyspace.scroller.handlers[title] = tiddlyspace.scroller.handlers[title] || [];
tiddlyspace.scroller.handlers[title].push(handler);
},
init: function() {
this.handlers = {};
this.interval = window.setInterval(function() {
var top = $(window).scrollTop();
var height = $(window).height();
var bottom = top + height;
var title;
for(title in tiddlyspace.scroller.handlers) {
if(title) {
tiddlyspace.scroller.runHandler(title, top, bottom, height);
}
}
}, 2000); // every 2 seconds check scroll position
}
};
tiddlyspace.scroller.init();
var followMacro = config.macros.followTiddlers = {
locale: {
followListHeader: "Here are tiddlers from spaces you follow using the follow tag which use this title.",
noTiddlersFromFollowers: "None of the spaces you follow contain a tiddler with this name.",
errorMessage: "There was a problem retrieving tiddlers from the server. Please try again later."
},
init: function() {
followMacro.lookup = {};
},
followTag: "follow",
getHosts: function(callback) {
tweb.getStatus(function(status) {
callback(tweb.host, tiddlyspace.getHost(status.server_host, "%0"));
});
},
getBlacklist: function() {
return store.getTiddlerText("FollowTiddlersBlackList").split("\n");
},
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
var args = paramString.parseParams("anon")[0];
var containingTiddler = story.findContainingTiddler(place).getAttribute('tiddler');
var title = (args.anon && args.anon[0]) || tiddler.fields["server.title"] || tiddler.title;
var tid = store.getTiddler(title);
var user = params[1] || false;
if(tid) {
followMacro.makeButton(place, {
url: "/search?q=title:%22"
+ encodeURIComponent(title) + "%22",
containingTiddler: containingTiddler,
blacklisted: followMacro.getBlacklist(), title: title, user: user,
consultFollowRelationship: (args.follow &&
args.follow[0] === 'false') ? false : true });
}
},
makeButton: function(place, options) { // this is essentially the same code in TiddlySpaceFollowingPlugin
var title = options.title;
var blacklisted = options.blacklisted;
var tiddler = store.getTiddler(title);
var btn = $('<div class="followButton" />').addClass("notLoaded").appendTo(place)[0];
if(blacklisted.contains(title)) {
$(btn).remove();
return;
} else {
var user = options.user;
window.setTimeout(function() { // prevent multiple calls due to refresh
tiddlyspace.scroller.registerIsVisibleEvent(options.containingTiddler, function() {
var mkButton = function(followers, ignore) {
if(!followers && !ignore) {
$(btn).remove();
} else {
$("<a />").appendTo(btn);
var scanOptions = { url: options.url,
spaceField: options.spaceField || "bag", template: null, sort: "-modified",
callback: function(tiddlers) {
$(btn).removeClass("notLoaded");
followMacro.constructInterface(btn, tiddlers);
}
};
if(!ignore) {
scanOptions.showBags = followMacro._getFollowerBags(followers);
}
scanOptions.hideBags = [tiddler.fields["server.bag"]];
scanMacro.scan(null, scanOptions, user);
}
};
if(options.consultFollowRelationship) {
followMacro.getFollowers(mkButton);
} else {
mkButton([], true);
}
});
}, 1000);
}
},
constructInterface: function(container, tiddlers) {
var txt = tiddlers.length;
var className = txt > 0 ? "hasReplies" : "noReplies";
var el = $(story.findContainingTiddler(container));
$(container).empty().addClass(className);
var btn = $("<a />").addClass("followedTiddlers").text(txt).
click(function(ev) {
followMacro.followingOnClick(ev);
}).appendTo('<div class="followedTiddlers" />').appendTo(container)[0];
$.data(btn, "tiddlers", tiddlers);
},
followingOnClick: function(ev) {
var target = ev.target;
var locale = followMacro.locale;
var el = $('<div class="followTiddlersList" />')[0];
var popup = Popup.create(target,"div");
$(popup).addClass("taggedTiddlerList followList").click(function(ev) { // make it so only clicking on the document outside the popup removes the popup
if(ev.target.parentNode != document) {
ev.stopPropagation();
}
}).append(el);
var tiddlers = $.data(target, "tiddlers") || [];
scanMacro.template(el, tiddlers.slice(0,1), "FollowTiddlersHeading");
scanMacro.template(el, tiddlers, "FollowTiddlersTemplate");
if(tiddlers.length === 0) {
$("<li />").text(locale.noTiddlersFromFollowers).appendTo(el);
}
Popup.show();
ev.stopPropagation();
return popup;
},
_getFollowerBags: function(followers) { // XXX: private or not?
return $.map(followers, function(name, i) {
return name != currentSpace ? "%0_public".format(name) : null;
});
},
getFollowers: function(callback, username) {
// returns a list of spaces being followed by the existing space
var followersCallback = function(user) {
if(!user.anon) {
scanMacro.scan(null, {
url: "/search?q=bag:%0_public tag:%1 _limit:%2".format(user.name, followMacro.followTag, LIMIT_FOLLOWING),
spaceField: "title", template: null, cache: true,
callback: function(tiddlers) {
var followers = [];
for(var i = 0; i < tiddlers.length; i++) {
followers.push(tiddlyspace.resolveSpaceName(tiddlers[i].title));
}
callback(followers);
}
});
} else {
callback(false);
}
};
return !username ? tweb.getUserInfo(followersCallback) : followersCallback({ name: username });
}
};
var scanMacro = config.macros.tsScan = {
init: function () {
this.scanned = {};
},
_tiddlerfy: function(jsontiddlers, options) {
var tiddlers = [];
var spaceField = options.spaceField || "bag"; // TODO: phase out use view types instead
$.each(jsontiddlers, function(i, t) {
var use = false;
if(!options.showBags || (options.showBags && options.showBags.contains(t.bag))) {
use = true;
}
if(options.hideBags && options.hideBags.contains(t.bag)) {
use = false;
}
if(use) {
var spaceName = t[spaceField];
var tiddler = config.adaptors.tiddlyweb.toTiddler(t, tweb.host);
tiddler.fields["server.space"] = tiddlyspace.resolveSpaceName(spaceName);
tiddlers.push(tiddler);
}
});
return tiddlers;
},
_scanCallback: function(place, jsontiddlers, options) {
var locale = followersMacro.locale;
var tiddlers = scanMacro._tiddlerfy(jsontiddlers, options);
if(options.sort) {
tiddlers = store.sortTiddlers(tiddlers, options.sort);
}
if(options.filter) {
var _store = new TiddlyWiki();
config.lastStore = _store;
for(var i = 0; i < tiddlers.length; i++) {
var clone = tiddlers[i];
clone.title = tiddlyspace.getLocalTitle(clone.title, clone.fields['server.workspace']);
_store.addTiddler(clone);
}
tiddlers = _store.filterTiddlers(options.filter);
}
if(place) {
$(place).empty();
var list = $("<ul />").appendTo(place)[0];
scanMacro.template(list, tiddlers, options.template);
if(tiddlers.length === 0) {
$("<li />").text(options.emptyMessage || locale.noone).appendTo(list);
$(list).addClass("emptyList");
}
}
if(options.callback) {
options.callback(tiddlers);
}
},
constructSearchUrl: function(host, options) {
if(options.url) {
return options.url;
}
var inputs = options.searchValues;
var tag = options.tag;
var searchField = options.searchField || "title";
var searchQuery = [];
for(var i = 0; i < inputs.length; i++) {
searchQuery.push('%0:"%1"'.format(searchField, inputs[i]));
}
var query = searchQuery.join(" OR ");
query = tag ? "(%0) AND tag:%1".format(query, tag) : query;
query = options.query ? "%0;%1;".format(query, options.query) : query;
query = options.fat ? "%0&fat=1".format(query) : query;
return '%0/search?q=%1'.format(host, query);
},
scan: function(place, options) { // TODO: make use of list macro with url filter
var locale = followersMacro.locale;
options.template = options.template ? options.template : "ScanTemplate";
followMacro.getHosts(function(host, tsHost) {
$(place).text(followersMacro.locale.pleaseWait);
options = options ? options: {};
var url = scanMacro.constructSearchUrl(host, options);
if(options.cache && scanMacro.scanned[url]) {
var tiddlers = scanMacro.scanned[url].tiddlers;
var run = function(tiddlers) {
scanMacro._scanCallback(place, tiddlers, options);
};
if(tiddlers) {
run(tiddlers);
} else {
scanMacro.scanned[url].callbacks.push(run);
}
} else {
var callback = function(tiddlers) {
scanMacro._scanCallback(place, tiddlers, options);
};
if(scanMacro.scanned[url] && scanMacro.scanned[url].callbacks) {
scanMacro.scanned[url].callbacks.push(callback)
} else {
scanMacro.scanned[url] = {
callbacks: [callback]
};
}
ajaxReq({
url: url,
dataType: "json",
success: function(tiddlers) {
scanMacro.scanned[url].tiddlers = tiddlers;
var callbacks = scanMacro.scanned[url].callbacks;
while(callbacks.length > 0) {
callbacks.pop()(tiddlers);
}
},
error: function(xhr) {
$(place).empty();
$("<span />").addClass("annotation error").text(locale.error.format(xhr.status)).appendTo(place);
}
});
}
});
},
template: function(place, tiddlers, template) { // TODO: make use of list macro.
for(var i = 0; i < tiddlers.length; i++) {
var tiddler = tiddlers[i];
var item = $('<li class="spaceName" />').appendTo(place)[0];
var spaceName = tiddler.fields["server.space"] || "";
var templateText = store.getTiddlerText(template).replace(/\$1/mg, spaceName);
wikify(templateText, item, null, tiddler);
}
},
getOptions: function(paramString, tiddler) {
var args = paramString.parseParams("name", null, true, false, true)[0];
var options = { query: false, sort: false, tag: false, template: false, showBags: args.show || false,
hideBags: args.hide || false, filter: false, spaceField: "bag", searchField: "title", fat: false,
emptyMessage: false };
for(var name in args) {
if(name != "name") {
if(name == "fat") {
options[name] = true;
} else {
options[name] = args[name][0];
}
}
}
// if user has set searchField to modifier, then use the modifiers value if available otherwise use searchValues.
var searchField = options.searchField;
var searchValues = args[searchField] ? args[searchField] : args.searchValues;
// if neither of those were used use the first parameter
var defaultValues = tiddler ? [ tiddler.title ] : [];
options.searchValues = searchValues ? searchValues : ( args.name ? [args.name[0]] : defaultValues);
return options;
},
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
var container = $("<div />").addClass("scanResults resultsArea").appendTo(place)[0];
var options = scanMacro.getOptions(paramString, tiddler);
scanMacro.scan(container, options);
}
};
var followersMacro = config.macros.followers = {
locale: {
loggedOut: "Please login to see the list of followers",
noSupport: "We were unable to retrieve followers as your browser does not support following.",
pleaseWait: "Please wait while we look this up...",
error: "Error %0 occurred whilst retrieving data from server",
noone: "None."
},
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
var locale = followersMacro.locale;
var args = paramString.parseParams("name", null, true, false, true)[0];
var username = args.name ? args.name[0] : false;
var container = $('<div class="followers" />').text(locale.pleaseWait).
appendTo(place)[0];
var followersCallback = function(user) {
if(user.anon) {
$("<span />").text(locale.loggedOut).appendTo(container);
} else {
var options = scanMacro.getOptions(paramString);
$.extend(options, {
url: "/search?q=title:@%0 OR title:%0 tag:%1 _limit:%2".
format(user.name, followMacro.followTag, LIMIT_FOLLOWING),
spaceField: "bag",
template: options.template ? options.template : "FollowersTemplate"
});
scanMacro.scan(container, options);
}
};
return !username ? followersCallback({ name: currentSpace }) : followersCallback({ name: username });
}
};
var followingMacro = config.macros.following = {
locale: {
pleaseWait: followersMacro.locale.pleaseWait,
loggedOut: "Please login to see who you are following",
noSupport: followersMacro.locale.noSupport,
error: followersMacro.locale.error,
noone: followersMacro.locale.noone
},
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
var locale = followingMacro.locale;
var args = paramString.parseParams("name", null, true, false, true)[0];
var fat = args.fat ? true : false;
var username = args.name ? args.name[0] : false;
var container = $('<div class="following" />').text(locale.pleaseWait).
appendTo(place)[0];
var followingCallback = function(user) {
if(user.anon) {
$("<span />").text(locale.loggedOut).appendTo(container);
} else {
var options = scanMacro.getOptions(paramString);
$.extend(options, {
url: "/search?q=bag:%0_public tag:%1 _limit:%2".format(user.name, followMacro.followTag, LIMIT_FOLLOWING),
spaceField: "title",
template: options.template ? options.template : "FollowingTemplate"
});
scanMacro.scan(container, options);
}
};
return !username ? followingCallback({ name: currentSpace }) : followingCallback({ name: username });
}
};
var linkedMacro = config.macros.linkedTiddlers = {
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
var args = paramString.parseParams("anon")[0];
var title = params[0] || tiddler.fields["server.title"] || tiddler.title;
var tid = store.getTiddler(title);
var containingTiddler = story.findContainingTiddler(place).getAttribute('tiddler');
if(tid) {
followMacro.makeButton(place, {
spaceField: "recipe",
url: "/bags/%0/tiddlers/%1/backlinks".format(tid.fields['server.bag'],
encodeURIComponent(tid.title)),
blacklisted: followMacro.getBlacklist(),
title: title,
containingTiddler: containingTiddler,
user: params[1] || false,
consultFollowRelationship: args.follow ? true : false });
}
}
}
if(config.options.chkFollowTiddlersIsLinkedTiddlers) {
merge(config.macros.followTiddlers, config.macros.linkedTiddlers);
config.shadowTiddlers.FollowTiddlersHeading = "These are the other tiddlers that link to this tiddler.";
}
})(jQuery);
//}}}
!Followers
<<followers>>
!Activity
[[Replies and Notifications]]
<<activity>>
!Following
All spaces tagged follow
<<list filter [tag[follow]][sort[title]]>>
<<followSuggestions>>
!URL
http://seancribbs.com/tech/2010/02/06/why-riak-should-power-your-next-rails-app/
!Description
Rails nerds like me love REST, but most don’t really understand what it means, or rather think that it is a one-to-one mapping to CRUD. Rails’ concept of REST is at best incomplete and potentially misleading. (See also Scott Raymond’s RailsConf 2007 talk)
!Notes
I like this pull quote, but the real reason for bookmarking this is for riak, which seems very interesting as a scalable db.
If you do not want to be tracked by google analytics across any servers anywhere on the internet, then you can control that, per computer, by making it so the host to which the analytics software sends it data cannot be reached. The easiest way to do this is by editing your host file or equivalent as follows:
{{{
127.0.0.1 www.google-analytics.com ssl.google-analytics.com
}}}
Another option is to block those hosts in a firewall configuration.
//
// Please note:
//
// * This code is designed to be readable but for compactness it only includes brief comments. You can see fuller comments
// in the project repository at https://github.com/TiddlyWiki/tiddlywiki
//
// * You should never need to modify this source code directly. TiddlyWiki is carefully designed to allow deep customisation
// without changing the core code. Please consult the development group at http://groups.google.com/group/TiddlyWikiDev
//
// JSLint directives
/*global jQuery:false, version:false */
/*jslint bitwise:true, browser:true, confusion:true, eqeq:true, evil:true, forin:true, maxerr:100, plusplus:true, regexp:true, sloppy:true, sub:true, undef:true, unparam:true, vars:true, white:true */
//--
//-- Configuration repository
//--
// Miscellaneous options
var config = {
numRssItems: 20, // Number of items in the RSS feed
animDuration: 400, // Duration of UI animations in milliseconds
cascadeFast: 20, // Speed for cascade animations (higher == slower)
cascadeSlow: 60, // Speed for EasterEgg cascade animations
cascadeDepth: 5, // Depth of cascade animation
locale: "en" // W3C language tag
};
// Hashmap of alternative parsers for the wikifier
config.parsers = {};
// Adaptors
config.adaptors = {};
config.defaultAdaptor = null;
// Backstage tasks
config.tasks = {};
// Annotations
config.annotations = {};
// Custom fields to be automatically added to new tiddlers
config.defaultCustomFields = {};
// Messages
config.messages = {
messageClose: {},
dates: {},
tiddlerPopup: {}
};
// Options that can be set in the options panel and/or cookies
config.options = {
chkRegExpSearch: false,
chkCaseSensitiveSearch: false,
chkIncrementalSearch: true,
chkAnimate: true,
chkSaveBackups: true,
chkAutoSave: false,
chkGenerateAnRssFeed: false,
chkSaveEmptyTemplate: false,
chkOpenInNewWindow: true,
chkToggleLinks: false,
chkHttpReadOnly: false,
chkForceMinorUpdate: false,
chkConfirmDelete: true,
chkInsertTabs: false,
chkUsePreForStorage: true, // Whether to use <pre> format for storage
chkDisplayInstrumentation: false,
txtBackupFolder: "",
txtEditorFocus: "text",
txtMainTab: "tabTimeline",
txtMoreTab: "moreTabAll",
txtMaxEditRows: "30",
txtFileSystemCharSet: "UTF-8",
txtTheme: ""
};
config.optionsDesc = {};
config.optionsSource = {};
// Default tiddler templates
var DEFAULT_VIEW_TEMPLATE = 1;
var DEFAULT_EDIT_TEMPLATE = 2;
config.tiddlerTemplates = {
1: "ViewTemplate",
2: "EditTemplate"
};
// More messages (rather a legacy layout that should not really be like this)
config.views = {
wikified: {
tag: {}
},
editor: {
tagChooser: {}
}
};
// Backstage tasks
config.backstageTasks = ["save","sync","importTask","tweak","plugins"];
// Extensions
config.extensions = {};
// Macros; each has a 'handler' member that is inserted later
config.macros = {
today: {},
version: {},
search: {sizeTextbox: 15},
tiddler: {},
tag: {},
tags: {},
tagging: {},
timeline: {},
allTags: {},
list: {
all: {},
missing: {},
orphans: {},
shadowed: {},
touched: {},
filter: {}
},
closeAll: {},
permaview: {},
saveChanges: {},
slider: {},
option: {},
options: {},
newTiddler: {},
newJournal: {},
tabs: {},
gradient: {},
message: {},
view: {defaultView: "text"},
edit: {},
tagChooser: {},
toolbar: {},
plugins: {},
refreshDisplay: {},
importTiddlers: {},
upgrade: {
source: "http://tiddlywiki-releases.tiddlyspace.com/upgrade",
backupExtension: "pre.core.upgrade"
},
sync: {},
annotations: {}
};
// Commands supported by the toolbar macro
config.commands = {
closeTiddler: {},
closeOthers: {},
editTiddler: {},
saveTiddler: {hideReadOnly: true},
cancelTiddler: {},
deleteTiddler: {hideReadOnly: true},
permalink: {},
references: {type: "popup"},
jump: {type: "popup"},
syncing: {type: "popup"},
fields: {type: "popup"}
};
// Control of macro parameter evaluation
config.evaluateMacroParameters = "all";
// Basic regular expressions
config.textPrimitives = {
upperLetter: "[A-Z\u00c0-\u00de\u0150\u0170]",
lowerLetter: "[a-z0-9_\\-\u00df-\u00ff\u0151\u0171]",
anyLetter: "[A-Za-z0-9_\\-\u00c0-\u00de\u00df-\u00ff\u0150\u0170\u0151\u0171]",
anyLetterStrict: "[A-Za-z0-9\u00c0-\u00de\u00df-\u00ff\u0150\u0170\u0151\u0171]"
};
if(!((new RegExp("[\u0150\u0170]","g")).test("\u0150"))) {
config.textPrimitives = {
upperLetter: "[A-Z\u00c0-\u00de]",
lowerLetter: "[a-z0-9_\\-\u00df-\u00ff]",
anyLetter: "[A-Za-z0-9_\\-\u00c0-\u00de\u00df-\u00ff]",
anyLetterStrict: "[A-Za-z0-9\u00c0-\u00de\u00df-\u00ff]"
};
}
config.textPrimitives.sliceSeparator = "::";
config.textPrimitives.sectionSeparator = "##";
config.textPrimitives.urlPattern = "(?:file|http|https|mailto|ftp|irc|news|data):[^\\s'\"]+(?:/|\\b)";
config.textPrimitives.unWikiLink = "~";
config.textPrimitives.wikiLink = "(?:(?:" + config.textPrimitives.upperLetter + "+" +
config.textPrimitives.lowerLetter + "+" +
config.textPrimitives.upperLetter +
config.textPrimitives.anyLetter + "*)|(?:" +
config.textPrimitives.upperLetter + "{2,}" +
config.textPrimitives.lowerLetter + "+))";
config.textPrimitives.cssLookahead = "(?:(" + config.textPrimitives.anyLetter + "+)\\(([^\\)\\|\\n]+)(?:\\):))|(?:(" + config.textPrimitives.anyLetter + "+):([^;\\|\\n]+);)";
config.textPrimitives.cssLookaheadRegExp = new RegExp(config.textPrimitives.cssLookahead,"mg");
config.textPrimitives.brackettedLink = "\\[\\[([^\\]]+)\\]\\]";
config.textPrimitives.titledBrackettedLink = "\\[\\[([^\\[\\]\\|]+)\\|([^\\[\\]\\|]+)\\]\\]";
config.textPrimitives.tiddlerForcedLinkRegExp = new RegExp("(?:" + config.textPrimitives.titledBrackettedLink + ")|(?:" +
config.textPrimitives.brackettedLink + ")|(?:" +
config.textPrimitives.urlPattern + ")","mg");
config.textPrimitives.tiddlerAnyLinkRegExp = new RegExp("("+ config.textPrimitives.wikiLink + ")|(?:" +
config.textPrimitives.titledBrackettedLink + ")|(?:" +
config.textPrimitives.brackettedLink + ")|(?:" +
config.textPrimitives.urlPattern + ")","mg");
config.glyphs = {
currBrowser: null,
browsers: [],
codes: {}
};
//--
//-- Shadow tiddlers
//--
config.shadowTiddlers = {
StyleSheet: "",
MarkupPreHead: "",
MarkupPostHead: "",
MarkupPreBody: "",
MarkupPostBody: "",
TabTimeline: '<<timeline>>',
TabAll: '<<list all>>',
TabTags: '<<allTags excludeLists>>',
TabMoreMissing: '<<list missing>>',
TabMoreOrphans: '<<list orphans>>',
TabMoreShadowed: '<<list shadowed>>',
AdvancedOptions: '<<options>>',
PluginManager: '<<plugins>>',
SystemSettings: '',
ToolbarCommands: '|~ViewToolbar|closeTiddler closeOthers +editTiddler > fields syncing permalink references jump|\n|~EditToolbar|+saveTiddler -cancelTiddler deleteTiddler|',
WindowTitle: '<<tiddler SiteTitle>> - <<tiddler SiteSubtitle>>'
};
// Browser detection... In a very few places, there's nothing else for it but to know what browser we're using.
config.userAgent = navigator.userAgent.toLowerCase();
config.browser = {
isIE: config.userAgent.indexOf("msie") != -1 && config.userAgent.indexOf("opera") == -1,
isGecko: navigator.product == "Gecko" && config.userAgent.indexOf("WebKit") == -1,
ieVersion: /MSIE (\d.\d)/i.exec(config.userAgent), // config.browser.ieVersion[1], if it exists, will be the IE version string, eg "6.0"
isSafari: config.userAgent.indexOf("applewebkit") != -1,
isBadSafari: !((new RegExp("[\u0150\u0170]","g")).test("\u0150")),
firefoxDate: /gecko\/(\d{8})/i.exec(config.userAgent), // config.browser.firefoxDate[1], if it exists, will be Firefox release date as "YYYYMMDD"
isOpera: config.userAgent.indexOf("opera") != -1,
isChrome: config.userAgent.indexOf('chrome') > -1,
isLinux: config.userAgent.indexOf("linux") != -1,
isUnix: config.userAgent.indexOf("x11") != -1,
isMac: config.userAgent.indexOf("mac") != -1,
isWindows: config.userAgent.indexOf("win") != -1
};
merge(config.glyphs,{
browsers: [
function() {return config.browser.isIE;},
function() {return true;}
],
codes: {
downTriangle: ["\u25BC","\u25BE"],
downArrow: ["\u2193","\u2193"],
bentArrowLeft: ["\u2190","\u21A9"],
bentArrowRight: ["\u2192","\u21AA"]
}
});
//--
//-- Translateable strings
//--
// Strings in "double quotes" should be translated; strings in 'single quotes' should be left alone
merge(config.options,{
txtUserName: "YourName"});
merge(config.tasks,{
save: {text: "save", tooltip: "Save your changes to this TiddlyWiki"},
importTask: {text: "import", tooltip: "Import tiddlers and plugins from other TiddlyWiki files and servers", content: '<<importTiddlers>>'},
tweak: {text: "tweak", tooltip: "Tweak the appearance and behaviour of TiddlyWiki", content: '<<options>>'},
upgrade: {text: "upgrade", tooltip: "Upgrade TiddlyWiki core code", content: '<<upgrade>>'},
plugins: {text: "plugins", tooltip: "Manage installed plugins", content: '<<plugins>>'}
});
// Options that can be set in the options panel and/or cookies
merge(config.optionsDesc,{
txtUserName: "Username for signing your edits",
chkRegExpSearch: "Enable regular expressions for searches",
chkCaseSensitiveSearch: "Case-sensitive searching",
chkIncrementalSearch: "Incremental key-by-key searching",
chkAnimate: "Enable animations",
chkSaveBackups: "Keep backup file when saving changes",
chkAutoSave: "Automatically save changes",
chkGenerateAnRssFeed: "Generate an RSS feed when saving changes",
chkSaveEmptyTemplate: "Generate an empty template when saving changes",
chkOpenInNewWindow: "Open external links in a new window",
chkToggleLinks: "Clicking on links to open tiddlers causes them to close",
chkHttpReadOnly: "Hide editing features when viewed over HTTP",
chkForceMinorUpdate: "Don't update modifier username and date when editing tiddlers",
chkConfirmDelete: "Require confirmation before deleting tiddlers",
chkInsertTabs: "Use the tab key to insert tab characters instead of moving between fields",
txtBackupFolder: "Name of folder to use for backups",
txtMaxEditRows: "Maximum number of rows in edit boxes",
txtTheme: "Name of the theme to use",
txtFileSystemCharSet: "Default character set for saving changes (Firefox/Mozilla only)"});
merge(config.messages,{
customConfigError: "Problems were encountered loading plugins. See PluginManager for details",
pluginError: "Error: %0",
pluginDisabled: "Not executed because disabled via 'systemConfigDisable' tag",
pluginForced: "Executed because forced via 'systemConfigForce' tag",
pluginVersionError: "Not executed because this plugin needs a newer version of TiddlyWiki",
nothingSelected: "Nothing is selected. You must select one or more items first",
savedSnapshotError: "It appears that this TiddlyWiki has been incorrectly saved. Please see http://www.tiddlywiki.com/#Download for details",
subtitleUnknown: "(unknown)",
undefinedTiddlerToolTip: "The tiddler '%0' doesn't yet exist",
shadowedTiddlerToolTip: "The tiddler '%0' doesn't yet exist, but has a pre-defined shadow value",
tiddlerLinkTooltip: "%0 - %1, %2",
externalLinkTooltip: "External link to %0",
noTags: "There are no tagged tiddlers",
notFileUrlError: "You need to save this TiddlyWiki to a file before you can save changes",
cantSaveError: "It's not possible to save changes. Possible reasons include:\n- your browser doesn't support saving (Firefox, Internet Explorer, Safari and Opera all work if properly configured)\n- the pathname to your TiddlyWiki file contains illegal characters\n- the TiddlyWiki HTML file has been moved or renamed",
invalidFileError: "The original file '%0' does not appear to be a valid TiddlyWiki",
backupSaved: "Backup saved",
backupFailed: "Failed to save backup file",
rssSaved: "RSS feed saved",
rssFailed: "Failed to save RSS feed file",
emptySaved: "Empty template saved",
emptyFailed: "Failed to save empty template file",
mainSaved: "Main TiddlyWiki file saved",
mainFailed: "Failed to save main TiddlyWiki file. Your changes have not been saved",
macroError: "Error in macro <<%0>>",
macroErrorDetails: "Error while executing macro <<%0>>:\n%1",
missingMacro: "No such macro",
overwriteWarning: "A tiddler named '%0' already exists. Choose OK to overwrite it",
unsavedChangesWarning: "WARNING! There are unsaved changes in TiddlyWiki\n\nChoose OK to save\nChoose CANCEL to discard",
confirmExit: "--------------------------------\n\nThere are unsaved changes in TiddlyWiki. If you continue you will lose those changes\n\n--------------------------------",
saveInstructions: "SaveChanges",
unsupportedTWFormat: "Unsupported TiddlyWiki format '%0'",
tiddlerSaveError: "Error when saving tiddler '%0'",
tiddlerLoadError: "Error when loading tiddler '%0'",
wrongSaveFormat: "Cannot save with storage format '%0'. Using standard format for save.",
invalidFieldName: "Invalid field name %0",
fieldCannotBeChanged: "Field '%0' cannot be changed",
loadingMissingTiddler: "Attempting to retrieve the tiddler '%0' from the '%1' server at:\n\n'%2' in the workspace '%3'",
upgradeDone: "The upgrade to version %0 is now complete\n\nClick 'OK' to reload the newly upgraded TiddlyWiki",
invalidCookie: "Invalid cookie '%0'"});
merge(config.messages.messageClose,{
text: "close",
tooltip: "close this message area"});
config.messages.backstage = {
open: {text: "backstage", tooltip: "Open the backstage area to perform authoring and editing tasks"},
close: {text: "close", tooltip: "Close the backstage area"},
prompt: "backstage: ",
decal: {
edit: {text: "edit", tooltip: "Edit the tiddler '%0'"}
}
};
config.messages.listView = {
tiddlerTooltip: "Click for the full text of this tiddler",
previewUnavailable: "(preview not available)"
};
config.messages.dates.months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November","December"];
config.messages.dates.days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
config.messages.dates.shortMonths = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
config.messages.dates.shortDays = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
// suffixes for dates, eg "1st","2nd","3rd"..."30th","31st"
config.messages.dates.daySuffixes = ["st","nd","rd","th","th","th","th","th","th","th",
"th","th","th","th","th","th","th","th","th","th",
"st","nd","rd","th","th","th","th","th","th","th",
"st"];
config.messages.dates.am = "am";
config.messages.dates.pm = "pm";
merge(config.messages.tiddlerPopup,{
});
merge(config.views.wikified.tag,{
labelNoTags: "no tags",
labelTags: "tags: ",
openTag: "Open tag '%0'",
tooltip: "Show tiddlers tagged with '%0'",
openAllText: "Open all",
openAllTooltip: "Open all of these tiddlers",
popupNone: "No other tiddlers tagged with '%0'"});
merge(config.views.wikified,{
defaultText: "The tiddler '%0' doesn't yet exist. Double-click to create it",
defaultModifier: "(missing)",
shadowModifier: "(built-in shadow tiddler)",
dateFormat: "DD MMM YYYY",
createdPrompt: "created"});
merge(config.views.editor,{
tagPrompt: "Type tags separated with spaces, [[use double square brackets]] if necessary, or add existing",
defaultText: "Type the text for '%0'"});
merge(config.views.editor.tagChooser,{
text: "tags",
tooltip: "Choose existing tags to add to this tiddler",
popupNone: "There are no tags defined",
tagTooltip: "Add the tag '%0'"});
merge(config.messages,{
sizeTemplates:
[
{unit: 1024*1024*1024, template: "%0\u00a0GB"},
{unit: 1024*1024, template: "%0\u00a0MB"},
{unit: 1024, template: "%0\u00a0KB"},
{unit: 1, template: "%0\u00a0B"}
]});
merge(config.macros.search,{
label: "search",
prompt: "Search this TiddlyWiki",
placeholder: "",
accessKey: "F",
successMsg: "%0 tiddlers found matching %1",
failureMsg: "No tiddlers found matching %0"});
merge(config.macros.tagging,{
label: "tagging: ",
labelNotTag: "not tagging",
tooltip: "List of tiddlers tagged with '%0'"});
merge(config.macros.timeline,{
dateFormat: "DD MMM YYYY"});
merge(config.macros.allTags,{
tooltip: "Show tiddlers tagged with '%0'",
noTags: "There are no tagged tiddlers"});
config.macros.list.all.prompt = "All tiddlers in alphabetical order";
config.macros.list.missing.prompt = "Tiddlers that have links to them but are not defined";
config.macros.list.orphans.prompt = "Tiddlers that are not linked to from any other tiddlers";
config.macros.list.shadowed.prompt = "Tiddlers shadowed with default contents";
config.macros.list.touched.prompt = "Tiddlers that have been modified locally";
merge(config.macros.closeAll,{
label: "close all",
prompt: "Close all displayed tiddlers (except any that are being edited)"});
merge(config.macros.permaview,{
label: "permaview",
prompt: "Link to an URL that retrieves all the currently displayed tiddlers"});
merge(config.macros.saveChanges,{
label: "save changes",
prompt: "Save all tiddlers to create a new TiddlyWiki",
accessKey: "S"});
merge(config.macros.newTiddler,{
label: "new tiddler",
prompt: "Create a new tiddler",
title: "New Tiddler",
accessKey: "N"});
merge(config.macros.newJournal,{
label: "new journal",
prompt: "Create a new tiddler from the current date and time",
accessKey: "J"});
merge(config.macros.options,{
wizardTitle: "Tweak advanced options",
step1Title: "These options are saved in cookies in your browser",
step1Html: "<input type='hidden' name='markList'></input><br><input type='checkbox' checked='false' name='chkUnknown'>Show unknown options</input>",
unknownDescription: "//(unknown)//",
listViewTemplate: {
columns: [
{name: 'Option', field: 'option', title: "Option", type: 'String'},
{name: 'Description', field: 'description', title: "Description", type: 'WikiText'},
{name: 'Name', field: 'name', title: "Name", type: 'String'}
],
rowClasses: [
{className: 'lowlight', field: 'lowlight'}
]}
});
merge(config.macros.plugins,{
wizardTitle: "Manage plugins",
step1Title: "Currently loaded plugins",
step1Html: "<input type='hidden' name='markList'></input>", // DO NOT TRANSLATE
skippedText: "(This plugin has not been executed because it was added since startup)",
noPluginText: "There are no plugins installed",
confirmDeleteText: "Are you sure you want to delete these plugins:\n\n%0",
removeLabel: "remove systemConfig tag",
removePrompt: "Remove systemConfig tag",
deleteLabel: "delete",
deletePrompt: "Delete these tiddlers forever",
listViewTemplate: {
columns: [
{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
{name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
{name: 'Description', field: 'Description', title: "Description", type: 'String'},
{name: 'Version', field: 'Version', title: "Version", type: 'String'},
{name: 'Size', field: 'size', tiddlerLink: 'size', title: "Size", type: 'Size'},
{name: 'Forced', field: 'forced', title: "Forced", tag: 'systemConfigForce', type: 'TagCheckbox'},
{name: 'Disabled', field: 'disabled', title: "Disabled", tag: 'systemConfigDisable', type: 'TagCheckbox'},
{name: 'Executed', field: 'executed', title: "Loaded", type: 'Boolean', trueText: "Yes", falseText: "No"},
{name: 'Startup Time', field: 'startupTime', title: "Startup Time", type: 'String'},
{name: 'Error', field: 'error', title: "Status", type: 'Boolean', trueText: "Error", falseText: "OK"},
{name: 'Log', field: 'log', title: "Log", type: 'StringList'}
],
rowClasses: [
{className: 'error', field: 'error'},
{className: 'warning', field: 'warning'}
]},
listViewTemplateReadOnly: {
columns: [
{name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
{name: 'Description', field: 'Description', title: "Description", type: 'String'},
{name: 'Version', field: 'Version', title: "Version", type: 'String'},
{name: 'Size', field: 'size', tiddlerLink: 'size', title: "Size", type: 'Size'},
{name: 'Executed', field: 'executed', title: "Loaded", type: 'Boolean', trueText: "Yes", falseText: "No"},
{name: 'Startup Time', field: 'startupTime', title: "Startup Time", type: 'String'},
{name: 'Error', field: 'error', title: "Status", type: 'Boolean', trueText: "Error", falseText: "OK"},
{name: 'Log', field: 'log', title: "Log", type: 'StringList'}
],
rowClasses: [
{className: 'error', field: 'error'},
{className: 'warning', field: 'warning'}
]}
});
merge(config.macros.toolbar,{
moreLabel: "more",
morePrompt: "Show additional commands",
lessLabel: "less",
lessPrompt: "Hide additional commands",
separator: "|"
});
merge(config.macros.refreshDisplay,{
label: "refresh",
prompt: "Redraw the entire TiddlyWiki display"
});
merge(config.macros.importTiddlers,{
readOnlyWarning: "You cannot import into a read-only TiddlyWiki file. Try opening it from a file:// URL",
wizardTitle: "Import tiddlers from another file or server",
step1Title: "Step 1: Locate the server or TiddlyWiki file",
step1Html: "Specify the type of the server: <select name='selTypes'><option value=''>Choose...</option></select><br>Enter the URL or pathname here: <input type='text' size=50 name='txtPath'><br>...or browse for a file: <input type='file' size=50 name='txtBrowse'><br><hr>...or select a pre-defined feed: <select name='selFeeds'><option value=''>Choose...</option></select>",
openLabel: "open",
openPrompt: "Open the connection to this file or server",
statusOpenHost: "Opening the host",
statusGetWorkspaceList: "Getting the list of available workspaces",
step2Title: "Step 2: Choose the workspace",
step2Html: "Enter a workspace name: <input type='text' size=50 name='txtWorkspace'><br>...or select a workspace: <select name='selWorkspace'><option value=''>Choose...</option></select>",
cancelLabel: "cancel",
cancelPrompt: "Cancel this import",
statusOpenWorkspace: "Opening the workspace",
statusGetTiddlerList: "Getting the list of available tiddlers",
errorGettingTiddlerList: "Error getting list of tiddlers, click Cancel to try again",
errorGettingTiddlerListHttp404: "Error retrieving tiddlers from url, please ensure the url exists. Click Cancel to try again.",
errorGettingTiddlerListHttp: "Error retrieving tiddlers from url, please ensure this url exists and is <a href='http://enable-cors.org/'>CORS</a> enabled",
errorGettingTiddlerListFile: "Error retrieving tiddlers from local file, please make sure the file is in the same directory as your TiddlyWiki. Click Cancel to try again.",
step3Title: "Step 3: Choose the tiddlers to import",
step3Html: "<input type='hidden' name='markList'></input><br><input type='checkbox' checked='true' name='chkSync'>Keep these tiddlers linked to this server so that you can synchronise subsequent changes</input><br><input type='checkbox' name='chkSave'>Save the details of this server in a 'systemServer' tiddler called:</input> <input type='text' size=25 name='txtSaveTiddler'>",
importLabel: "import",
importPrompt: "Import these tiddlers",
confirmOverwriteText: "Are you sure you want to overwrite these tiddlers:\n\n%0",
step4Title: "Step 4: Importing %0 tiddler(s)",
step4Html: "<input type='hidden' name='markReport'></input>", // DO NOT TRANSLATE
doneLabel: "done",
donePrompt: "Close this wizard",
statusDoingImport: "Importing tiddlers",
statusDoneImport: "All tiddlers imported",
systemServerNamePattern: "%2 on %1",
systemServerNamePatternNoWorkspace: "%1",
confirmOverwriteSaveTiddler: "The tiddler '%0' already exists. Click 'OK' to overwrite it with the details of this server, or 'Cancel' to leave it unchanged",
serverSaveTemplate: "|''Type:''|%0|\n|''URL:''|%1|\n|''Workspace:''|%2|\n\nThis tiddler was automatically created to record the details of this server",
serverSaveModifier: "(System)",
listViewTemplate: {
columns: [
{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
{name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
{name: 'Size', field: 'size', tiddlerLink: 'size', title: "Size", type: 'Size'},
{name: 'Tags', field: 'tags', title: "Tags", type: 'Tags'}
],
rowClasses: [
]}
});
merge(config.macros.upgrade,{
wizardTitle: "Upgrade TiddlyWiki core code",
step1Title: "Update or repair this TiddlyWiki to the latest release",
step1Html: "You are about to upgrade to the latest release of the TiddlyWiki core code (from <a href='%0' class='externalLink' target='_blank'>%1</a>). Your content will be preserved across the upgrade.<br><br>Note that core upgrades have been known to interfere with older plugins. If you run into problems with the upgraded file, see <a href='http://www.tiddlywiki.org/wiki/CoreUpgrades' class='externalLink' target='_blank'>http://www.tiddlywiki.org/wiki/CoreUpgrades</a>",
errorCantUpgrade: "Unable to upgrade this TiddlyWiki. You can only perform upgrades on TiddlyWiki files stored locally",
errorNotSaved: "You must save changes before you can perform an upgrade",
step2Title: "Confirm the upgrade details",
step2Html_downgrade: "You are about to downgrade to TiddlyWiki version %0 from %1.<br><br>Downgrading to an earlier version of the core code is not recommended",
step2Html_restore: "This TiddlyWiki appears to be already using the latest version of the core code (%0).<br><br>You can continue to upgrade anyway to ensure that the core code hasn't been corrupted or damaged",
step2Html_upgrade: "You are about to upgrade to TiddlyWiki version %0 from %1",
upgradeLabel: "upgrade",
upgradePrompt: "Prepare for the upgrade process",
statusPreparingBackup: "Preparing backup",
statusSavingBackup: "Saving backup file",
errorSavingBackup: "There was a problem saving the backup file",
statusLoadingCore: "Loading core code",
errorLoadingCore: "Error loading the core code",
errorCoreFormat: "Error with the new core code",
statusSavingCore: "Saving the new core code",
statusReloadingCore: "Reloading the new core code",
startLabel: "start",
startPrompt: "Start the upgrade process",
cancelLabel: "cancel",
cancelPrompt: "Cancel the upgrade process",
step3Title: "Upgrade cancelled",
step3Html: "You have cancelled the upgrade process"
});
merge(config.macros.annotations,{
});
merge(config.commands.closeTiddler,{
text: "close",
tooltip: "Close this tiddler"});
merge(config.commands.closeOthers,{
text: "close others",
tooltip: "Close all other tiddlers"});
merge(config.commands.editTiddler,{
text: "edit",
tooltip: "Edit this tiddler",
readOnlyText: "view",
readOnlyTooltip: "View the source of this tiddler"});
merge(config.commands.saveTiddler,{
text: "done",
tooltip: "Save changes to this tiddler"});
merge(config.commands.cancelTiddler,{
text: "cancel",
tooltip: "Undo changes to this tiddler",
warning: "Are you sure you want to abandon your changes to '%0'?",
readOnlyText: "done",
readOnlyTooltip: "View this tiddler normally"});
merge(config.commands.deleteTiddler,{
text: "delete",
tooltip: "Delete this tiddler",
warning: "Are you sure you want to delete '%0'?"});
merge(config.commands.permalink,{
text: "permalink",
tooltip: "Permalink for this tiddler"});
merge(config.commands.references,{
text: "references",
tooltip: "Show tiddlers that link to this one",
popupNone: "No references"});
merge(config.commands.jump,{
text: "jump",
tooltip: "Jump to another open tiddler"});
merge(config.commands.fields,{
text: "fields",
tooltip: "Show the extended fields of this tiddler",
emptyText: "There are no extended fields for this tiddler",
listViewTemplate: {
columns: [
{name: 'Field', field: 'field', title: "Field", type: 'String'},
{name: 'Value', field: 'value', title: "Value", type: 'String'}
],
rowClasses: [
],
buttons: [
]}});
merge(config.shadowTiddlers,{
DefaultTiddlers: "[[GettingStarted]]",
MainMenu: "[[GettingStarted]]",
SiteTitle: "My TiddlyWiki",
SiteSubtitle: "a reusable non-linear personal web notebook",
SiteUrl: "",
SideBarOptions: '<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "options \u00bb" "Change TiddlyWiki advanced options">>',
SideBarTabs: '<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>',
TabMore: '<<tabs txtMoreTab "Missing" "Missing tiddlers" TabMoreMissing "Orphans" "Orphaned tiddlers" TabMoreOrphans "Shadowed" "Shadowed tiddlers" TabMoreShadowed>>'
});
merge(config.annotations,{
AdvancedOptions: "This shadow tiddler provides access to several advanced options",
ColorPalette: "These values in this shadow tiddler determine the colour scheme of the ~TiddlyWiki user interface",
DefaultTiddlers: "The tiddlers listed in this shadow tiddler will be automatically displayed when ~TiddlyWiki starts up",
EditTemplate: "The HTML template in this shadow tiddler determines how tiddlers look while they are being edited",
GettingStarted: "This shadow tiddler provides basic usage instructions",
ImportTiddlers: "This shadow tiddler provides access to importing tiddlers",
MainMenu: "This shadow tiddler is used as the contents of the main menu in the left-hand column of the screen",
MarkupPreHead: "This tiddler is inserted at the top of the <head> section of the TiddlyWiki HTML file",
MarkupPostHead: "This tiddler is inserted at the bottom of the <head> section of the TiddlyWiki HTML file",
MarkupPreBody: "This tiddler is inserted at the top of the <body> section of the TiddlyWiki HTML file",
MarkupPostBody: "This tiddler is inserted at the end of the <body> section of the TiddlyWiki HTML file immediately after the script block",
OptionsPanel: "This shadow tiddler is used as the contents of the options panel slider in the right-hand sidebar",
PageTemplate: "The HTML template in this shadow tiddler determines the overall ~TiddlyWiki layout",
PluginManager: "This shadow tiddler provides access to the plugin manager",
SideBarOptions: "This shadow tiddler is used as the contents of the option panel in the right-hand sidebar",
SideBarTabs: "This shadow tiddler is used as the contents of the tabs panel in the right-hand sidebar",
SiteSubtitle: "This shadow tiddler is used as the second part of the page title",
SiteTitle: "This shadow tiddler is used as the first part of the page title",
SiteUrl: "This shadow tiddler should be set to the full target URL for publication",
StyleSheetColors: "This shadow tiddler contains CSS definitions related to the color of page elements. ''DO NOT EDIT THIS TIDDLER'', instead make your changes in the StyleSheet shadow tiddler",
StyleSheet: "This tiddler can contain custom CSS definitions",
StyleSheetLayout: "This shadow tiddler contains CSS definitions related to the layout of page elements. ''DO NOT EDIT THIS TIDDLER'', instead make your changes in the StyleSheet shadow tiddler",
StyleSheetLocale: "This shadow tiddler contains CSS definitions related to the translation locale",
StyleSheetPrint: "This shadow tiddler contains CSS definitions for printing",
SystemSettings: "This tiddler is used to store configuration options for this TiddlyWiki document",
TabAll: "This shadow tiddler contains the contents of the 'All' tab in the right-hand sidebar",
TabMore: "This shadow tiddler contains the contents of the 'More' tab in the right-hand sidebar",
TabMoreMissing: "This shadow tiddler contains the contents of the 'Missing' tab in the right-hand sidebar",
TabMoreOrphans: "This shadow tiddler contains the contents of the 'Orphans' tab in the right-hand sidebar",
TabMoreShadowed: "This shadow tiddler contains the contents of the 'Shadowed' tab in the right-hand sidebar",
TabTags: "This shadow tiddler contains the contents of the 'Tags' tab in the right-hand sidebar",
TabTimeline: "This shadow tiddler contains the contents of the 'Timeline' tab in the right-hand sidebar",
ToolbarCommands: "This shadow tiddler determines which commands are shown in tiddler toolbars",
ViewTemplate: "The HTML template in this shadow tiddler determines how tiddlers look"
});
//--
//-- Paramifiers
//--
function getParameters()
{
var p = null;
if(window.location.hash) {
p = decodeURIComponent(window.location.hash.substr(1));
if(config.browser.firefoxDate != null && config.browser.firefoxDate[1] < "20051111")
p = convertUTF8ToUnicode(p);
}
return p;
}
function invokeParamifier(params,handler)
{
if(!params || params.length == undefined || params.length <= 1)
return;
var i;
for(i=1; i<params.length; i++) {
var p = config.paramifiers[params[i].name];
if(p && p[handler] instanceof Function)
p[handler](params[i].value);
else {
var h = config.optionHandlers[params[i].name.substr(0,3)];
if(h && h.set instanceof Function)
h.set(params[i].name,params[i].value);
}
}
}
config.paramifiers = {};
config.paramifiers.start = {
oninit: function(v) {
safeMode = v.toLowerCase() == "safe";
}
};
config.paramifiers.open = {
onstart: function(v) {
if(!readOnly || store.tiddlerExists(v) || store.isShadowTiddler(v))
story.displayTiddler("bottom",v,null,false,null);
}
};
config.paramifiers.story = {
onstart: function(v) {
var list = store.getTiddlerText(v,"").parseParams("open",null,false);
invokeParamifier(list,"onstart");
}
};
config.paramifiers.search = {
onstart: function(v) {
story.search(v,false,false);
}
};
config.paramifiers.searchRegExp = {
onstart: function(v) {
story.prototype.search(v,false,true);
}
};
config.paramifiers.tag = {
onstart: function(v) {
story.displayTiddlers(null,store.filterTiddlers("[tag["+v+"]]"),null,false,null);
}
};
config.paramifiers.newTiddler = {
onstart: function(v) {
var args = v.parseParams("anon", null, null)[0];
var title = args.title ? args.title[0] : v;
var customFields = args.fields ? args.fields[0] : null;
if(!readOnly) {
story.displayTiddler(null,title,DEFAULT_EDIT_TEMPLATE,false,null,customFields);
story.focusTiddler(title,"text");
var i,tags = args.tag || [];
for(i=0;i<tags.length;i++) {
story.setTiddlerTag(title,tags[i],+1);
}
}
}
};
config.paramifiers.newJournal = {
onstart: function(v) {
if(!readOnly) {
var now = new Date();
var title = now.formatString(v.trim());
story.displayTiddler(null,title,DEFAULT_EDIT_TEMPLATE);
story.focusTiddler(title,"text");
}
}
};
config.paramifiers.readOnly = {
onconfig: function(v) {
var p = v.toLowerCase();
readOnly = p == "yes" ? true : (p == "no" ? false : readOnly);
}
};
config.paramifiers.theme = {
onconfig: function(v) {
story.switchTheme(v);
}
};
config.paramifiers.upgrade = {
onstart: function(v) {
upgradeFrom(v);
}
};
config.paramifiers.recent= {
onstart: function(v) {
var titles=[];
var i,tiddlers=store.getTiddlers("modified","excludeLists").reverse();
for(i=0; i<v && i<tiddlers.length; i++)
titles.push(tiddlers[i].title);
story.displayTiddlers(null,titles);
}
};
config.paramifiers.filter = {
onstart: function(v) {
story.displayTiddlers(null,store.filterTiddlers(v),null,false);
}
};
//--
//-- Formatter helpers
//--
function Formatter(formatters)
{
var n;
this.formatters = [];
var pattern = [];
for(n=0; n<formatters.length; n++) {
pattern.push("(" + formatters[n].match + ")");
this.formatters.push(formatters[n]);
}
this.formatterRegExp = new RegExp(pattern.join("|"),"mg");
}
config.formatterHelpers = {
createElementAndWikify: function(w)
{
w.subWikifyTerm(createTiddlyElement(w.output,this.element),this.termRegExp);
},
inlineCssHelper: function(w)
{
var styles = [];
config.textPrimitives.cssLookaheadRegExp.lastIndex = w.nextMatch;
var lookaheadMatch = config.textPrimitives.cssLookaheadRegExp.exec(w.source);
while(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {
var s,v;
if(lookaheadMatch[1]) {
s = lookaheadMatch[1].unDash();
v = lookaheadMatch[2];
} else {
s = lookaheadMatch[3].unDash();
v = lookaheadMatch[4];
}
if(s=="bgcolor")
s = "backgroundColor";
if(s=="float")
s = "cssFloat";
styles.push({style: s, value: v});
w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
config.textPrimitives.cssLookaheadRegExp.lastIndex = w.nextMatch;
lookaheadMatch = config.textPrimitives.cssLookaheadRegExp.exec(w.source);
}
return styles;
},
applyCssHelper: function(e,styles)
{
var t;
for(t=0; t< styles.length; t++) {
try {
e.style[styles[t].style] = styles[t].value;
} catch (ex) {
}
}
},
enclosedTextHelper: function(w)
{
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var text = lookaheadMatch[1];
if(config.browser.isIE)
text = text.replace(/\n/g,"\r");
createTiddlyElement(w.output,this.element,null,null,text);
w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
}
},
isExternalLink: function(link)
{
if(store.tiddlerExists(link) || store.isShadowTiddler(link)) {
return false;
}
var urlRegExp = new RegExp(config.textPrimitives.urlPattern,"mg");
if(urlRegExp.exec(link)) {
return true;
}
if(link.indexOf(".")!=-1 || link.indexOf("\\")!=-1 || link.indexOf("/")!=-1 || link.indexOf("#")!=-1) {
return true;
}
return false;
}
};
//--
//-- Standard formatters
//--
config.formatters = [
{
name: "table",
match: "^\\|(?:[^\\n]*)\\|(?:[fhck]?)$",
lookaheadRegExp: /^\|([^\n]*)\|([fhck]?)$/mg,
rowTermRegExp: /(\|(?:[fhck]?)$\n?)/mg,
cellRegExp: /(?:\|([^\n\|]*)\|)|(\|[fhck]?$\n?)/mg,
cellTermRegExp: /((?:\x20*)\|)/mg,
rowTypes: {"c":"caption", "h":"thead", "":"tbody", "f":"tfoot"},
handler: function(w)
{
var table = createTiddlyElement(w.output,"table",null,"twtable");
var prevColumns = [];
var currRowType = null;
var rowContainer;
var rowCount = 0;
var onmouseover = function() {jQuery(this).addClass("hoverRow");};
var onmouseout = function() {jQuery(this).removeClass("hoverRow");};
w.nextMatch = w.matchStart;
this.lookaheadRegExp.lastIndex = w.nextMatch;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
while(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {
var nextRowType = lookaheadMatch[2];
if(nextRowType == "k") {
table.className = lookaheadMatch[1];
w.nextMatch += lookaheadMatch[0].length+1;
} else {
if(nextRowType != currRowType) {
rowContainer = createTiddlyElement(table,this.rowTypes[nextRowType]);
currRowType = nextRowType;
}
if(currRowType == "c") {
// Caption
w.nextMatch++;
if(rowContainer != table.firstChild)
table.insertBefore(rowContainer,table.firstChild);
rowContainer.setAttribute("align",rowCount == 0?"top":"bottom");
w.subWikifyTerm(rowContainer,this.rowTermRegExp);
} else {
var theRow = createTiddlyElement(rowContainer,"tr",null,rowCount%2?"oddRow":"evenRow");
theRow.onmouseover = onmouseover;
theRow.onmouseout = onmouseout;
this.rowHandler(w,theRow,prevColumns);
rowCount++;
}
}
this.lookaheadRegExp.lastIndex = w.nextMatch;
lookaheadMatch = this.lookaheadRegExp.exec(w.source);
}
},
rowHandler: function(w,e,prevColumns)
{
var col = 0;
var colSpanCount = 1;
var prevCell = null;
this.cellRegExp.lastIndex = w.nextMatch;
var cellMatch = this.cellRegExp.exec(w.source);
while(cellMatch && cellMatch.index == w.nextMatch) {
if(cellMatch[1] == "~") {
// Rowspan
var last = prevColumns[col];
if(last) {
last.rowSpanCount++;
last.element.setAttribute("rowspan",last.rowSpanCount);
last.element.setAttribute("rowSpan",last.rowSpanCount); // Needed for IE
last.element.valign = "center";
if(colSpanCount > 1) {
last.element.setAttribute("colspan",colSpanCount);
last.element.setAttribute("colSpan",colSpanCount); // Needed for IE
colSpanCount = 1;
}
}
w.nextMatch = this.cellRegExp.lastIndex-1;
} else if(cellMatch[1] == ">") {
// Colspan
colSpanCount++;
w.nextMatch = this.cellRegExp.lastIndex-1;
} else if(cellMatch[2]) {
// End of row
if(prevCell && colSpanCount > 1) {
prevCell.setAttribute("colspan",colSpanCount);
prevCell.setAttribute("colSpan",colSpanCount); // Needed for IE
}
w.nextMatch = this.cellRegExp.lastIndex;
break;
} else {
// Cell
w.nextMatch++;
var styles = config.formatterHelpers.inlineCssHelper(w);
var spaceLeft = false;
var chr = w.source.substr(w.nextMatch,1);
while(chr == " ") {
spaceLeft = true;
w.nextMatch++;
chr = w.source.substr(w.nextMatch,1);
}
var cell;
if(chr == "!") {
cell = createTiddlyElement(e,"th");
w.nextMatch++;
} else {
cell = createTiddlyElement(e,"td");
}
prevCell = cell;
prevColumns[col] = {rowSpanCount:1,element:cell};
if(colSpanCount > 1) {
cell.setAttribute("colspan",colSpanCount);
cell.setAttribute("colSpan",colSpanCount); // Needed for IE
colSpanCount = 1;
}
config.formatterHelpers.applyCssHelper(cell,styles);
w.subWikifyTerm(cell,this.cellTermRegExp);
if(w.matchText.substr(w.matchText.length-2,1) == " ") // spaceRight
cell.align = spaceLeft ? "center" : "left";
else if(spaceLeft)
cell.align = "right";
w.nextMatch--;
}
col++;
this.cellRegExp.lastIndex = w.nextMatch;
cellMatch = this.cellRegExp.exec(w.source);
}
}
},
{
name: "heading",
match: "^!{1,6}",
termRegExp: /(\n)/mg,
handler: function(w)
{
w.subWikifyTerm(createTiddlyElement(w.output,"h" + w.matchLength),this.termRegExp);
}
},
{
name: "list",
match: "^(?:[\\*#;:]+)",
lookaheadRegExp: /^(?:(?:(\*)|(#)|(;)|(:))+)/mg,
termRegExp: /(\n)/mg,
handler: function(w)
{
var stack = [w.output];
var currLevel = 0, currType = null;
var listLevel, listType, itemType, baseType;
w.nextMatch = w.matchStart;
this.lookaheadRegExp.lastIndex = w.nextMatch;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
while(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {
if(lookaheadMatch[1]) {
listType = "ul";
itemType = "li";
} else if(lookaheadMatch[2]) {
listType = "ol";
itemType = "li";
} else if(lookaheadMatch[3]) {
listType = "dl";
itemType = "dt";
} else if(lookaheadMatch[4]) {
listType = "dl";
itemType = "dd";
}
if(!baseType)
baseType = listType;
listLevel = lookaheadMatch[0].length;
w.nextMatch += lookaheadMatch[0].length;
var t;
if(listLevel > currLevel) {
for(t=currLevel; t<listLevel; t++) {
var target = (currLevel == 0) ? stack[stack.length-1] : stack[stack.length-1].lastChild;
stack.push(createTiddlyElement(target,listType));
}
} else if(listType!=baseType && listLevel==1) {
w.nextMatch -= lookaheadMatch[0].length;
return;
} else if(listLevel < currLevel) {
for(t=currLevel; t>listLevel; t--)
stack.pop();
} else if(listLevel == currLevel && listType != currType) {
stack.pop();
stack.push(createTiddlyElement(stack[stack.length-1].lastChild,listType));
}
currLevel = listLevel;
currType = listType;
var e = createTiddlyElement(stack[stack.length-1],itemType);
w.subWikifyTerm(e,this.termRegExp);
this.lookaheadRegExp.lastIndex = w.nextMatch;
lookaheadMatch = this.lookaheadRegExp.exec(w.source);
}
}
},
{
name: "quoteByBlock",
match: "^<<<\\n",
termRegExp: /(^<<<(\n|$))/mg,
element: "blockquote",
handler: config.formatterHelpers.createElementAndWikify
},
{
name: "quoteByLine",
match: "^>+",
lookaheadRegExp: /^>+/mg,
termRegExp: /(\n)/mg,
element: "blockquote",
handler: function(w)
{
var stack = [w.output];
var currLevel = 0;
var newLevel = w.matchLength;
var t,matched;
do {
if(newLevel > currLevel) {
for(t=currLevel; t<newLevel; t++)
stack.push(createTiddlyElement(stack[stack.length-1],this.element));
} else if(newLevel < currLevel) {
for(t=currLevel; t>newLevel; t--)
stack.pop();
}
currLevel = newLevel;
w.subWikifyTerm(stack[stack.length-1],this.termRegExp);
createTiddlyElement(stack[stack.length-1],"br");
this.lookaheadRegExp.lastIndex = w.nextMatch;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
matched = lookaheadMatch && lookaheadMatch.index == w.nextMatch;
if(matched) {
newLevel = lookaheadMatch[0].length;
w.nextMatch += lookaheadMatch[0].length;
}
} while(matched);
}
},
{
name: "rule",
match: "^----+$\\n?|<hr ?/?>\\n?",
handler: function(w)
{
createTiddlyElement(w.output,"hr");
}
},
{
name: "monospacedByLine",
match: "^(?:/\\*\\{\\{\\{\\*/|\\{\\{\\{|//\\{\\{\\{|<!--\\{\\{\\{-->)\\n",
element: "pre",
handler: function(w)
{
switch(w.matchText) {
case "/*{{{*/\n": // CSS
this.lookaheadRegExp = /\/\*\{\{\{\*\/\n*((?:^[^\n]*\n)+?)(\n*^\f*\/\*\}\}\}\*\/$\n?)/mg;
break;
case "{{{\n": // monospaced block
this.lookaheadRegExp = /^\{\{\{\n((?:^[^\n]*\n)+?)(^\f*\}\}\}$\n?)/mg;
break;
case "//{{{\n": // plugin
this.lookaheadRegExp = /^\/\/\{\{\{\n\n*((?:^[^\n]*\n)+?)(\n*^\f*\/\/\}\}\}$\n?)/mg;
break;
case "<!--{{{-->\n": //template
this.lookaheadRegExp = /<!--\{\{\{-->\n*((?:^[^\n]*\n)+?)(\n*^\f*<!--\}\}\}-->$\n?)/mg;
break;
default:
break;
}
config.formatterHelpers.enclosedTextHelper.call(this,w);
}
},
{
name: "wikifyComment",
match: "^(?:/\\*\\*\\*|<!---)\\n",
handler: function(w)
{
var termRegExp = (w.matchText == "/***\n") ? (/(^\*\*\*\/\n)/mg) : (/(^--->\n)/mg);
w.subWikifyTerm(w.output,termRegExp);
}
},
{
name: "macro",
match: "<<",
lookaheadRegExp: /<<([^>\s]+)(?:\s*)((?:[^>]|(?:>(?!>)))*)>>/mg,
handler: function(w)
{
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart && lookaheadMatch[1]) {
w.nextMatch = this.lookaheadRegExp.lastIndex;
invokeMacro(w.output,lookaheadMatch[1],lookaheadMatch[2],w,w.tiddler);
}
}
},
{
name: "prettyLink",
match: "\\[\\[",
lookaheadRegExp: /\[\[(.*?)(?:\|(~)?(.*?))?\]\]/mg,
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];
e = (!lookaheadMatch[2] && config.formatterHelpers.isExternalLink(link)) ?
createExternalLink(w.output,link) : createTiddlyLink(w.output,link,false,null,w.isStatic,w.tiddler);
} else {
// Simple bracketted link
e = createTiddlyLink(w.output,text,false,null,w.isStatic,w.tiddler);
}
createTiddlyText(e,text);
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
},
{
name: "wikiLink",
match: config.textPrimitives.unWikiLink+"?"+config.textPrimitives.wikiLink,
handler: function(w)
{
if(w.matchText.substr(0,1) == config.textPrimitives.unWikiLink) {
w.outputText(w.output,w.matchStart+1,w.nextMatch);
return;
}
if(w.matchStart > 0) {
var preRegExp = new RegExp(config.textPrimitives.anyLetterStrict,"mg");
preRegExp.lastIndex = w.matchStart-1;
var preMatch = preRegExp.exec(w.source);
if(preMatch.index == w.matchStart-1) {
w.outputText(w.output,w.matchStart,w.nextMatch);
return;
}
}
if(w.autoLinkWikiWords || store.isShadowTiddler(w.matchText)) {
var link = createTiddlyLink(w.output,w.matchText,false,null,w.isStatic,w.tiddler);
w.outputText(link,w.matchStart,w.nextMatch);
} else {
w.outputText(w.output,w.matchStart,w.nextMatch);
}
}
},
{
name: "urlLink",
match: config.textPrimitives.urlPattern,
handler: function(w)
{
w.outputText(createExternalLink(w.output,w.matchText),w.matchStart,w.nextMatch);
}
},
{
name: "image",
match: "\\[[<>]?[Ii][Mm][Gg]\\[",
lookaheadRegExp: /\[([<]?)(>?)[Ii][Mm][Gg]\[(?:([^\|\]]+)\|)?([^\[\]\|]+)\](?:\[([^\]]*)\])?\]/mg,
handler: function(w)
{
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var e = w.output;
if(lookaheadMatch[5]) {
var link = lookaheadMatch[5];
e = config.formatterHelpers.isExternalLink(link) ? createExternalLink(w.output,link) : createTiddlyLink(w.output,link,false,null,w.isStatic,w.tiddler);
jQuery(e).addClass("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.setAttribute("alt",lookaheadMatch[3]);
}
img.src = lookaheadMatch[4];
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
},
{
name: "html",
match: "<[Hh][Tt][Mm][Ll]>",
lookaheadRegExp: /<[Hh][Tt][Mm][Ll]>((?:.|\n)*?)<\/[Hh][Tt][Mm][Ll]>/mg,
handler: function(w)
{
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
createTiddlyElement(w.output,"span").innerHTML = lookaheadMatch[1];
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
},
{
name: "commentByBlock",
match: "/%",
lookaheadRegExp: /\/%((?:.|\n)*?)%\//mg,
handler: function(w)
{
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
},
{
name: "characterFormat",
match: "''|//|__|\\^\\^|~~|--(?!\\s|$)|\\{\\{\\{",
handler: function(w)
{
switch(w.matchText) {
case "''":
w.subWikifyTerm(w.output.appendChild(document.createElement("strong")),/('')/mg);
break;
case "//":
w.subWikifyTerm(createTiddlyElement(w.output,"em"),/(\/\/)/mg);
break;
case "__":
w.subWikifyTerm(createTiddlyElement(w.output,"u"),/(__)/mg);
break;
case "^^":
w.subWikifyTerm(createTiddlyElement(w.output,"sup"),/(\^\^)/mg);
break;
case "~~":
w.subWikifyTerm(createTiddlyElement(w.output,"sub"),/(~~)/mg);
break;
case "--":
w.subWikifyTerm(createTiddlyElement(w.output,"strike"),/(--)/mg);
break;
case "{{{":
var lookaheadRegExp = /\{\{\{((?:.|\n)*?)\}\}\}/mg;
lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
createTiddlyElement(w.output,"code",null,null,lookaheadMatch[1]);
w.nextMatch = lookaheadRegExp.lastIndex;
}
break;
}
}
},
{
name: "customFormat",
match: "@@|\\{\\{",
handler: function(w)
{
switch(w.matchText) {
case "@@":
var e = createTiddlyElement(w.output,"span");
var styles = config.formatterHelpers.inlineCssHelper(w);
if(styles.length == 0)
e.className = "marked";
else
config.formatterHelpers.applyCssHelper(e,styles);
w.subWikifyTerm(e,/(@@)/mg);
break;
case "{{":
var lookaheadRegExp = /\{\{[\s]*([\w]+[\s\w]*)[\s]*\{(\n?)/mg;
lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = lookaheadRegExp.exec(w.source);
if(lookaheadMatch) {
w.nextMatch = lookaheadRegExp.lastIndex;
e = createTiddlyElement(w.output,lookaheadMatch[2] == "\n" ? "div" : "span",null,lookaheadMatch[1]);
w.subWikifyTerm(e,/(\}\}\})/mg);
}
break;
}
}
},
{
name: "mdash",
match: "--",
handler: function(w)
{
createTiddlyElement(w.output,"span").innerHTML = "—";
}
},
{
name: "lineBreak",
match: "\\n|<br ?/?>",
handler: function(w)
{
createTiddlyElement(w.output,"br");
}
},
{
name: "rawText",
match: "\"{3}|<nowiki>",
lookaheadRegExp: /(?:\"{3}|<nowiki>)((?:.|\n)*?)(?:\"{3}|<\/nowiki>)/mg,
handler: function(w)
{
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
createTiddlyElement(w.output,"span",null,null,lookaheadMatch[1]);
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
},
{
name: "htmlEntitiesEncoding",
match: "(?:(?:&#?[a-zA-Z0-9]{2,8};|.)(?:&#?(?:x0*(?:3[0-6][0-9a-fA-F]|1D[c-fC-F][0-9a-fA-F]|20[d-fD-F][0-9a-fA-F]|FE2[0-9a-fA-F])|0*(?:76[89]|7[7-9][0-9]|8[0-7][0-9]|761[6-9]|76[2-7][0-9]|84[0-3][0-9]|844[0-7]|6505[6-9]|6506[0-9]|6507[0-1]));)+|&#?[a-zA-Z0-9]{2,8};)",
handler: function(w)
{
createTiddlyElement(w.output,"span").innerHTML = w.matchText;
}
}
];
//--
//-- Wikifier
//--
function getParser(tiddler,format)
{
if(tiddler) {
if(!format)
format = tiddler.fields["wikiformat"];
var i;
if(format) {
for(i in config.parsers) {
if(format == config.parsers[i].format)
return config.parsers[i];
}
} else {
for(i in config.parsers) {
if(tiddler.isTagged(config.parsers[i].formatTag))
return config.parsers[i];
}
}
}
return formatter;
}
function Wikifier(source,formatter,highlightRegExp,tiddler)
{
this.source = source;
this.output = null;
this.formatter = formatter;
this.nextMatch = 0;
this.autoLinkWikiWords = tiddler && tiddler.autoLinkWikiWords() == false ? false : true;
this.highlightRegExp = highlightRegExp;
this.highlightMatch = null;
this.isStatic = false;
if(highlightRegExp) {
highlightRegExp.lastIndex = 0;
this.highlightMatch = highlightRegExp.exec(source);
}
this.tiddler = tiddler;
}
Wikifier.prototype.wikifyPlain = function()
{
var e = createTiddlyElement(document.body,"div");
e.style.display = "none";
this.subWikify(e);
var text = jQuery(e).text();
jQuery(e).remove();
return text;
};
Wikifier.prototype.subWikify = function(output,terminator)
{
try {
if(terminator)
this.subWikifyTerm(output,new RegExp("(" + terminator + ")","mg"));
else
this.subWikifyUnterm(output);
} catch(ex) {
showException(ex);
}
};
Wikifier.prototype.subWikifyUnterm = function(output)
{
var oldOutput = this.output;
this.output = output;
this.formatter.formatterRegExp.lastIndex = this.nextMatch;
var formatterMatch = this.formatter.formatterRegExp.exec(this.source);
while(formatterMatch) {
// Output any text before the match
if(formatterMatch.index > this.nextMatch)
this.outputText(this.output,this.nextMatch,formatterMatch.index);
// Set the match parameters for the handler
this.matchStart = formatterMatch.index;
this.matchLength = formatterMatch[0].length;
this.matchText = formatterMatch[0];
this.nextMatch = this.formatter.formatterRegExp.lastIndex;
var t;
for(t=1; t<formatterMatch.length; t++) {
if(formatterMatch[t]) {
this.formatter.formatters[t-1].handler(this);
this.formatter.formatterRegExp.lastIndex = this.nextMatch;
break;
}
}
formatterMatch = this.formatter.formatterRegExp.exec(this.source);
}
if(this.nextMatch < this.source.length) {
this.outputText(this.output,this.nextMatch,this.source.length);
this.nextMatch = this.source.length;
}
this.output = oldOutput;
};
Wikifier.prototype.subWikifyTerm = function(output,terminatorRegExp)
{
var oldOutput = this.output;
this.output = output;
terminatorRegExp.lastIndex = this.nextMatch;
var terminatorMatch = terminatorRegExp.exec(this.source);
this.formatter.formatterRegExp.lastIndex = this.nextMatch;
var formatterMatch = this.formatter.formatterRegExp.exec(terminatorMatch ? this.source.substr(0,terminatorMatch.index) : this.source);
while(terminatorMatch || formatterMatch) {
if(terminatorMatch && (!formatterMatch || terminatorMatch.index <= formatterMatch.index)) {
if(terminatorMatch.index > this.nextMatch)
this.outputText(this.output,this.nextMatch,terminatorMatch.index);
this.matchText = terminatorMatch[1];
this.matchLength = terminatorMatch[1].length;
this.matchStart = terminatorMatch.index;
this.nextMatch = this.matchStart + this.matchLength;
this.output = oldOutput;
return;
}
if(formatterMatch.index > this.nextMatch)
this.outputText(this.output,this.nextMatch,formatterMatch.index);
this.matchStart = formatterMatch.index;
this.matchLength = formatterMatch[0].length;
this.matchText = formatterMatch[0];
this.nextMatch = this.formatter.formatterRegExp.lastIndex;
var t;
for(t=1; t<formatterMatch.length; t++) {
if(formatterMatch[t]) {
this.formatter.formatters[t-1].handler(this);
this.formatter.formatterRegExp.lastIndex = this.nextMatch;
break;
}
}
terminatorRegExp.lastIndex = this.nextMatch;
terminatorMatch = terminatorRegExp.exec(this.source);
formatterMatch = this.formatter.formatterRegExp.exec(terminatorMatch ? this.source.substr(0,terminatorMatch.index) : this.source);
}
if(this.nextMatch < this.source.length) {
this.outputText(this.output,this.nextMatch,this.source.length);
this.nextMatch = this.source.length;
}
this.output = oldOutput;
};
Wikifier.prototype.outputText = function(place,startPos,endPos)
{
while(this.highlightMatch && (this.highlightRegExp.lastIndex > startPos) && (this.highlightMatch.index < endPos) && (startPos < endPos)) {
if(this.highlightMatch.index > startPos) {
createTiddlyText(place,this.source.substring(startPos,this.highlightMatch.index));
startPos = this.highlightMatch.index;
}
var highlightEnd = Math.min(this.highlightRegExp.lastIndex,endPos);
createTiddlyElement(place,"span",null,"highlight",this.source.substring(startPos,highlightEnd));
startPos = highlightEnd;
if(startPos >= this.highlightRegExp.lastIndex)
this.highlightMatch = this.highlightRegExp.exec(this.source);
}
if(startPos < endPos) {
createTiddlyText(place,this.source.substring(startPos,endPos));
}
};
function wikify(source,output,highlightRegExp,tiddler)
{
if(source) {
var wikifier = new Wikifier(source,getParser(tiddler),highlightRegExp,tiddler);
var t0 = new Date();
wikifier.subWikify(output);
if(tiddler && config.options.chkDisplayInstrumentation)
displayMessage("wikify:" +tiddler.title+ " in " + (new Date()-t0) + " ms");
}
}
function wikifyStatic(source,highlightRegExp,tiddler,format)
{
var e = createTiddlyElement(document.body,"pre");
e.style.display = "none";
var html = "";
if(source && source != "") {
if(!tiddler)
tiddler = new Tiddler("temp");
var wikifier = new Wikifier(source,getParser(tiddler,format),highlightRegExp,tiddler);
wikifier.isStatic = true;
wikifier.subWikify(e);
html = e.innerHTML;
jQuery(e).remove();
}
return html;
}
function wikifyPlainText(text,limit,tiddler)
{
if(limit > 0)
text = text.substr(0,limit);
var wikifier = new Wikifier(text,formatter,null,tiddler);
return wikifier.wikifyPlain();
}
function highlightify(source,output,highlightRegExp,tiddler)
{
if(source) {
var wikifier = new Wikifier(source,formatter,highlightRegExp,tiddler);
wikifier.outputText(output,0,source.length);
}
}
//--
//-- Macro definitions
//--
function invokeMacro(place,macro,params,wikifier,tiddler)
{
try {
var m = config.macros[macro];
if(m && m.handler) {
var tiddlerElem = story.findContainingTiddler(place);
window.tiddler = tiddlerElem ? store.getTiddler(tiddlerElem.getAttribute("tiddler")) : null;
window.place = place;
var allowEval = true;
if(config.evaluateMacroParameters=="system") {
if(!tiddler || tiddler.tags.indexOf("systemAllowEval") == -1) {
allowEval = false;
}
}
m.handler(place,macro,m.noPreParse?null:params.readMacroParams(!allowEval),wikifier,params,tiddler);
} else {
createTiddlyError(place,config.messages.macroError.format([macro]),config.messages.macroErrorDetails.format([macro,config.messages.missingMacro]));
}
} catch(ex) {
createTiddlyError(place,config.messages.macroError.format([macro]),config.messages.macroErrorDetails.format([macro,ex.toString()]));
}
}
config.macros.version.handler = function(place)
{
jQuery("<span/>").text(formatVersion()).appendTo(place);
};
config.macros.today.handler = function(place,macroName,params)
{
var now = new Date();
var text = params[0] ? now.formatString(params[0].trim()) : now.toLocaleString();
jQuery("<span/>").text(text).appendTo(place);
};
config.macros.list.template = "<<view title link>>";
config.macros.list.handler = function(place,macroName,params,wikifier,paramString)
{
var list = document.createElement("ul");
jQuery(list).attr({ refresh: "macro", macroName: macroName }).data("params", paramString);
place.appendChild(list);
this.refresh(list);
};
config.macros.list.refresh = function(list) {
var paramString = jQuery(list).data("params");
var params = paramString.readMacroParams();
var args = paramString.parseParams("anon", null, null)[0];
var type = args.anon ? args.anon[0] : "all";
jQuery(list).empty().addClass("list list-" + type);
var template = args.template ? store.getTiddlerText(args.template[0]) : false;
if(!template) {
template = config.macros.list.template;
}
if(this[type].prompt)
createTiddlyElement(list,"li",null,"listTitle",this[type].prompt);
var results;
if(this[type].handler)
results = this[type].handler(params);
var t;
for(t = 0; t < results.length; t++) {
var li = document.createElement("li");
list.appendChild(li);
var tiddler = results[t];
if(typeof(tiddler) == 'string') { // deal with missing etc..
tiddler = store.getTiddler(tiddler) || new Tiddler(tiddler);
}
wikify(template, li, null, tiddler);
}
if(results.length === 0 && args.emptyMessage) {
jQuery(list).addClass("emptyList");
jQuery("<li />").text(args.emptyMessage[0]).appendTo(list);
}
};
config.macros.list.all.handler = function(params)
{
return store.reverseLookup("tags","excludeLists",false,"title");
};
config.macros.list.missing.handler = function(params)
{
return store.getMissingLinks();
};
config.macros.list.orphans.handler = function(params)
{
return store.getOrphans();
};
config.macros.list.shadowed.handler = function(params)
{
return store.getShadowed();
};
config.macros.list.touched.handler = function(params)
{
return store.getTouched();
};
config.macros.list.filter.handler = function(params)
{
var filter = params[1];
var results = [];
if(filter) {
var tiddlers = store.filterTiddlers(filter);
var t;
for(t=0; t<tiddlers.length; t++)
results.push(tiddlers[t].title);
}
return results;
};
config.macros.allTags.handler = function(place,macroName,params)
{
var tags = store.getTags(params[0]);
var ul = createTiddlyElement(place,"ul");
if(tags.length == 0)
createTiddlyElement(ul,"li",null,"listTitle",this.noTags);
var t;
for(t=0; t<tags.length; t++) {
var title = tags[t][0];
var info = getTiddlyLinkInfo(title);
var li = createTiddlyElement(ul,"li");
var btn = createTiddlyButton(li,title + " (" + tags[t][1] + ")",this.tooltip.format([title]),onClickTag,info.classes);
btn.setAttribute("tag",title);
btn.setAttribute("refresh","link");
btn.setAttribute("tiddlyLink",title);
if(params[1]) {
btn.setAttribute("sortby",params[1]);
}
}
};
var macro = config.macros.timeline;
merge(macro, {
handler: function(place,macroName,params, wikifier, paramString, tiddler) {
var container = jQuery("<div />").attr("params", paramString).
attr("macroName", macroName).appendTo(place)[0];
macro.refresh(container);
},
refresh: function(container) {
jQuery(container).attr("refresh", "macro").empty();
var paramString = jQuery(container).attr("params");
var args = paramString.parseParams("anon", null, null)[0];
var params = args.anon || [];
var field = params[0] || "modified";
var prefix = field.charAt(0);
var no_prefix_field = prefix === "-" || prefix === "+" ? field.substr(1, field.length) : field;
var dateFormat = params[2] || this.dateFormat;
var groupTemplate = macro.groupTemplate.format(no_prefix_field, dateFormat);
groupTemplate = args.groupTemplate ? store.getTiddlerText(args.groupTemplate[0]) || groupTemplate :
groupTemplate;
var itemTemplate = macro.itemTemplate;
itemTemplate = args.template ? store.getTiddlerText(args.template[0]) || itemTemplate :
itemTemplate;
var tiddlers = args.filter ? store.sortTiddlers(store.filterTiddlers(args.filter[0]), field) :
store.reverseLookup("tags", "excludeLists", false, field);
var lastGroup = "", ul;
var last = params[1] ? tiddlers.length-Math.min(tiddlers.length,parseInt(params[1],10)) : 0;
var t;
for(t=tiddlers.length-1; t>=last; t--) {
var tiddler = tiddlers[t];
var theGroup = wikifyPlainText(groupTemplate,0,tiddler);
if(typeof(ul) == "undefined" || theGroup != lastGroup) {
ul = document.createElement("ul");
jQuery(ul).addClass("timeline");
container.appendChild(ul);
createTiddlyElement(ul,"li",null,"listTitle",theGroup);
lastGroup = theGroup;
}
var item = createTiddlyElement(ul,"li",null,"listLink");
wikify(itemTemplate,item,null,tiddler);
}
},
groupTemplate: "<<view %0 date '%1'>>",
itemTemplate: "<<view title link>>"
});
config.macros.tiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
var allowEval = true;
var stack = config.macros.tiddler.tiddlerStack;
if(stack.length > 0 && config.evaluateMacroParameters == "system") {
// included tiddler and "system" evaluation required, so check tiddler tagged appropriately
var title = stack[stack.length-1];
var pos = title.indexOf(config.textPrimitives.sectionSeparator);
if(pos != -1) {
title = title.substr(0,pos); // get the base tiddler title
}
var t = store.getTiddler(title);
if(!t || t.tags.indexOf("systemAllowEval") == -1) {
allowEval = false;
}
}
params = paramString.parseParams("name",null,allowEval,false,true);
var names = params[0]["name"];
var tiddlerName = names[0];
var className = names[1] || null;
var args = params[0]["with"];
var wrapper = createTiddlyElement(place,"span",null,className,null,{
refresh: "content", tiddler: tiddlerName
});
if(args!==undefined)
wrapper.setAttribute("args","[["+args.join("]] [[")+"]]");
this.transclude(wrapper,tiddlerName,args);
};
config.macros.tiddler.transclude = function(wrapper,tiddlerName,args)
{
var text = store.getTiddlerText(tiddlerName);
if(!text)
return;
var stack = config.macros.tiddler.tiddlerStack;
if(stack.indexOf(tiddlerName) !== -1)
return;
stack.push(tiddlerName);
try {
if(typeof args == "string")
args = args.readBracketedList();
var n = args ? Math.min(args.length,9) : 0;
var i;
for(i=0; i<n; i++) {
var placeholderRE = new RegExp("\\$" + (i + 1),"mg");
text = text.replace(placeholderRE,args[i]);
}
config.macros.tiddler.renderText(wrapper,text,tiddlerName);
} finally {
stack.pop();
}
};
config.macros.tiddler.renderText = function(place,text,tiddlerName)
{
wikify(text,place,null,store.getTiddler(tiddlerName));
};
config.macros.tiddler.tiddlerStack = [];
config.macros.tag.handler = function(place,macroName,params)
{
var btn = createTagButton(place,params[0],null,params[1],params[2]);
if(params[3]) {
btn.setAttribute('sortby',params[3]);
}
};
config.macros.tags.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
params = paramString.parseParams("anon",null,true,false,false);
var ul = createTiddlyElement(place,"ul");
var title = getParam(params,"anon","");
if(title && store.tiddlerExists(title))
tiddler = store.getTiddler(title);
var sep = getParam(params,"sep"," ");
var lingo = config.views.wikified.tag;
var label = null;
var t;
for(t=0; t<tiddler.tags.length; t++) {
var tag = store.getTiddler(tiddler.tags[t]);
if(!tag || !tag.tags.contains("excludeLists")) {
if(!label)
label = createTiddlyElement(ul,"li",null,"listTitle",lingo.labelTags.format([tiddler.title]));
createTagButton(createTiddlyElement(ul,"li"),tiddler.tags[t],tiddler.title);
if(t<tiddler.tags.length-1)
createTiddlyText(ul,sep);
}
}
if(!label)
createTiddlyElement(ul,"li",null,"listTitle",lingo.labelNoTags.format([tiddler.title]));
};
config.macros.tagging.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
params = paramString.parseParams("anon",null,true,false,false);
var ul = createTiddlyElement(place,"ul");
var title = getParam(params,"anon","");
if(title == "" && tiddler instanceof Tiddler)
title = tiddler.title;
var sep = getParam(params,"sep"," ");
ul.setAttribute("title",this.tooltip.format([title]));
var sortby = getParam(params,"sortBy",false);
var tagged = store.getTaggedTiddlers(title,sortby);
var prompt = tagged.length == 0 ? this.labelNotTag : this.label;
createTiddlyElement(ul,"li",null,"listTitle",prompt.format([title,tagged.length]));
var t;
for(t=0; t<tagged.length; t++) {
createTiddlyLink(createTiddlyElement(ul,"li"),tagged[t].title,true);
if(t<tagged.length-1)
createTiddlyText(ul,sep);
}
};
config.macros.closeAll.handler = function(place)
{
createTiddlyButton(place,this.label,this.prompt,this.onClick);
};
config.macros.closeAll.onClick = function(e)
{
story.closeAllTiddlers();
return false;
};
config.macros.permaview.handler = function(place)
{
createTiddlyButton(place,this.label,this.prompt,this.onClick);
};
config.macros.permaview.onClick = function(e)
{
story.permaView();
return false;
};
config.macros.saveChanges.handler = function(place,macroName,params)
{
if(!readOnly)
createTiddlyButton(place,params[0] || this.label,params[1] || this.prompt,this.onClick,null,null,this.accessKey);
};
config.macros.saveChanges.onClick = function(e)
{
saveChanges();
return false;
};
config.macros.slider.onClickSlider = function(ev)
{
var n = this.nextSibling;
var cookie = n.getAttribute("cookie");
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";
config.options[cookie] = !isOpen;
saveOption(cookie);
return false;
};
config.macros.slider.createSlider = function(place,cookie,title,tooltip)
{
var c = cookie || "";
createTiddlyButton(place,title,tooltip,this.onClickSlider);
var panel = createTiddlyElement(null,"div",null,"sliderPanel");
panel.setAttribute("cookie",c);
panel.style.display = config.options[c] ? "block" : "none";
place.appendChild(panel);
return panel;
};
config.macros.slider.handler = function(place,macroName,params)
{
var panel = this.createSlider(place,params[0],params[2],params[3]);
var text = store.getTiddlerText(params[1]);
panel.setAttribute("refresh","content");
panel.setAttribute("tiddler",params[1]);
if(text)
wikify(text,panel,null,store.getTiddler(params[1]));
};
// <<gradient [[tiddler name]] vert|horiz rgb rgb rgb rgb... >>
config.macros.gradient.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
var panel = wikifier ? createTiddlyElement(place,"div",null,"gradient") : place;
panel.style.position = "relative";
panel.style.overflow = "hidden";
panel.style.zIndex = "0";
if(wikifier) {
var styles = config.formatterHelpers.inlineCssHelper(wikifier);
config.formatterHelpers.applyCssHelper(panel,styles);
}
params = paramString.parseParams("color");
var locolors = [], hicolors = [];
var t;
for(t=2; t<params.length; t++) {
var c = params[t].value;
if(params[t].name == "snap") {
hicolors[hicolors.length-1] = c;
} else {
locolors.push(c);
hicolors.push(c);
}
}
drawGradient(panel,params[1].value != "vert",locolors,hicolors);
if(wikifier)
wikifier.subWikify(panel,">>");
if(document.all) {
panel.style.height = "100%";
panel.style.width = "100%";
}
};
config.macros.message.handler = function(place,macroName,params)
{
if(params[0]) {
var names = params[0].split(".");
var lookupMessage = function(root,nameIndex) {
if(root[names[nameIndex]]) {
if(nameIndex < names.length-1)
return (lookupMessage(root[names[nameIndex]],nameIndex+1));
else
return root[names[nameIndex]];
} else
return null;
};
var m = lookupMessage(config,0);
if(m == null)
m = lookupMessage(window,0);
createTiddlyText(place,m.toString().format(params.splice(1)));
}
};
config.macros.view.depth = 0;
config.macros.view.values = [];
config.macros.view.views = {
text: function(value,place,params,wikifier,paramString,tiddler) {
highlightify(value,place,highlightHack,tiddler);
},
link: function(value,place,params,wikifier,paramString,tiddler) {
createTiddlyLink(place,value,true);
},
wikified: function(value,place,params,wikifier,paramString,tiddler) {
if(config.macros.view.depth>50)
return;
if(config.macros.view.depth>0) {
if (value==config.macros.view.values[config.macros.view.depth-1]) {
return;
}
}
config.macros.view.values[config.macros.view.depth] = value;
config.macros.view.depth++;
if(params[2])
value=params[2].unescapeLineBreaks().format([value]);
wikify(value,place,highlightHack,tiddler);
config.macros.view.depth--;
config.macros.view.values[config.macros.view.depth] = null;
},
date: function(value,place,params,wikifier,paramString,tiddler) {
value = Date.convertFromYYYYMMDDHHMM(value);
createTiddlyText(place,value.formatString(params[2] || config.views.wikified.dateFormat));
}
};
config.macros.view.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
if((tiddler instanceof Tiddler) && params[0]) {
var value = store.getValue(tiddler,params[0]);
if(value) {
var type = params[1] || config.macros.view.defaultView;
var handler = config.macros.view.views[type];
if(handler)
handler(value,place,params,wikifier,paramString,tiddler);
}
}
};
config.macros.edit.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
var field = params[0];
var rows = params[1] || 0;
var defVal = params[2] || '';
if((tiddler instanceof Tiddler) && field) {
story.setDirty(tiddler.title,true);
var e,v;
if(field != "text" && !rows) {
e = createTiddlyElement(null,"input",null,null,null,{
type: "text", edit: field, size: "40", autocomplete: "off"
});
e.value = store.getValue(tiddler,field) || defVal;
place.appendChild(e);
} else {
var wrapper1 = createTiddlyElement(null,"fieldset",null,"fieldsetFix");
var wrapper2 = createTiddlyElement(wrapper1,"div");
e = createTiddlyElement(wrapper2,"textarea");
e.value = v = store.getValue(tiddler,field) || defVal;
rows = rows || 10;
var lines = v.match(/\n/mg);
var maxLines = Math.max(parseInt(config.options.txtMaxEditRows,10),5);
if(lines != null && lines.length > rows)
rows = lines.length + 5;
rows = Math.min(rows,maxLines);
e.setAttribute("rows",rows);
e.setAttribute("edit",field);
place.appendChild(wrapper1);
}
if(tiddler.isReadOnly()) {
e.setAttribute("readOnly","readOnly");
jQuery(e).addClass("readOnly");
}
return e;
}
};
config.macros.tagChooser.onClick = function(ev)
{
var e = ev || window.event;
var lingo = config.views.editor.tagChooser;
var popup = Popup.create(this);
var tags = store.getTags(this.getAttribute("tags"));
if(tags.length == 0)
jQuery("<li/>").text(lingo.popupNone).appendTo(popup);
var t;
for(t=0; t<tags.length; t++) {
var tag = createTiddlyButton(createTiddlyElement(popup,"li"),tags[t][0],lingo.tagTooltip.format([tags[t][0]]),config.macros.tagChooser.onTagClick);
tag.setAttribute("tag",tags[t][0]);
tag.setAttribute("tiddler",this.getAttribute("tiddler"));
}
Popup.show();
e.cancelBubble = true;
if(e.stopPropagation) e.stopPropagation();
return false;
};
config.macros.tagChooser.onTagClick = function(ev)
{
var e = ev || window.event;
if(e.metaKey || e.ctrlKey) stopEvent(e); //# keep popup open on CTRL-click
var tag = this.getAttribute("tag");
var title = this.getAttribute("tiddler");
if(!readOnly)
story.setTiddlerTag(title,tag,0);
return false;
};
config.macros.tagChooser.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
if(tiddler instanceof Tiddler) {
var lingo = config.views.editor.tagChooser;
var btn = createTiddlyButton(place,lingo.text,lingo.tooltip,this.onClick);
btn.setAttribute("tiddler",tiddler.title);
btn.setAttribute("tags",params[0]);
}
};
config.macros.refreshDisplay.handler = function(place)
{
createTiddlyButton(place,this.label,this.prompt,this.onClick);
};
config.macros.refreshDisplay.onClick = function(e)
{
refreshAll();
return false;
};
config.macros.annotations.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
var title = tiddler ? tiddler.title : null;
var a = title ? config.annotations[title] : null;
if(!tiddler || !title || !a)
return;
var text = a.format([title]);
wikify(text,createTiddlyElement(place,"div",null,"annotation"),null,tiddler);
};
//--
//-- NewTiddler and NewJournal macros
//--
config.macros.newTiddler.createNewTiddlerButton = function(place,title,params,label,prompt,accessKey,newFocus,isJournal)
{
var tags = [];
var t;
for(t=1; t<params.length; t++) {
if((params[t].name == "anon" && t != 1) || (params[t].name == "tag"))
tags.push(params[t].value);
}
label = getParam(params,"label",label);
prompt = getParam(params,"prompt",prompt);
accessKey = getParam(params,"accessKey",accessKey);
newFocus = getParam(params,"focus",newFocus);
var customFields = getParam(params,"fields","");
if(!customFields && !store.isShadowTiddler(title))
customFields = String.encodeHashMap(config.defaultCustomFields);
var btn = createTiddlyButton(place,label,prompt,this.onClickNewTiddler,null,null,accessKey);
btn.setAttribute("newTitle",title);
btn.setAttribute("isJournal",isJournal ? "true" : "false");
if(tags.length > 0)
btn.setAttribute("params",tags.join("|"));
btn.setAttribute("newFocus",newFocus);
btn.setAttribute("newTemplate",getParam(params,"template",DEFAULT_EDIT_TEMPLATE));
if(customFields !== "")
btn.setAttribute("customFields",customFields);
var text = getParam(params,"text");
if(text !== undefined)
btn.setAttribute("newText",text);
return btn;
};
config.macros.newTiddler.onClickNewTiddler = function()
{
var title = this.getAttribute("newTitle");
if(this.getAttribute("isJournal") == "true") {
title = new Date().formatString(title.trim());
}
var params = this.getAttribute("params");
var tags = params ? params.split("|") : [];
var focus = this.getAttribute("newFocus");
var template = this.getAttribute("newTemplate");
var customFields = this.getAttribute("customFields");
if(!customFields && !store.isShadowTiddler(title))
customFields = String.encodeHashMap(config.defaultCustomFields);
story.displayTiddler(null,title,template,false,null,null);
var tiddlerElem = story.getTiddler(title);
if(customFields)
story.addCustomFields(tiddlerElem,customFields);
var text = this.getAttribute("newText");
if(typeof text == "string" && story.getTiddlerField(title,"text"))
story.getTiddlerField(title,"text").value = text.format([title]);
var t;
for(t=0;t<tags.length;t++)
story.setTiddlerTag(title,tags[t],+1);
story.focusTiddler(title,focus);
return false;
};
config.macros.newTiddler.handler = function(place,macroName,params,wikifier,paramString)
{
if(!readOnly) {
params = paramString.parseParams("anon",null,true,false,false);
var title = params[1] && params[1].name == "anon" ? params[1].value : this.title;
title = getParam(params,"title",title);
this.createNewTiddlerButton(place,title,params,this.label,this.prompt,this.accessKey,"title",false);
}
};
config.macros.newJournal.handler = function(place,macroName,params,wikifier,paramString)
{
if(!readOnly) {
params = paramString.parseParams("anon",null,true,false,false);
var title = params[1] && params[1].name == "anon" ? params[1].value : config.macros.timeline.dateFormat;
title = getParam(params,"title",title);
config.macros.newTiddler.createNewTiddlerButton(place,title,params,this.label,this.prompt,this.accessKey,"text",true);
}
};
//--
//-- Search macro
//--
config.macros.search.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
params = paramString.parseParams("anon",null,false,false,false);
createTiddlyButton(place,this.label,this.prompt,this.onClick,"searchButton");
var txt = createTiddlyElement(null,"input",null,"txtOptionInput searchField");
txt.value = getParam(params,"anon","");
if(config.browser.isSafari) {
txt.setAttribute("type","search");
txt.setAttribute("results","5");
} else {
txt.setAttribute("type","text");
}
place.appendChild(txt);
txt.onkeyup = this.onKeyPress;
txt.onfocus = this.onFocus;
txt.setAttribute("size",this.sizeTextbox);
txt.setAttribute("accessKey",getParam(params,"accesskey",this.accessKey));
txt.setAttribute("autocomplete","off");
txt.setAttribute("lastSearchText","");
txt.setAttribute("placeholder",getParam(params,"placeholder",this.placeholder));
};
// Global because there's only ever one outstanding incremental search timer
config.macros.search.timeout = null;
config.macros.search.doSearch = function(txt)
{
if(txt.value.length > 0) {
story.search(txt.value,config.options.chkCaseSensitiveSearch,config.options.chkRegExpSearch);
txt.setAttribute("lastSearchText",txt.value);
}
};
config.macros.search.onClick = function(e)
{
config.macros.search.doSearch(this.nextSibling);
return false;
};
config.macros.search.onKeyPress = function(ev)
{
var me = config.macros.search;
var e = ev || window.event;
switch(e.keyCode) {
case 9: // Tab
return;
case 13: // Ctrl-Enter
case 10: // Ctrl-Enter on IE PC
me.doSearch(this);
break;
case 27: // Escape
this.value = "";
clearMessage();
break;
}
if(config.options.chkIncrementalSearch) {
if(this.value.length > 2) {
if(this.value != this.getAttribute("lastSearchText")) {
if(me.timeout) {
clearTimeout(me.timeout);
}
var txt = this;
me.timeout = setTimeout(function() {me.doSearch(txt);},500);
}
} else {
if(me.timeout) {
clearTimeout(me.timeout);
}
}
}
};
config.macros.search.onFocus = function(e)
{
this.select();
};
//--
//-- Tabs macro
//--
config.macros.tabs.handler = function(place,macroName,params)
{
var cookie = params[0];
var numTabs = (params.length-1)/3;
var wrapper = createTiddlyElement(null,"div",null,"tabsetWrapper " + cookie);
var tabset = createTiddlyElement(wrapper,"div",null,"tabset");
tabset.setAttribute("cookie",cookie);
var validTab = false;
var t;
for(t=0; t<numTabs; t++) {
var label = params[t*3+1];
var prompt = params[t*3+2];
var content = params[t*3+3];
var tab = createTiddlyButton(tabset,label,prompt,this.onClickTab,"tab tabUnselected");
createTiddlyElement(tab,"span",null,null," ",{style:"font-size:0pt;line-height:0px"});
tab.setAttribute("tab",label);
tab.setAttribute("content",content);
tab.title = prompt;
if(config.options[cookie] == label)
validTab = true;
}
if(!validTab)
config.options[cookie] = params[1];
place.appendChild(wrapper);
this.switchTab(tabset,config.options[cookie]);
};
config.macros.tabs.onClickTab = function(e)
{
config.macros.tabs.switchTab(this.parentNode,this.getAttribute("tab"));
return false;
};
config.macros.tabs.switchTab = function(tabset,tab)
{
var cookie = tabset.getAttribute("cookie");
var theTab = null;
var nodes = tabset.childNodes;
var t;
for(t=0; t<nodes.length; t++) {
if(nodes[t].getAttribute && nodes[t].getAttribute("tab") == tab) {
theTab = nodes[t];
theTab.className = "tab tabSelected";
} else {
nodes[t].className = "tab tabUnselected";
}
}
if(theTab) {
if(tabset.nextSibling && tabset.nextSibling.className == "tabContents")
jQuery(tabset.nextSibling).remove();
var tabContent = createTiddlyElement(null,"div",null,"tabContents");
tabset.parentNode.insertBefore(tabContent,tabset.nextSibling);
var contentTitle = theTab.getAttribute("content");
wikify(store.getTiddlerText(contentTitle),tabContent,null,store.getTiddler(contentTitle));
if(cookie) {
config.options[cookie] = tab;
saveOption(cookie);
}
}
};
//--
//-- Tiddler toolbar
//--
// Create a toolbar command button
config.macros.toolbar.createCommand = function(place,commandName,tiddler,className)
{
if(typeof commandName != "string") {
var c = null;
var t;
for(t in config.commands) {
if(config.commands[t] == commandName)
c = t;
}
commandName = c;
}
if((tiddler instanceof Tiddler) && (typeof commandName == "string")) {
var command = config.commands[commandName];
if(command.isEnabled ? command.isEnabled(tiddler) : this.isCommandEnabled(command,tiddler)) {
var text = command.getText ? command.getText(tiddler) : this.getCommandText(command,tiddler);
var tooltip = command.getTooltip ? command.getTooltip(tiddler) : this.getCommandTooltip(command,tiddler);
var cmd = command.type == "popup" ? this.onClickPopup : this.onClickCommand;
var btn = createTiddlyButton(null,text,tooltip,cmd);
btn.setAttribute("commandName",commandName);
btn.setAttribute("tiddler",tiddler.title);
jQuery(btn).addClass("command_" + commandName);
if(className)
jQuery(btn).addClass(className);
place.appendChild(btn);
}
}
};
config.macros.toolbar.isCommandEnabled = function(command,tiddler)
{
var title = tiddler.title;
var ro = tiddler.isReadOnly();
var shadow = store.isShadowTiddler(title) && !store.tiddlerExists(title);
return (!ro || (ro && !command.hideReadOnly)) && !(shadow && command.hideShadow);
};
config.macros.toolbar.getCommandText = function(command,tiddler)
{
return (tiddler.isReadOnly() && command.readOnlyText) || command.text;
};
config.macros.toolbar.getCommandTooltip = function(command,tiddler)
{
return (tiddler.isReadOnly() && command.readOnlyTooltip) || command.tooltip;
};
config.macros.toolbar.onClickCommand = function(ev)
{
var e = ev || window.event;
e.cancelBubble = true;
if(e.stopPropagation) e.stopPropagation();
var command = config.commands[this.getAttribute("commandName")];
return command.handler(e,this,this.getAttribute("tiddler"));
};
config.macros.toolbar.onClickPopup = function(ev)
{
var e = ev || window.event;
e.cancelBubble = true;
if(e.stopPropagation) e.stopPropagation();
var popup = Popup.create(this);
var command = config.commands[this.getAttribute("commandName")];
var title = this.getAttribute("tiddler");
popup.setAttribute("tiddler",title);
command.handlePopup(popup,title);
Popup.show();
return false;
};
// Invoke the first command encountered from a given place that is tagged with a specified class
config.macros.toolbar.invokeCommand = function(place,className,event)
{
var children = place.getElementsByTagName("a");
var t;
for(t=0; t<children.length; t++) {
var c = children[t];
if(jQuery(c).hasClass(className) && c.getAttribute && c.getAttribute("commandName")) {
if(c.onclick instanceof Function)
c.onclick.call(c,event);
break;
}
}
};
config.macros.toolbar.onClickMore = function(ev)
{
var e = this.nextSibling;
e.style.display = "inline";
this.style.display = "none";
return false;
};
config.macros.toolbar.onClickLess = function(ev)
{
var e = this.parentNode;
var m = e.previousSibling;
e.style.display = "none";
m.style.display = "inline";
return false;
};
config.macros.toolbar.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
var t;
for(t=0; t<params.length; t++) {
var btn;
var c = params[t];
switch(c) {
case "!":
createTiddlyText(place,this.separator);
break;
case "*":
createTiddlyElement(place,"br");
break;
case "<":
btn = createTiddlyButton(place,this.lessLabel,this.lessPrompt,config.macros.toolbar.onClickLess);
jQuery(btn).addClass("lessCommand");
break;
case ">":
btn = createTiddlyButton(place,this.moreLabel,this.morePrompt,config.macros.toolbar.onClickMore);
jQuery(btn).addClass("moreCommand");
var e = createTiddlyElement(place,"span",null,"moreCommand");
e.style.display = "none";
place = e;
break;
default:
var className = "";
switch(c.substr(0,1)) {
case "+":
className = "defaultCommand";
c = c.substr(1);
break;
case "-":
className = "cancelCommand";
c = c.substr(1);
break;
}
if(config.commands[c]) {
this.createCommand(place,c,tiddler,className);
} else {
this.customCommand(place,c,wikifier,tiddler);
}
break;
}
}
};
// Overrideable function to extend toolbar handler
config.macros.toolbar.customCommand = function(place,command,wikifier,tiddler)
{
};
//--
//-- Menu and toolbar commands
//--
config.commands.closeTiddler.handler = function(event,src,title)
{
if(story.isDirty(title) && !readOnly) {
if(!confirm(config.commands.cancelTiddler.warning.format([title])))
return false;
}
story.setDirty(title,false);
story.closeTiddler(title,true);
return false;
};
config.commands.closeOthers.handler = function(event,src,title)
{
story.closeAllTiddlers(title);
return false;
};
config.commands.editTiddler.handler = function(event,src,title)
{
clearMessage();
var tiddlerElem = story.getTiddler(title);
var fields = tiddlerElem.getAttribute("tiddlyFields");
story.displayTiddler(null,title,DEFAULT_EDIT_TEMPLATE,false,null,fields);
var e = story.getTiddlerField(title,config.options.txtEditorFocus||"text");
if(e) {
setCaretPosition(e,0);
}
return false;
};
config.commands.saveTiddler.handler = function(event,src,title)
{
var newTitle = story.saveTiddler(title,event.shiftKey);
if(newTitle)
story.displayTiddler(null,newTitle);
return false;
};
config.commands.cancelTiddler.handler = function(event,src,title)
{
if(story.hasChanges(title) && !readOnly) {
if(!confirm(this.warning.format([title])))
return false;
}
story.setDirty(title,false);
story.displayTiddler(null,title);
return false;
};
config.commands.deleteTiddler.handler = function(event,src,title)
{
var deleteIt = true;
if(config.options.chkConfirmDelete)
deleteIt = confirm(this.warning.format([title]));
if(deleteIt) {
store.removeTiddler(title);
story.closeTiddler(title,true);
autoSaveChanges();
}
return false;
};
config.commands.permalink.handler = function(event,src,title)
{
var t = encodeURIComponent(String.encodeTiddlyLink(title));
if(window.location.hash != t)
window.location.hash = t;
return false;
};
config.commands.references.handlePopup = function(popup,title)
{
var references = store.getReferringTiddlers(title);
var c = false;
var r;
for(r=0; r<references.length; r++) {
if(references[r].title != title && !references[r].isTagged("excludeLists")) {
createTiddlyLink(createTiddlyElement(popup,"li"),references[r].title,true);
c = true;
}
}
if(!c)
createTiddlyElement(popup,"li",null,"disabled",this.popupNone);
};
config.commands.jump.handlePopup = function(popup,title)
{
story.forEachTiddler(function(title,element) {
createTiddlyLink(createTiddlyElement(popup,"li"),title,true,null,false,null,true);
});
};
config.commands.fields.handlePopup = function(popup,title)
{
var tiddler = store.fetchTiddler(title);
if(!tiddler)
return;
var items = [];
store.forEachField(tiddler,function(tiddler,fieldName,value){items.push({field:fieldName,value:value});},true);
items.sort(function(a,b) {return a.field < b.field ? -1 : (a.field == b.field ? 0 : +1);});
if(items.length > 0)
ListView.create(popup,items,this.listViewTemplate);
else
createTiddlyElement(popup,"div",null,null,this.emptyText);
};
//--
//-- Tiddler() object
//--
function Tiddler(title)
{
this.title = title;
this.text = "";
this.creator = null;
this.modifier = null;
this.created = new Date();
this.modified = this.created;
this.links = [];
this.linksUpdated = false;
this.tags = [];
this.fields = {};
return this;
}
Tiddler.prototype.getLinks = function()
{
if(this.linksUpdated==false)
this.changed();
return this.links;
};
// Returns the fields that are inherited in string field:"value" field2:"value2" format
Tiddler.prototype.getInheritedFields = function()
{
var f = {};
var i;
for(i in this.fields) {
if(i=="server.host" || i=="server.workspace" || i=="wikiformat"|| i=="server.type") {
f[i] = this.fields[i];
}
}
return String.encodeHashMap(f);
};
// Increment the changeCount of a tiddler
Tiddler.prototype.incChangeCount = function()
{
var c = this.fields['changecount'];
c = c ? parseInt(c,10) : 0;
this.fields['changecount'] = String(c+1);
};
// Clear the changeCount of a tiddler
Tiddler.prototype.clearChangeCount = function()
{
if(this.fields['changecount']) {
delete this.fields['changecount'];
}
};
Tiddler.prototype.doNotSave = function()
{
return this.fields['doNotSave'];
};
// Returns true if the tiddler has been updated since the tiddler was created or downloaded
Tiddler.prototype.isTouched = function()
{
var changecount = this.fields.changecount || 0;
return changecount > 0;
};
// Change the text and other attributes of a tiddler
Tiddler.prototype.set = function(title,text,modifier,modified,tags,created,fields,creator)
{
this.assign(title,text,modifier,modified,tags,created,fields,creator);
this.changed();
return this;
};
// Change the text and other attributes of a tiddler without triggered a tiddler.changed() call
Tiddler.prototype.assign = function(title,text,modifier,modified,tags,created,fields,creator)
{
if(title != undefined)
this.title = title;
if(text != undefined)
this.text = text;
if(modifier != undefined)
this.modifier = modifier;
if(modified != undefined)
this.modified = modified;
if(creator != undefined)
this.creator = creator;
if(created != undefined)
this.created = created;
if(fields != undefined)
this.fields = fields;
if(tags != undefined)
this.tags = (typeof tags == "string") ? tags.readBracketedList() : tags;
else if(this.tags == undefined)
this.tags = [];
return this;
};
// Get the tags for a tiddler as a string (space delimited, using [[brackets]] for tags containing spaces)
Tiddler.prototype.getTags = function()
{
return String.encodeTiddlyLinkList(this.tags);
};
// Test if a tiddler carries a tag
Tiddler.prototype.isTagged = function(tag)
{
return this.tags.indexOf(tag) != -1;
};
// Static method to convert "\n" to newlines, "\s" to "\"
Tiddler.unescapeLineBreaks = function(text)
{
return text ? text.unescapeLineBreaks() : "";
};
// Convert newlines to "\n", "\" to "\s"
Tiddler.prototype.escapeLineBreaks = function()
{
return this.text.escapeLineBreaks();
};
// Updates the secondary information (like links[] array) after a change to a tiddler
Tiddler.prototype.changed = function()
{
this.links = [];
var text = this.text;
// remove 'quoted' text before scanning tiddler source
text = text.replace(/\/%((?:.|\n)*?)%\//g,"").
replace(/\{{3}((?:.|\n)*?)\}{3}/g,"").
replace(/"""((?:.|\n)*?)"""/g,"").
replace(/<nowiki\>((?:.|\n)*?)<\/nowiki\>/g,"").
replace(/<html\>((?:.|\n)*?)<\/html\>/g,"").
replace(/<script((?:.|\n)*?)<\/script\>/g,"");
var t = this.autoLinkWikiWords() ? 0 : 1;
var tiddlerLinkRegExp = t==0 ? config.textPrimitives.tiddlerAnyLinkRegExp : config.textPrimitives.tiddlerForcedLinkRegExp;
tiddlerLinkRegExp.lastIndex = 0;
var formatMatch = tiddlerLinkRegExp.exec(text);
while(formatMatch) {
var lastIndex = tiddlerLinkRegExp.lastIndex;
if(t==0 && formatMatch[1] && formatMatch[1] != this.title) {
// wikiWordLink
if(formatMatch.index > 0) {
var preRegExp = new RegExp(config.textPrimitives.unWikiLink+"|"+config.textPrimitives.anyLetter,"mg");
preRegExp.lastIndex = formatMatch.index-1;
var preMatch = preRegExp.exec(text);
if(preMatch.index != formatMatch.index-1)
this.links.pushUnique(formatMatch[1]);
} else {
this.links.pushUnique(formatMatch[1]);
}
}
else if(formatMatch[2-t] && !config.formatterHelpers.isExternalLink(formatMatch[3-t])) // titledBrackettedLink
this.links.pushUnique(formatMatch[3-t]);
else if(formatMatch[4-t] && formatMatch[4-t] != this.title) // brackettedLink
this.links.pushUnique(formatMatch[4-t]);
tiddlerLinkRegExp.lastIndex = lastIndex;
formatMatch = tiddlerLinkRegExp.exec(text);
}
this.linksUpdated = true;
};
Tiddler.prototype.getSubtitle = function()
{
var modifier = this.modifier;
if(!modifier)
modifier = config.messages.subtitleUnknown || "";
var modified = this.modified;
if(modified)
modified = modified.toLocaleString();
else
modified = config.messages.subtitleUnknown || "";
var f = config.messages.tiddlerLinkTooltip || "%0 - %1, %2";
return f.format([this.title,modifier,modified]);
};
Tiddler.prototype.isReadOnly = function()
{
return readOnly;
};
Tiddler.prototype.autoLinkWikiWords = function()
{
return !(this.isTagged("systemConfig") || this.isTagged("excludeMissing"));
};
Tiddler.prototype.getServerType = function()
{
var serverType = null;
if(this.fields['server.type'])
serverType = this.fields['server.type'];
if(!serverType)
serverType = this.fields['wikiformat'];
if(serverType && !config.adaptors[serverType])
serverType = null;
return serverType;
};
Tiddler.prototype.getAdaptor = function()
{
var serverType = this.getServerType();
return serverType ? new config.adaptors[serverType]() : null;
};
//--
//-- TiddlyWiki instance contains TiddlerS
//--
function TiddlyWiki(params)
{
var tiddlers = {}; // Hashmap by name of tiddlers
if(params && params.config) {
this.config = config;
}
this.tiddlersUpdated = false;
this.namedNotifications = []; // Array of {name:,notify:} of notification functions
this.notificationLevel = 0;
this.slices = {}; // map tiddlerName->(map sliceName->sliceValue). Lazy.
this.clear = function() {
tiddlers = {};
this.setDirty(false);
};
this.fetchTiddler = function(title) {
var t = tiddlers[title];
return t instanceof Tiddler ? t : null;
};
this.deleteTiddler = function(title) {
delete this.slices[title];
delete tiddlers[title];
};
this.addTiddler = function(tiddler) {
delete this.slices[tiddler.title];
tiddlers[tiddler.title] = tiddler;
};
this.forEachTiddler = function(callback) {
var t;
for(t in tiddlers) {
var tiddler = tiddlers[t];
if(tiddler instanceof Tiddler)
callback.call(this,t,tiddler);
}
};
}
TiddlyWiki.prototype.setDirty = function(dirty)
{
this.dirty = dirty;
};
TiddlyWiki.prototype.isDirty = function()
{
return this.dirty;
};
TiddlyWiki.prototype.tiddlerExists = function(title)
{
var t = this.fetchTiddler(title);
return t != undefined;
};
TiddlyWiki.prototype.isShadowTiddler = function(title)
{
return config.shadowTiddlers[title] === undefined ? false : true;
};
TiddlyWiki.prototype.createTiddler = function(title)
{
var tiddler = this.fetchTiddler(title);
if(!tiddler) {
tiddler = new Tiddler(title);
this.addTiddler(tiddler);
this.setDirty(true);
}
return tiddler;
};
TiddlyWiki.prototype.getTiddler = function(title)
{
var t = this.fetchTiddler(title);
if(t != undefined)
return t;
else
return null;
};
TiddlyWiki.prototype.getShadowTiddlerText = function(title)
{
if(typeof config.shadowTiddlers[title] == "string")
return config.shadowTiddlers[title];
else
return "";
};
// Retrieve tiddler contents
TiddlyWiki.prototype.getTiddlerText = function(title,defaultText)
{
if(!title)
return defaultText;
var pos = title.indexOf(config.textPrimitives.sectionSeparator);
var section = null;
if(pos != -1) {
section = title.substr(pos + config.textPrimitives.sectionSeparator.length);
title = title.substr(0,pos);
}
pos = title.indexOf(config.textPrimitives.sliceSeparator);
if(pos != -1) {
var slice = this.getTiddlerSlice(title.substr(0,pos),title.substr(pos + config.textPrimitives.sliceSeparator.length));
if(slice)
return slice;
}
var tiddler = this.fetchTiddler(title);
var text = tiddler ? tiddler.text : null;
if(!tiddler && this.isShadowTiddler(title)) {
text = this.getShadowTiddlerText(title);
}
if(text) {
if(!section)
return text;
var re = new RegExp("(^!{1,6}[ \t]*" + section.escapeRegExp() + "[ \t]*\n)","mg");
re.lastIndex = 0;
var match = re.exec(text);
if(match) {
var t = text.substr(match.index+match[1].length);
var re2 = /^!/mg;
re2.lastIndex = 0;
match = re2.exec(t); //# search for the next heading
if(match)
t = t.substr(0,match.index-1);//# don't include final \n
return t;
}
return defaultText;
}
if(defaultText != undefined)
return defaultText;
return null;
};
TiddlyWiki.prototype.getRecursiveTiddlerText = function(title,defaultText,depth)
{
var bracketRegExp = new RegExp("(?:\\[\\[([^\\]]+)\\]\\])","mg");
var text = this.getTiddlerText(title,null);
if(text == null)
return defaultText;
var textOut = [];
var match,lastPos = 0;
do {
match = bracketRegExp.exec(text);
if(match) {
textOut.push(text.substr(lastPos,match.index-lastPos));
if(match[1]) {
if(depth <= 0)
textOut.push(match[1]);
else
textOut.push(this.getRecursiveTiddlerText(match[1],"",depth-1));
}
lastPos = match.index + match[0].length;
} else {
textOut.push(text.substr(lastPos));
}
} while(match);
return textOut.join("");
};
//TiddlyWiki.prototype.slicesRE = /(?:^([\'\/]{0,2})~?([\.\w]+)\:\1[\t\x20]*([^\n]+)[\t\x20]*$)|(?:^\|([\'\/]{0,2})~?([\.\w]+)\:?\4\|[\t\x20]*([^\n]+)[\t\x20]*\|$)/gm;
TiddlyWiki.prototype.slicesRE = /(?:^([\'\/]{0,2})~?([\.\w]+)\:\1[\t\x20]*([^\n]*)[\t\x20]*$)|(?:^\|([\'\/]{0,2})~?([\.\w]+)\:?\4\|[\t\x20]*([^\|\n]*)[\t\x20]*\|$)/gm;
// @internal
TiddlyWiki.prototype.calcAllSlices = function(title)
{
var slices = {};
var text = this.getTiddlerText(title,"");
this.slicesRE.lastIndex = 0;
var m = this.slicesRE.exec(text);
while(m) {
if(m[2])
slices[m[2]] = m[3];
else
slices[m[5]] = m[6];
m = this.slicesRE.exec(text);
}
return slices;
};
// Returns the slice of text of the given name
TiddlyWiki.prototype.getTiddlerSlice = function(title,sliceName)
{
var slices = this.slices[title];
if(!slices) {
slices = this.calcAllSlices(title);
this.slices[title] = slices;
}
return slices[sliceName];
};
// Build an hashmap of the specified named slices of a tiddler
TiddlyWiki.prototype.getTiddlerSlices = function(title,sliceNames)
{
var t,r = {};
for(t=0; t<sliceNames.length; t++) {
var slice = this.getTiddlerSlice(title,sliceNames[t]);
if(slice)
r[sliceNames[t]] = slice;
}
return r;
};
TiddlyWiki.prototype.suspendNotifications = function()
{
this.notificationLevel--;
};
TiddlyWiki.prototype.resumeNotifications = function()
{
this.notificationLevel++;
};
// Invoke the notification handlers for a particular tiddler
TiddlyWiki.prototype.notify = function(title,doBlanket)
{
if(!this.notificationLevel) {
var t;
for(t=0; t<this.namedNotifications.length; t++) {
var n = this.namedNotifications[t];
if((n.name == null && doBlanket) || (n.name == title))
n.notify(title);
}
}
};
// Invoke the notification handlers for all tiddlers
TiddlyWiki.prototype.notifyAll = function()
{
if(!this.notificationLevel) {
var t;
for(t=0; t<this.namedNotifications.length; t++) {
var n = this.namedNotifications[t];
if(n.name)
n.notify(n.name);
}
}
};
// Add a notification handler to a tiddler
TiddlyWiki.prototype.addNotification = function(title,fn)
{
var i;
for(i=0; i<this.namedNotifications.length; i++) {
if((this.namedNotifications[i].name == title) && (this.namedNotifications[i].notify == fn))
return this;
}
this.namedNotifications.push({name: title, notify: fn});
return this;
};
TiddlyWiki.prototype.removeTiddler = function(title)
{
var tiddler = this.fetchTiddler(title);
if(tiddler) {
this.deleteTiddler(title);
this.notify(title,true);
this.setDirty(true);
}
};
// Reset the sync status of a freshly synced tiddler
TiddlyWiki.prototype.resetTiddler = function(title)
{
var tiddler = this.fetchTiddler(title);
if(tiddler) {
tiddler.clearChangeCount();
this.notify(title,true);
this.setDirty(true);
}
};
TiddlyWiki.prototype.setTiddlerTag = function(title,status,tag)
{
var tiddler = this.fetchTiddler(title);
if(tiddler) {
var t = tiddler.tags.indexOf(tag);
if(t != -1)
tiddler.tags.splice(t,1);
if(status)
tiddler.tags.push(tag);
tiddler.changed();
tiddler.incChangeCount();
this.notify(title,true);
this.setDirty(true);
}
};
TiddlyWiki.prototype.addTiddlerFields = function(title,fields)
{
var tiddler = this.fetchTiddler(title);
if(!tiddler)
return;
merge(tiddler.fields,fields);
tiddler.changed();
tiddler.incChangeCount();
this.notify(title,true);
this.setDirty(true);
};
// Store tiddler in TiddlyWiki instance
TiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created,creator)
{
var tiddler;
if(title instanceof Tiddler) {
tiddler = title;
title = tiddler.title;
newTitle = title;
} else {
tiddler = this.fetchTiddler(title);
if(tiddler) {
created = created || tiddler.created; // Preserve created date
creator = creator || tiddler.creator;
this.deleteTiddler(title);
} else {
created = created || modified;
tiddler = new Tiddler();
}
fields = merge(merge({},fields),config.defaultCustomFields,true);
tiddler.set(newTitle,newBody,modifier,modified,tags,created,fields,creator);
}
this.addTiddler(tiddler);
if(clearChangeCount)
tiddler.clearChangeCount();
else
tiddler.incChangeCount();
if(title != newTitle)
this.notify(title,true);
this.notify(newTitle,true);
this.setDirty(true);
return tiddler;
};
TiddlyWiki.prototype.incChangeCount = function(title)
{
var tiddler = this.fetchTiddler(title);
if(tiddler)
tiddler.incChangeCount();
};
TiddlyWiki.prototype.getLoader = function()
{
if(!this.loader)
this.loader = new TW21Loader();
return this.loader;
};
TiddlyWiki.prototype.getSaver = function()
{
if(!this.saver)
this.saver = new TW21Saver();
return this.saver;
};
// Return all tiddlers formatted as an HTML string
TiddlyWiki.prototype.allTiddlersAsHtml = function()
{
return this.getSaver().externalize(store);
};
// Load contents of a TiddlyWiki from an HTML DIV
TiddlyWiki.prototype.loadFromDiv = function(src,idPrefix,noUpdate)
{
this.idPrefix = idPrefix;
var storeElem = (typeof src == "string") ? document.getElementById(src) : src;
if(!storeElem)
return;
var tiddlers = this.getLoader().loadTiddlers(this,storeElem.childNodes);
this.setDirty(false);
if(!noUpdate) {
var i;
for(i = 0;i<tiddlers.length; i++)
tiddlers[i].changed();
}
jQuery(document).trigger("loadTiddlers");
};
// Load contents of a TiddlyWiki from a string
// Returns null if there's an error
TiddlyWiki.prototype.importTiddlyWiki = function(text)
{
var posDiv = locateStoreArea(text);
if(!posDiv)
return null;
var content = "<" + "html><" + "body>" + text.substring(posDiv[0],posDiv[1] + endSaveArea.length) + "<" + "/body><" + "/html>";
// Create the iframe
var iframe = document.createElement("iframe");
iframe.style.display = "none";
document.body.appendChild(iframe);
var doc = iframe.document;
if(iframe.contentDocument)
doc = iframe.contentDocument; // For NS6
else if(iframe.contentWindow)
doc = iframe.contentWindow.document; // For IE5.5 and IE6
// Put the content in the iframe
doc.open();
doc.writeln(content);
doc.close();
// Load the content into a TiddlyWiki() object
var storeArea = doc.getElementById("storeArea");
this.loadFromDiv(storeArea,"store");
// Get rid of the iframe
iframe.parentNode.removeChild(iframe);
return this;
};
TiddlyWiki.prototype.updateTiddlers = function()
{
this.tiddlersUpdated = true;
this.forEachTiddler(function(title,tiddler) {
tiddler.changed();
});
};
// Return an array of tiddlers matching a search regular expression
TiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag,match)
{
var candidates = this.reverseLookup("tags",excludeTag,!!match);
var t,results = [];
for(t=0; t<candidates.length; t++) {
if((candidates[t].title.search(searchRegExp) != -1) || (candidates[t].text.search(searchRegExp) != -1))
results.push(candidates[t]);
}
if(!sortField)
sortField = "title";
results.sort(function(a,b) {return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);});
return results;
};
// Returns a list of all tags in use
// excludeTag - if present, excludes tags that are themselves tagged with excludeTag
// Returns an array of arrays where [tag][0] is the name of the tag and [tag][1] is the number of occurances
TiddlyWiki.prototype.getTags = function(excludeTag)
{
var results = [];
this.forEachTiddler(function(title,tiddler) {
var g,c;
for(g=0; g<tiddler.tags.length; g++) {
var tag = tiddler.tags[g];
var n = true;
for(c=0; c<results.length; c++) {
if(results[c][0] == tag) {
n = false;
results[c][1]++;
}
}
if(n && excludeTag) {
var t = this.fetchTiddler(tag);
if(t && t.isTagged(excludeTag))
n = false;
}
if(n)
results.push([tag,1]);
}
});
results.sort(function(a,b) {return a[0].toLowerCase() < b[0].toLowerCase() ? -1 : (a[0].toLowerCase() == b[0].toLowerCase() ? 0 : +1);});
return results;
};
// Return an array of the tiddlers that are tagged with a given tag
TiddlyWiki.prototype.getTaggedTiddlers = function(tag,sortField)
{
return this.reverseLookup("tags",tag,true,sortField);
};
TiddlyWiki.prototype.getValueTiddlers = function(field,value,sortField)
{
return this.reverseLookup(field,value,true,sortField);
};
// Return an array of the tiddlers that link to a given tiddler
TiddlyWiki.prototype.getReferringTiddlers = function(title,unusedParameter,sortField)
{
if(!this.tiddlersUpdated)
this.updateTiddlers();
return this.reverseLookup("links",title,true,sortField);
};
// Return an array of the tiddlers that do or do not have a specified entry in the specified storage array (ie, "links" or "tags")
// lookupMatch == true to match tiddlers, false to exclude tiddlers
TiddlyWiki.prototype.reverseLookup = function(lookupField,lookupValue,lookupMatch,sortField)
{
var results = [];
this.forEachTiddler(function(title,tiddler) {
var f = !lookupMatch;
var values;
if(["links", "tags"].contains(lookupField)) {
values = tiddler[lookupField];
} else {
var accessor = TiddlyWiki.standardFieldAccess[lookupField];
if(accessor) {
values = [ accessor.get(tiddler) ];
} else {
values = tiddler.fields[lookupField] ? [tiddler.fields[lookupField]] : [];
}
}
var lookup;
for(lookup=0; lookup<values.length; lookup++) {
if(values[lookup] == lookupValue)
f = lookupMatch;
}
if(f)
results.push(tiddler);
});
if(!sortField)
sortField = "title";
return this.sortTiddlers(results,sortField);
};
// Return the tiddlers as a sorted array
TiddlyWiki.prototype.getTiddlers = function(field,excludeTag)
{
var results = [];
this.forEachTiddler(function(title,tiddler) {
if(excludeTag == undefined || !tiddler.isTagged(excludeTag))
results.push(tiddler);
});
if(field)
results.sort(function(a,b) {return a[field] < b[field] ? -1 : (a[field] == b[field] ? 0 : +1);});
return results;
};
// Return array of names of tiddlers that are referred to but not defined
TiddlyWiki.prototype.getMissingLinks = function()
{
if(!this.tiddlersUpdated)
this.updateTiddlers();
var results = [];
this.forEachTiddler(function (title,tiddler) {
if(tiddler.isTagged("excludeMissing") || tiddler.isTagged("systemConfig"))
return;
var n;
for(n=0; n<tiddler.links.length;n++) {
var link = tiddler.links[n];
if(this.getTiddlerText(link,null) == null && !this.isShadowTiddler(link) && !config.macros[link])
results.pushUnique(link);
}
});
results.sort();
return results;
};
// Return an array of names of tiddlers that are defined but not referred to
TiddlyWiki.prototype.getOrphans = function()
{
var results = [];
this.forEachTiddler(function (title,tiddler) {
if(this.getReferringTiddlers(title).length == 0 && !tiddler.isTagged("excludeLists"))
results.push(title);
});
results.sort();
return results;
};
// Return an array of names of all the shadow tiddlers
TiddlyWiki.prototype.getShadowed = function()
{
var t,results = [];
for(t in config.shadowTiddlers) {
if(this.isShadowTiddler(t))
results.push(t);
}
results.sort();
return results;
};
// Return an array of tiddlers that have been touched since they were downloaded or created
TiddlyWiki.prototype.getTouched = function()
{
var results = [];
this.forEachTiddler(function(title,tiddler) {
if(tiddler.isTouched())
results.push(tiddler);
});
results.sort();
return results;
};
// Resolves a Tiddler reference or tiddler title into a Tiddler object, or null if it doesn't exist
TiddlyWiki.prototype.resolveTiddler = function(tiddler)
{
var t = (typeof tiddler == "string") ? this.getTiddler(tiddler) : tiddler;
return t instanceof Tiddler ? t : null;
};
// Sort a list of tiddlers
TiddlyWiki.prototype.sortTiddlers = function(tiddlers,field)
{
var asc = +1;
switch(field.substr(0,1)) {
case "-":
asc = -1;
field = field.substr(1);
break;
case "+":
field = field.substr(1);
break;
}
if(TiddlyWiki.standardFieldAccess[field]) {
if(field=="title") {
tiddlers.sort(function(a,b) {return a[field].toLowerCase() < b[field].toLowerCase() ? -asc : (a[field].toLowerCase() == b[field].toLowerCase() ? 0 : asc);});
} else {
tiddlers.sort(function(a,b) {return a[field] < b[field] ? -asc : (a[field] == b[field] ? 0 : asc);});
}
} else {
tiddlers.sort(function(a,b) {return a.fields[field] < b.fields[field] ? -asc : (a.fields[field] == b.fields[field] ? 0 : +asc);});
}
return tiddlers;
};
//--
//-- Filter a list of tiddlers
//--
config.filters = {
tiddler: function(results,match) {
var title = match[1]||match[4];
var tiddler = this.fetchTiddler(title);
if(tiddler) {
results.pushUnique(tiddler);
} else if(this.isShadowTiddler(title)) {
tiddler = new Tiddler();
tiddler.set(title,this.getTiddlerText(title));
results.pushUnique(tiddler);
} else {
results.pushUnique(new Tiddler(title));
}
return results;
},
tag: function(results,match) {
var m,matched = this.getTaggedTiddlers(match[3]);
for(m=0; m<matched.length; m++) {
results.pushUnique(matched[m]);
}
return results;
},
sort: function(results,match) {
return this.sortTiddlers(results,match[3]);
},
limit: function(results,match) {
return results.slice(0,parseInt(match[3],10));
},
field: function(results,match) {
var m,matched = this.getValueTiddlers(match[2],match[3]);
for (m = 0; m < matched.length; m++) {
results.pushUnique(matched[m]);
}
return results;
}
};
// Filter a list of tiddlers
TiddlyWiki.prototype.filterTiddlers = function(filter)
{
var re = /([^\s\[\]]+)|(?:\[([ \w\.\-]+)\[([^\]]+)\]\])|(?:\[\[([^\]]+)\]\])/mg;
var results = [];
if(filter) {
var match = re.exec(filter);
while(match) {
var handler = (match[1]||match[4])?'tiddler':config.filters[match[2]]?match[2]:'field';
results = config.filters[handler].call(this,results,match);
match = re.exec(filter);
}
}
return results;
};
// Returns true if path is a valid field name (path),
// i.e. a sequence of identifiers, separated by "."
TiddlyWiki.isValidFieldName = function(name)
{
var match = /[a-zA-Z_]\w*(\.[a-zA-Z_]\w*)*/.exec(name);
return match && (match[0] == name);
};
// Throws an exception when name is not a valid field name.
TiddlyWiki.checkFieldName = function(name)
{
if(!TiddlyWiki.isValidFieldName(name))
throw config.messages.invalidFieldName.format([name]);
};
function StringFieldAccess(n,readOnly)
{
this.set = readOnly ?
function(t,v) {if(v != t[n]) throw config.messages.fieldCannotBeChanged.format([n]);} :
function(t,v) {if(v != t[n]) {t[n] = v; return true;}};
this.get = function(t) {return t[n];};
}
function DateFieldAccess(n)
{
this.set = function(t,v) {
var d = v instanceof Date ? v : Date.convertFromYYYYMMDDHHMM(v);
if(d != t[n]) {
t[n] = d; return true;
}
};
this.get = function(t) {return t[n].convertToYYYYMMDDHHMM();};
}
function LinksFieldAccess(n)
{
this.set = function(t,v) {
var s = (typeof v == "string") ? v.readBracketedList() : v;
if(s.toString() != t[n].toString()) {
t[n] = s; return true;
}
};
this.get = function(t) {return String.encodeTiddlyLinkList(t[n]);};
}
TiddlyWiki.standardFieldAccess = {
// The set functions return true when setting the data has changed the value.
"title": new StringFieldAccess("title",true),
// Handle the "tiddler" field name as the title
"tiddler": new StringFieldAccess("title",true),
"text": new StringFieldAccess("text"),
"modifier": new StringFieldAccess("modifier"),
"modified": new DateFieldAccess("modified"),
"creator": new StringFieldAccess("creator"),
"created": new DateFieldAccess("created"),
"tags": new LinksFieldAccess("tags")
};
TiddlyWiki.isStandardField = function(name)
{
return TiddlyWiki.standardFieldAccess[name] != undefined;
};
// Sets the value of the given field of the tiddler to the value.
// Setting an ExtendedField's value to null or undefined removes the field.
// Setting a namespace to undefined removes all fields of that namespace.
// The fieldName is case-insensitive.
// All values will be converted to a string value.
TiddlyWiki.prototype.setValue = function(tiddler,fieldName,value)
{
TiddlyWiki.checkFieldName(fieldName);
var t = this.resolveTiddler(tiddler);
if(!t)
return;
fieldName = fieldName.toLowerCase();
var isRemove = (value === undefined) || (value === null);
var accessor = TiddlyWiki.standardFieldAccess[fieldName];
if(accessor) {
if(isRemove)
// don't remove StandardFields
return;
var h = TiddlyWiki.standardFieldAccess[fieldName];
if(!h.set(t,value))
return;
} else {
var oldValue = t.fields[fieldName];
if(isRemove) {
if(oldValue !== undefined) {
// deletes a single field
delete t.fields[fieldName];
} else {
// no concrete value is defined for the fieldName
// so we guess this is a namespace path.
// delete all fields in a namespace
var re = new RegExp("^"+fieldName+"\\.");
var dirty = false;
var n;
for(n in t.fields) {
if(n.match(re)) {
delete t.fields[n];
dirty = true;
}
}
if(!dirty)
return;
}
} else {
// the "normal" set case. value is defined (not null/undefined)
// For convenience provide a nicer conversion Date->String
value = value instanceof Date ? value.convertToYYYYMMDDHHMMSSMMM() : String(value);
if(oldValue == value)
return;
t.fields[fieldName] = value;
}
}
// When we are here the tiddler/store really was changed.
this.notify(t.title,true);
if(!fieldName.match(/^temp\./))
this.setDirty(true);
};
// Returns the value of the given field of the tiddler.
// The fieldName is case-insensitive.
// Will only return String values (or undefined).
TiddlyWiki.prototype.getValue = function(tiddler,fieldName)
{
var t = this.resolveTiddler(tiddler);
if(!t)
return undefined;
if(fieldName.indexOf(config.textPrimitives.sectionSeparator) === 0 || fieldName.indexOf(config.textPrimitives.sliceSeparator) === 0) {
var sliceType = fieldName.substr(0, 2);
var sliceName = fieldName.substring(2);
return store.getTiddlerText("%0%1%2".format(t.title,sliceType,sliceName));
} else {
fieldName = fieldName.toLowerCase();
var accessor = TiddlyWiki.standardFieldAccess[fieldName];
if(accessor) {
return accessor.get(t);
}
}
return t.fields[fieldName];
};
// Calls the callback function for every field in the tiddler.
// When callback function returns a non-false value the iteration stops
// and that value is returned.
// The order of the fields is not defined.
// @param callback a function(tiddler,fieldName,value).
TiddlyWiki.prototype.forEachField = function(tiddler,callback,onlyExtendedFields)
{
var t = this.resolveTiddler(tiddler);
if(!t)
return undefined;
var n,result;
for(n in t.fields) {
result = callback(t,n,t.fields[n]);
if(result)
return result;
}
if(onlyExtendedFields)
return undefined;
for(n in TiddlyWiki.standardFieldAccess) {
if(n != "tiddler") {
// even though the "title" field can also be referenced through the name "tiddler"
// we only visit this field once.
result = callback(t,n,TiddlyWiki.standardFieldAccess[n].get(t));
if(result)
return result;
}
}
return undefined;
};
//--
//-- Story functions
//--
function Story(containerId,idPrefix)
{
this.container = containerId;
this.idPrefix = idPrefix;
this.highlightRegExp = null;
this.tiddlerId = function(title) {
title = title.replace(/_/g, "__").replace(/ /g, "_");
var id = this.idPrefix + title;
return id==this.container ? this.idPrefix + "_" + title : id;
};
this.containerId = function() {
return this.container;
};
}
Story.prototype.getTiddler = function(title)
{
return document.getElementById(this.tiddlerId(title));
};
Story.prototype.getContainer = function()
{
return document.getElementById(this.containerId());
};
Story.prototype.forEachTiddler = function(fn)
{
var place = this.getContainer();
if(!place)
return;
var e = place.firstChild;
while(e) {
var n = e.nextSibling;
var title = e.getAttribute("tiddler");
if(title) {
fn.call(this,title,e);
}
e = n;
}
};
Story.prototype.displayDefaultTiddlers = function()
{
this.displayTiddlers(null,store.filterTiddlers(store.getTiddlerText("DefaultTiddlers")),null,null,null,String.encodeHashMap(config.defaultCustomFields));
};
Story.prototype.displayTiddlers = function(srcElement,titles,template,animate,unused,customFields,toggle)
{
var t;
for(t = titles.length-1;t>=0;t--)
this.displayTiddler(srcElement,titles[t],template,animate,unused,customFields);
};
Story.prototype.displayTiddler = function(srcElement,tiddler,template,animate,unused,customFields,toggle,animationSrc)
{
var title = (tiddler instanceof Tiddler) ? tiddler.title : tiddler;
var tiddlerElem = this.getTiddler(title);
if(tiddlerElem) {
if(toggle) {
if(tiddlerElem.getAttribute("dirty") != "true")
this.closeTiddler(title,true);
} else {
this.refreshTiddler(title,template,false,customFields);
}
} else {
var place = this.getContainer();
var before = this.positionTiddler(srcElement);
tiddlerElem = this.createTiddler(place,before,title,template,customFields);
}
if(animationSrc && typeof animationSrc !== "string") {
srcElement = animationSrc;
}
if(srcElement && typeof srcElement !== "string") {
if(config.options.chkAnimate && (animate == undefined || animate == true) && anim && typeof Zoomer == "function" && typeof Scroller == "function")
anim.startAnimating(new Zoomer(title,srcElement,tiddlerElem),new Scroller(tiddlerElem));
else
window.scrollTo(0,ensureVisible(tiddlerElem));
}
return tiddlerElem;
};
Story.prototype.positionTiddler = function(srcElement)
{
var place = this.getContainer();
var before = null;
if(typeof srcElement == "string") {
switch(srcElement) {
case "top":
before = place.firstChild;
break;
case "bottom":
before = null;
break;
}
} else {
var after = this.findContainingTiddler(srcElement);
if(after == null) {
before = place.firstChild;
} else if(after.nextSibling) {
before = after.nextSibling;
if(before.nodeType != 1)
before = null;
}
}
return before;
};
Story.prototype.createTiddler = function(place,before,title,template,customFields)
{
var tiddlerElem = createTiddlyElement(null,"div",this.tiddlerId(title),"tiddler");
tiddlerElem.setAttribute("refresh","tiddler");
if(customFields)
tiddlerElem.setAttribute("tiddlyFields",customFields);
place.insertBefore(tiddlerElem,before);
var defaultText = null;
if(!store.tiddlerExists(title) && !store.isShadowTiddler(title))
defaultText = this.loadMissingTiddler(title,customFields);
this.refreshTiddler(title,template,false,customFields,defaultText);
return tiddlerElem;
};
Story.prototype.loadMissingTiddler = function(title,fields,callback)
{
var getTiddlerCallback = function(context)
{
if(context.status) {
var t = context.tiddler;
if(!t.created)
t.created = new Date();
if(!t.modified)
t.modified = t.created;
var dirty = store.isDirty();
context.tiddler = store.saveTiddler(t.title,t.title,t.text,t.modifier,t.modified,t.tags,t.fields,true,t.created,t.creator);
if(window.location.protocol != "file:")
store.setDirty(dirty);
autoSaveChanges();
} else {
story.refreshTiddler(context.title,null,true);
}
context.adaptor.close();
if(callback) {
callback(context);
}
};
var tiddler = new Tiddler(title);
tiddler.fields = typeof fields == "string" ? fields.decodeHashMap() : fields||{};
var context = {serverType:tiddler.getServerType()};
if(!context.serverType)
return "";
context.host = tiddler.fields['server.host'];
context.workspace = tiddler.fields['server.workspace'];
var adaptor = new config.adaptors[context.serverType]();
adaptor.getTiddler(title,context,null,getTiddlerCallback);
return config.messages.loadingMissingTiddler.format([title,context.serverType,context.host,context.workspace]);
};
Story.prototype.chooseTemplateForTiddler = function(title,template)
{
if(!template)
template = DEFAULT_VIEW_TEMPLATE;
if(template == DEFAULT_VIEW_TEMPLATE || template == DEFAULT_EDIT_TEMPLATE)
template = config.tiddlerTemplates[template];
return template;
};
Story.prototype.getTemplateForTiddler = function(title,template,tiddler)
{
return store.getRecursiveTiddlerText(template,null,10);
};
Story.prototype.refreshTiddler = function(title,template,force,customFields,defaultText)
{
var tiddlerElem = this.getTiddler(title);
if(tiddlerElem) {
if(tiddlerElem.getAttribute("dirty") == "true" && !force)
return tiddlerElem;
template = this.chooseTemplateForTiddler(title,template);
var currTemplate = tiddlerElem.getAttribute("template");
if((template != currTemplate) || force) {
var tiddler = store.getTiddler(title);
if(!tiddler) {
tiddler = new Tiddler();
if(store.isShadowTiddler(title)) {
var tags = [];
tiddler.set(title,store.getTiddlerText(title),config.views.wikified.shadowModifier,version.date,tags,version.date);
} else {
var text = template=="EditTemplate" ?
config.views.editor.defaultText.format([title]) :
config.views.wikified.defaultText.format([title]);
text = defaultText || text;
var fields = customFields ? customFields.decodeHashMap() : null;
tiddler.set(title,text,config.views.wikified.defaultModifier,version.date,[],version.date,fields);
}
}
tiddlerElem.setAttribute("tags",tiddler.tags.join(" "));
tiddlerElem.setAttribute("tiddler",title);
tiddlerElem.setAttribute("template",template);
tiddlerElem.onmouseover = this.onTiddlerMouseOver;
tiddlerElem.onmouseout = this.onTiddlerMouseOut;
tiddlerElem.ondblclick = this.onTiddlerDblClick;
tiddlerElem[window.event?"onkeydown":"onkeypress"] = this.onTiddlerKeyPress;
tiddlerElem.innerHTML = this.getTemplateForTiddler(title,template,tiddler);
applyHtmlMacros(tiddlerElem,tiddler);
if(store.getTaggedTiddlers(title).length > 0)
jQuery(tiddlerElem).addClass("isTag");
else
jQuery(tiddlerElem).removeClass("isTag");
if(store.tiddlerExists(title)) {
jQuery(tiddlerElem).removeClass("shadow");
jQuery(tiddlerElem).removeClass("missing");
} else {
jQuery(tiddlerElem).addClass(store.isShadowTiddler(title) ? "shadow" : "missing");
}
if(customFields)
this.addCustomFields(tiddlerElem,customFields);
}
}
return tiddlerElem;
};
Story.prototype.addCustomFields = function(place,customFields)
{
var fields = customFields.decodeHashMap();
var w = createTiddlyElement(place,"div",null,"customFields");
w.style.display = "none";
var t;
for(t in fields) {
var e = document.createElement("input");
e.setAttribute("type","text");
e.setAttribute("value",fields[t]);
w.appendChild(e);
e.setAttribute("edit",t);
}
};
Story.prototype.refreshAllTiddlers = function(force)
{
var e = this.getContainer().firstChild;
while(e) {
var template = e.getAttribute("template");
if(template && e.getAttribute("dirty") != "true") {
this.refreshTiddler(e.getAttribute("tiddler"),force ? null : template,true);
}
e = e.nextSibling;
}
};
Story.prototype.onTiddlerMouseOver = function(e)
{
jQuery(this).addClass("selected");
};
Story.prototype.onTiddlerMouseOut = function(e)
{
jQuery(this).removeClass("selected");
};
Story.prototype.onTiddlerDblClick = function(ev)
{
var e = ev || window.event;
var target = resolveTarget(e);
if(target && target.nodeName.toLowerCase() != "input" && target.nodeName.toLowerCase() != "textarea") {
if(document.selection && document.selection.empty)
document.selection.empty();
config.macros.toolbar.invokeCommand(this,"defaultCommand",e);
e.cancelBubble = true;
if(e.stopPropagation) e.stopPropagation();
return true;
}
return false;
};
Story.prototype.onTiddlerKeyPress = function(ev)
{
var e = ev || window.event;
clearMessage();
var consume = false;
var title = this.getAttribute("tiddler");
var target = resolveTarget(e);
switch(e.keyCode) {
case 9: // Tab
var ed = story.getTiddlerField(title,"text");
if(target.tagName.toLowerCase() == "input" && ed.value==config.views.editor.defaultText.format([title])) {
// moving from input field and editor still contains default text, so select it
ed.focus();
ed.select();
consume = true;
}
if(config.options.chkInsertTabs && target.tagName.toLowerCase() == "textarea") {
replaceSelection(target,String.fromCharCode(9));
consume = true;
}
if(config.isOpera) {
target.onblur = function() {
this.focus();
this.onblur = null;
};
}
break;
case 13: // Ctrl-Enter
case 10: // Ctrl-Enter on IE PC
case 77: // Ctrl-Enter is "M" on some platforms
if(e.ctrlKey) {
blurElement(this);
config.macros.toolbar.invokeCommand(this,"defaultCommand",e);
consume = true;
}
break;
case 27: // Escape
blurElement(this);
config.macros.toolbar.invokeCommand(this,"cancelCommand",e);
consume = true;
break;
}
e.cancelBubble = consume;
if(consume) {
if(e.stopPropagation) e.stopPropagation(); // Stop Propagation
e.returnValue = true; // Cancel The Event in IE
if(e.preventDefault ) e.preventDefault(); // Cancel The Event in Moz
}
return !consume;
};
Story.prototype.getTiddlerField = function(title,field)
{
var tiddlerElem = this.getTiddler(title);
var e = null;
if(tiddlerElem) {
var t,children = tiddlerElem.getElementsByTagName("*");
for(t=0; t<children.length; t++) {
var c = children[t];
if(c.tagName.toLowerCase() == "input" || c.tagName.toLowerCase() == "textarea") {
if(!e)
e = c;
if(c.getAttribute("edit") == field)
e = c;
}
}
}
return e;
};
Story.prototype.focusTiddler = function(title,field)
{
var e = this.getTiddlerField(title,field);
if(e) {
e.focus();
e.select();
}
};
Story.prototype.blurTiddler = function(title)
{
var tiddlerElem = this.getTiddler(title);
if(tiddlerElem && tiddlerElem.focus && tiddlerElem.blur) {
tiddlerElem.focus();
tiddlerElem.blur();
}
};
Story.prototype.setTiddlerField = function(title,tag,mode,field)
{
var c = this.getTiddlerField(title,field);
var tags = c.value.readBracketedList();
tags.setItem(tag,mode);
c.value = String.encodeTiddlyLinkList(tags);
};
Story.prototype.setTiddlerTag = function(title,tag,mode)
{
this.setTiddlerField(title,tag,mode,"tags");
};
Story.prototype.closeTiddler = function(title,animate,unused)
{
var tiddlerElem = this.getTiddler(title);
if(tiddlerElem) {
clearMessage();
this.scrubTiddler(tiddlerElem);
if(config.options.chkAnimate && animate && anim && typeof Slider == "function")
anim.startAnimating(new Slider(tiddlerElem,false,null,"all"));
else {
jQuery(tiddlerElem).remove();
}
}
};
Story.prototype.scrubTiddler = function(tiddlerElem)
{
tiddlerElem.id = null;
};
Story.prototype.setDirty = function(title,dirty)
{
var tiddlerElem = this.getTiddler(title);
if(tiddlerElem)
tiddlerElem.setAttribute("dirty",dirty ? "true" : "false");
};
Story.prototype.isDirty = function(title)
{
var tiddlerElem = this.getTiddler(title);
if(tiddlerElem)
return tiddlerElem.getAttribute("dirty") == "true";
return null;
};
Story.prototype.areAnyDirty = function()
{
var r = false;
this.forEachTiddler(function(title,element) {
if(this.isDirty(title))
r = true;
});
return r;
};
Story.prototype.closeAllTiddlers = function(exclude)
{
clearMessage();
this.forEachTiddler(function(title,element) {
if((title != exclude) && element.getAttribute("dirty") != "true")
this.closeTiddler(title);
});
window.scrollTo(0,ensureVisible(this.container));
};
Story.prototype.isEmpty = function()
{
var place = this.getContainer();
return place && place.firstChild == null;
};
Story.prototype.search = function(text,useCaseSensitive,useRegExp)
{
this.closeAllTiddlers();
highlightHack = new RegExp(useRegExp ? text : text.escapeRegExp(),useCaseSensitive ? "mg" : "img");
var matches = store.search(highlightHack,"title","excludeSearch");
this.displayTiddlers(null,matches);
highlightHack = null;
var q = useRegExp ? "/" : "'";
if(matches.length > 0)
displayMessage(config.macros.search.successMsg.format([matches.length.toString(),q + text + q]));
else
displayMessage(config.macros.search.failureMsg.format([q + text + q]));
};
Story.prototype.findContainingTiddler = function(e)
{
while(e && !jQuery(e).hasClass("tiddler")) {
e = jQuery(e).hasClass("popup") && Popup.stack[0] ? Popup.stack[0].root : e.parentNode;
}
return e;
};
Story.prototype.gatherSaveFields = function(e,fields)
{
if(e && e.getAttribute) {
var f = e.getAttribute("edit");
if(f)
fields[f] = e.value.replace(/\r/mg,"");
if(e.hasChildNodes()) {
var t,c = e.childNodes;
for(t=0; t<c.length; t++)
this.gatherSaveFields(c[t],fields);
}
}
};
Story.prototype.hasChanges = function(title)
{
var e = this.getTiddler(title);
if(e) {
var fields = {};
this.gatherSaveFields(e,fields);
if(store.fetchTiddler(title)) {
var n;
for(n in fields) {
if(store.getValue(title,n) != fields[n]) //# tiddler changed
return true;
}
} else {
if(store.isShadowTiddler(title) && store.getShadowTiddlerText(title) == fields.text) { //# not checking for title or tags
return false;
} else { //# changed shadow or new tiddler
return true;
}
}
}
return false;
};
Story.prototype.saveTiddler = function(title,minorUpdate)
{
var tiddlerElem = this.getTiddler(title);
if(tiddlerElem) {
var fields = {};
this.gatherSaveFields(tiddlerElem,fields);
var newTitle = fields.title || title;
if(!store.tiddlerExists(newTitle)) {
newTitle = newTitle.trim();
var creator = config.options.txtUserName;
}
if(store.tiddlerExists(newTitle) && newTitle != title) {
if(!confirm(config.messages.overwriteWarning.format([newTitle.toString()])))
return null;
title = newTitle;
}
if(newTitle != title)
this.closeTiddler(newTitle,false);
tiddlerElem.id = this.tiddlerId(newTitle);
tiddlerElem.setAttribute("tiddler",newTitle);
tiddlerElem.setAttribute("template",DEFAULT_VIEW_TEMPLATE);
tiddlerElem.setAttribute("dirty","false");
if(config.options.chkForceMinorUpdate)
minorUpdate = !minorUpdate;
if(!store.tiddlerExists(newTitle))
minorUpdate = false;
var newDate = new Date();
if(store.tiddlerExists(title)) {
var t = store.fetchTiddler(title);
var extendedFields = t.fields;
creator = t.creator;
} else {
extendedFields = merge({},config.defaultCustomFields);
}
var n;
for(n in fields) {
if(!TiddlyWiki.isStandardField(n))
extendedFields[n] = fields[n];
}
var tiddler = store.saveTiddler(title,newTitle,fields.text,minorUpdate ? undefined : config.options.txtUserName,minorUpdate ? undefined : newDate,fields.tags,extendedFields,null,null,creator);
autoSaveChanges(null,[tiddler]);
return newTitle;
}
return null;
};
Story.prototype.permaView = function()
{
var links = [];
this.forEachTiddler(function(title,element) {
links.push(String.encodeTiddlyLink(title));
});
var t = encodeURIComponent(links.join(" "));
if(t == "")
t = "#";
if(window.location.hash != t)
window.location.hash = t;
};
Story.prototype.switchTheme = function(theme)
{
if(safeMode)
return;
var isAvailable = function(title) {
var s = title ? title.indexOf(config.textPrimitives.sectionSeparator) : -1;
if(s!=-1)
title = title.substr(0,s);
return store.tiddlerExists(title) || store.isShadowTiddler(title);
};
var getSlice = function(theme,slice) {
var r;
if(readOnly)
r = store.getTiddlerSlice(theme,slice+"ReadOnly") || store.getTiddlerSlice(theme,"Web"+slice);
r = r || store.getTiddlerSlice(theme,slice);
if(r && r.indexOf(config.textPrimitives.sectionSeparator)==0)
r = theme + r;
return isAvailable(r) ? r : slice;
};
var replaceNotification = function(i,name,theme,slice) {
var newName = getSlice(theme,slice);
if(name!=newName && store.namedNotifications[i].name==name) {
store.namedNotifications[i].name = newName;
return newName;
}
return name;
};
var pt = config.refresherData.pageTemplate;
var vi = DEFAULT_VIEW_TEMPLATE;
var vt = config.tiddlerTemplates[vi];
var ei = DEFAULT_EDIT_TEMPLATE;
var et = config.tiddlerTemplates[ei];
var i;
for(i=0; i<config.notifyTiddlers.length; i++) {
var name = config.notifyTiddlers[i].name;
switch(name) {
case "PageTemplate":
config.refresherData.pageTemplate = replaceNotification(i,config.refresherData.pageTemplate,theme,name);
break;
case "StyleSheet":
removeStyleSheet(config.refresherData.styleSheet);
config.refresherData.styleSheet = replaceNotification(i,config.refresherData.styleSheet,theme,name);
break;
case "ColorPalette":
config.refresherData.colorPalette = replaceNotification(i,config.refresherData.colorPalette,theme,name);
break;
default:
break;
}
}
config.tiddlerTemplates[vi] = getSlice(theme,"ViewTemplate");
config.tiddlerTemplates[ei] = getSlice(theme,"EditTemplate");
if(!startingUp) {
if(config.refresherData.pageTemplate!=pt || config.tiddlerTemplates[vi]!=vt || config.tiddlerTemplates[ei]!=et) {
refreshAll();
this.refreshAllTiddlers(true);
} else {
setStylesheet(store.getRecursiveTiddlerText(config.refresherData.styleSheet,"",10),config.refreshers.styleSheet);
}
config.options.txtTheme = theme;
saveOption("txtTheme");
}
};
//--
//-- Manager UI for groups of tiddlers
//--
config.macros.plugins.handler = function(place,macroName,params,wikifier,paramString)
{
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);
listWrapper.setAttribute("refresh","macro");
listWrapper.setAttribute("macroName","plugins");
listWrapper.setAttribute("params",paramString);
this.refresh(listWrapper,paramString);
};
config.macros.plugins.refresh = function(listWrapper,params)
{
var me = config.macros.plugins;
var wizard = new Wizard(listWrapper);
var selectedRows = [];
ListView.forEachSelector(listWrapper,function(e,rowName) {
if(e.checked)
selectedRows.push(e.getAttribute("rowName"));
});
jQuery(listWrapper).empty();
params = params.parseParams("anon");
var plugins = installedPlugins.slice(0);
var t,tiddler,p;
var configTiddlers = store.getTaggedTiddlers("systemConfig");
for(t=0; t<configTiddlers.length; t++) {
tiddler = configTiddlers[t];
if(plugins.findByField("title",tiddler.title) == null) {
p = getPluginInfo(tiddler);
p.executed = false;
p.log.splice(0,0,this.skippedText);
plugins.push(p);
}
}
for(t=0; t<plugins.length; t++) {
p = plugins[t];
p.size = p.tiddler.text ? p.tiddler.text.length : 0;
p.forced = p.tiddler.isTagged("systemConfigForce");
p.disabled = p.tiddler.isTagged("systemConfigDisable");
p.Selected = selectedRows.indexOf(plugins[t].title) != -1;
}
if(plugins.length == 0) {
createTiddlyElement(listWrapper,"em",null,null,this.noPluginText);
wizard.setButtons([]);
} else {
var template = readOnly ? this.listViewTemplateReadOnly : this.listViewTemplate;
var listView = ListView.create(listWrapper,plugins,template,this.onSelectCommand);
wizard.setValue("listView",listView);
if(!readOnly) {
wizard.setButtons([
{caption: me.removeLabel, tooltip: me.removePrompt, onClick: me.doRemoveTag},
{caption: me.deleteLabel, tooltip: me.deletePrompt, onClick: me.doDelete}
]);
}
}
};
config.macros.plugins.doRemoveTag = function(e)
{
var wizard = new Wizard(this);
var listView = wizard.getValue("listView");
var rowNames = ListView.getSelectedRows(listView);
if(rowNames.length == 0) {
alert(config.messages.nothingSelected);
} else {
var t;
for(t=0; t<rowNames.length; t++) {
store.setTiddlerTag(rowNames[t],false,"systemConfig");
}
autoSaveChanges();
}
};
config.macros.plugins.doDelete = function(e)
{
var wizard = new Wizard(this);
var listView = wizard.getValue("listView");
var rowNames = ListView.getSelectedRows(listView);
if(rowNames.length == 0) {
alert(config.messages.nothingSelected);
} else {
if(confirm(config.macros.plugins.confirmDeleteText.format([rowNames.join(", ")]))) {
var t;
for(t=0; t<rowNames.length; t++) {
store.removeTiddler(rowNames[t]);
story.closeTiddler(rowNames[t],true);
}
}
autoSaveChanges();
}
};
//--
//-- Message area
//--
function getMessageDiv()
{
var msgArea = document.getElementById("messageArea");
if(!msgArea)
return null;
if(!msgArea.hasChildNodes())
createTiddlyButton(createTiddlyElement(msgArea,"div",null,"messageToolbar"),
config.messages.messageClose.text,
config.messages.messageClose.tooltip,
clearMessage);
msgArea.style.display = "block";
return createTiddlyElement(msgArea,"div");
}
function displayMessage(text,linkText)
{
var e = getMessageDiv();
if(!e) {
alert(text);
return;
}
if(linkText) {
var link = createTiddlyElement(e,"a",null,null,text);
link.href = linkText;
link.target = "_blank";
} else {
e.appendChild(document.createTextNode(text));
}
}
function clearMessage()
{
var msgArea = document.getElementById("messageArea");
if(msgArea) {
jQuery(msgArea).empty();
msgArea.style.display = "none";
}
return false;
}
//--
//-- Refresh mechanism
//--
config.notifyTiddlers = [
{name: "SystemSettings", notify: onSystemSettingsChange},
{name: "StyleSheetLayout", notify: refreshStyles},
{name: "StyleSheetColors", notify: refreshStyles},
{name: "StyleSheet", notify: refreshStyles},
{name: "StyleSheetPrint", notify: refreshStyles},
{name: "PageTemplate", notify: refreshPageTemplate},
{name: "SiteTitle", notify: refreshPageTitle},
{name: "SiteSubtitle", notify: refreshPageTitle},
{name: "WindowTitle", notify: refreshPageTitle},
{name: "ColorPalette", notify: refreshColorPalette},
{name: null, notify: refreshDisplay}
];
config.refreshers = {
link: function(e,changeList)
{
var title = e.getAttribute("tiddlyLink");
refreshTiddlyLink(e,title);
return true;
},
tiddler: function(e,changeList)
{
var title = e.getAttribute("tiddler");
var template = e.getAttribute("template");
if(changeList && (changeList.indexOf && changeList.indexOf(title) != -1) && !story.isDirty(title))
story.refreshTiddler(title,template,true);
else
refreshElements(e,changeList);
return true;
},
content: function(e,changeList)
{
var title = e.getAttribute("tiddler");
var force = e.getAttribute("force");
var args = e.getAttribute("args");
if(force != null || changeList == null || (changeList.indexOf && changeList.indexOf(title) != -1)) {
jQuery(e).empty();
config.macros.tiddler.transclude(e,title,args);
return true;
} else
return false;
},
macro: function(e,changeList)
{
var macro = e.getAttribute("macroName");
var params = e.getAttribute("params");
if(macro)
macro = config.macros[macro];
if(macro && macro.refresh)
macro.refresh(e,params);
return true;
}
};
config.refresherData = {
styleSheet: "StyleSheet",
defaultStyleSheet: "StyleSheet",
pageTemplate: "PageTemplate",
defaultPageTemplate: "PageTemplate",
colorPalette: "ColorPalette",
defaultColorPalette: "ColorPalette"
};
function refreshElements(root,changeList)
{
var c,nodes = root.childNodes;
for(c=0; c<nodes.length; c++) {
var e = nodes[c], type = null;
if(e.getAttribute && (e.tagName ? e.tagName != "IFRAME" : true))
type = e.getAttribute("refresh");
var refresher = config.refreshers[type];
var refreshed = false;
if(refresher != undefined)
refreshed = refresher(e,changeList);
if(e.hasChildNodes() && !refreshed)
refreshElements(e,changeList);
}
}
function applyHtmlMacros(root,tiddler)
{
var e = root.firstChild;
while(e) {
var nextChild = e.nextSibling;
if(e.getAttribute) {
var macro = e.getAttribute("macro");
if(macro) {
e.removeAttribute("macro");
var params = "";
var p = macro.indexOf(" ");
if(p != -1) {
params = macro.substr(p+1);
macro = macro.substr(0,p);
}
invokeMacro(e,macro,params,null,tiddler);
}
}
if(e.hasChildNodes())
applyHtmlMacros(e,tiddler);
e = nextChild;
}
}
function refreshPageTemplate(title)
{
var stash = jQuery("<div/>").appendTo("body").hide()[0];
var display = story.getContainer();
var nodes,t;
if(display) {
nodes = display.childNodes;
for(t=nodes.length-1; t>=0; t--)
stash.appendChild(nodes[t]);
}
var wrapper = document.getElementById("contentWrapper");
var isAvailable = function(title) {
var s = title ? title.indexOf(config.textPrimitives.sectionSeparator) : -1;
if(s!=-1)
title = title.substr(0,s);
return store.tiddlerExists(title) || store.isShadowTiddler(title);
};
if(!title || !isAvailable(title))
title = config.refresherData.pageTemplate;
if(!isAvailable(title))
title = config.refresherData.defaultPageTemplate; //# this one is always avaialable
wrapper.innerHTML = store.getRecursiveTiddlerText(title,null,10);
applyHtmlMacros(wrapper);
refreshElements(wrapper);
display = story.getContainer();
jQuery(display).empty();
if(!display)
display = createTiddlyElement(wrapper,"div",story.containerId());
nodes = stash.childNodes;
for(t=nodes.length-1; t>=0; t--)
display.appendChild(nodes[t]);
jQuery(stash).remove();
}
function refreshDisplay(hint)
{
if(typeof hint == "string")
hint = [hint];
var e = document.getElementById("contentWrapper");
refreshElements(e,hint);
if(backstage.isPanelVisible()) {
e = document.getElementById("backstage");
refreshElements(e,hint);
}
}
function refreshPageTitle()
{
document.title = getPageTitle();
}
function getPageTitle()
{
return wikifyPlainText(store.getTiddlerText("WindowTitle",""),null,tiddler);
}
function refreshStyles(title,doc)
{
setStylesheet(title == null ? "" : store.getRecursiveTiddlerText(title,"",10),title,doc || document);
}
function refreshColorPalette(title)
{
if(!startingUp)
refreshAll();
}
function refreshAll()
{
refreshPageTemplate();
refreshDisplay();
refreshStyles("StyleSheetLayout");
refreshStyles("StyleSheetColors");
refreshStyles(config.refresherData.styleSheet);
refreshStyles("StyleSheetPrint");
}
//--
//-- Option handling
//--
config.optionHandlers = {
'txt': {
get: function(name) {return encodeCookie(config.options[name].toString());},
set: function(name,value) {config.options[name] = decodeCookie(value);}
},
'chk': {
get: function(name) {return config.options[name] ? 'true' : 'false';},
set: function(name,value) {config.options[name] = value == 'true';}
}
};
function setOption(name,value)
{
var optType = name.substr(0,3);
if(config.optionHandlers[optType] && config.optionHandlers[optType].set)
config.optionHandlers[optType].set(name,value);
}
// Gets the value of an option as a string. Most code should just read from config.options.* directly
function getOption(name)
{
var optType = name.substr(0,3);
return config.optionHandlers[optType] && config.optionHandlers[optType].get ? config.optionHandlers[optType].get(name) : null;
}
function loadOptions()
{
if(safeMode)
return;
loadCookies();
loadSystemSettings();
}
// @Deprecated; retained for backwards compatibility
var loadOptionsCookie = loadOptions;
function getCookies()
{
var cookieList = document.cookie.split(';');
var i,cookies = {};
for(i=0; i<cookieList.length; i++) {
var p = cookieList[i].indexOf('=');
if(p != -1) {
var name = cookieList[i].substr(0,p).trim();
var value = cookieList[i].substr(p+1).trim();
cookies[name] = value;
}
}
return cookies;
}
function loadCookies()
{
var i,cookies = getCookies();
if(cookies['TiddlyWiki']) {
cookies = cookies['TiddlyWiki'].decodeHashMap();
}
for(i in cookies) {
if(config.optionsSource[i] != 'setting') {
setOption(i,cookies[i]);
}
}
}
function loadSystemSettings()
{
var key,settings = store.calcAllSlices('SystemSettings');
config.optionsSource = {};
for(key in settings) {
setOption(key,settings[key]);
config.optionsSource[key] = 'setting';
}
}
function onSystemSettingsChange()
{
if(!startingUp) {
loadSystemSettings();
}
}
function saveOption(name)
{
if(safeMode)
return;
if(name.match(/[()\s]/g, '_')) {
alert(config.messages.invalidCookie.format([name]));
return;
}
saveCookie(name);
if(config.optionsSource[name] == 'setting') {
saveSystemSetting(name,true);
}
}
// @Deprecated; retained for backwards compatibility
var saveOptionCookie = saveOption;
function removeCookie(name)
{
document.cookie = name + '=; expires=Thu, 01-Jan-1970 00:00:01 UTC; path=/;';
}
function saveCookie(name)
{
var key,cookies = {};
for(key in config.options) {
var value = getOption(key);
value = value == null ? 'false' : value;
cookies[key] = value;
}
document.cookie = 'TiddlyWiki=' + String.encodeHashMap(cookies) + '; expires=Fri, 1 Jan 2038 12:00:00 UTC; path=/';
cookies = getCookies();
var c;
for(c in cookies) {
var optType = c.substr(0,3);
if(config.optionHandlers[optType])
removeCookie(c);
}
}
var systemSettingSave;
function commitSystemSettings(storeWasDirty)
{
if(systemSettingSave) {
window.clearTimeout(systemSettingSave);
}
systemSettingSave = window.setTimeout(function() {
var tiddler = store.getTiddler('SystemSettings');
autoSaveChanges(null,[tiddler]);
}, 1000);
}
function saveSystemSetting(name,saveFile)
{
var title = 'SystemSettings';
var slice = store.getTiddlerSlice(title,name);
if(readOnly || slice === getOption(name)) {
return; //# don't save if read-only or the option hasn't changed
}
var slices = store.calcAllSlices(title);
var key;
for(key in config.optionsSource) {
var value = getOption(key) || '';
if(slices[key] !== value) {
slices[key] = value;
}
}
var text = [];
for(key in slices) {
text.push('%0: %1'.format([key,slices[key]]));
}
text = text.sort().join('\n');
var storeWasDirty = store.isDirty();
var tiddler = store.getTiddler(title);
if(tiddler) {
tiddler.text = text;
tiddler = store.saveTiddler(tiddler);
} else {
tiddler = store.saveTiddler(title,title,text,'System',new Date(),['excludeLists'],config.defaultCustomFields);
}
if(saveFile) {
commitSystemSettings(storeWasDirty);
}
}
function encodeCookie(s)
{
return escape(convertUnicodeToHtmlEntities(s));
}
function decodeCookie(s)
{
s = unescape(s);
var re = /&#[0-9]{1,5};/g;
return s.replace(re,function($0) {return String.fromCharCode(eval($0.replace(/[&#;]/g,'')));});
}
config.macros.option.genericCreate = function(place,type,opt,className,desc)
{
var typeInfo = config.macros.option.types[type];
var c = document.createElement(typeInfo.elementType);
if(typeInfo.typeValue)
c.setAttribute('type',typeInfo.typeValue);
c[typeInfo.eventName] = typeInfo.onChange;
c.setAttribute('option',opt);
c.className = className || typeInfo.className;
if(config.optionsDesc[opt])
c.setAttribute('title',config.optionsDesc[opt]);
place.appendChild(c);
if(desc != 'no')
createTiddlyText(place,config.optionsDesc[opt] || opt);
c[typeInfo.valueField] = config.options[opt];
return c;
};
config.macros.option.genericOnChange = function(e)
{
var opt = this.getAttribute('option');
if(opt) {
var optType = opt.substr(0,3);
var handler = config.macros.option.types[optType];
if(handler.elementType && handler.valueField)
config.macros.option.propagateOption(opt,handler.valueField,this[handler.valueField],handler.elementType,this);
}
return true;
};
config.macros.option.types = {
'txt': {
elementType: 'input',
valueField: 'value',
eventName: 'onchange',
className: 'txtOptionInput',
create: config.macros.option.genericCreate,
onChange: config.macros.option.genericOnChange
},
'chk': {
elementType: 'input',
valueField: 'checked',
eventName: 'onclick',
className: 'chkOptionInput',
typeValue: 'checkbox',
create: config.macros.option.genericCreate,
onChange: config.macros.option.genericOnChange
}
};
config.macros.option.propagateOption = function(opt,valueField,value,elementType,elem)
{
config.options[opt] = value;
saveOption(opt);
var t,nodes = document.getElementsByTagName(elementType);
for(t=0; t<nodes.length; t++) {
var optNode = nodes[t].getAttribute('option');
if(opt == optNode && nodes[t]!=elem)
nodes[t][valueField] = value;
}
};
config.macros.option.handler = function(place,macroName,params,wikifier,paramString)
{
params = paramString.parseParams('anon',null,true,false,false);
var opt = (params[1] && params[1].name == 'anon') ? params[1].value : getParam(params,'name',null);
var className = (params[2] && params[2].name == 'anon') ? params[2].value : getParam(params,'class',null);
var desc = getParam(params,'desc','no');
var type = opt.substr(0,3);
var h = config.macros.option.types[type];
if(h && h.create)
h.create(place,type,opt,className,desc);
};
config.macros.options.handler = function(place,macroName,params,wikifier,paramString)
{
params = paramString.parseParams('anon',null,true,false,false);
var showUnknown = getParam(params,'showUnknown','no');
var wizard = new Wizard();
wizard.createWizard(place,this.wizardTitle);
wizard.addStep(this.step1Title,this.step1Html);
var markList = wizard.getElement('markList');
var chkUnknown = wizard.getElement('chkUnknown');
chkUnknown.checked = showUnknown == 'yes';
chkUnknown.onchange = this.onChangeUnknown;
var listWrapper = document.createElement('div');
markList.parentNode.insertBefore(listWrapper,markList);
wizard.setValue('listWrapper',listWrapper);
this.refreshOptions(listWrapper,showUnknown == 'yes');
};
config.macros.options.refreshOptions = function(listWrapper,showUnknown)
{
var n,opts = [];
for(n in config.options) {
var opt = {};
opt.option = '';
opt.name = n;
opt.lowlight = !config.optionsDesc[n];
opt.description = opt.lowlight ? this.unknownDescription : config.optionsDesc[n];
if(!opt.lowlight || showUnknown)
opts.push(opt);
}
opts.sort(function(a,b) {return a.name.substr(3) < b.name.substr(3) ? -1 : (a.name.substr(3) == b.name.substr(3) ? 0 : +1);});
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,null,'no');
}
}
};
config.macros.options.onChangeUnknown = function(e)
{
var wizard = new Wizard(this);
var listWrapper = wizard.getValue('listWrapper');
jQuery(listWrapper).empty();
config.macros.options.refreshOptions(listWrapper,this.checked);
return false;
};
// If there are unsaved changes, force the user to confirm before exitting
function confirmExit()
{
hadConfirmExit = true;
if((store && store.isDirty && store.isDirty()) || (story && story.areAnyDirty && story.areAnyDirty()))
return config.messages.confirmExit;
}
// Give the user a chance to save changes before exitting
function checkUnsavedChanges()
{
if(store && store.isDirty && store.isDirty() && window.hadConfirmExit === false) {
if(confirm(config.messages.unsavedChangesWarning))
saveChanges();
}
}
function saveChanges() {
// expects to be implemented elsewhere
}
function autoSaveChanges(onlyIfDirty,tiddlers)
{
if(config.options.chkAutoSave)
saveChanges(onlyIfDirty,tiddlers);
}
//--
//-- Filesystem utilities
//--
function convertUTF8ToUnicode(u)
{
return config.browser.isOpera || !window.netscape ? manualConvertUTF8ToUnicode(u) : mozConvertUTF8ToUnicode(u);
}
function manualConvertUTF8ToUnicode(utf)
{
var uni = utf;
var src = 0;
var dst = 0;
var b1, b2, b3;
var c;
while(src < utf.length) {
b1 = utf.charCodeAt(src++);
if(b1 < 0x80) {
dst++;
} else if(b1 < 0xE0) {
b2 = utf.charCodeAt(src++);
c = String.fromCharCode(((b1 & 0x1F) << 6) | (b2 & 0x3F));
uni = uni.substring(0,dst++).concat(c,utf.substr(src));
} else {
b2 = utf.charCodeAt(src++);
b3 = utf.charCodeAt(src++);
c = String.fromCharCode(((b1 & 0xF) << 12) | ((b2 & 0x3F) << 6) | (b3 & 0x3F));
uni = uni.substring(0,dst++).concat(c,utf.substr(src));
}
}
return uni;
}
function mozConvertUTF8ToUnicode(u)
{
try {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
converter.charset = "UTF-8";
} catch(ex) {
return manualConvertUTF8ToUnicode(u);
} // fallback
var s = converter.ConvertToUnicode(u);
var fin = converter.Finish();
return fin.length > 0 ? s+fin : s;
}
function convertUnicodeToFileFormat(s)
{
return config.browser.isOpera || !window.netscape ? (config.browser.isIE ? convertUnicodeToHtmlEntities(s) : s) : mozConvertUnicodeToUTF8(s);
}
function convertUnicodeToHtmlEntities(s)
{
var re = /[^\u0000-\u007F]/g;
return s.replace(re,function($0) {return "&#" + $0.charCodeAt(0).toString() + ";";});
}
function convertUnicodeToUTF8(s)
{
// return convertUnicodeToFileFormat to allow plugin migration
return convertUnicodeToFileFormat(s);
}
function manualConvertUnicodeToUTF8(s)
{
return unescape(encodeURIComponent(s));
}
function mozConvertUnicodeToUTF8(s)
{
try {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
converter.charset = "UTF-8";
} catch(ex) {
return manualConvertUnicodeToUTF8(s);
} // fallback
var u = converter.ConvertFromUnicode(s);
var fin = converter.Finish();
return fin.length > 0 ? u + fin : u;
}
function convertUriToUTF8(uri,charSet)
{
if(window.netscape == undefined || charSet == undefined || charSet == "")
return uri;
try {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var converter = Components.classes["@mozilla.org/intl/utf8converterservice;1"].getService(Components.interfaces.nsIUTF8ConverterService);
} catch(ex) {
return uri;
}
return converter.convertURISpecToUTF8(uri,charSet);
}
//--
//-- Server adaptor base class
//--
function AdaptorBase()
{
this.host = null;
this.store = null;
return this;
}
AdaptorBase.prototype.close = function()
{
return true;
};
AdaptorBase.prototype.fullHostName = function(host)
{
if(!host)
return '';
host = host.trim();
if(!host.match(/:\/\//))
host = 'http://' + host;
if(host.substr(host.length-1) == '/')
host = host.substr(0,host.length-1);
return host;
};
AdaptorBase.minHostName = function(host)
{
return host;
};
AdaptorBase.prototype.setContext = function(context,userParams,callback)
{
if(!context) context = {};
context.userParams = userParams;
if(callback) context.callback = callback;
context.adaptor = this;
if(!context.host)
context.host = this.host;
context.host = this.fullHostName(context.host);
if(!context.workspace)
context.workspace = this.workspace;
return context;
};
// Open the specified host
AdaptorBase.prototype.openHost = function(host,context,userParams,callback)
{
this.host = host;
context = this.setContext(context,userParams,callback);
context.status = true;
if(callback)
window.setTimeout(function() {context.callback(context,userParams);},10);
return true;
};
// Open the specified workspace
AdaptorBase.prototype.openWorkspace = function(workspace,context,userParams,callback)
{
this.workspace = workspace;
context = this.setContext(context,userParams,callback);
context.status = true;
if(callback)
window.setTimeout(function() {callback(context,userParams);},10);
return true;
};
//--
//-- HTTP request code
//--
function ajaxReq(args)
{
if(window.Components && window.netscape && window.netscape.security && document.location.protocol.indexOf("http") == -1)
window.netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
return jQuery.ajax(args);
}
function httpReq(type,url,callback,params,headers,data,contentType,username,password,allowCache)
{
var httpSuccess = function(xhr) {
try {
// IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
return (!xhr.status && location.protocol === "file:") ||
(xhr.status >= 200 && xhr.status < 300) ||
xhr.status === 304 || xhr.status === 1223;
} catch(e) {}
return false;
};
var options = {
type:type,
url:url,
processData:false,
data:data,
cache:!!allowCache,
beforeSend: function(xhr) {
var i;
for(i in headers)
xhr.setRequestHeader(i,headers[i]);
xhr.setRequestHeader("X-Requested-With", "TiddlyWiki " + formatVersion());
}
};
if(callback) {
options.complete = function(xhr,textStatus) {
if(httpSuccess(xhr))
callback(true,params,xhr.responseText,url,xhr);
else
callback(false,params,null,url,xhr);
};
}
if(contentType)
options.contentType = contentType;
if(username)
options.username = username;
if(password)
options.password = password;
if(window.Components && window.netscape && window.netscape.security && document.location.protocol.indexOf("http") == -1)
window.netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
return jQuery.ajax(options);
}
//--
//-- TiddlyWiki-specific utility functions
//--
// Returns TiddlyWiki version string
function formatVersion(v)
{
v = v || version;
return v.major + "." + v.minor + "." + v.revision +
(v.alpha ? " (alpha " + v.alpha + ")" : "") +
(v.beta ? " (beta " + v.beta + ")" : "");
}
function compareVersions(v1,v2)
{
var x1,x2,i,a = ["major","minor","revision"];
for(i = 0; i<a.length; i++) {
x1 = v1[a[i]] || 0;
x2 = v2[a[i]] || 0;
if(x1<x2)
return 1;
if(x1>x2)
return -1;
}
x1 = v1.beta || 9999;
x2 = v2.beta || 9999;
if(x1<x2)
return 1;
return x1 > x2 ? -1 : 0;
}
function merge(dst,src,preserveExisting)
{
var i;
for(i in src) {
if(!preserveExisting || dst[i] === undefined)
dst[i] = src[i];
}
return dst;
}
// Resolve the target object of an event
function resolveTarget(e)
{
var obj;
if(e.target)
obj = e.target;
else if(e.srcElement)
obj = e.srcElement;
if(obj.nodeType == 3) // defeat Safari bug
obj = obj.parentNode;
return obj;
}
// Returns a string containing the description of an exception, optionally prepended by a message
function exceptionText(e,message)
{
var s = e.description || e.toString();
return message ? "%0:\n%1".format([message,s]) : s;
}
// Displays an alert of an exception description with optional message
function showException(e,message)
{
alert(exceptionText(e,message));
}
function alertAndThrow(m)
{
alert(m);
throw(m);
}
function glyph(name)
{
var g = config.glyphs;
var b = g.currBrowser;
if(b == null) {
b = 0;
while(b < g.browsers.length-1 && !g.browsers[b]())
b++;
g.currBrowser = b;
}
if(!g.codes[name])
return "";
return g.codes[name][b];
}
function createTiddlyText(parent,text)
{
return parent.appendChild(document.createTextNode(text));
}
function createTiddlyCheckbox(parent,caption,checked,onChange)
{
var cb = document.createElement("input");
cb.setAttribute("type","checkbox");
cb.onclick = onChange;
parent.appendChild(cb);
cb.checked = checked;
cb.className = "chkOptionInput";
if(caption)
wikify(caption,parent);
return cb;
}
function createTiddlyElement(parent,element,id,className,text,attribs)
{
var n,e = document.createElement(element);
if(className != null)
e.className = className;
if(id != null)
e.setAttribute("id",id);
if(text != null)
e.appendChild(document.createTextNode(text));
if(attribs) {
for(n in attribs) {
e.setAttribute(n,attribs[n]);
}
}
if(parent != null)
parent.appendChild(e);
return e;
}
function createTiddlyButton(parent,text,tooltip,action,className,id,accessKey,attribs)
{
var i,btn = document.createElement("a");
btn.setAttribute("href","javascript:;");
if(action) {
btn.onclick = action;
}
if(tooltip)
btn.setAttribute("title",tooltip);
if(text)
btn.appendChild(document.createTextNode(text));
btn.className = className || "button";
if(id)
btn.id = id;
if(attribs) {
for(i in attribs) {
btn.setAttribute(i,attribs[i]);
}
}
if(parent)
parent.appendChild(btn);
if(accessKey)
btn.setAttribute("accessKey",accessKey);
return btn;
}
function createExternalLink(place,url,label)
{
var link = document.createElement("a");
link.className = "externalLink";
link.href = url;
var f = config.messages.externalLinkTooltip;
link.title = f ? f.format([url]) : url;
if(config.options.chkOpenInNewWindow)
link.target = "_blank";
place.appendChild(link);
if(label)
createTiddlyText(link, label);
return link;
}
function getTiddlyLinkInfo(title,currClasses)
{
var classes = currClasses ? currClasses.split(" ") : [];
classes.pushUnique("tiddlyLink");
var tiddler = store.fetchTiddler(title);
var subTitle;
if(tiddler) {
subTitle = tiddler.getSubtitle();
classes.pushUnique("tiddlyLinkExisting");
classes.remove("tiddlyLinkNonExisting");
classes.remove("shadow");
} else {
var f;
classes.remove("tiddlyLinkExisting");
classes.pushUnique("tiddlyLinkNonExisting");
if(store.isShadowTiddler(title)) {
f = config.messages.shadowedTiddlerToolTip;
classes.pushUnique("shadow");
} else {
f = config.messages.undefinedTiddlerToolTip;
classes.remove("shadow");
}
subTitle = f ? f.format([title]) : "";
}
if(typeof config.annotations[title]=="string")
subTitle = config.annotations[title];
return {classes: classes.join(" "),subTitle: subTitle};
}
// Event handler for clicking on a tiddly link
function onClickTiddlerLink(ev)
{
var e = ev || window.event;
var target = resolveTarget(e);
var link = target;
var title = null;
var fields = null;
var noToggle = null;
do {
title = link.getAttribute("tiddlyLink");
fields = link.getAttribute("tiddlyFields");
noToggle = link.getAttribute("noToggle");
link = link.parentNode;
} while(title == null && link != null);
if(!store.isShadowTiddler(title)) {
var f = fields ? fields.decodeHashMap() : {};
fields = String.encodeHashMap(merge(f,config.defaultCustomFields,true));
}
if(title) {
var toggling = e.metaKey || e.ctrlKey;
if(config.options.chkToggleLinks)
toggling = !toggling;
if(noToggle)
toggling = false;
if(store.getTiddler(title))
fields = null;
story.displayTiddler(target,title,null,true,null,fields,toggling);
}
clearMessage();
return false;
}
function createTiddlyLink(place,title,includeText,className,isStatic,linkedFromTiddler,noToggle)
{
var title = jQuery.trim(title);
var text = includeText ? title : null;
var i = getTiddlyLinkInfo(title,className);
var btn = isStatic ? createExternalLink(place,store.getTiddlerText("SiteUrl",null) + "#" + title) : createTiddlyButton(place,text,i.subTitle,onClickTiddlerLink,i.classes);
if(isStatic)
btn.className += ' ' + className;
btn.setAttribute("refresh","link");
btn.setAttribute("tiddlyLink",title);
if(noToggle)
btn.setAttribute("noToggle","true");
if(linkedFromTiddler) {
var fields = linkedFromTiddler.getInheritedFields();
if(fields)
btn.setAttribute("tiddlyFields",fields);
}
return btn;
}
function refreshTiddlyLink(e,title)
{
var i = getTiddlyLinkInfo(title,e.className);
e.className = i.classes;
e.title = i.subTitle;
}
function createTiddlyDropDown(place,onchange,options,defaultValue)
{
var sel = createTiddlyElement(place,"select");
sel.onchange = onchange;
var t;
for(t=0; t<options.length; t++) {
var e = createTiddlyElement(sel,"option",null,null,options[t].caption);
e.value = options[t].name;
if(options[t].name == defaultValue)
e.selected = true;
}
return sel;
}
//--
//-- TiddlyWiki-specific popup utility functions
//--
// Event handler for 'open all' on a tiddler popup
function onClickTagOpenAll(ev)
{
var tiddlers = store.getTaggedTiddlers(this.getAttribute("tag"));
var sortby = this.getAttribute("sortby");
if(sortby&&sortby.length) {
store.sortTiddlers(tiddlers,sortby);
}
story.displayTiddlers(this,tiddlers);
return false;
}
// Event handler for clicking on a tiddler tag
function onClickTag(ev)
{
var e = ev || window.event;
var popup = Popup.create(this);
jQuery(popup).addClass("taggedTiddlerList");
var tag = this.getAttribute("tag");
var title = this.getAttribute("tiddler");
if(popup && tag) {
var tagged = tag.indexOf("[")==-1 ? store.getTaggedTiddlers(tag) : store.filterTiddlers(tag);
var sortby = this.getAttribute("sortby");
if(sortby&&sortby.length) {
store.sortTiddlers(tagged,sortby);
}
var titles = [];
var r;
for(r=0;r<tagged.length;r++) {
if(tagged[r].title != title)
titles.push(tagged[r].title);
}
var lingo = config.views.wikified.tag;
if(titles.length > 0) {
var openAll = createTiddlyButton(createTiddlyElement(popup,"li"),lingo.openAllText.format([tag]),lingo.openAllTooltip,onClickTagOpenAll);
openAll.setAttribute("tag",tag);
openAll.setAttribute("sortby",sortby);
createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");
for(r=0; r<titles.length; r++) {
createTiddlyLink(createTiddlyElement(popup,"li"),titles[r],true);
}
} else {
createTiddlyElement(popup,"li",null,"disabled",lingo.popupNone.format([tag]));
}
createTiddlyElement(createTiddlyElement(popup,"li",null,"listBreak"),"div");
var h = createTiddlyLink(createTiddlyElement(popup,"li"),tag,false);
createTiddlyText(h,lingo.openTag.format([tag]));
}
Popup.show();
e.cancelBubble = true;
if(e.stopPropagation) e.stopPropagation();
return false;
}
// Create a button for a tag with a popup listing all the tiddlers that it tags
function createTagButton(place,tag,excludeTiddler,title,tooltip)
{
var btn = createTiddlyButton(place,title||tag,(tooltip||config.views.wikified.tag.tooltip).format([tag]),onClickTag);
btn.setAttribute("tag",tag);
if(excludeTiddler)
btn.setAttribute("tiddler",excludeTiddler);
return btn;
}
function onClickTiddlyPopup(ev)
{
var e = ev || window.event;
var tiddler = this.tiddler;
if(tiddler.text) {
var popup = Popup.create(this,"div","popupTiddler");
wikify(tiddler.text,popup,null,tiddler);
Popup.show();
}
if(e) e.cancelBubble = true;
if(e && e.stopPropagation) e.stopPropagation();
return false;
}
function createTiddlyPopup(place,caption,tooltip,tiddler)
{
if(tiddler.text) {
createTiddlyLink(place,caption,true);
var btn = createTiddlyButton(place,glyph("downArrow"),tooltip,onClickTiddlyPopup,"tiddlerPopupButton");
btn.tiddler = tiddler;
} else {
createTiddlyText(place,caption);
}
}
function onClickError(ev)
{
var e = ev || window.event;
var popup = Popup.create(this);
var lines = this.getAttribute("errorText").split("\n");
var t;
for(t=0; t<lines.length; t++)
createTiddlyElement(popup,"li",null,null,lines[t]);
Popup.show();
e.cancelBubble = true;
if(e.stopPropagation) e.stopPropagation();
return false;
}
function createTiddlyError(place,title,text)
{
var btn = createTiddlyButton(place,title,null,onClickError,"errorButton");
if(text) btn.setAttribute("errorText",text);
}
//-
//- Animation engine
//-
function Animator()
{
this.running = 0; // Incremented at start of each animation, decremented afterwards. If zero, the interval timer is disabled
this.timerID = 0; // ID of the timer used for animating
this.animations = []; // List of animations in progress
return this;
}
// Start animation engine
Animator.prototype.startAnimating = function() //# Variable number of arguments
{
var t;
for(t=0; t<arguments.length; t++)
this.animations.push(arguments[t]);
if(this.running == 0) {
var me = this;
this.timerID = window.setInterval(function() {me.doAnimate(me);},10);
}
this.running += arguments.length;
};
// Perform an animation engine tick, calling each of the known animation modules
Animator.prototype.doAnimate = function(me)
{
var a = 0;
while(a < me.animations.length) {
var animation = me.animations[a];
if(animation.tick()) {
a++;
} else {
me.animations.splice(a,1);
if(--me.running == 0)
window.clearInterval(me.timerID);
}
}
};
Animator.slowInSlowOut = function(progress)
{
return(1-((Math.cos(progress * Math.PI)+1)/2));
};
//--
//-- Morpher animation
//--
// Animate a set of properties of an element
function Morpher(element,duration,properties,callback)
{
this.element = element;
this.duration = duration;
this.properties = properties;
this.startTime = new Date();
this.endTime = Number(this.startTime) + duration;
this.callback = callback;
this.tick();
return this;
}
Morpher.prototype.assignStyle = function(element,style,value)
{
switch(style) {
case "-tw-vertScroll":
window.scrollTo(findScrollX(),value);
break;
case "-tw-horizScroll":
window.scrollTo(value,findScrollY());
break;
default:
element.style[style] = value;
break;
}
};
Morpher.prototype.stop = function()
{
var t;
for(t=0; t<this.properties.length; t++) {
var p = this.properties[t];
if(p.atEnd !== undefined) {
this.assignStyle(this.element,p.style,p.atEnd);
}
}
if(this.callback)
this.callback(this.element,this.properties);
};
Morpher.prototype.tick = function()
{
var currTime = Number(new Date());
var t,progress = Animator.slowInSlowOut(Math.min(1,(currTime-this.startTime)/this.duration));
for(t=0; t<this.properties.length; t++) {
var p = this.properties[t];
if(p.start !== undefined && p.end !== undefined) {
var template = p.template || "%0";
switch(p.format) {
case undefined:
case "style":
var v = p.start + (p.end-p.start) * progress;
this.assignStyle(this.element,p.style,template.format([v]));
break;
case "color":
break;
}
}
}
if(currTime >= this.endTime) {
this.stop();
return false;
}
return true;
};
//--
//-- Zoomer animation
//--
function Zoomer(text,startElement,targetElement,unused)
{
var e = createTiddlyElement(document.body,"div",null,"zoomer");
createTiddlyElement(e,"div",null,null,text);
var winWidth = findWindowWidth();
var winHeight = findWindowHeight();
var p = [
{style: 'left', start: findPosX(startElement), end: findPosX(targetElement), template: '%0px'},
{style: 'top', start: findPosY(startElement), end: findPosY(targetElement), template: '%0px'},
{style: 'width', start: Math.min(startElement.scrollWidth,winWidth), end: Math.min(targetElement.scrollWidth,winWidth), template: '%0px', atEnd: 'auto'},
{style: 'height', start: Math.min(startElement.scrollHeight,winHeight), end: Math.min(targetElement.scrollHeight,winHeight), template: '%0px', atEnd: 'auto'},
{style: 'fontSize', start: 8, end: 24, template: '%0pt'}
];
var c = function(element,properties) {jQuery(element).remove();};
return new Morpher(e,config.animDuration,p,c);
}
//--
//-- Scroller animation
//--
function Scroller(targetElement)
{
var p = [{style: '-tw-vertScroll', start: findScrollY(), end: ensureVisible(targetElement)}];
return new Morpher(targetElement,config.animDuration,p);
}
//--
//-- Slider animation
//--
// deleteMode - "none", "all" [delete target element and it's children], [only] "children" [but not the target element]
function Slider(element,opening,unused,deleteMode)
{
element.style.overflow = 'hidden';
if(opening)
element.style.height = '0px'; // Resolves a Firefox flashing bug
element.style.display = 'block';
var height = element.scrollHeight;
var p = [];
var c = null;
if(opening) {
p.push({style: 'height', start: 0, end: height, template: '%0px', atEnd: 'auto'});
p.push({style: 'opacity', start: 0, end: 1, template: '%0'});
p.push({style: 'filter', start: 0, end: 100, template: 'alpha(opacity:%0)'});
} else {
p.push({style: 'height', start: height, end: 0, template: '%0px'});
p.push({style: 'display', atEnd: 'none'});
p.push({style: 'opacity', start: 1, end: 0, template: '%0'});
p.push({style: 'filter', start: 100, end: 0, template: 'alpha(opacity:%0)'});
switch(deleteMode) {
case "all":
c = function(element,properties) {jQuery(element).remove();};
break;
case "children":
c = function(element,properties) {jQuery(element).empty();};
break;
}
}
return new Morpher(element,config.animDuration,p,c);
}
//--
//-- Popup menu
//--
var Popup = {
stack: [] // Array of objects with members root: and popup:
};
Popup.create = function(root,elem,className)
{
var stackPosition = this.find(root,"popup");
Popup.remove(stackPosition+1);
var popup = createTiddlyElement(document.body,elem || "ol","popup",className || "popup");
popup.stackPosition = stackPosition;
Popup.stack.push({root: root, popup: popup});
return popup;
};
Popup.onDocumentClick = function(ev)
{
var e = ev || window.event;
if(e.eventPhase == undefined)
Popup.remove();
else if(e.eventPhase == Event.BUBBLING_PHASE || e.eventPhase == Event.AT_TARGET)
Popup.remove();
return true;
};
Popup.show = function(valign,halign,offset)
{
var curr = Popup.stack[Popup.stack.length-1];
this.place(curr.root,curr.popup,valign,halign,offset);
jQuery(curr.root).addClass("highlight");
if(config.options.chkAnimate && anim && typeof Scroller == "function")
anim.startAnimating(new Scroller(curr.popup));
else
window.scrollTo(0,ensureVisible(curr.popup));
};
Popup.place = function(root,popup,valign,halign,offset)
{
if(!offset)
offset = {x:0,y:0};
if(popup.stackPosition >= 0 && !valign && !halign) {
offset.x = offset.x + root.offsetWidth;
} else {
offset.x = (halign == "right") ? offset.x + root.offsetWidth : offset.x;
offset.y = (valign == "top") ? offset.y : offset.y + root.offsetHeight;
}
var rootLeft = findPosX(root);
var rootTop = findPosY(root);
var popupLeft = rootLeft + offset.x;
var popupTop = rootTop + offset.y;
var winWidth = findWindowWidth();
if(popup.offsetWidth > winWidth*0.75)
popup.style.width = winWidth*0.75 + "px";
var popupWidth = popup.offsetWidth;
var scrollWidth = winWidth - document.body.offsetWidth;
if(popupLeft + popupWidth > winWidth - scrollWidth - 1) {
if(halign == "right")
popupLeft = popupLeft - root.offsetWidth - popupWidth;
else
popupLeft = winWidth - popupWidth - scrollWidth - 1;
}
popup.style.left = popupLeft + "px";
popup.style.top = popupTop + "px";
popup.style.display = "block";
};
Popup.find = function(e)
{
var t,pos = -1;
for(t=this.stack.length-1; t>=0; t--) {
if(isDescendant(e,this.stack[t].popup))
pos = t;
}
return pos;
};
Popup.remove = function(pos)
{
if(!pos) pos = 0;
if(Popup.stack.length > pos) {
Popup.removeFrom(pos);
}
};
Popup.removeFrom = function(from)
{
var t;
for(t=Popup.stack.length-1; t>=from; t--) {
var p = Popup.stack[t];
jQuery(p.root).removeClass("highlight");
jQuery(p.popup).remove();
}
Popup.stack = Popup.stack.slice(0,from);
};
//--
//-- Wizard support
//--
function Wizard(elem)
{
if(elem) {
this.formElem = findRelated(elem,"wizard","className");
this.bodyElem = findRelated(this.formElem.firstChild,"wizardBody","className","nextSibling");
this.footElem = findRelated(this.formElem.firstChild,"wizardFooter","className","nextSibling");
} else {
this.formElem = null;
this.bodyElem = null;
this.footElem = null;
}
}
Wizard.prototype.setValue = function(name,value)
{
jQuery(this.formElem).data(name, value);
};
Wizard.prototype.getValue = function(name)
{
return this.formElem ? jQuery(this.formElem).data(name) : null;
};
Wizard.prototype.createWizard = function(place,title)
{
this.formElem = createTiddlyElement(place,"form",null,"wizard");
createTiddlyElement(this.formElem,"h1",null,null,title);
this.bodyElem = createTiddlyElement(this.formElem,"div",null,"wizardBody");
this.footElem = createTiddlyElement(this.formElem,"div",null,"wizardFooter");
return this.formElem;
};
Wizard.prototype.clear = function()
{
jQuery(this.bodyElem).empty();
};
Wizard.prototype.setButtons = function(buttonInfo,status)
{
jQuery(this.footElem).empty();
var t;
for(t=0; t<buttonInfo.length; t++) {
createTiddlyButton(this.footElem,buttonInfo[t].caption,buttonInfo[t].tooltip,buttonInfo[t].onClick);
insertSpacer(this.footElem);
}
if(typeof status == "string") {
createTiddlyElement(this.footElem,"span",null,"status",status);
}
};
Wizard.prototype.addStep = function(stepTitle,html)
{
jQuery(this.bodyElem).empty();
var w = createTiddlyElement(this.bodyElem,"div");
createTiddlyElement(w,"h2",null,null,stepTitle);
var step = createTiddlyElement(w,"div",null,"wizardStep");
step.innerHTML = html;
applyHtmlMacros(step,tiddler);
};
Wizard.prototype.getElement = function(name)
{
return this.formElem.elements[name];
};
//--
//-- ListView gadget
//--
var ListView = {};
// Create a listview
ListView.create = function(place,listObject,listTemplate,callback,className)
{
var table = createTiddlyElement(place,"table",null,className || "listView twtable");
var thead = createTiddlyElement(table,"thead");
var t,r = createTiddlyElement(thead,"tr");
for(t=0; t<listTemplate.columns.length; t++) {
var columnTemplate = listTemplate.columns[t];
var c = createTiddlyElement(r,"th");
var colType = ListView.columnTypes[columnTemplate.type];
if(colType && colType.createHeader) {
colType.createHeader(c,columnTemplate,t);
if(columnTemplate.className)
jQuery(c).addClass(columnTemplate.className);
}
}
var rc,tbody = createTiddlyElement(table,"tbody");
for(rc=0; rc<listObject.length; rc++) {
var rowObject = listObject[rc];
r = createTiddlyElement(tbody,"tr");
for(c=0; c<listTemplate.rowClasses.length; c++) {
if(rowObject[listTemplate.rowClasses[c].field])
jQuery(r).addClass(listTemplate.rowClasses[c].className);
}
rowObject.rowElement = r;
rowObject.colElements = {};
var cc;
for(cc=0; cc<listTemplate.columns.length; cc++) {
c = createTiddlyElement(r,"td");
columnTemplate = listTemplate.columns[cc];
var field = columnTemplate.field;
colType = ListView.columnTypes[columnTemplate.type];
if(colType && colType.createItem) {
colType.createItem(c,rowObject,field,columnTemplate,cc,rc);
if(columnTemplate.className)
jQuery(c).addClass(columnTemplate.className);
}
rowObject.colElements[field] = c;
}
}
if(callback && listTemplate.actions)
createTiddlyDropDown(place,ListView.getCommandHandler(callback),listTemplate.actions);
if(callback && listTemplate.buttons) {
for(t=0; t<listTemplate.buttons.length; t++) {
var a = listTemplate.buttons[t];
if(a && a.name != "")
createTiddlyButton(place,a.caption,null,ListView.getCommandHandler(callback,a.name,a.allowEmptySelection));
}
}
return table;
};
ListView.getCommandHandler = function(callback,name,allowEmptySelection)
{
return function(e) {
var view = findRelated(this,"TABLE",null,"previousSibling");
var tiddlers = [];
ListView.forEachSelector(view,function(e,rowName) {
if(e.checked)
tiddlers.push(rowName);
});
if(tiddlers.length == 0 && !allowEmptySelection) {
alert(config.messages.nothingSelected);
} else {
if(this.nodeName.toLowerCase() == "select") {
callback(view,this.value,tiddlers);
this.selectedIndex = 0;
} else {
callback(view,name,tiddlers);
}
}
};
};
// Invoke a callback for each selector checkbox in the listview
ListView.forEachSelector = function(view,callback)
{
var checkboxes = view.getElementsByTagName("input");
var t,hadOne = false;
for(t=0; t<checkboxes.length; t++) {
var cb = checkboxes[t];
if(cb.getAttribute("type") == "checkbox") {
var rn = cb.getAttribute("rowName");
if(rn) {
callback(cb,rn);
hadOne = true;
}
}
}
return hadOne;
};
ListView.getSelectedRows = function(view)
{
var rowNames = [];
ListView.forEachSelector(view,function(e,rowName) {
if(e.checked)
rowNames.push(rowName);
});
return rowNames;
};
ListView.columnTypes = {};
ListView.columnTypes.String = {
createHeader: function(place,columnTemplate,col)
{
createTiddlyText(place,columnTemplate.title);
},
createItem: function(place,listObject,field,columnTemplate,col,row)
{
var v = listObject[field];
if(v != undefined)
createTiddlyText(place,v);
}
};
ListView.columnTypes.WikiText = {
createHeader: ListView.columnTypes.String.createHeader,
createItem: function(place,listObject,field,columnTemplate,col,row)
{
var v = listObject[field];
if(v != undefined)
wikify(v,place,null,null);
}
};
ListView.columnTypes.Tiddler = {
createHeader: ListView.columnTypes.String.createHeader,
createItem: function(place,listObject,field,columnTemplate,col,row)
{
var v = listObject[field];
if(v != undefined && v.title)
createTiddlyPopup(place,v.title,config.messages.listView.tiddlerTooltip,v);
}
};
ListView.columnTypes.Size = {
createHeader: ListView.columnTypes.String.createHeader,
createItem: function(place,listObject,field,columnTemplate,col,row)
{
var msg = config.messages.sizeTemplates;
var v = listObject[field];
if(v != undefined) {
var t = 0;
while(t<msg.length-1 && v<msg[t].unit)
t++;
createTiddlyText(place,msg[t].template.format([Math.round(v/msg[t].unit)]));
}
}
};
ListView.columnTypes.Link = {
createHeader: ListView.columnTypes.String.createHeader,
createItem: function(place,listObject,field,columnTemplate,col,row)
{
var v = listObject[field];
var c = columnTemplate.text;
if(v != undefined)
createExternalLink(place,v,c || v);
}
};
ListView.columnTypes.Date = {
createHeader: ListView.columnTypes.String.createHeader,
createItem: function(place,listObject,field,columnTemplate,col,row)
{
var v = listObject[field];
if(v != undefined)
createTiddlyText(place,v.formatString(columnTemplate.dateFormat));
}
};
ListView.columnTypes.StringList = {
createHeader: ListView.columnTypes.String.createHeader,
createItem: function(place,listObject,field,columnTemplate,col,row)
{
var v = listObject[field];
if(v != undefined) {
var t;
for(t=0; t<v.length; t++) {
createTiddlyText(place,v[t]);
createTiddlyElement(place,"br");
}
}
}
};
ListView.columnTypes.Selector = {
createHeader: function(place,columnTemplate,col)
{
createTiddlyCheckbox(place,null,false,this.onHeaderChange);
},
createItem: function(place,listObject,field,columnTemplate,col,row)
{
var e = createTiddlyCheckbox(place,null,listObject[field],null);
e.setAttribute("rowName",listObject[columnTemplate.rowName]);
},
onHeaderChange: function(e)
{
var state = this.checked;
var view = findRelated(this,"TABLE");
if(!view)
return;
ListView.forEachSelector(view,function(e,rowName) {
e.checked = state;
});
}
};
ListView.columnTypes.Tags = {
createHeader: ListView.columnTypes.String.createHeader,
createItem: function(place,listObject,field,columnTemplate,col,row)
{
var tags = listObject[field];
createTiddlyText(place,String.encodeTiddlyLinkList(tags));
}
};
ListView.columnTypes.Boolean = {
createHeader: ListView.columnTypes.String.createHeader,
createItem: function(place,listObject,field,columnTemplate,col,row)
{
if(listObject[field] == true)
createTiddlyText(place,columnTemplate.trueText);
if(listObject[field] == false)
createTiddlyText(place,columnTemplate.falseText);
}
};
ListView.columnTypes.TagCheckbox = {
createHeader: ListView.columnTypes.String.createHeader,
createItem: function(place,listObject,field,columnTemplate,col,row)
{
var e = createTiddlyCheckbox(place,null,listObject[field],this.onChange);
e.setAttribute("tiddler",listObject.title);
e.setAttribute("tag",columnTemplate.tag);
},
onChange : function(e)
{
var tag = this.getAttribute("tag");
var tiddler = this.getAttribute("tiddler");
store.setTiddlerTag(tiddler,this.checked,tag);
}
};
ListView.columnTypes.TiddlerLink = {
createHeader: ListView.columnTypes.String.createHeader,
createItem: function(place,listObject,field,columnTemplate,col,row)
{
var v = listObject[field];
if(v != undefined) {
var link = createTiddlyLink(place,listObject[columnTemplate.tiddlerLink],false,null);
createTiddlyText(link,listObject[field]);
}
}
};
//--
//-- Augmented methods for the JavaScript Array() object
//--
// Add indexOf function if browser does not support it
if(!Array.indexOf) {
Array.prototype.indexOf = function(item,from)
{
if(!from)
from = 0;
var i;
for(i=from; i<this.length; i++) {
if(this[i] === item)
return i;
}
return -1;
};}
// Find an entry in a given field of the members of an array
Array.prototype.findByField = function(field,value)
{
var t;
for(t=0; t<this.length; t++) {
if(this[t][field] === value)
return t;
}
return null;
};
// Return whether an entry exists in an array
Array.prototype.contains = function(item)
{
return this.indexOf(item) != -1;
};
// Adds, removes or toggles a particular value within an array
// value - value to add
// mode - +1 to add value, -1 to remove value, 0 to toggle it
Array.prototype.setItem = function(value,mode)
{
var p = this.indexOf(value);
if(mode == 0)
mode = (p == -1) ? +1 : -1;
if(mode == +1) {
if(p == -1)
this.push(value);
} else if(mode == -1) {
if(p != -1)
this.splice(p,1);
}
};
// Return whether one of a list of values exists in an array
Array.prototype.containsAny = function(items)
{
var i;
for(i=0; i<items.length; i++) {
if(this.indexOf(items[i]) != -1)
return true;
}
return false;
};
// Return whether all of a list of values exists in an array
Array.prototype.containsAll = function(items)
{
var i;
for(i = 0; i<items.length; i++) {
if(this.indexOf(items[i]) == -1)
return false;
}
return true;
};
// Push a new value into an array only if it is not already present in the array. If the optional unique parameter is false, it reverts to a normal push
Array.prototype.pushUnique = function(item,unique)
{
if(unique === false) {
this.push(item);
} else {
if(this.indexOf(item) == -1)
this.push(item);
}
};
Array.prototype.remove = function(item)
{
var p = this.indexOf(item);
if(p != -1)
this.splice(p,1);
};
if(!Array.prototype.map) {
Array.prototype.map = function(fn,thisObj)
{
var scope = thisObj || window;
var i,j,a = [];
for(i=0, j=this.length; i < j; ++i) {
a.push(fn.call(scope,this[i],i,this));
}
return a;
};}
//--
//-- Augmented methods for the JavaScript String() object
//--
// Get characters from the right end of a string
String.prototype.right = function(n)
{
return n < this.length ? this.slice(this.length-n) : this;
};
// Trim whitespace from both ends of a string
String.prototype.trim = function()
{
return this.replace(/^\s*|\s*$/g,"");
};
// Convert a string from a CSS style property name to a JavaScript style name ("background-color" -> "backgroundColor")
String.prototype.unDash = function()
{
var t,s = this.split("-");
if(s.length > 1) {
for(t=1; t<s.length; t++)
s[t] = s[t].substr(0,1).toUpperCase() + s[t].substr(1);
}
return s.join("");
};
// Substitute substrings from an array into a format string that includes '%1'-type specifiers
String.prototype.format = function(s)
{
var substrings = s && s.constructor == Array ? s : arguments;
var subRegExp = /(?:%(\d+))/mg;
var currPos = 0;
var match,r = [];
do {
match = subRegExp.exec(this);
if(match && match[1]) {
if(match.index > currPos)
r.push(this.substring(currPos,match.index));
r.push(substrings[parseInt(match[1],10)]);
currPos = subRegExp.lastIndex;
}
} while(match);
if(currPos < this.length)
r.push(this.substring(currPos,this.length));
return r.join("");
};
// Escape any special RegExp characters with that character preceded by a backslash
String.prototype.escapeRegExp = function()
{
var s = "\\^$*+?()=!|,{}[].";
var t,c = this;
for(t=0; t<s.length; t++)
c = c.replace(new RegExp("\\" + s.substr(t,1),"g"),"\\" + s.substr(t,1));
return c;
};
// Convert "\" to "\s", newlines to "\n" (and remove carriage returns)
String.prototype.escapeLineBreaks = function()
{
return this.replace(/\\/mg,"\\s").replace(/\n/mg,"\\n").replace(/\r/mg,"");
};
// Convert "\n" to newlines, "\b" to " ", "\s" to "\" (and remove carriage returns)
String.prototype.unescapeLineBreaks = function()
{
return this.replace(/\\n/mg,"\n").replace(/\\b/mg," ").replace(/\\s/mg,"\\").replace(/\r/mg,"");
};
// Convert & to "&", < to "<", > to ">" and " to """
String.prototype.htmlEncode = function()
{
return this.replace(/&/mg,"&").replace(/</mg,"<").replace(/>/mg,">").replace(/\"/mg,""");
};
// Convert "&" to &, "<" to <, ">" to > and """ to "
String.prototype.htmlDecode = function()
{
return this.replace(/</mg,"<").replace(/>/mg,">").replace(/"/mg,"\"").replace(/&/mg,"&");
};
// Parse a space-separated string of name:value parameters
// The result is an array of objects:
// result[0] = object with a member for each parameter name, value of that member being an array of values
// result[1..n] = one object for each parameter, with 'name' and 'value' members
String.prototype.parseParams = function(defaultName,defaultValue,allowEval,noNames,cascadeDefaults)
{
var parseToken = function(match,p) {
var n;
if(match[p]) // Double quoted
n = match[p];
else if(match[p+1]) // Single quoted
n = match[p+1];
else if(match[p+2]) // Double-square-bracket quoted
n = match[p+2];
else if(match[p+3]) // Double-brace quoted
try {
n = match[p+3];
if(allowEval && config.evaluateMacroParameters != "none") {
if(config.evaluateMacroParameters == "restricted") {
if(window.restrictedEval) {
n = window.restrictedEval(n);
}
} else {
n = window.eval(n);
}
}
} catch(ex) {
throw "Unable to evaluate {{" + match[p+3] + "}}: " + exceptionText(ex);
}
else if(match[p+4]) // Unquoted
n = match[p+4];
else if(match[p+5]) // empty quote
n = "";
return n;
};
var r = [{}];
var dblQuote = "(?:\"((?:(?:\\\\\")|[^\"])+)\")";
var sngQuote = "(?:'((?:(?:\\\\\')|[^'])+)')";
var dblSquare = "(?:\\[\\[((?:\\s|\\S)*?)\\]\\])";
var dblBrace = "(?:\\{\\{((?:\\s|\\S)*?)\\}\\})";
var unQuoted = noNames ? "([^\"'\\s]\\S*)" : "([^\"':\\s][^\\s:]*)";
var emptyQuote = "((?:\"\")|(?:''))";
var skipSpace = "(?:\\s*)";
var token = "(?:" + dblQuote + "|" + sngQuote + "|" + dblSquare + "|" + dblBrace + "|" + unQuoted + "|" + emptyQuote + ")";
var re = noNames ? new RegExp(token,"mg") : new RegExp(skipSpace + token + skipSpace + "(?:(\\:)" + skipSpace + token + ")?","mg");
var match;
do {
match = re.exec(this);
if(match) {
var n = parseToken(match,1);
if(noNames) {
r.push({name:"",value:n});
} else {
var v = parseToken(match,8);
if(v == null && defaultName) {
v = n;
n = defaultName;
} else if(v == null && defaultValue) {
v = defaultValue;
}
r.push({name:n,value:v});
if(cascadeDefaults) {
defaultName = n;
defaultValue = v;
}
}
}
} while(match);
// Summarise parameters into first element
var t;
for(t=1; t<r.length; t++) {
if(r[0][r[t].name])
r[0][r[t].name].push(r[t].value);
else
r[0][r[t].name] = [r[t].value];
}
return r;
};
// Process a string list of macro parameters into an array. Parameters can be quoted with "", '',
// [[]], {{ }} or left unquoted (and therefore space-separated). Double-braces {{}} results in
// an *evaluated* parameter: e.g. {{config.options.txtUserName}} results in the current user's name.
String.prototype.readMacroParams = function(notAllowEval)
{
var p = this.parseParams("list",null,!notAllowEval,true);
var t,n = [];
for(t=1; t<p.length; t++)
n.push(p[t].value);
return n;
};
// Process a string list of unique tiddler names into an array. Tiddler names that have spaces in them must be [[bracketed]]
String.prototype.readBracketedList = function(unique)
{
var p = this.parseParams("list",null,false,true);
var t,n = [];
for(t=1; t<p.length; t++) {
if(p[t].value)
n.pushUnique(p[t].value,unique);
}
return n;
};
// Returns array with start and end index of chunk between given start and end marker, or undefined.
String.prototype.getChunkRange = function(start,end)
{
var s = this.indexOf(start);
if(s != -1) {
s += start.length;
var e = this.indexOf(end,s);
if(e != -1)
return [s,e];
}
};
// Replace a chunk of a string given start and end markers
String.prototype.replaceChunk = function(start,end,sub)
{
var r = this.getChunkRange(start,end);
return r ? this.substring(0,r[0]) + sub + this.substring(r[1]) : this;
};
// Returns a chunk of a string between start and end markers, or undefined
String.prototype.getChunk = function(start,end)
{
var r = this.getChunkRange(start,end);
if(r)
return this.substring(r[0],r[1]);
};
// Static method to bracket a string with double square brackets if it contains a space
String.encodeTiddlyLink = function(title)
{
return title.indexOf(" ") == -1 ? title : "[[" + title + "]]";
};
// Static method to encodeTiddlyLink for every item in an array and join them with spaces
String.encodeTiddlyLinkList = function(list)
{
if(list) {
var t,results = [];
for(t=0; t<list.length; t++)
results.push(String.encodeTiddlyLink(list[t]));
return results.join(" ");
} else {
return "";
}
};
// Convert a string as a sequence of name:"value" pairs into a hashmap
String.prototype.decodeHashMap = function()
{
var fields = this.parseParams("anon","",false);
var t,r = {};
for(t=1; t<fields.length; t++)
r[fields[t].name] = fields[t].value;
return r;
};
// Static method to encode a hashmap into a name:"value"... string
String.encodeHashMap = function(hashmap)
{
var t,r = [];
for(t in hashmap)
r.push(t + ':"' + hashmap[t] + '"');
return r.join(" ");
};
// Static method to left-pad a string with 0s to a certain width
String.zeroPad = function(n,d)
{
var s = n.toString();
if(s.length < d)
s = "000000000000000000000000000".substr(0,d-s.length) + s;
return s;
};
String.prototype.startsWith = function(prefix)
{
return !prefix || this.substring(0,prefix.length) == prefix;
};
// Returns the first value of the given named parameter.
function getParam(params,name,defaultValue)
{
if(!params)
return defaultValue;
var p = params[0][name];
return p ? p[0] : defaultValue;
}
// Returns the first value of the given boolean named parameter.
function getFlag(params,name,defaultValue)
{
return !!getParam(params,name,defaultValue);
}
//--
//-- Augmented methods for the JavaScript Date() object
//--
// Substitute date components into a string
Date.prototype.formatString = function(template)
{
var t = template.replace(/0hh12/g,String.zeroPad(this.getHours12(),2));
t = t.replace(/hh12/g,this.getHours12());
t = t.replace(/0hh/g,String.zeroPad(this.getHours(),2));
t = t.replace(/hh/g,this.getHours());
t = t.replace(/mmm/g,config.messages.dates.shortMonths[this.getMonth()]);
t = t.replace(/0mm/g,String.zeroPad(this.getMinutes(),2));
t = t.replace(/mm/g,this.getMinutes());
t = t.replace(/0ss/g,String.zeroPad(this.getSeconds(),2));
t = t.replace(/ss/g,this.getSeconds());
t = t.replace(/[ap]m/g,this.getAmPm().toLowerCase());
t = t.replace(/[AP]M/g,this.getAmPm().toUpperCase());
t = t.replace(/wYYYY/g,this.getYearForWeekNo());
t = t.replace(/wYY/g,String.zeroPad(this.getYearForWeekNo()-2000,2));
t = t.replace(/YYYY/g,this.getFullYear());
t = t.replace(/YY/g,String.zeroPad(this.getFullYear()-2000,2));
t = t.replace(/MMM/g,config.messages.dates.months[this.getMonth()]);
t = t.replace(/0MM/g,String.zeroPad(this.getMonth()+1,2));
t = t.replace(/MM/g,this.getMonth()+1);
t = t.replace(/0WW/g,String.zeroPad(this.getWeek(),2));
t = t.replace(/WW/g,this.getWeek());
t = t.replace(/DDD/g,config.messages.dates.days[this.getDay()]);
t = t.replace(/ddd/g,config.messages.dates.shortDays[this.getDay()]);
t = t.replace(/0DD/g,String.zeroPad(this.getDate(),2));
t = t.replace(/DDth/g,this.getDate()+this.daySuffix());
t = t.replace(/DD/g,this.getDate());
var tz = this.getTimezoneOffset();
var atz = Math.abs(tz);
t = t.replace(/TZD/g,(tz < 0 ? '+' : '-') + String.zeroPad(Math.floor(atz / 60),2) + ':' + String.zeroPad(atz % 60,2));
t = t.replace(/\\/g,"");
return t;
};
Date.prototype.getWeek = function()
{
var dt = new Date(this.getTime());
var d = dt.getDay();
if(d==0) d=7;// JavaScript Sun=0, ISO Sun=7
dt.setTime(dt.getTime()+(4-d)*86400000);// shift day to Thurs of same week to calculate weekNo
var n = Math.floor((dt.getTime()-new Date(dt.getFullYear(),0,1)+3600000)/86400000);
return Math.floor(n/7)+1;
};
Date.prototype.getYearForWeekNo = function()
{
var dt = new Date(this.getTime());
var d = dt.getDay();
if(d==0) d=7;// JavaScript Sun=0, ISO Sun=7
dt.setTime(dt.getTime()+(4-d)*86400000);// shift day to Thurs of same week
return dt.getFullYear();
};
Date.prototype.getHours12 = function()
{
var h = this.getHours();
return h > 12 ? h-12 : ( h > 0 ? h : 12 );
};
Date.prototype.getAmPm = function()
{
return this.getHours() >= 12 ? config.messages.dates.pm : config.messages.dates.am;
};
Date.prototype.daySuffix = function()
{
return config.messages.dates.daySuffixes[this.getDate()-1];
};
// Convert a date to local YYYYMMDDHHMM string format
Date.prototype.convertToLocalYYYYMMDDHHMM = function()
{
return this.getFullYear() + String.zeroPad(this.getMonth()+1,2) + String.zeroPad(this.getDate(),2) + String.zeroPad(this.getHours(),2) + String.zeroPad(this.getMinutes(),2);
};
// Convert a date to UTC YYYYMMDDHHMM string format
Date.prototype.convertToYYYYMMDDHHMM = function()
{
return this.getUTCFullYear() + String.zeroPad(this.getUTCMonth()+1,2) + String.zeroPad(this.getUTCDate(),2) + String.zeroPad(this.getUTCHours(),2) + String.zeroPad(this.getUTCMinutes(),2);
};
// Convert a date to UTC YYYYMMDD.HHMMSSMMM string format
Date.prototype.convertToYYYYMMDDHHMMSSMMM = function()
{
return this.getUTCFullYear() + String.zeroPad(this.getUTCMonth()+1,2) + String.zeroPad(this.getUTCDate(),2) + "." + String.zeroPad(this.getUTCHours(),2) + String.zeroPad(this.getUTCMinutes(),2) + String.zeroPad(this.getUTCSeconds(),2) + String.zeroPad(this.getUTCMilliseconds(),3) +"0";
};
// Static method to create a date from a UTC YYYYMMDDHHMM format string
Date.convertFromYYYYMMDDHHMM = function(d)
{
d = d?d.replace(/[^0-9]/g, ""):"";
return Date.convertFromYYYYMMDDHHMMSSMMM(d.substr(0,12));
};
// Static method to create a date from a UTC YYYYMMDDHHMMSS format string
Date.convertFromYYYYMMDDHHMMSS = function(d)
{
d = d?d.replace(/[^0-9]/g, ""):"";
return Date.convertFromYYYYMMDDHHMMSSMMM(d.substr(0,14));
};
// Static method to create a date from a UTC YYYYMMDDHHMMSSMMM format string
Date.convertFromYYYYMMDDHHMMSSMMM = function(d)
{
d = d ? d.replace(/[^0-9]/g, "") : "";
return new Date(Date.UTC(parseInt(d.substr(0,4),10),
parseInt(d.substr(4,2),10)-1,
parseInt(d.substr(6,2),10),
parseInt(d.substr(8,2)||"00",10),
parseInt(d.substr(10,2)||"00",10),
parseInt(d.substr(12,2)||"00",10),
parseInt(d.substr(14,3)||"000",10)));
};
//--
//-- RGB colour object
//--
// Construct an RGB colour object from a '#rrggbb', '#rgb' or 'rgb(n,n,n)' string or from separate r,g,b values
function RGB(r,g,b)
{
this.r = 0;
this.g = 0;
this.b = 0;
if(typeof r == "string") {
if(r.substr(0,1) == "#") {
if(r.length == 7) {
this.r = parseInt(r.substr(1,2),16)/255;
this.g = parseInt(r.substr(3,2),16)/255;
this.b = parseInt(r.substr(5,2),16)/255;
} else {
this.r = parseInt(r.substr(1,1),16)/15;
this.g = parseInt(r.substr(2,1),16)/15;
this.b = parseInt(r.substr(3,1),16)/15;
}
} else {
var rgbPattern = /rgb\s*\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)/;
var c = r.match(rgbPattern);
if(c) {
this.r = parseInt(c[1],10)/255;
this.g = parseInt(c[2],10)/255;
this.b = parseInt(c[3],10)/255;
}
}
} else {
this.r = r;
this.g = g;
this.b = b;
}
return this;
}
// Mixes this colour with another in a specified proportion
// c = other colour to mix
// f = 0..1 where 0 is this colour and 1 is the new colour
// Returns an RGB object
RGB.prototype.mix = function(c,f)
{
return new RGB(this.r + (c.r-this.r) * f,this.g + (c.g-this.g) * f,this.b + (c.b-this.b) * f);
};
// Return an rgb colour as a #rrggbb format hex string
RGB.prototype.toString = function()
{
var clamp = function(x,min,max) {
return x < min ? min : (x > max ? max : x);
};
return "#" +
("0" + Math.floor(clamp(this.r,0,1) * 255).toString(16)).right(2) +
("0" + Math.floor(clamp(this.g,0,1) * 255).toString(16)).right(2) +
("0" + Math.floor(clamp(this.b,0,1) * 255).toString(16)).right(2);
};
//--
//-- DOM utilities - many derived from www.quirksmode.org
//--
function drawGradient(place,horiz,locolors,hicolors)
{
if(!hicolors)
hicolors = locolors;
var t;
for(t=0; t<= 100; t+=2) {
var bar = document.createElement("div");
place.appendChild(bar);
bar.style.position = "absolute";
bar.style.left = horiz ? t + "%" : 0;
bar.style.top = horiz ? 0 : t + "%";
bar.style.width = horiz ? (101-t) + "%" : "100%";
bar.style.height = horiz ? "100%" : (101-t) + "%";
bar.style.zIndex = -1;
var p = t/100*(locolors.length-1);
var hc = hicolors[Math.floor(p)];
if(typeof hc == "string")
hc = new RGB(hc);
var lc = locolors[Math.ceil(p)];
if(typeof lc == "string")
lc = new RGB(lc);
bar.style.backgroundColor = hc.mix(lc,p-Math.floor(p)).toString();
}
}
function addEvent(obj,type,fn)
{
if(obj.attachEvent) {
obj["e"+type+fn] = fn;
obj[type+fn] = function(){obj["e"+type+fn](window.event);};
obj.attachEvent("on"+type,obj[type+fn]);
} else {
obj.addEventListener(type,fn,false);
}
}
function removeEvent(obj,type,fn)
{
if(obj.detachEvent) {
obj.detachEvent("on"+type,obj[type+fn]);
obj[type+fn] = null;
} else {
obj.removeEventListener(type,fn,false);
}
}
// Find the closest relative with a given property value (property defaults to tagName, relative defaults to parentNode)
function findRelated(e,value,name,relative)
{
name = name || "tagName";
relative = relative || "parentNode";
if(name == "className") {
while(e && !jQuery(e).hasClass(value)) {
e = e[relative];
}
} else {
while(e && e[name] != value) {
e = e[relative];
}
}
return e;
}
// Get the scroll position for window.scrollTo necessary to scroll a given element into view
function ensureVisible(e)
{
var posTop = findPosY(e);
var posBot = posTop + e.offsetHeight;
var winTop = findScrollY();
var winHeight = findWindowHeight();
var winBot = winTop + winHeight;
if(posTop < winTop) {
return posTop;
} else if(posBot > winBot) {
if(e.offsetHeight < winHeight)
return posTop - (winHeight - e.offsetHeight);
else
return posTop;
} else {
return winTop;
}
}
// Get the current width of the display window
function findWindowWidth()
{
return window.innerWidth || document.documentElement.clientWidth;
}
// Get the current height of the display window
function findWindowHeight()
{
return window.innerHeight || document.documentElement.clientHeight;
}
// Get the current height of the document
function findDocHeight() {
var D = document;
return Math.max(
Math.max(D.body.scrollHeight, D.documentElement.scrollHeight),
Math.max(D.body.offsetHeight, D.documentElement.offsetHeight),
Math.max(D.body.clientHeight, D.documentElement.clientHeight)
);
}
// Get the current horizontal page scroll position
function findScrollX()
{
return window.scrollX || document.documentElement.scrollLeft;
}
// Get the current vertical page scroll position
function findScrollY()
{
return window.scrollY || document.documentElement.scrollTop;
}
function findPosX(obj)
{
var curleft = 0;
while(obj.offsetParent) {
curleft += obj.offsetLeft;
obj = obj.offsetParent;
}
return curleft;
}
function findPosY(obj)
{
var curtop = 0;
while(obj.offsetParent) {
curtop += obj.offsetTop;
obj = obj.offsetParent;
}
return curtop;
}
// Blur a particular element
function blurElement(e)
{
if(e && e.focus && e.blur) {
e.focus();
e.blur();
}
}
// Create a non-breaking space
function insertSpacer(place)
{
var e = document.createTextNode(String.fromCharCode(160));
if(place)
place.appendChild(e);
return e;
}
// Replace the current selection of a textarea or text input and scroll it into view
function replaceSelection(e,text)
{
if(e.setSelectionRange) {
var oldpos = e.selectionStart;
var isRange = e.selectionEnd > e.selectionStart;
e.value = e.value.substr(0,e.selectionStart) + text + e.value.substr(e.selectionEnd);
e.setSelectionRange(isRange ? oldpos : oldpos + text.length,oldpos + text.length);
var linecount = e.value.split("\n").length;
var thisline = e.value.substr(0,e.selectionStart).split("\n").length-1;
e.scrollTop = Math.floor((thisline - e.rows / 2) * e.scrollHeight / linecount);
} else if(document.selection) {
var range = document.selection.createRange();
if(range.parentElement() == e) {
var isCollapsed = range.text == "";
range.text = text;
if(!isCollapsed) {
range.moveStart("character", -text.length);
range.select();
}
}
}
}
// Set the caret position in a text area
function setCaretPosition(e,pos)
{
if(e.selectionStart || e.selectionStart == '0') {
e.selectionStart = pos;
e.selectionEnd = pos;
e.focus();
} else if(document.selection) {
// IE support
e.focus ();
var sel = document.selection.createRange();
sel.moveStart('character', -e.value.length);
sel.moveStart('character',pos);
sel.moveEnd('character',0);
sel.select();
}
}
// Returns the text of the given (text) node, possibly merging subsequent text nodes
function getNodeText(e)
{
var t = "";
while(e && e.nodeName == "#text") {
t += e.nodeValue;
e = e.nextSibling;
}
return t;
}
// Returns true if the element e has a given ancestor element
function isDescendant(e,ancestor)
{
while(e) {
if(e === ancestor)
return true;
e = e.parentNode;
}
return false;
}
// deprecate the following...
// Prevent an event from bubbling
function stopEvent(e)
{
var ev = e || window.event;
ev.cancelBubble = true;
if(ev.stopPropagation) ev.stopPropagation();
return false;
}
// Remove any event handlers or non-primitve custom attributes
function scrubNode(e)
{
if(!config.browser.isIE)
return;
var att = e.attributes;
if(att) {
var t;
for(t=0; t<att.length; t++) {
var n = att[t].name;
if(n !== "style" && (typeof e[n] === "function" || (typeof e[n] === "object" && e[n] != null))) {
try {
e[n] = null;
} catch(ex) {
}
}
}
}
var c = e.firstChild;
while(c) {
scrubNode(c);
c = c.nextSibling;
}
}
function setStylesheet(s,id,doc)
{
jQuery.twStylesheet(s,{id:id,doc:doc});
}
function removeStyleSheet(id)
{
jQuery.twStylesheet.remove({id:id});
}
//--
//-- LoaderBase and SaverBase
//--
function LoaderBase() {}
LoaderBase.prototype.loadTiddler = function(store,node,tiddlers)
{
var title = this.getTitle(store,node);
if(safeMode && store.isShadowTiddler(title))
return;
if(title) {
var tiddler = store.createTiddler(title);
this.internalizeTiddler(store,tiddler,title,node);
tiddlers.push(tiddler);
}
};
LoaderBase.prototype.loadTiddlers = function(store,nodes)
{
var t,tiddlers = [];
for(t = 0; t < nodes.length; t++) {
try {
this.loadTiddler(store,nodes[t],tiddlers);
} catch(ex) {
showException(ex,config.messages.tiddlerLoadError.format([this.getTitle(store,nodes[t])]));
}
}
return tiddlers;
};
function SaverBase() {}
SaverBase.prototype.externalize = function(store)
{
var results = [];
var t,tiddlers = store.getTiddlers("title");
for(t = 0; t < tiddlers.length; t++) {
if(!tiddlers[t].doNotSave())
results.push(this.externalizeTiddler(store, tiddlers[t]));
}
return results.join("\n");
};
//--
//-- TW21Loader (inherits from LoaderBase)
//--
function TW21Loader() {}
TW21Loader.prototype = new LoaderBase();
TW21Loader.prototype.getTitle = function(store,node)
{
var title = null;
if(node.getAttribute) {
title = node.getAttribute("title");
if(!title)
title = node.getAttribute("tiddler");
}
if(!title && node.id) {
var lenPrefix = store.idPrefix.length;
if(node.id.substr(0,lenPrefix) == store.idPrefix)
title = node.id.substr(lenPrefix);
}
return title;
};
TW21Loader.prototype.internalizeTiddler = function(store,tiddler,title,node)
{
var e = node.firstChild;
var text = null;
if(node.getAttribute("tiddler")) {
text = getNodeText(e).unescapeLineBreaks();
} else {
while(e.nodeName!="PRE" && e.nodeName!="pre") {
e = e.nextSibling;
}
text = e.innerHTML.replace(/\r/mg,"").htmlDecode();
}
var creator = node.getAttribute("creator");
var modifier = node.getAttribute("modifier");
var c = node.getAttribute("created");
var m = node.getAttribute("modified");
var created = c ? Date.convertFromYYYYMMDDHHMMSS(c) : version.date;
var modified = m ? Date.convertFromYYYYMMDDHHMMSS(m) : created;
var tags = node.getAttribute("tags");
var fields = {};
var i,attrs = node.attributes;
for(i = attrs.length-1; i >= 0; i--) {
var name = attrs[i].name;
if(attrs[i].specified && !TiddlyWiki.isStandardField(name)) {
fields[name] = attrs[i].value.unescapeLineBreaks();
}
}
tiddler.assign(title,text,modifier,modified,tags,created,fields,creator);
return tiddler;
};
//--
//-- TW21Saver (inherits from SaverBase)
//--
function TW21Saver() {}
TW21Saver.prototype = new SaverBase();
TW21Saver.prototype.externalizeTiddler = function(store,tiddler)
{
try {
var extendedAttributes = "";
var usePre = config.options.chkUsePreForStorage;
store.forEachField(tiddler,
function(tiddler,fieldName,value) {
// don't store stuff from the temp namespace
if(typeof value != "string")
value = "";
if(!fieldName.match(/^temp\./))
extendedAttributes += ' %0="%1"'.format([fieldName,value.escapeLineBreaks().htmlEncode()]);
},true);
var created = tiddler.created;
var modified = tiddler.modified;
var attributes = tiddler.creator ? ' creator="' + tiddler.creator.htmlEncode() + '"' : "";
attributes += tiddler.modifier ? ' modifier="' + tiddler.modifier.htmlEncode() + '"' : "";
attributes += (usePre && created == version.date) ? "" :' created="' + created.convertToYYYYMMDDHHMM() + '"';
attributes += (usePre && modified == created) ? "" : ' modified="' + modified.convertToYYYYMMDDHHMM() +'"';
var tags = tiddler.getTags();
if(!usePre || tags)
attributes += ' tags="' + tags.htmlEncode() + '"';
return ('<div %0="%1"%2%3>%4</'+'div>').format([
usePre ? "title" : "tiddler",
tiddler.title.htmlEncode(),
attributes,
extendedAttributes,
usePre ? "\n<pre>" + tiddler.text.htmlEncode() + "</pre>\n" : tiddler.text.escapeLineBreaks().htmlEncode()
]);
} catch (ex) {
throw exceptionText(ex,config.messages.tiddlerSaveError.format([tiddler.title]));
}
};
/***
|''Name''|TiddlyWebAdaptor|
|''Description''|adaptor for interacting with TiddlyWeb|
|''Author:''|FND|
|''Contributors''|Chris Dent, Martin Budden|
|''Version''|1.4.10|
|''Status''|stable|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/adaptors/TiddlyWebAdaptor.js|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/association/|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5|
|''Keywords''|serverSide TiddlyWeb|
!Notes
This plugin includes [[jQuery JSON|http://code.google.com/p/jquery-json/]].
!To Do
* createWorkspace
* document custom/optional context attributes (e.g. filters, query, revision) and tiddler fields (e.g. server.title, origin)
!Code
***/
//{{{
(function($) {
var adaptor = config.adaptors.tiddlyweb = function() {};
adaptor.prototype = new AdaptorBase();
adaptor.serverType = "tiddlyweb";
adaptor.serverLabel = "TiddlyWeb";
adaptor.mimeType = "application/json";
adaptor.parsingErrorMessage = "Error parsing result from server";
adaptor.noBagErrorMessage = "no bag specified for tiddler";
adaptor.locationIDErrorMessage = "no bag or recipe specified for tiddler"; // TODO: rename
// retrieve current status (requires TiddlyWeb status plugin)
adaptor.prototype.getStatus = function(context, userParams, callback) {
context = this.setContext(context, userParams, callback);
var uriTemplate = "%0/status";
var uri = uriTemplate.format([context.host]);
var req = httpReq("GET", uri, adaptor.getStatusCallback, context,
null, null, null, null, null, true);
return typeof req == "string" ? req : true;
};
adaptor.getStatusCallback = function(status, context, responseText, uri, xhr) {
context.status = responseText ? status : false;
try {
context.statusText = xhr.statusText;
} catch(exc) { // offline (Firefox)
context.status = false;
context.statusText = null;
}
context.httpStatus = xhr.status;
if(context.status) {
context.serverStatus = $.evalJSON(responseText); // XXX: error handling!?
}
if(context.callback) {
context.callback(context, context.userParams);
}
};
// retrieve a list of workspaces
adaptor.prototype.getWorkspaceList = function(context, userParams, callback) {
context = this.setContext(context, userParams, callback);
context.workspaces = [];
var uriTemplate = "%0/recipes"; // XXX: bags?
var uri = uriTemplate.format([context.host]);
var req = httpReq("GET", uri, adaptor.getWorkspaceListCallback,
context, { accept: adaptor.mimeType }, null, null, null, null, true);
return typeof req == "string" ? req : true;
};
adaptor.getWorkspaceListCallback = function(status, context, responseText, uri, xhr) {
context.status = status;
context.statusText = xhr.statusText;
context.httpStatus = xhr.status;
if(status) {
try {
var workspaces = $.evalJSON(responseText);
} catch(ex) {
context.status = false; // XXX: correct?
context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
if(context.callback) {
context.callback(context, context.userParams);
}
return;
}
context.workspaces = workspaces.map(function(itm) { return { title: itm }; });
}
if(context.callback) {
context.callback(context, context.userParams);
}
};
// retrieve a list of tiddlers
adaptor.prototype.getTiddlerList = function(context, userParams, callback) {
context = this.setContext(context, userParams, callback);
var uriTemplate = "%0/%1/%2/tiddlers%3";
var params = context.filters ? "?" + context.filters : "";
if(context.format) {
params = context.format + params;
}
var workspace = adaptor.resolveWorkspace(context.workspace);
var uri = uriTemplate.format([context.host, workspace.type + "s",
adaptor.normalizeTitle(workspace.name), params]);
var req = httpReq("GET", uri, adaptor.getTiddlerListCallback,
context, merge({ accept: adaptor.mimeType }, context.headers), null, null, null, null, true);
return typeof req == "string" ? req : true;
};
adaptor.getTiddlerListCallback = function(status, context, responseText, uri, xhr) {
context.status = status;
context.statusText = xhr.statusText;
context.httpStatus = xhr.status;
if(status) {
context.tiddlers = [];
try {
var tiddlers = $.evalJSON(responseText); //# NB: not actual tiddler instances
} catch(ex) {
context.status = false; // XXX: correct?
context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
if(context.callback) {
context.callback(context, context.userParams);
}
return;
}
for(var i = 0; i < tiddlers.length; i++) {
var tiddler = adaptor.toTiddler(tiddlers[i], context.host);
context.tiddlers.push(tiddler);
}
}
if(context.callback) {
context.callback(context, context.userParams);
}
};
// perform global search
adaptor.prototype.getSearchResults = function(context, userParams, callback) {
context = this.setContext(context, userParams, callback);
var uriTemplate = "%0/search?q=%1%2";
var filterString = context.filters ? ";" + context.filters : "";
var uri = uriTemplate.format([context.host, context.query, filterString]); // XXX: parameters need escaping?
var req = httpReq("GET", uri, adaptor.getSearchResultsCallback,
context, { accept: adaptor.mimeType }, null, null, null, null, true);
return typeof req == "string" ? req : true;
};
adaptor.getSearchResultsCallback = function(status, context, responseText, uri, xhr) {
adaptor.getTiddlerListCallback(status, context, responseText, uri, xhr); // XXX: use apply?
};
// retrieve a particular tiddler's revisions
adaptor.prototype.getTiddlerRevisionList = function(title, limit, context, userParams, callback) {
context = this.setContext(context, userParams, callback);
var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions";
var workspace = adaptor.resolveWorkspace(context.workspace);
var uri = uriTemplate.format([context.host, workspace.type + "s",
adaptor.normalizeTitle(workspace.name), adaptor.normalizeTitle(title)]);
var req = httpReq("GET", uri, adaptor.getTiddlerRevisionListCallback,
context, merge({ accept: adaptor.mimeType }, context.headers), null, null, null, null, true);
return typeof req == "string" ? req : true;
};
adaptor.getTiddlerRevisionListCallback = function(status, context, responseText, uri, xhr) {
context.status = status;
context.statusText = xhr.statusText;
context.httpStatus = xhr.status;
if(status) {
context.revisions = [];
try {
var tiddlers = $.evalJSON(responseText); //# NB: not actual tiddler instances
} catch(ex) {
context.status = false; // XXX: correct?
context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
if(context.callback) {
context.callback(context, context.userParams);
}
return;
}
for(var i = 0; i < tiddlers.length; i++) {
var tiddler = adaptor.toTiddler(tiddlers[i], context.host);
context.revisions.push(tiddler);
}
var sortField = "server.page.revision";
context.revisions.sort(function(a, b) {
return a.fields[sortField] < b.fields[sortField] ? 1 :
(a.fields[sortField] == b.fields[sortField] ? 0 : -1);
});
}
if(context.callback) {
context.callback(context, context.userParams);
}
};
// retrieve an individual tiddler revision -- XXX: breaks with standard arguments list -- XXX: convenience function; simply use getTiddler?
adaptor.prototype.getTiddlerRevision = function(title, revision, context, userParams, callback) {
context = this.setContext(context, userParams, callback);
context.revision = revision;
return this.getTiddler(title, context, userParams, callback);
};
// retrieve an individual tiddler
adaptor.prototype.getTiddler = function(title, context, userParams, callback) {
context = this.setContext(context, userParams, callback);
context.title = title;
if(context.revision) {
var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions/%4";
} else {
uriTemplate = "%0/%1/%2/tiddlers/%3";
}
if(!context.tiddler) {
context.tiddler = new Tiddler(title);
}
context.tiddler.fields["server.type"] = adaptor.serverType;
context.tiddler.fields["server.host"] = AdaptorBase.minHostName(context.host);
context.tiddler.fields["server.workspace"] = context.workspace;
var workspace = adaptor.resolveWorkspace(context.workspace);
var uri = uriTemplate.format([context.host, workspace.type + "s",
adaptor.normalizeTitle(workspace.name), adaptor.normalizeTitle(title),
context.revision]);
var req = httpReq("GET", uri, adaptor.getTiddlerCallback, context,
merge({ accept: adaptor.mimeType }, context.headers), null, null, null, null, true);
return typeof req == "string" ? req : true;
};
adaptor.getTiddlerCallback = function(status, context, responseText, uri, xhr) {
context.status = status;
context.statusText = xhr.statusText;
context.httpStatus = xhr.status;
if(status) {
try {
var tid = $.evalJSON(responseText);
} catch(ex) {
context.status = false;
context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
if(context.callback) {
context.callback(context, context.userParams);
}
return;
}
var tiddler = adaptor.toTiddler(tid, context.host);
tiddler.title = context.tiddler.title;
tiddler.fields["server.etag"] = xhr.getResponseHeader("Etag");
// normally we'd assign context.tiddler = tiddler here - but we can't do
// that because of IE, which triggers getTiddler in putTiddlerCallback,
// and since ServerSideSavingPlugin foolishly relies on persistent
// object references, we need to merge the data into the existing object
$.extend(context.tiddler, tiddler);
}
if(context.callback) {
context.callback(context, context.userParams);
}
};
// retrieve tiddler chronicle (all revisions)
adaptor.prototype.getTiddlerChronicle = function(title, context, userParams, callback) {
context = this.setContext(context, userParams, callback);
context.title = title;
var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions?fat=1";
var workspace = adaptor.resolveWorkspace(context.workspace);
var uri = uriTemplate.format([context.host, workspace.type + "s",
adaptor.normalizeTitle(workspace.name), adaptor.normalizeTitle(title)]);
var req = httpReq("GET", uri, adaptor.getTiddlerChronicleCallback,
context, { accept: adaptor.mimeType }, null, null, null, null, true);
return typeof req == "string" ? req : true;
};
adaptor.getTiddlerChronicleCallback = function(status, context, responseText, uri, xhr) {
context.status = status;
context.statusText = xhr.statusText;
context.httpStatus = xhr.status;
if(status) {
context.responseText = responseText;
}
if(context.callback) {
context.callback(context, context.userParams);
}
};
// store an individual tiddler
adaptor.prototype.putTiddler = function(tiddler, context, userParams, callback) {
context = this.setContext(context, userParams, callback);
context.title = tiddler.title;
context.tiddler = tiddler;
context.host = context.host || this.fullHostName(tiddler.fields["server.host"]);
var uriTemplate = "%0/%1/%2/tiddlers/%3";
try {
context.workspace = context.workspace || tiddler.fields["server.workspace"];
var workspace = adaptor.resolveWorkspace(context.workspace);
} catch(ex) {
return adaptor.locationIDErrorMessage;
}
var uri = uriTemplate.format([context.host, workspace.type + "s",
adaptor.normalizeTitle(workspace.name),
adaptor.normalizeTitle(tiddler.title)]);
var etag = adaptor.generateETag(workspace, tiddler);
var headers = etag ? { "If-Match": etag } : null;
var payload = {
type: tiddler.fields["server.content-type"] || null,
text: tiddler.text,
tags: tiddler.tags,
fields: $.extend({}, tiddler.fields)
};
delete payload.fields.changecount;
$.each(payload.fields, function(key, value) {
if(key.indexOf("server.") == 0) {
delete payload.fields[key];
}
});
payload = $.toJSON(payload);
var req = httpReq("PUT", uri, adaptor.putTiddlerCallback,
context, headers, payload, adaptor.mimeType, null, null, true);
return typeof req == "string" ? req : true;
};
adaptor.putTiddlerCallback = function(status, context, responseText, uri, xhr) {
context.status = [204, 1223].contains(xhr.status);
context.statusText = xhr.statusText;
context.httpStatus = xhr.status;
if(context.status) {
var loc = xhr.getResponseHeader("Location");
var etag = xhr.getResponseHeader("Etag");
if(loc && etag) {
var bag = loc.split("/bags/").pop().split("/")[0];
context.tiddler.fields["server.bag"] = bag;
context.tiddler.fields["server.workspace"] = "bags/" + bag;
var rev = etag.split("/").pop().split(/;|:/)[0];
context.tiddler.fields["server.page.revision"] = rev;
context.tiddler.fields["server.etag"] = etag;
if(context.callback) {
context.callback(context, context.userParams);
}
} else { // IE
context.adaptor.getTiddler(context.tiddler.title, context,
context.userParams, context.callback);
}
} else if(context.callback) {
context.callback(context, context.userParams);
}
};
// store a tiddler chronicle
adaptor.prototype.putTiddlerChronicle = function(revisions, context, userParams, callback) {
context = this.setContext(context, userParams, callback);
context.title = revisions[0].title;
var headers = null;
var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions";
var host = context.host || this.fullHostName(tiddler.fields["server.host"]);
var workspace = adaptor.resolveWorkspace(context.workspace);
var uri = uriTemplate.format([host, workspace.type + "s",
adaptor.normalizeTitle(workspace.name),
adaptor.normalizeTitle(context.title)]);
if(workspace.type == "bag") { // generate ETag
var etag = [adaptor.normalizeTitle(workspace.name),
adaptor.normalizeTitle(context.title), 0].join("/"); //# zero-revision prevents overwriting existing contents
headers = { "If-Match": '"' + etag + '"' };
}
var payload = $.toJSON(revisions);
var req = httpReq("POST", uri, adaptor.putTiddlerChronicleCallback,
context, headers, payload, adaptor.mimeType, null, null, true);
return typeof req == "string" ? req : true;
};
adaptor.putTiddlerChronicleCallback = function(status, context, responseText, uri, xhr) {
context.status = [204, 1223].contains(xhr.status);
context.statusText = xhr.statusText;
context.httpStatus = xhr.status;
if(context.callback) {
context.callback(context, context.userParams);
}
};
// store a collection of tiddlers (import TiddlyWiki HTML store)
adaptor.prototype.putTiddlerStore = function(store, context, userParams, callback) {
context = this.setContext(context, userParams, callback);
var uriTemplate = "%0/%1/%2/tiddlers";
var host = context.host;
var workspace = adaptor.resolveWorkspace(context.workspace);
var uri = uriTemplate.format([host, workspace.type + "s",
adaptor.normalizeTitle(workspace.name)]);
var req = httpReq("POST", uri, adaptor.putTiddlerStoreCallback,
context, null, store, "text/x-tiddlywiki", null, null, true);
return typeof req == "string" ? req : true;
};
adaptor.putTiddlerStoreCallback = function(status, context, responseText, uri, xhr) {
context.status = [204, 1223].contains(xhr.status);
context.statusText = xhr.statusText;
context.httpStatus = xhr.status;
if(context.callback) {
context.callback(context, context.userParams);
}
};
// rename an individual tiddler or move it to a different workspace -- TODO: make {from|to}.title optional
adaptor.prototype.moveTiddler = function(from, to, context, userParams, callback) { // XXX: rename parameters (old/new)?
var self = this;
var newTiddler = store.getTiddler(from.title) || store.getTiddler(to.title); //# local rename might already have occurred
var oldTiddler = $.extend(true, {}, newTiddler); //# required for eventual deletion
oldTiddler.title = from.title; //# required for original tiddler's ETag
var _getTiddlerChronicle = function(title, context, userParams, callback) {
return self.getTiddlerChronicle(title, context, userParams, callback);
};
var _putTiddlerChronicle = function(context, userParams) {
if(!context.status) {
return callback(context, userParams);
}
var revisions = $.evalJSON(context.responseText); // XXX: error handling?
// change current title while retaining previous location
for(var i = 0; i < revisions.length; i++) {
delete revisions[i].revision;
if(!revisions[i].fields.origin) { // NB: origin = "<workspace>/<title>"
revisions[i].fields.origin = ["bags", revisions[i].bag, revisions[i].title].join("/");
}
revisions[i].title = to.title;
}
// add new revision
var rev = $.extend({}, revisions[0]);
$.each(newTiddler, function(i, item) {
if(!$.isFunction(item)) {
rev[i] = item;
}
});
rev.title = to.title;
rev.created = rev.created.convertToYYYYMMDDHHMM();
rev.modified = new Date().convertToYYYYMMDDHHMM();
delete rev.fields.changecount;
revisions.unshift(rev);
if(to.workspace) {
context.workspace = to.workspace;
} else if(context.workspace.substring(0, 4) != "bags") { // NB: target workspace must be a bag
context.workspace = "bags/" + rev.bag;
}
var subCallback = function(context, userParams) {
if(!context.status) {
return callback(context, userParams);
}
context.adaptor.getTiddler(newTiddler.title, context, userParams, _deleteTiddler);
};
return self.putTiddlerChronicle(revisions, context, context.userParams, subCallback);
};
var _deleteTiddler = function(context, userParams) {
if(!context.status) {
return callback(context, userParams);
}
$.extend(true, newTiddler, context.tiddler);
context.callback = null;
return self.deleteTiddler(oldTiddler, context, context.userParams, callback);
};
callback = callback || function() {};
context = this.setContext(context, userParams);
context.host = context.host || oldTiddler.fields["server.host"];
context.workspace = from.workspace || oldTiddler.fields["server.workspace"];
return _getTiddlerChronicle(from.title, context, userParams, _putTiddlerChronicle);
};
// delete an individual tiddler
adaptor.prototype.deleteTiddler = function(tiddler, context, userParams, callback) {
context = this.setContext(context, userParams, callback);
context.title = tiddler.title; // XXX: not required!?
var uriTemplate = "%0/bags/%1/tiddlers/%2";
var host = context.host || this.fullHostName(tiddler.fields["server.host"]);
var bag = tiddler.fields["server.bag"];
if(!bag) {
return adaptor.noBagErrorMessage;
}
var uri = uriTemplate.format([host, adaptor.normalizeTitle(bag),
adaptor.normalizeTitle(tiddler.title)]);
var etag = adaptor.generateETag({ type: "bag", name: bag }, tiddler);
var headers = etag ? { "If-Match": etag } : null;
var req = httpReq("DELETE", uri, adaptor.deleteTiddlerCallback, context, headers,
null, null, null, null, true);
return typeof req == "string" ? req : true;
};
adaptor.deleteTiddlerCallback = function(status, context, responseText, uri, xhr) {
context.status = [204, 1223].contains(xhr.status);
context.statusText = xhr.statusText;
context.httpStatus = xhr.status;
if(context.callback) {
context.callback(context, context.userParams);
}
};
// compare two revisions of a tiddler (requires TiddlyWeb differ plugin)
adaptor.prototype.getTiddlerDiff = function(title, context, userParams, callback) {
context = this.setContext(context, userParams, callback);
context.title = title;
var tiddler = store.getTiddler(title);
try {
var workspace = adaptor.resolveWorkspace(tiddler.fields["server.workspace"]);
} catch(ex) {
return adaptor.locationIDErrorMessage;
}
var tiddlerRef = [workspace.type + "s", workspace.name, tiddler.title].join("/");
var rev1 = context.rev1 ? [tiddlerRef, context.rev1].join("/") : tiddlerRef;
var rev2 = context.rev2 ? [tiddlerRef, context.rev2].join("/") : null;
var uriTemplate = "%0/diff?rev1=%1";
if(rev2) {
uriTemplate += "&rev2=%2";
}
if(context.format) {
uriTemplate += "&format=%3";
}
var host = context.host || this.fullHostName(tiddler.fields["server.host"]);
var uri = uriTemplate.format([host, adaptor.normalizeTitle(rev1),
adaptor.normalizeTitle(rev2), context.format]);
if(rev2) {
var req = httpReq("GET", uri, adaptor.getTiddlerDiffCallback, context, null,
null, null, null, null, true);
} else {
var payload = {
title: tiddler.title,
text: tiddler.text,
modifier: tiddler.modifier,
tags: tiddler.tags,
fields: $.extend({}, tiddler.fields)
}; // XXX: missing attributes!?
payload = $.toJSON(payload);
req = httpReq("POST", uri, adaptor.getTiddlerDiffCallback, context,
null, payload, adaptor.mimeType, null, null, true);
}
return typeof req == "string" ? req : true;
};
adaptor.getTiddlerDiffCallback = function(status, context, responseText, uri, xhr) {
context.status = status;
context.statusText = xhr.statusText;
context.httpStatus = xhr.status;
context.uri = uri;
if(status) {
context.diff = responseText;
}
if(context.callback) {
context.callback(context, context.userParams);
}
};
// generate tiddler information
adaptor.prototype.generateTiddlerInfo = function(tiddler) {
var info = {};
var uriTemplate = "%0/%1/%2/tiddlers/%3";
var host = this.host || tiddler.fields["server.host"]; // XXX: this.host obsolete?
host = this.fullHostName(host);
var workspace = adaptor.resolveWorkspace(tiddler.fields["server.workspace"]);
info.uri = uriTemplate.format([host, workspace.type + "s",
adaptor.normalizeTitle(workspace.name),
adaptor.normalizeTitle(tiddler.title)]);
return info;
};
// create Tiddler instance from TiddlyWeb tiddler JSON
adaptor.toTiddler = function(json, host) {
var created = Date.convertFromYYYYMMDDHHMM(json.created);
var modified = Date.convertFromYYYYMMDDHHMM(json.modified);
var fields = json.fields;
fields["server.type"] = adaptor.serverType;
fields["server.host"] = AdaptorBase.minHostName(host);
fields["server.bag"] = json.bag;
fields["server.title"] = json.title;
if(json.recipe) {
fields["server.recipe"] = json.recipe;
}
if(json.type && json.type != "None") {
fields["server.content-type"] = json.type;
}
fields["server.permissions"] = json.permissions.join(", ");
fields["server.page.revision"] = json.revision;
fields["server.workspace"] = "bags/" + json.bag;
var tiddler = new Tiddler(json.title);
tiddler.assign(tiddler.title, json.text, json.modifier, modified, json.tags,
created, json.fields, json.creator);
return tiddler;
};
adaptor.resolveWorkspace = function(workspace) {
var components = workspace.split("/");
return {
type: components[0] == "bags" ? "bag" : "recipe",
name: components[1] || components[0]
};
};
adaptor.generateETag = function(workspace, tiddler) {
var revision = tiddler.fields["server.page.revision"];
var etag = revision == "false" ? null : tiddler.fields["server.etag"];
if(!etag && workspace.type == "bag") {
if(typeof revision == "undefined") {
revision = "0";
} else if(revision == "false") {
return null;
}
etag = [adaptor.normalizeTitle(workspace.name),
adaptor.normalizeTitle(tiddler.title), revision].join("/");
etag = '"' + etag + '"';
}
return etag;
};
adaptor.normalizeTitle = function(title) {
return encodeURIComponent(title);
};
})(jQuery);
/*
* jQuery JSON Plugin
* version: 1.3
* source: http://code.google.com/p/jquery-json/
* license: MIT (http://www.opensource.org/licenses/mit-license.php)
*/
(function($){function toIntegersAtLease(n)
{return n<10?'0'+n:n;}
Date.prototype.toJSON=function(date)
{return this.getUTCFullYear()+'-'+
toIntegersAtLease(this.getUTCMonth())+'-'+
toIntegersAtLease(this.getUTCDate());};var escapeable=/["\\\x00-\x1f\x7f-\x9f]/g;var meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};$.quoteString=function(string)
{if(escapeable.test(string))
{return'"'+string.replace(escapeable,function(a)
{var c=meta[a];if(typeof c==='string'){return c;}
c=a.charCodeAt();return'\\u00'+Math.floor(c/16).toString(16)+(c%16).toString(16);})+'"';}
return'"'+string+'"';};$.toJSON=function(o,compact)
{var type=typeof(o);if(type=="undefined")
return"undefined";else if(type=="number"||type=="boolean")
return o+"";else if(o===null)
return"null";if(type=="string")
{return $.quoteString(o);}
if(type=="object"&&typeof o.toJSON=="function")
return o.toJSON(compact);if(type!="function"&&typeof(o.length)=="number")
{var ret=[];for(var i=0;i<o.length;i++){ret.push($.toJSON(o[i],compact));}
if(compact)
return"["+ret.join(",")+"]";else
return"["+ret.join(", ")+"]";}
if(type=="function"){throw new TypeError("Unable to convert object of type 'function' to json.");}
var ret=[];for(var k in o){var name;type=typeof(k);if(type=="number")
name='"'+k+'"';else if(type=="string")
name=$.quoteString(k);else
continue;var val=$.toJSON(o[k],compact);if(typeof(val)!="string"){continue;}
if(compact)
ret.push(name+":"+val);else
ret.push(name+": "+val);}
return"{"+ret.join(", ")+"}";};$.compactJSON=function(o)
{return $.toJSON(o,true);};$.evalJSON=function(src)
{return eval("("+src+")");};$.secureEvalJSON=function(src)
{var filtered=src;filtered=filtered.replace(/\\["\\\/bfnrtu]/g,'@');filtered=filtered.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']');filtered=filtered.replace(/(?:^|:|,)(?:\s*\[)+/g,'');if(/^[\],:{}\s]*$/.test(filtered))
return eval("("+src+")");else
throw new SyntaxError("Error parsing JSON, source is not valid.");};})(jQuery);
//}}}
/***
|''Name''|ServerSideSavingPlugin|
|''Description''|server-side saving|
|''Author''|FND|
|''Version''|0.6.5|
|''Status''|stable|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/ServerSideSavingPlugin.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5.3|
|''Keywords''|serverSide|
!Notes
This plugin relies on a dedicated adaptor to be present.
The specific nature of this plugin depends on the respective server.
!Revision History
!!v0.1 (2008-11-24)
* initial release
!!v0.2 (2008-12-01)
* added support for local saving
!!v0.3 (2008-12-03)
* added Save to Web macro for manual synchronization
!!v0.4 (2009-01-15)
* removed ServerConfig dependency by detecting server type from the respective tiddlers
!!v0.5 (2009-08-25)
* raised CoreVersion to 2.5.3 to take advantage of core fixes
!!v0.6 (2010-04-21)
* added notification about cross-domain restrictions to ImportTiddlers
!To Do
* conflict detection/resolution
* rename to ServerLinkPlugin?
* document deletion/renaming convention
!Code
***/
//{{{
(function($) {
readOnly = false; //# enable editing over HTTP
var plugin = config.extensions.ServerSideSavingPlugin = {};
plugin.locale = {
saved: "%0 saved successfully",
saveError: "Error saving %0: %1",
saveConflict: "Error saving %0: edit conflict",
deleted: "Removed %0",
deleteError: "Error removing %0: %1",
deleteLocalError: "Error removing %0 locally",
removedNotice: "This tiddler has been deleted.",
connectionError: "connection could not be established",
hostError: "Unable to import from this location due to cross-domain restrictions."
};
plugin.sync = function(tiddlers) {
tiddlers = tiddlers && tiddlers[0] ? tiddlers : store.getTiddlers();
$.each(tiddlers, function(i, tiddler) {
var changecount = parseInt(tiddler.fields.changecount, 10);
if(tiddler.fields.deleted === "true" && changecount === 1) {
plugin.removeTiddler(tiddler);
} else if(tiddler.isTouched() && !tiddler.doNotSave() &&
tiddler.getServerType() && tiddler.fields["server.host"]) { // XXX: server.host could be empty string
delete tiddler.fields.deleted;
plugin.saveTiddler(tiddler);
}
});
};
plugin.saveTiddler = function(tiddler) {
try {
var adaptor = this.getTiddlerServerAdaptor(tiddler);
} catch(ex) {
return false;
}
var context = {
tiddler: tiddler,
changecount: tiddler.fields.changecount,
workspace: tiddler.fields["server.workspace"]
};
var serverTitle = tiddler.fields["server.title"]; // indicates renames
if(!serverTitle) {
tiddler.fields["server.title"] = tiddler.title;
} else if(tiddler.title != serverTitle) {
return adaptor.moveTiddler({ title: serverTitle },
{ title: tiddler.title }, context, null, this.saveTiddlerCallback);
}
var req = adaptor.putTiddler(tiddler, context, {}, this.saveTiddlerCallback);
return req ? tiddler : false;
};
plugin.saveTiddlerCallback = function(context, userParams) {
var tiddler = context.tiddler;
if(context.status) {
if(tiddler.fields.changecount == context.changecount) { //# check for changes since save was triggered
tiddler.clearChangeCount();
} else if(tiddler.fields.changecount > 0) {
tiddler.fields.changecount -= context.changecount;
}
plugin.reportSuccess("saved", tiddler);
store.setDirty(false);
} else {
if(context.httpStatus == 412) {
plugin.reportFailure("saveConflict", tiddler);
} else {
plugin.reportFailure("saveError", tiddler, context);
}
}
};
plugin.removeTiddler = function(tiddler) {
try {
var adaptor = this.getTiddlerServerAdaptor(tiddler);
} catch(ex) {
return false;
}
var context = {
host: tiddler.fields["server.host"],
workspace: tiddler.fields["server.workspace"],
tiddler: tiddler
};
var req = adaptor.deleteTiddler(tiddler, context, {}, this.removeTiddlerCallback);
return req ? tiddler : false;
};
plugin.removeTiddlerCallback = function(context, userParams) {
var tiddler = context.tiddler;
if(context.status) {
if(tiddler.fields.deleted === "true") {
store.deleteTiddler(tiddler.title);
} else {
plugin.reportFailure("deleteLocalError", tiddler);
}
plugin.reportSuccess("deleted", tiddler);
store.setDirty(false);
} else {
plugin.reportFailure("deleteError", tiddler, context);
}
};
plugin.getTiddlerServerAdaptor = function(tiddler) { // XXX: rename?
var type = tiddler.fields["server.type"] || config.defaultCustomFields["server.type"];
return new config.adaptors[type]();
};
plugin.reportSuccess = function(msg, tiddler) {
displayMessage(plugin.locale[msg].format([tiddler.title]));
};
plugin.reportFailure = function(msg, tiddler, context) {
var desc = (context && context.httpStatus) ? context.statusText :
plugin.locale.connectionError;
displayMessage(plugin.locale[msg].format([tiddler.title, desc]));
};
config.macros.saveToWeb = { // XXX: hijack existing sync macro?
locale: { // TODO: merge with plugin.locale?
btnLabel: "save to web",
btnTooltip: "synchronize changes",
btnAccessKey: null
},
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
createTiddlyButton(place, this.locale.btnLabel, this.locale.btnTooltip,
plugin.sync, null, null, this.locale.btnAccessKey);
}
};
window.saveChanges = function(onlyIfDirty, tiddlers) {
plugin.sync(tiddlers);
};
// override removeTiddler to flag tiddler as deleted -- XXX: use hijack to preserve compatibility?
TiddlyWiki.prototype.removeTiddler = function(title) { // XXX: should override deleteTiddler instance method?
var tiddler = this.fetchTiddler(title);
if(tiddler) {
tiddler.tags = ["excludeLists", "excludeSearch", "excludeMissing"];
tiddler.text = plugin.locale.removedNotice;
tiddler.fields.deleted = "true"; // XXX: rename to removed/tiddlerRemoved?
tiddler.fields.changecount = "1";
this.notify(title, true);
this.setDirty(true);
}
};
// hijack ImportTiddlers wizard to handle cross-domain restrictions
var _onOpen = config.macros.importTiddlers.onOpen;
config.macros.importTiddlers.onOpen = function(ev) {
var btn = $(resolveTarget(ev));
var url = btn.closest(".wizard").find("input[name=txtPath]").val();
if(window.location.protocol != "file:" && url.indexOf("://") != -1) {
var host = url.split("/")[2];
var macro = config.macros.importTiddlers;
if(host != window.location.host) {
btn.text(macro.cancelLabel).attr("title", macro.cancelPrompt);
btn[0].onclick = macro.onCancel;
$('<span class="status" />').text(plugin.locale.hostError).insertAfter(btn);
return false;
}
}
return _onOpen.apply(this, arguments);
};
})(jQuery);
//}}}
//--
//-- Backstage
//--
// Backstage tasks
config.tasks.save.action = saveChanges;
var backstage = {
area: null,
toolbar: null,
button: null,
showButton: null,
hideButton: null,
cloak: null,
panel: null,
panelBody: null,
panelFooter: null,
currTabName: null,
currTabElem: null,
content: null,
init: function() {
var cmb = config.messages.backstage;
this.area = document.getElementById("backstageArea");
this.toolbar = jQuery("#backstageToolbar").empty()[0];
this.button = jQuery("#backstageButton").empty()[0];
this.button.style.display = "block";
var t = cmb.open.text + " " + glyph("bentArrowLeft");
this.showButton = createTiddlyButton(this.button,t,cmb.open.tooltip,
function(e) {backstage.show(); return false;},null,"backstageShow");
t = glyph("bentArrowRight") + " " + cmb.close.text;
this.hideButton = createTiddlyButton(this.button,t,cmb.close.tooltip,
function(e) {backstage.hide(); return false;},null,"backstageHide");
this.cloak = document.getElementById("backstageCloak");
this.panel = document.getElementById("backstagePanel");
this.panelFooter = createTiddlyElement(this.panel,"div",null,"backstagePanelFooter");
this.panelBody = createTiddlyElement(this.panel,"div",null,"backstagePanelBody");
this.cloak.onmousedown = function(e) {backstage.switchTab(null);};
createTiddlyText(this.toolbar,cmb.prompt);
for(t=0; t<config.backstageTasks.length; t++) {
var taskName = config.backstageTasks[t];
var task = config.tasks[taskName];
var handler = task.action ? this.onClickCommand : this.onClickTab;
var text = task.text + (task.action ? "" : glyph("downTriangle"));
var btn = createTiddlyButton(this.toolbar,text,task.tooltip,handler,"backstageTab");
jQuery(btn).addClass(task.action ? "backstageAction" : "backstageTask");
btn.setAttribute("task", taskName);
}
this.content = document.getElementById("contentWrapper");
if(config.options.chkBackstage)
this.show();
else
this.hide();
},
isVisible: function() {
return this.area ? this.area.style.display == "block" : false;
},
show: function() {
this.area.style.display = "block";
if(anim && config.options.chkAnimate) {
backstage.toolbar.style.left = findWindowWidth() + "px";
var p = [{style: "left", start: findWindowWidth(), end: 0, template: "%0px"}];
anim.startAnimating(new Morpher(backstage.toolbar,config.animDuration,p));
} else {
backstage.area.style.left = "0px";
}
jQuery(this.showButton).hide();
jQuery(this.hideButton).show();
config.options.chkBackstage = true;
saveOption("chkBackstage");
jQuery(this.content).addClass("backstageVisible");
},
hide: function() {
if(this.currTabElem) {
this.switchTab(null);
} else {
backstage.toolbar.style.left = "0px";
if(anim && config.options.chkAnimate) {
var p = [{style: "left", start: 0, end: findWindowWidth(), template: "%0px"}];
var c = function(element,properties) {backstage.area.style.display = "none";};
anim.startAnimating(new Morpher(backstage.toolbar,config.animDuration,p,c));
} else {
this.area.style.display = "none";
}
this.showButton.style.display = "block";
this.hideButton.style.display = "none";
config.options.chkBackstage = false;
saveOption("chkBackstage");
jQuery(this.content).removeClass("backstageVisible");
}
},
onClickCommand: function(e) {
var task = config.tasks[this.getAttribute("task")];
if(task.action) {
backstage.switchTab(null);
task.action();
}
return false;
},
onClickTab: function(e) {
backstage.switchTab(this.getAttribute("task"));
return false;
},
// Switch to a given tab, or none if null is passed
switchTab: function(tabName) {
var tabElem = null;
var e = this.toolbar.firstChild;
while(e) {
if(e.getAttribute && e.getAttribute("task") == tabName)
tabElem = e;
e = e.nextSibling;
}
if(tabName == backstage.currTabName) {
backstage.hidePanel();
return;
}
if(backstage.currTabElem) {
jQuery(this.currTabElem).removeClass("backstageSelTab");
}
if(tabElem && tabName) {
backstage.preparePanel();
jQuery(tabElem).addClass("backstageSelTab");
var task = config.tasks[tabName];
wikify(task.content,backstage.panelBody,null,null);
backstage.showPanel();
} else if(backstage.currTabElem) {
backstage.hidePanel();
}
backstage.currTabName = tabName;
backstage.currTabElem = tabElem;
},
isPanelVisible: function() {
return backstage.panel ? backstage.panel.style.display == "block" : false;
},
preparePanel: function() {
backstage.cloak.style.height = findDocHeight() + "px";
backstage.cloak.style.display = "block";
jQuery(backstage.panelBody).empty();
return backstage.panelBody;
},
showPanel: function() {
backstage.panel.style.display = "block";
if(anim && config.options.chkAnimate) {
backstage.panel.style.top = (-backstage.panel.offsetHeight) + "px";
var p = [{style: "top", start: -backstage.panel.offsetHeight, end: 0, template: "%0px"}];
anim.startAnimating(new Morpher(backstage.panel,config.animDuration,p),new Scroller(backstage.panel,false));
} else {
backstage.panel.style.top = "0px";
}
return backstage.panelBody;
},
hidePanel: function() {
if(backstage.currTabElem)
jQuery(backstage.currTabElem).removeClass("backstageSelTab");
backstage.currTabElem = null;
backstage.currTabName = null;
if(anim && config.options.chkAnimate) {
var p = [
{style: "top", start: 0, end: -(backstage.panel.offsetHeight), template: "%0px"},
{style: "display", atEnd: "none"}
];
var c = function(element,properties) {backstage.cloak.style.display = "none";};
anim.startAnimating(new Morpher(backstage.panel,config.animDuration,p,c));
} else {
jQuery([backstage.panel,backstage.cloak]).hide();
}
}
};
config.macros.backstage = {};
config.macros.backstage.handler = function(place,macroName,params)
{
var backstageTask = config.tasks[params[0]];
if(backstageTask)
createTiddlyButton(place,backstageTask.text,backstageTask.tooltip,function(e) {backstage.switchTab(params[0]); return false;});
};
//--
//-- Main
//--
var params = null; // Command line parameters
var store = null; // TiddlyWiki storage
var story = null; // Main story
var formatter = null; // Default formatters for the wikifier
var anim = typeof Animator == "function" ? new Animator() : null; // Animation engine
var readOnly = false; // Whether we're in readonly mode
var highlightHack = null; // Embarrassing hack department...
var hadConfirmExit = false; // Don't warn more than once
var safeMode = false; // Disable all plugins and cookies
var showBackstage; // Whether to include the backstage area
var installedPlugins = []; // Information filled in when plugins are executed
var startingUp = false; // Whether we're in the process of starting up
var pluginInfo,tiddler; // Used to pass information to plugins in loadPlugins()
jQuery(document).ready(function() {
jQuery("#contentWrapper").addClass("loading").text("Loading Space...");
var total_tiddlers = -1;
ajaxReq({ dataType: "text", url: "/tiddlers", success: function(text) {
total_tiddlers = text.split("\n").length;
}
});
ajaxReq({ dataType: "json", url: "/status", success: function(status) {
var host = window.location.protocol + "//" + window.location.hostname;
var workspace = "recipes/" + status["space"]["recipe"];
config.defaultCustomFields = {
"server.workspace": workspace,
"server.type": "tiddlyweb",
"server.host": host
};
var defaults = config.defaultCustomFields;
var filter = "?mselect=tag:systemConfig,tag:excludeLists&type:!text/css&select=type:!text/html&select=type:!image/png&select=type:!image/jpg&select=type:!image/gif&select=type:!image/jpeg";
var time = 0, start = 0, total = 50;
var lazy_load_content = function(title) {
window.setTimeout(function() {
if(time < 0) {
return;
}
ajaxReq({
dataType: "json",
data: {
"fat": "1"
},
url: host + "/tiddlers?sort=-modified&limit=" + start + "," + total,
success: function(tids) {
for(var i = 0; i < tids.length; i++) {
var tid = config.adaptors.tiddlyweb.toTiddler(tids[i], host);
store.addTiddler(tid);
store.notify(tid.title);
story.refreshTiddler(tid.title, null, true);
}
if(tids.length === 0) {
time = -1;
} else {
if(total_tiddlers > -1) {
var pc = 100 - Math.floor(((total_tiddlers - store.getTiddlers().length) / total_tiddlers) * 100);
displayMessage(pc + "% of document loaded.");
}
start += total;
time += 100;
lazy_load_content(title);
}
},
});
}, time);
}
var success = function(json) {
store = new TiddlyWiki({config:config});
invokeParamifier(params,"oninit");
story = new Story("tiddlerDisplay","tiddler");
jQuery("#contentWrapper").removeClass("loading");
for(var i = 0; i < json.length; i++) {
var title = json[i].title;
if(["ServerSideSavingPlugin",
"TiddlySpaceInit", "TiddlyWebAdaptor", "LoadMissingTiddlersPlugin"].indexOf(title) === -1) {
var tid = config.adaptors.tiddlyweb.toTiddler(json[i], host);
store.addTiddler(tid);
}
}
lazy_load_content();
main();
};
ajaxReq({
dataType: "json",
data: {
"fat": "1"
},
url: host + "/" + workspace + "/tiddlers" + filter,
success: function(tiddlers) {
success(tiddlers);
},
error: function() {
jQuery("#contentWrapper").addClass("error").text("Error occurred loading your tiddlers");
}
});
}});
});
// Starting up
function main()
{
var t10,t9,t8,t7,t6,t5,t4,t3,t2,t1,t0 = new Date();
startingUp = true;
var doc = jQuery(document);
jQuery.noConflict();
window.onbeforeunload = function(e) {if(window.confirmExit) return confirmExit();};
params = getParameters();
if(params)
params = params.parseParams("open",null,false);
addEvent(document,"click",Popup.onDocumentClick);
var s;
for(s=0; s<config.notifyTiddlers.length; s++)
store.addNotification(config.notifyTiddlers[s].name,config.notifyTiddlers[s].notify);
t1 = new Date();
loadShadowTiddlers();
doc.trigger("loadShadows");
t2 = new Date();
store.loadFromDiv("storeArea","store",true);
doc.trigger("loadTiddlers");
loadOptions();
t3 = new Date();
invokeParamifier(params,"onload");
t4 = new Date();
readOnly = (window.location.protocol == "file:") ? false : config.options.chkHttpReadOnly;
var pluginProblem = loadPlugins("systemConfig");
doc.trigger("loadPlugins");
t5 = new Date();
formatter = new Formatter(config.formatters);
invokeParamifier(params,"onconfig");
story.switchTheme(config.options.txtTheme);
showBackstage = showBackstage !== undefined ? showBackstage : !readOnly;
t6 = new Date();
var m;
for(m in config.macros) {
if(config.macros[m].init)
config.macros[m].init();
}
t7 = new Date();
store.notifyAll();
t8 = new Date();
restart();
refreshDisplay();
t9 = new Date();
if(pluginProblem) {
story.displayTiddler(null,"PluginManager");
displayMessage(config.messages.customConfigError);
}
if(showBackstage)
backstage.init();
t10 = new Date();
if(config.options.chkDisplayInstrumentation) {
displayMessage("LoadShadows " + (t2-t1) + " ms");
displayMessage("LoadFromDiv " + (t3-t2) + " ms");
displayMessage("LoadPlugins " + (t5-t4) + " ms");
displayMessage("Macro init " + (t7-t6) + " ms");
displayMessage("Notify " + (t8-t7) + " ms");
displayMessage("Restart " + (t9-t8) + " ms");
displayMessage("Total: " + (t10-t0) + " ms");
}
startingUp = false;
doc.trigger("startup");
}
// Called on unload. All functions called conditionally since they themselves may have been unloaded.
function unload()
{
if(window.checkUnsavedChanges)
checkUnsavedChanges();
if(window.scrubNodes)
scrubNodes(document.body);
}
// Restarting
function restart()
{
invokeParamifier(params,"onstart");
if(story.isEmpty()) {
story.displayDefaultTiddlers();
}
window.scrollTo(0,0);
}
function loadShadowTiddlers()
{
var shadows = new TiddlyWiki();
shadows.loadFromDiv("shadowArea","shadows",true);
shadows.forEachTiddler(function(title,tiddler){config.shadowTiddlers[title] = tiddler.text;});
}
function loadPlugins(tag)
{
if(safeMode)
return false;
var tiddlers = store.getTaggedTiddlers(tag);
tiddlers.sort(function(a,b) {return a.title < b.title ? -1 : (a.title == b.title ? 0 : 1);});
var toLoad = [];
var nLoaded = 0;
var map = {};
var nPlugins = tiddlers.length;
installedPlugins = [];
var i;
for(i=0; i<nPlugins; i++) {
var p = getPluginInfo(tiddlers[i]);
installedPlugins[i] = p;
var n = p.Name || p.title;
if(n)
map[n] = p;
n = p.Source;
if(n)
map[n] = p;
}
var visit = function(p) {
if(!p || p.done)
return;
p.done = 1;
var reqs = p.Requires;
if(reqs) {
reqs = reqs.readBracketedList();
var i;
for(i=0; i<reqs.length; i++)
visit(map[reqs[i]]);
}
toLoad.push(p);
};
for(i=0; i<nPlugins; i++)
visit(installedPlugins[i]);
for(i=0; i<toLoad.length; i++) {
p = toLoad[i];
pluginInfo = p;
tiddler = p.tiddler;
if(isPluginExecutable(p)) {
if(isPluginEnabled(p)) {
p.executed = true;
var startTime = new Date();
try {
if(tiddler.text)
window.eval(tiddler.text);
nLoaded++;
} catch(ex) {
p.log.push(config.messages.pluginError.format([exceptionText(ex)]));
p.error = true;
if(!console.tiddlywiki) {
console.log("error evaluating " + tiddler.title, ex);
}
}
pluginInfo.startupTime = String((new Date()) - startTime) + "ms";
} else {
nPlugins--;
}
} else {
p.warning = true;
}
}
return nLoaded != nPlugins;
}
function getPluginInfo(tiddler)
{
var p = store.getTiddlerSlices(tiddler.title,["Name","Description","Version","Requires","CoreVersion","Date","Source","Author","License","Browsers"]);
p.tiddler = tiddler;
p.title = tiddler.title;
p.log = [];
return p;
}
// Check that a particular plugin is valid for execution
function isPluginExecutable(plugin)
{
if(plugin.tiddler.isTagged("systemConfigForce")) {
plugin.log.push(config.messages.pluginForced);
return true;
}
if(plugin["CoreVersion"]) {
var coreVersion = plugin["CoreVersion"].split(".");
var w = parseInt(coreVersion[0],10) - version.major;
if(w == 0 && coreVersion[1])
w = parseInt(coreVersion[1],10) - version.minor;
if(w == 0 && coreVersion[2])
w = parseInt(coreVersion[2],10) - version.revision;
if(w > 0) {
plugin.log.push(config.messages.pluginVersionError);
return false;
}
}
return true;
}
function isPluginEnabled(plugin)
{
if(plugin.tiddler.isTagged("systemConfigDisable")) {
plugin.log.push(config.messages.pluginDisabled);
return false;
}
return true;
}
/*
* A new bookmarklet for TiddlySpace
*
* Use the following Bookmarklet to test:
* javascript:(function(a,b)%7Ba=b.createElement('script');a.setAttribute('src','http://sandben.tiddlyspace.com/bookmarklet.js');b.body.appendChild(a);a.addEventListener('load',function()%7BloadBookmarker('http://sandben.tiddlyspace.com/bookmark','sandben');%7D,false);%7D(null,document))
*/
/*
* @url: url of the bookmarklet
* @space: space to save back to
* @callback: callback to call when the window closes
*/
function loadBookmarker(url, space, callback) {
function getText() {
var text = '';
if (window.getSelection) {
text = window.getSelection().toString();
} else if (document.getSelection) {
text = document.getSelection();
} else if (document.selection) {
text = document.selection.createRange().text;
} else {
text = '';
}
return text;
}
function getImages() {
var images = [],
candidates = document.getElementsByTagName('img'),
res = [],
i, l, image;
for (i = 0, l = candidates.length; i < l; i++) {
image = candidates[i];
if ((image.offsetWidth >= 150 && image.offsetHeight >= 50)
|| (image.offsetWidth >= 50 && image.offsetHeight >= 150)) {
images.push(image);
}
}
images = images.sort(function(a, b) {
var aSize = a.offsetWidth * a.offsetHeight,
bSize = b.offsetWidth * b.offsetHeight;
return (aSize > bSize) ? -1 : ((aSize === bSize) ? 0 : 1);
});
for (i = 0, l = images.length; i < l; i++) {
image = images[i];
if (image.src) {
res.push(image.src);
}
}
return res;
}
var container = document.createElement('div'),
iframe = document.createElement('iframe'),
stylesheet = document.createElement('style'),
randID = ('' + Math.random()).slice(2),
bookmarkletID = 'bookmarklet' + randID,
cloakID = 'cloak' + randID,
style = [
'#' + bookmarkletID + ' {',
'width: 555px;',
'height: 87%;',
'max-height: 527px;',
'min-height: 300px;',
'position: fixed;',
'top: 0;',
'left: 0;',
'bottom: 0;',
'margin: 10% 25%;',
'z-index: 10000;',
'border: 0;',
'}',
'@media all and (min-width: 1360px) {',
'#' + bookmarkletID + ' {',
'margin: 10% 30%;',
'}',
'}',
'@media all and (max-width: 800px) {',
'#' + bookmarkletID + ' {',
'margin: 10%;',
'}',
'}',
'@media all and (max-width: 600px) {',
'#' + bookmarkletID + ' {',
'margin: 10% 5%;',
'}',
'}',
'@media all and (max-width: 550px) {',
'#' + bookmarkletID + ' {',
'margin: 10% 0;',
'width: 100%;',
'}',
'}',
'#' + cloakID + ' {',
'position: fixed;',
'top: 0;',
'bottom: 0;',
'left: 0;',
'right: 0;',
'background-color: rgba(11, 18, 29, 0.6);',
'z-index: 9999;',
'}'
].join('\n');
urlBase = url.replace(/^(.*)([^\/])(\/[^\/].*)/,
function($0, $1, $2) {
return ($1) ? $1 + $2 : '';
});
function closeBookmarker() {
document.body.removeChild(container);
if (callback) {
callback();
}
}
stylesheet.innerHTML = style;
document.body.appendChild(stylesheet);
iframe.src = url;
iframe.id = bookmarkletID;
container.appendChild(iframe);
container.id = cloakID;
document.body.appendChild(container);
iframe.addEventListener('load', function() {
var message = JSON.stringify({
title: document.title,
url: window.location.href,
space: space,
text: getText(),
images: getImages(),
from: 'TiddlySpace'
});
iframe.contentWindow.postMessage(message, urlBase);
}, false);
window.addEventListener('message', function(event) {
if ((event.origin === urlBase) && (event.data === 'close')) {
closeBookmarker();
}
}, false);
container.addEventListener('click', function() {
closeBookmarker();
});
}
(function() {
// check if we should run straight away
var scripts = document.getElementsByTagName('script');
for (var i = 0, l = scripts.length; i < l; i++) {
var attribute = scripts[i].getAttribute('data-tiddlyspace-trigger-hack'),
args;
// if there's a script from tiddlyspace with the right attribute
if (attribute) {
args = JSON.parse(attribute);
// remove the script when the bookmarklet closes
args.push(function() {
document.body.removeChild(scripts[i]);
});
loadBookmarker.apply(window, args);
return;
}
}
}());
inbox zero across all (of several) inboxes
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="434 218 68 68"
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
<g>
<path d="M 478.39694 232.53705 L 478.39694 232.53705
C 477.1145 231.85132 475.77875 231.30147 474.41058 230.88734 L 474.41058 218.24994 L 461.58942 218.24994
L 461.58942 230.88734 C 460.22125 231.30147 458.8855 231.85132 457.60306 232.53705 L 448.66824 223.60214
L 439.6022 232.66814 L 448.53717 241.60304 C 447.8515 242.8854 447.30157 244.22116 446.88745 245.58936
L 434.25 245.58936 L 434.25 258.41052 L 446.88745 258.41052
C 447.30157 259.77869 447.8515 261.11447 448.53717 262.39688 L 439.6022 271.33173 L 448.66824 280.3978
L 457.60306 271.46283 C 458.8855 272.14862 460.22125 272.69846 461.58942 273.11252 L 461.58942 285.74988
L 474.41058 285.74988 L 474.41058 273.11252 C 475.77875 272.69846 477.1145 272.14862 478.39694 271.46283
L 487.33176 280.3978 L 496.39767 271.33173 L 487.46286 262.39688
C 488.14853 261.11447 488.69836 259.77869 489.11255 258.41052 L 501.74988 258.41052 L 501.74988 245.58936
L 489.11255 245.58936 C 488.69836 244.22116 488.14853 242.8854 487.46286 241.60304 L 496.39767 232.66814
L 487.33176 223.60214 Z M 475.3328 244.66714 C 479.3825 248.71698 479.3825 255.2829 475.3328 259.33273
C 471.28296 263.3826 464.71704 263.3826 460.66724 259.33273
C 456.61737 255.2829 456.61737 248.71698 460.66724 244.66714
C 464.71704 240.61734 471.28296 240.61734 475.3328 244.66714" fill="#111"
class="glyph"/>
</g>
</g>
</svg>
!URL
http://www.alleged.org.uk/pdc/2007/08/05.html
!Description
!URL
http://confluence.atlassian.com/display/CODEGEIST/Atom+Publishing+Protocol+(APP)+Plugin
!Description
Confluence gets some Atom too.
!URL
http://markbernstein.org/Nov0701/Clubbable.html
!Description
!URL
http://www.postneo.com/2006/03/22/backing-up-flickr-photos-with-amazon-s3
!Description
!URL
http://ianbicking.org/docs/setuptools-presentation/
!Description
presentation from ian bicking
iVBORw0KGgoAAAANSUhEUgAAAiAAAAGbCAIAAAByDrxgAAAXWWlDQ1BJQ0MgUHJvZmlsZQAAeAHVWWdYFEuz7plNhF1yzjnnnHMUkBwFZVlyEpacDICogKiIgASJkpSokgQUDIiiiKCiooKIgqCCRIl30HPO993nu/ff/XP7eabn3arq6pqp6umuWgDY54lhYcEwHQAhoZFkO1MDPhdXNz7cWwABHCAALOAlkiLC9G1sLMH/2lZfItJIG5He0/W/iv3PDHpvnwgSAJANwvbyjiCFIPgGALABKYwcCQBqHaE/i4kMQzD6IYKZyIiBCB7fw35/8MIe9vqNMejfMg52hgBg2ACgwBOJZD8ACEIInS+a5IfoIRgBgGUI9Q4IBYDRBcE6JH+iNwDs+YiMVEjI4T18D8FiXv+mx+/fMJHo9Y9OItHvH/znWZCRyMRGARFhwcS43z/+L7uQ4Cjkff1uDEiPDw3ev+cbFuSa8SYaWSB3LuTaCQv+7TNEBuLwCXW0R2h7WCrUa7/1X1jHl2xih2BkLGQTFmmwh5F3BvmGRdo4/EU/Eu9vuB/BeISe4xNh/Lee0kDivj2f0SD0FnKUnSOChRB8JyLa3hjBSERBn+L9HZz/kln29jH6iw7DvgEm5n9kYIaASPO9uZgQnwsEHbbYswGZC1YBFiAY+IAoQEb6UCANLIEhMPqrlwa+gIhwohFeBAgCnxEcgow4jIw5jGC+v+QM/4Ni8nucHzLuv2vkAyRENuqfOf/MxofM+bfOAOCN4L/pRGSOPd6edRGHApL/NeffEnv6flsjd1VuVm7rb5vQImgFtDLaAK2N1kGrAz40C5oDSKOV0GpofbQuWhPhqQMT8AnR7Pe3jXv6Q1p8o/MPx2k4+SPcvWf3+psLnH5LB/zz+z8sAAFP59vm/7YAgEifWGQdAGB4OCyOHODnH8mnj6xcHyk+81CSjBSfgpy8/B77/03b+2b9MXbJ7ve3CGIZ+hfNC3kYtW1kSQ7+ixayBUBDKgA89/9FE6lFwv8IAFeLSFHk6D/60Hs3DKACtEiEsgMeIAjEkPesAFSAJtADxmAfsAYOwBUcROLHH4lBMogBieA4SAMZ4By4CApACagANaAetIA20AV6wQPwGDwDL8BbMAGmwRxYAKtgE4IgHESAGCF2iBcShiQhBUgN0oGMIUvIDnKFPCE/KBSKghKhFCgDyoYKoDKoFmqGOqBeaAAahl5Dk9As9BPagFEwHmaCuWERWBZWg/VhC9gB9oD94HA4Hk6Fs+B8uBy+BrfCvfBj+AU8Ac/BKyiAokaxoPhR0ig1lCHKGuWG8kWRUUdQ6ahcVDmqAdWJ6keNoCZQ86hfaCyaEc2Hlkbi1AztiCahw9FH0JnoAnQNuhV9Dz2CnkQvoHcwBAwXRhKjgTHHuGD8MDGYNEwupgpzE3Mf8wIzjVnFYrEsWFGsKtYM64oNxCZgM7HF2EbsHewwdgq7gsPh2HGSOG2cNY6Ii8Sl4S7hruFu457jpnHrFNQUvBQKFCYUbhShFMkUuRR1FD0Uzym+UGxS0lEKU2pQWlN6U8ZRnqWspOykHKKcptykoqcSpdKmcqAKpDpOlU/VQHWfapxqiZqaWoBandqWOoD6GHU+dRP1Q+pJ6l94BrwE3hDvjo/CZ+Gr8Xfwr/FLBAJBhKBHcCNEErIItYS7hPeEdRpGGhkacxpvmqM0hTStNM9pvtNS0grT6tMepI2nzaW9TjtEO09HSSdCZ0hHpDtCV0jXQfeKboWekV6e3po+hD6Tvo5+gH6GAccgwmDM4M2QylDBcJdhihHFKMhoyEhiTGGsZLzPOM2EZRJlMmcKZMpgqmd6yrTAzMCsxOzEHMtcyNzNPMGCYhFhMWcJZjnL0sLykmWDlZtVn9WH9TRrA+tz1jU2TjY9Nh+2dLZGthdsG+x87MbsQezn2dvY33GgOSQ4bDliOC5z3OeY52Ti1OQkcaZztnC+4YK5JLjsuBK4KrgGuVa4ebhNucO4L3Hf5Z7nYeHR4wnkyeHp4ZnlZeTV4Q3gzeG9zfuVj5lPny+YL5/vHt8CPxe/GX8Ufxn/U/5NAVEBR4FkgUaBd4JUgmqCvoI5gn2CC0K8QlZCiUJXhd4IUwqrCfsL5wn3C6+JiIo4i5wUaROZEWUTNReNF70qOi5GENMVCxcrFxsVx4qriQeJF4s/k4AllCX8JQolhiRhSRXJAMliyWEpjJS6VKhUudQraby0vnS09FXpSRkWGUuZZJk2me+yQrJusudl+2V35JTlguUq5d7KM8jvk0+W75T/qSChQFIoVBhVJCiaKB5VbFdcVJJU8lG6rDSmzKhspXxSuU95W0VVhazSoDKrKqTqqVqk+kqNSc1GLVPtoTpG3UD9qHqX+i8NFY1IjRaNH5rSmkGadZozWqJaPlqVWlPaAtpE7TLtCR0+HU+dUp0JXX5dom657kc9QT1vvSq9L/ri+oH61/S/G8gZkA1uGqwZahgmGd4xQhmZGqUbPTVmMHY0LjB+byJg4mdy1WTBVNk0wfSOGcbMwuy82StzbnOSea35wj7VfUn77lngLewtCiw+WkpYki07rWCrfVYXrMb3C+8P3d9mDazNrS9Yv7MRtQm3uWWLtbWxLbT9bCdvl2jXb89of8i+zn7VwcDhrMNbRzHHKMc+J1ond6dapzVnI+ds5wkXWZckl8euHK4Bru1uODcntyq3lQPGBy4emHZXdk9zf+kh6hHrMXCQ42Dwwe5DtIeIh657YjydPes8t4jWxHLiipe5V5HXAsmQlEea89bzzvGe9dH2yfb54qvtm+0746ftd8Fv1l/XP9d/PsAwoCBgMdAssCRwLcg6qDpoN9g5uDGEIsQzpCOUITQo9N5hnsOxh4fDJMPSwibCNcIvhi+QLchVEVCER0R7JBNyOByMEos6ETUZrRNdGL0e4xRzPZY+NjR2ME4i7nTcl3iT+CsJ6ARSQl8if+LxxMkk/aSyI9ARryN9RwWPph6dPmZ6rOY41fGg40+S5ZKzk5dTnFM6U7lTj6VOnTA9cTWNJo2c9uqk5smSU+hTAaeenlY8fen0Trp3+qMMuYzcjK1MUuajM/Jn8s/sZvlmPT2rcvbyOey50HMvz+uer8mmz47PnrpgdaE1hy8nPWf54qGLA7lKuSV5VHlReRP5lvntl4Qunbu0VeBf8KLQoLCxiKvodNFasXfx88t6lxtKuEsySjZKA0rHykzLWstFynMrsBXRFZ8rnSr7r6hdqa3iqMqo2q4OrZ6osau5V6taW1vHVXf2Knw16ursNfdrz+qN6tsbpBvKGlkaM5pAU1TT12bP5pctFi1919WuN9wQvlF0k/FmeivUGte60ObfNtHu2j7csa+jr1Oz8+YtmVvVXfxdhd3M3Wd7qHpSe3Zvx99euRN2Z77Xr3eq71Df27sud0fv2d57et/i/sMHJg/u9uv3336o/bBrQGOg45Hao7bHKo9bB5UHbz5RfnLzqcrT1iHVofZn6s86h7WGe57rPu8dMRp5MGo++vjF/hfDLx1fjr1yfzUx5j028zr49eKb6Debb4+NY8bT39G9y33P9b78g/iHxgmVie5Jo8nBj/Yf306RpuY+RXzamk79TPic+4X3S+2MwkzXrMnss68Hvk7Phc1tzqd9o/9W9F3s+40fej8GF1wWphfJi7s/M5fYl6qXlZb7VmxW3q+GrG6upa+zr9f8UvvVv+G88WUzZgu3lb8tvt25Y7EzvhuyuxtGJBN/nwVQSA/7+gLwsxrJIVyR3OEZAFR3/uQUvyWQdAVCZBDsBMlAc3AqSgE1gy7FEJG9bgHXTpFJ6UelS82EpyMw0NDRMtFx0fMzSDJqMFkxe7HEsl5ga2Af5JjhXOHa5qHgZeMT5pcT0BG0FvIUjhA5JVos1iL+RBIjRZTukeWTS5AfVZRQilHuU8WqGapHalRoDmr90KHSpddj1mczYDfkMGI1ZjKhNaUw3TVbNp/b98FixPKBVdv+GusCmzO2KXbx9pEO4Y4RTjHOR1xOuea4lR+od2/wqDtYdajCs4xY4lVKKvOu9Kn1bfTr8L8bMBT4PmgxBBvKcVgyTCPcjOwYcTDSJyo4OjwmOjYuLin+WEJxYmfSyJGvR3eO0yRzpoikypxQTtM4qXPK4LRpum0GObPozEDW+jnx8+7ZZy705MznsuRp5rtfii04V1hR1Fr86PK7ksUydDlLhVil+hXzKpdqv5qo2uS6rKuF167UNzfcbhxqmmheuo69wXlTrtW4zbU9pONYZ/atsq4z3ZE9rre17/D2gt6PfXfvVt3LuE9+4NG/76HGAM/A3KPKx86D2MHGJw5P1p8WDOkOTT+7MGw8vPX81kjyqPUL3hffX3a/Sh9zfM37euZN/dvwccXx5Xct78M+KHzYnng6WfIxbErvE/2nj9PNn49/sZnhnfk2e+vr6TmHefb519/yvrv9EPzxa+HL4uKS+PLZVcl12g3brfnd3d/+F4SaYEt4AZWLNkGvYKqxXjgh3AxFA2UklT61MJ4ev0GYo3lL+4zuPn0PQxtjO1MXczdLL+sA2zB7P0c3ZytXM/dVnhreKr7L/BcEzglWCPULfxdlEdMTD5YokHwotSojImsvd0S+TmFYcVWZTUVN1VqNqB6oQdJ01bLS1tdR0hXWY9KH9X8YvDV8YNRkXGCSahpsZmeuso/TAlh8sXxqdXN/ifVpm2hbkp2dvYGDgqOQE4szhfOmyzfXD27DB+65tyHRUHIoxzOdeMwrmhTqHeoT6hviF+wfFBAY6B/kE0wMORjqdtg5zD7cmmwV4RrpixyZk2LSYrPicuIvJRQlFieVHCk9Wnqs9HhFcmvK09SZNMxJASQeSOkpGRWZvWfeZ62dozkvmK16wTLH62Js7tm8yvzOS0MFU4VrxZSXOUokSzXKTMudKvwrj1zJqaqvfljzqQ5c5b6mWe/cQG7MbLrS3NXy7Pq7G7M3V9qgdkIHe6fwLbku9W6Dnn23be449rr1HbjrcM/8vtYD6X7Oh7iHCwMvH3U8LhxMfOL+VHOIY2j92cvhG88vjESOurzQeyn9ineM7TXrG563EuNa7+zfe31wmzCdVPrIP0UztfPp+/Tk51dfhmYezw58HZh7Mj/y7esPaIF1Ueqn0ZLncspK8+rcutav0k22rbody9/+lwT3IAtoDImAByhz1Au0J3oZk4blx7bh7HFLFNWUHlSMVM+os/B2BD7CAs0j2mt0OfTHGSIZg5g8mLVZ2FiWkEgoZY/msODk51zjesJdyZPE68ynyE/H/0WgQ/CUkIMwt/CESLkoSUxY7LN4rcRhSTUptNSwdIEMUVZMdl6uWT5aQUNhR7FXKVXZVIVC5ZFqhpqVOqX6A40UTT3NLa127UgdOZ2vulf0PPU59EcNsgzNDXeMrhsHmvCajJieNNM0+2Zess/WArJosfSyore6vz/JWsN6zeaGLRk5P/ywb3AIdZR2/OZU7xziIuUy41ru5nqA6cCw+zkP+4PsBz8eavBMIFp4cXl9J/V6Z/u4+wr6zvld908MMA6kCxwPqguOD7EKFQj9dfh5WHV4GFmRvBrREZkUZRiNjx6LqY5NjHOOV03gTEQlfk96feTu0fpjecePJwelOKXqn5BJ4z5JOLlzavH05/RXGT2ZZWdSsnzOmp2TPs94fjv764XxnOcXn+Q+zhvKH700VjBe+KHoU/HM5R8lq2WgnLqCvVL8ilaVbbV/zbHa/Lqmq/3XJup/NTI2STebt/hdT7tRdfNh63w7fYduZ9qtkW6eHt/b9XeW+jTvnrg3/ECoP/Hh20cGj5ufSDwteYYeJj7vHVV40fmK/Jr09sp798na6ZE54pLgnv//1Jb29gSsCgAXeQBwQeoh9hcBOINsEKI/AGClAsCGAICDOoD3aQOYKR5Axjz/7B8QQCM5JwNSyRFDMk0T4AwCwTGQA2rBHTAGFiE8JIbkhiQoGaqA7kFfYGpYDnaGk+FG+B0Kj9JGhaEqUa/RdEiOdhzdhV7HqGAiMFcxH7DMWAtsMvYWkmPJ40JxDbgfSC4VS3GHEk/pRllHuYNkSY3UjNRx1JN4S3wHQYJQjGQ6mUhucwrJZrLomelLGKQZuhitGD8wkZmxzAUsMix9rM6s82zJ7OzszRx2HBuclVw2XNvc9TwevLS8fXzR/JL8EwK5gvuFsELdwpEi0iKzorViweIK4psSA5IFUqHSxjK8Mluyb+W65TMVPBQVlKiVZpQHVBpVC9ROqydqkDVDtAK0A3QCdX31rPSVDDgMgeFn5ITcalJmmmV2xDxiX7BFkOVhq/j96dZlNh22I3Y/HAiO0k62zjEupa6Dbpvu0h5eBwsOvSAyetmT8r3f+Qr4+fnXBywFaQSnhAweZgvzDW+LoIokRt2K4Y7tjPdIpEjqOBp2XDJ5NrU6jXSK6/RIxskzamflz4deeJxrnj9VePqyeGlzBf+VuOrW2o/XmBqsmrJaXt+UbcvuhLoSb6N7c+/BDzwedj3me3JyaPm57+j7Vwdevxv3ef9zMu/TwS/SszPzEd97Fh79zFuWX6lZ3V2X+WW/YbtpuSWzjd4e2zm3a/r7+wEhNQc8YAb8QBboAlukxpQIshHv94FxsA4xQ0qQAxQN5UNd0EeYEpaHD8AZ8C34G4oP5YTKRN1HQ2g9dAL6BnoeI4IhYooxb7BsWGdsPvYNjhvnhavFLVJoUpyieEkpShlPOUwlSXWaaoH6APUAXh1/jSBAKKJho8mn5aAtpROju06vTz/KEMgIMxYzqTONMceycLB0s3qxUbA1sbtxYDiuc5K4mLkecSfzaPKs8d7ki+JX4d8QuC14UshGmFl4XKRKlCymL84g/lmiWzJPKkLaTkZRllV2W25KvkehSDFJiahsrqKkKqjGrE6tgdGEtIA2rIPTJehh9Db0FwymDd8aPTceMOkz7TbrNO/c121x33LYanL/ig3eVtBO094ROcWcc2pyHnXZcBM8YO1+1KPl4IynAPGQVxHplQ+9r6XfSf++gG3E27Eh7aEbYbrhp8ijkUJRMdFDsUpxRQnYRHLS5FG7Yw+StVPaT6imdZzSPf0owyXza9bJcyrnv16ouhiQp3yJqmCmaOhyd2lL+bXKq1X1Na11vdeeNLxset3y4sbD1qb2M52eXZLdC7cbev3vmt4/0B8+kP74ypPbQ6+HF0cxL5nHBN5IjSu9V59Q/8j9CTO9+GVi9ulc57eSH7GLxkvwcu2qztqDX3obtVvU26Sd67/9DwMKpN4kiKx9S6TSmYLUkG6DCQiNrPr9UCRUCN2F5mEWpLoTAdfCkyhu1AFUMWoSLYoOQ9/CUGCcMTWYHaSy0oHjwZ3G/aIIpviIrO8RKiuqAWor6lG8J/4HIZmGneYGrT3tKl0xvRn9JkMzYzCTJNN35laWFFZ7NnF2mP0DRz9nC1cF9yWei7x5yDnkGuLVMaE54V+i1GJ84qoS9pLhUhekO2Sm5BjkLRTOK44qs6g4qp5Xe6yB1tTWitG+rrOoZ6hfaLBm5GTcZspulmA+bqFlWWD1y9rZ5pWdr/2G43lnEZd2N+MDjzxMD/Z4yhKLSFTeST7LfiH+XwMDgr6GBId+DwsPX46IidyIToplj7ubEJ4kcOTFsZPJqilTJ9JPSp7qTz+U8fNM8lm2c83ZlhdmL57KE83vL/AtwhSXl+iWvimPrKS5Ul2tX/O+LukaT/2dRu9mypamG043t9sqOyw6f3Zd6tG7/aX37F3uezkPaPvPDNA+ujjI86RmSOFZz3OzkecvnF6OjTm9HnprNH7jPf+HExPzH92mxqYPfZ6ZCZ2dmbObb/y28INvQWvR8KfKEt/St+XOFfIqx2rfGnHt83rw+uKvyF9vNvQ2qjYJmxGbD7Zot5y3SrdmtuW347b7thd3uHfMd6J2SncGd9Z3hXZtdhN2q3dH9vwf4auosLd7AAhvgJQf3+/uLokAgMsGYPv87u5m+e7udgWSbCD/gdwJ/vN/xZ4wFtljipb20MOipmN7939v/wWxAollC97D8AAAAAlwSFlzAAALEwAACxMBAJqcGAAAIABJREFUeAHsvVmQJtl1Hvbnv9XeVb13z9YzGIAAiMFCcBNpSDIVsiUHGX6Qw2EbpF9tk7ZfKdt6tmmHwm82qXCEXxSWwi+mX8gIUYowLZKiSVACiRmCAIkZYGYw3dPbdHd1d23/lv7OOfeePPfm8v9V9dfWdbOr8z/3bPfck5n35F0z+8Xf/LDVauX4XzqyfeKhYL8i4Mex39xnEWmwZBZxMssfVlU7y66vdv/2ZzZeutDz9KbfSd76ywe7P3i0O5rkvU52ebl7YbG73Gv3Oq0ryz1gmoRbrXfubn/73s54kq/0O+2sNRznT/fGj7dH0KZOO3M+tEU+OuPrcpk9x6sr3f/4rY3PXl6wqgCr5y1+MM7/5M72//nOE0EiF2Fb6Lb//R9Z+7GbS1eXu5ZfYQiOKzUyR6fd6uGeU+5TAIixdM7pJpQ//Bh8NTw7J+l26hngdLV+5gRTA1UeFZd7wM8UKxtQY50uC8NfxrBXcHIWVWbNVFbOqtgwusJOG0Ei53gsiZiNAY7EkoW4V0DM/g9QwMCSEaakmWQiHosR5RYjsMNz1l2KCRwY6Cc8Gm7rBlKb9YaaKFUWAUasL5NEvBJfidTsLLUMS3aVxmiOIqWcihcADn+4PfpXHzz72VtrL61NiTGoOL51Z+tbd7cREhARUFEs99uLXUSXDNECAeYrL61cWelaO+8+H+IyX1jsPNsbv/tw968e7jym+BKZQ960UlGJQFKBiE1KoYWynEqyIhauZFCkApUioOLGwKGGccqdIhFJgjPCN4gIqYEfDJYawWqVxS91269e6CvJ5l6Gu+3sUxcXEJOurXRxffFi8Wh79PHz0fWV7s++urLal9KX5VoUPWry6LZbUGtNqpA/XpRYKhUgYPpjlMeTNRXwbJxOkFSQVvnDj8EbWDJqpKptJQ1MsbJlbQbjxA1/GeMK7nim62eODHoK21yOYjXjTY6iH7SAnxMhhlKKASDqFMPexangEQxxElrOLsQZTKFHkWqM1SBUxeAebjrk5sbjgcp0td8B6+54cu/Z8MnuZOz8UCE++yMxO2eUzcEEZ5dq4JxM8o+e7P1hnv/MrQt17Rj45vlg/M3bW997sIM2B4yHQly0rb0x/qQsD54PH++Mbqz2rl3ogzoa5/efD+8/H+AK4bV3MJp8sj3aHU7A3HyNIs9IssH+iH92zrkIzp7d7JzWsDlK4dlY6lXrK9/74Lu81P0Pv7CBh6WToeLItwY5ruBCJ2uILrAcgogheOHAgbCEPzl6pyy6aLUyU+1v6kEIkqxiWJHTZmHHRq6toIacpM9iLMzuAxU4+RN/en7+9fz8S3ThJ4C56ew1RFTHoMUJ+VmTk2UdRFZtArMFM4WWwhjWi6TFiIVhLlJKYnPMtXYWqkplJxmbEcEGQ5qZ7Hg8THhwGiqEuiv99vZwgttbaMzgTkDiUfnc1cUfu7F4c623gOY66sFJ/nh39O37u2/f2930daVK1emBcn6C4lwOgDyAiJoHQMUBVBZ5FiSaFLc3B3/4/tPPXFl649Li2kIRAiC+uTv+4PHe+4937zwd7I0m+gqqOQoAT97e3Hu4NVx9sgfDELeeDybDMUWUwgbfUhERnAMqJw+APIAIZ+VOKg6gMNVzHAB5ABGfG/2quAKV1NmRogcX6NHO+NJSxz21Vr4KRkCK+tPeuNh3z2IVv+DQ9dnOuR0DZ1KAyQeTFh6109N2kUtM51kaFlFNRFLuJmENNTDfSPLaDLapnLU6nR5yrdMDgNRJvk0v5p6n4CcNhaxTCAzjVKfyEFqpwsMoxykwzrjaBVUMc3axZq+fOVnWY0g/IeinQYMjVfDEUiVrSaakucCARFTLw7DDGypjiLf7068sP94dP9+bPNubPNkdo0eYCsAHHpiv3lz62msrr633+2a04JULPTRolnrtb9zeQWXq2d0vHs7yoUgFLM8BkAcQKed4GCV407z9dIDWCWLJ+lIHHV/QD9+hzYF2Cf6esmd8gHCZa44K7I3yvdHI2EYUpRp8gWymVopUIueiZy5Kpha50v5K5LzsQcvjxgpeqjKpYmxegIuHJCKESYoTWfHyERJdCgYXryDUlMnGrfz0jLtISVEBOgBlL9UvKAlRDR7JCGOpAcycon6KVLNOp4e86vQE/Gy/sbBss8WQ8RA3/GWM5Wdeys+xiThzWEGEFpEq2JxdLMhYnJRqDQizowwcm9XASEZ4qrCVDCtpJg7NN8pLTCKq5WFYSJafMcJL/N2fe31tMJ7sjfO9Yf50MP7h5vC7D/cebNEw8qcvLaD7+I2LeMqgoTjQnMeI5d+4tbo9zP/NnR2MXxe0sHKkfEqHVdbM0EyF4maGSqqYAxvqqGpeHQM0iDguEqLIs91xr9PG+yZrzoeTHEPxkkvduSH3OhGLbxZ3dliBED6wuGhWZZWFbMh9dnHJokE/GJqpUxkqxSGl9q/1O1+6sYTpGHWqgC8fsdq8hWjh2ydl9mpM/3SMu0hZbNUf1FxM9jxUEAczMCMnSXEGqkcAxhcKnfJS7RZkypI4OVVMExydrazw1GCcuKGWMaE9XFbDH1LJHuaYqU9MZG2ODpY6RxJBGcXTnIsvpooQghMRBkmPod9KHrFEzsTPAk7KFLaEIUZCMgGn7tVljKzQ4AoOvJX/yOXxW9cWv/2AesC+eH3x1oZtugiXO19e6nzx2uJHT4cfbg4CgklEdYqhOLCZoZkKFc0Mh6HuS/lwMuGxEl+o5oyZawYWp63yZ6p4M0MzFTlOZWjmOaS4FLlZSTO12bxZqJiO8ealphF+foLE0qYzXjbw9oaY4d5AmngdbWrRZtBxKBYpGp197c+w1kpUfRieAgZyRk7S7dQLQAY7nfzjYELHtVvB6amkSmCPYR7CBTVjQKWEE2RhgcHPqeJcxoAmEnQu8VsM537A0KLm0f0Q5kIIvjTKwxixypxDKSpggGHrAgzLGgyJRLkz1eFZobeBtRmM4IOpk3gGLi528IeZMK+v919Zpy4C8NUdr230MEnmh9MCDJnoD6izSY+e229Zf4SR8hypDVMLE5k0lX/uDGUnRCaVGY7CBnsVTkOO6gQ0IdB00Z4rlN2aWumKgMEkAKIDNJ/k6CxFawg6uVFUqePkkWI4nY8ttFBezr2cr4HF7Y1UqdUgaCwXeHrtyaUknztxX3UqRpULhs6cjVjkYaB97o7KGKfNDbcYHpEreITk7LeFFbWhVcR80NBiMmIbavIybGFACi0hgz1GNClGNQATBBgQ5MDA5oWFxakt9Qv9zgp6i71U3W/EECXrpA6ML+ufBXPg7A4mWDbpYHoOIxXZECWhuYw5THZl2bL+MqYsdRhMWX+EQRKDiz9yZeGL15Yw/C6PfZRjgSwgV8UIJ6JIoRYPX94aUTdZjilpmDUTaTs9SSlNUH8xyuPJUsCUlBpFYEFaTB3sOEVBSY+VEs0WY2GfY2FPwD+99hRBKYWWzgGiCudSjr7U0/UzR6nh4uSQOSl3NnB2SClGzCjzMEa4nKyVKrSVNGsxlQItkktxNhggCW8wqkFyUSpzSirgZ7zDVAcYKPKDCgBrD8QW/J3iR6bW8kRIHih7AI0WzNf48ZeW0UuMFS3y6kQPkBwe8r8er7+IH/zg0EPhkXiYRzkaMLReEmP+U0b8vdQx/0qJ6KwNF0Y5fB1MdUhRM7I0Ga5SAhgM1Y9KNXgjRSDpLGQ97ASJTFT545TDsJzCTgNJ1WuweRUKa/hn0U8l5Eli9Es5+7Npdlh7HENtjk4DqTIaqqUYW+TI5iLpMfTL5imGbWOy5yFSwOOphCf2ggqTSxhmMDxI1wYY4p12YMoZnsPPXlnEpCmsjJk6uD1NX6InD5yYBxAVsM/Cv/XayuevLq7yvHP7pFWaJQ+YkKjvizvWbHQhEkUdWnfZ2Nlcqf44kK6OQFYaWgj2tUk9DEGSnYGTuUQ9iTRJgUpk5olgQhPVaWAeUcX8DFpZz89USjCx0I+k5uVIVRiIiVY628KKQoNhbaVWC0lJPqzH8pNRrkQESJKhAna5SObE40hGj5MtYcLScarEA3WaV4VmpgYMBYYUEinSUDA4zdmWHZ7mQs5+wvQxLIXBVN2tweT+1uh7n+x98GSIReuza0icyQMn5QE0KW6udhFONhY7WDWM1WCLvfaPXl1a7E7rGauyGJNhsFr/dDZQquwtahapAcv1ha07LDw7J/IlZle5cY6mPrI6hTPAWE6nh8rhcmfA80+vPa1+aKCk0c9GMlJIcmY+4eIMKGscKm5h0sCt1pCHUhG/MqhOxYC1gEXQlYzwjsQ/RZIzcCTAzBZqdioiHpuXI9ncGVYRAgoMKVSMy5FyDlzq8HDKYQIMq3Wn3VGOGPPeo70/u7vzyc4YD+3aQgdtGixmfjaYYLcTy5zg5IET8QA2ccGoIabg74zy19Z7/86nVjFPEnORcXdiQRJ26cG4o96qs9yyeNrQdulm2WL3jEUXriP4VK6VuOQ4CZlTDFdxFlRbQzlOUVDSU+IER6MeulnAUOKZXnuKoOh34iavMsbyI0NiMPwhlU0ijv01XFipKQtnI5Y4/YSRnDkLYJ0psVTB73kgJqrE6igvp5R5Ck5bQIa9BlZVYEiZaAgY2DbFiElgFczcAgwXsIXXwA83h9hHC7tpYe0h4gqiy0dPB995sHfvOTZDkUyFN52TB47PA4gin77U/5HLiyu9DG1sNLuxgwuGW2SgRezA3TmY5KXtKQojK+9fBJjlbhbsKFdInDqoqAgO0CfGwk6Dr0FQQq1NCOYSQzcADxNKYQEEQzCnlVrgheJrN8fAZJGgs7ehRPXZeR7HYPjLGMna6+RLbfhDKulnjv2FFlLSqNPnwrrZA2qnIzFS9AjGMTh72DAQXIQyfjAMKijZRFlQ0UiDFFAUenuY4KjMFmgQQS6g8sw5wMAsvABihNOO/CPG3H46xH4BO8PJg+3Rh0+GWMiZgg1fxHQ6Dg/gXedHry3+3Osr2PkNEQV3P9rWaMfIOkprAbp3EX5wA4NHdm3BI4SbGSMo+GMk3eFQInOO6W7PsiW3kMxqOnWwPvNS+SBJGFvf1cCzc7I+V7dNkWrOnanwPFkonDi7JFsdkoiHWV2mImUwXtZpIzZPtfoZZkqon3gNhjlOPrSI5bYsUqbIWldAaz9QhT+L24DFKakaGJZU6AHD4/SHCkmGMfMPMKy5+oRV7pu7E2wY/K27O2jToFetmi9hkwfm6oGba91/7zNrP3p1cV9aETywTBL3KOINRRQEGOwVxo8NYHmLktcpJE/z4Z52mOgbFoQxNU4d7ARn4GR9op481qR/BqrW/s6Awtrptb9YIiUq21/GED9jpZQeBppLUVAZw0z8Cu2phC4KzjBj6EQ89Of0G3wFRricCMlW8BgNoWbhpbO9WMxjMcxGmh3g+TWpGhhDJiiGeb2g1VBhSSF1qFlkVNz9HHh7vLLcwRYAWMuJzu537u2iR2I/ChJv8sBBPLC+0Hl9o79fSQkqVgpNGRrGN+HkdM4NU5vl6eI6wtRftnbwMESCeqdcazRyQhi5yB9+TL4GZoZmqljp9AT8TLGaA6rJhXmcAYa/jKEi838mTdfPHPtouIh+SLmskUaOkpnADiNWFGxVPCwbSBG/18waOOExzO8xigw0W0c5S1QnMZKUMd4pMRimFyXSXERKkscaYLgU1OGAvTJ//KUl7K35/ce128wIczqfNw9gKSK2acEryEI3wzx43CTYifUwHaqYbPL6RRrJP2+eNA+8qy8IYyuIGtgJKpXTimQd5EuP8ZURMF6EqB4WNsEYKS8OFB/C73R6DH5FTaSN2EL9inEaDLWMYWnVAN0KG6usBuLYR2iZlqPNhXJ3/AJwQjFkWohBKsQ4+6VQhaC13xfQUb1CUgWSUQihCMOixBZm6qQKDYQoeBR/AgEGdiDGYIdmfKAJMwKm7QzJhqfTOfAAWgxo4L55aYE/PkSfZcMwCbbr/vjZCC8imI54gFtlrd/+ys2lL99YOgf+K4ro6gggZmlYRDURVxNGg6+DSJuBKSXqGYioJc5AtkTVysvlyz9yUhLngFNRi5UxbBLz0MkZVq+BcqinkriYrX1ibJLgRa7g0exEZ8HJZoge4XFnvjQqJXlp0vPgl7PgM3hCaznFOWl2oidIspRixBJNKj9jSKFiAmOmXjLmduLeWug6mQADY7Da4PJyB1+jwWcCkEzHOfcAGi6vbvTweQh8QwVRAd7gO57Or1+cvLzee/suvjyNJo2gZ/IWumHxRbifeWUZcWsmgbPPpE5zdb886rZ2qIEhSLI11ADvdAp7o1SzTqeHnO5yD/hd7UnZCD6gcr4G49iM/WWM0+N4pulnNg0thQ1Ojq3iPNRCAHJ7KoakQh7GCM6UOuShVIgBQgYTGA0is3gejyQphR1gMEINGFwZnZlEMvwVGtguLZGqqtMMfScWYJA3XlHxEbPnNG6ajvPlAYQTbMqyzgvm0QmGqR+vXOgiErxxqY+Nh+XGFY9gvOPCQvtzVxZl1vv7++lTxVat2Iz1nEQXdZq8GSNJf4wV2NYdAew5mZekAqqvcRgtVNI6i85KPZpLYBsr9PxM8fkqv6dS1mKMYFzS8Jcxlh9ZEYPhD6mknzmOr0/MGQw7XNaujGIYjCGThMq/bJ5iYilhDnhY2OFFT1F8YiR6Ew9nYWxjXiflxFmB6FEqgJMMMIjJmAlqRky56On0onsAcz3evNzHEvr1xQ5uQXxTBx99uLbaRXQBSe5O8YHC+Jzbq+u9p9cWn+wgGsXfuKtzGKTQUK6jvkh4cRSdj61PjLN0+VpYaiqPod+iLnMuD2vMop4i60v8gmE0iSMZ8Yi2gCHM0fDX6iceUU7QPkKLSqkGwUSlZhs4d18ExnBZpEQQA8BaVBWAEMNCIY+VIn6vxwFEJqQmCXAYAaMsmJm5VUSyQDLCsCbmBwRqKIVMgDmxAIPVBs/3aGUMxmPSca48cGOt+9WXljDWIld+st7Ddx+wmoSWqPAh97H6hJK8WeTLF3r4wxpJJTUDWOe7O4yUNUucPaoUL2i1oBC2hq2BvaCpNWo4WR/XFlzFyOVw4lFezFCbu4izJE4lDVxBWRvK2oCx4sysekinp4rNdHYY+vEwQJ+75Xfa6CZktD+Lc0mINASkKgw4Ih6IKQYAwRU8rF+ofA6tZSHWwiefhcfg1+G9ZrVW+QlgKmNIvWKYEmtgNkKqJYoxepjBay70cJHBf2IB5uH26IdPhxjiT/EFV+WsH+12ttyjCIFbij8Cjf2D5W6sKNkr6/2XL/TluoMJwIUFN0ZiZQjmtCLR4rm51nv3kz0M/lfoLaGwzR4W9mJVL7ZkLRHPPEJcwG52vgYGkMF7GGVVPJc74IyoFZykkkSmcQa5VOihvJ2eQJsUgvULPqAaPOskM8Bg9JcxkpG3Z7p+5ig1XJycy87pZNvUFVocMcnyMEYYTanZVj75coUYEcDZ8zCCEx4DxUGl7/DGIVJw5SegcB2VSjFM8XlZDczDDiAq8RspTVbpodiiDCfz4GFtPxZaYkk/3lvZ8nQ6qx7AZGJM+sIIysZSRza4R4BBnf7BE8z7GlfO+8KM4aXShpJyR4oX7F1bYHjQ7lOXMEazil4yRA40ghHS8MVu9Jvhq5GVHrz7fPQnd3Z+9tVlbI4HBgz3jSf4FIVdylIpd9qR7gFmT+FEf4ziU/F4oxj2aaek4SRmUxcEMHNCmPgdTIBoqOKcTnV6Am1stbUhoMY6y5Y4k2o1TNfPHKXQQuVkSo09oBXeqOGxGsqWcw7en6yBFBq1DuSfIC9OKAaAGOownkp4Uq9U4goxPlnwMD+zqU4nQoqIX5MEBNZyVgZDuo6/BYNXT2yF+e37u1hliT2YU3iRy3BGz2hSfP7aAj7PhbF02oRY7r5WCy8Qr2703/54F5/TLs9Dx1Qw/GGKh5TaC1HK3rVlKjDYUR9/20PaRBXfWUFIG4xyfFP1rx7uYSxHROwZeaCRDMr2iCbH4/ZDvxmyxqoY2evlzN2B4i6p/QDTH6McHoW3D7mBHYPB1HGyDlc9kv56nURhvarcyeLHCDqqwTg5b0whFWII7zFQonkVChkiEmVoTWVeIxtSiZM5Tii0sDWFzWy5lk6JIQbowANOnH8UBuBgAdgD4gZHMj4hTsfAyunkHK5KBENn/2cxHu+isZUCCcfxtWCwDyYWNNx5NrzzdPTDzSF60s/csy0uS2fxAJZDfunGIkZTMMsLT4I8DCDhJsM+kp+7soBPduETW5j3FcUYfD0IG9Phs9xyO4o2gv2tX2AE4rPqRwrdccvrPRW/stxF5PjWxzuTsOsMHXc31npfuL7Y77Z3TRMHDSv0nmHEB5PZ0LA5K/ehlPcUhRZcCX/J7OVzdoLIEE6K8fxMsbLCU4NxGgyVMKxUNRPgMAwaZkdxVKS0DqUrz2h/dnY5HqEqQ2WOSnWqTLsHJKJWWRJJQbNglD3Ki/DMgZP8WYzABd7kK4odyedScBoMZx3kIhixHyKOgX+CJIRCPczrTscRYPC6iq2U33209/1Hg/tb4x10beA4K4+19VaCjQfevNTHlx+xZkVufaHInQcY1fcr67298SLaqXirMHLuyisnAf4GZdDyEmz1VzLg+2AY/P/ew93nA9VKgmipXFzqSOeYFYRCiUSdLEc7Cp1uxH2KDykV+8E5Az9AOjws9w4UcoFnHmFmLsNppbjspJDlnWbVWcVZ5FhFVTMKS5w2l0GBZwsDbQZTtsQJWtsMP5Wgyh6rnzn20XBRhS5r8RUnQowwIiv6Iyv4x8FVGOIMeCgRYmI9sqQj4GFXRLmQZraCAUqQZv8nuTBOKEwyPMIMrIiorGCKJIwNLwRI0XFUAQb975h7ildXbHCJxsr952PUMmjEIPvT/jRHHkrJKg+sLWD3+wVU30qU+1WS8gCg3n51vf/W9Qn2msS3vLDsEYPzzwdjbOIglT6J+BuUQVVGgCixKJuFZcAddWWl++WbS/efjx7tjAejycZS99JyZ7XfuXmhaOgEqlg7+tQGY+ouO833pJTaVv3iGY+nYjmYS6gwgIhTSMTv3a7MXFf4CsVSLSwZWYyFDZWyVmMcD9tSwx8UgXmcBsPvFBqMk3KYGfQT5z5Ci+iv8pUpnSs1585w2fLQzkI21EzlEy2upCymsKgNGJjm8GAuxImLibFCwjPBUb0U4QWuwhDJuJ05p4cW1nQ0XWTogn/n/u7bd3c4wLQwDCuZpRF98cMLcMZAyMYSYgYVRW5NKZTcvlpATAH47NWFVmthiecg40bYGowxcNJF28HfspEGSlqNof7KXIDEaNCXbiw/G4w1wCD4YW1m1DiRalqU4Ix2zGDSwvcsl/yAkJJOAyBumCm0yEPPRgP0ggUAikMyVMCMt1mAr6BaWDRYjIWdHiMLjGMgfR42DCVxm7XcA2oJANVQlIXJUMMZGM3gMPyeerpCi5TClYCtFUxx9jT8MijlLOACDxlfXnFqxF9wlnyufm4QKUwiS9wz5Pg564bT/FswFF3u7f75vd3HuxpXTvMLYoNzEqnWA5eWOogZIMt9JnxyszrYi+ILksqD6Vv4Eh3fpI6spLIGYJqplgF3GILZQpemADjV5ieKK6oWwLiV79BoYL7QzqJoJAqIJ6ePwRznTSwW2npfKwIqNZM9D5npYAG4ElEMeZtLQmcLM7PNIqCWOJupalIpL6Y0awvNjux0CiMNjJWTZi1+EPHCJyyoO744bURWRgILvHMLOEIkcwRs/q4CUv4CF4l4lWajJHBOkSNzFGqhymPEcCFZfsYQEzMGJVKMUF3S6FSM2K9JAoz9jKcyKwPoU4+Kp3GqTB0D3gfvbY2+82D3Ow8GeJE8zgeyzqSE368HMHSPeVYD1LtyU9fIY3gDI+Ryq4HF8iqS8EacYH93RiRKWtZQcCq1rA0YQoZKNQcFmKeF2WjbeTZu530qFMUSOXA/I7TgixLo2e1lNKKDAGn3ZAYVvJVhyanY/4/YJpZ7mNyoMFRWwJwRiltwMp/jjGDRwHk4fn9diN/CjtPnWEUVH1fly5RmbUZ/hSVMlUJxzjixJU7nDPqJ8wgaLi7nwi2MKJJkJ7mywFDpAgwlQgzzBzwkHvAw1Q3DELujTjgfJhb8JOt5HCBJllrtZhd69Eb1bJRvDmlqZcEvgubCsTjdLlYPK5t+2l+A2RpO8JUwzBHCLk9WN4bxH+/QKMu7jwYfPBnS+nxLTvBZ8ABWI2I7FuxAio4srCzBBsZP93DfyU0VFwBD91h6suZvcSFHrJokwN+dDAbaohxUyukM02GKWCowRqOlWpgETRoxhmNJC9PepLECIhjgCgQYwHuYMsALaAIqPm3ZaklYmuVrAKga8Fw0PBpikUYXsUHLKAZ7nqLsxMZMDjBJJ+ud72VJk4c94DU4kalKPH+hymMgSsqjTOsxTkOJH1qckZAN7JlBP8keQWghOzh3tqfO8nLZw7IE9ruikWJXzAq17ArBMxdlz0kSEoyKi0LCM8FRSTdhLvaz15bbVxcy7J7BAab1yV7+0c7ko10aLxceOqtaLrAoETzOsx9TAgxyxMCJPBLY9vgvHuxh5Rq2QMY2heiRkGWSu8MJaqJHOyPMQsanO+gpSoMts1+BE+XcWGxjrGKp28YQyWsXe5+62JclkHiTwFX+1l3My3L9nJGZT3YnmLKR5zWD/J6bb1j3AACnt6nQ5QHwvPukqpgH/IPv0pJXlCNoUaZemsdjQCsVV/ihBwEVm9TI48BPIotmLewGjpbNSjfjPaBVXwygGbQzzvFmxjt8xlRnLWcGmP4Y5fHEXwEbpKMyXyWnaLDRCxorpCgrxjdS1bySBlcGxRPACZwUCUhhCCgsvGWM53fKHRt+vKkFhrVJdHFUx8Oynn/mHI1t/g6DrPx5qyyPgYUtKJ2z3+ZORnK6UGswQnXZsUKDITEWnab/eeC0AAAgAElEQVSB2ZDLK0vtL663P73aMbNzqJl+e6f9Z5vj7z6jt0ankETkn88Cme3/mBJgEE7QLkFnCOb/PNweY00DRlZQryC66AgqVr1h7479Z50kTtIDuKZvXOp95lIf869klxdM9MLrudxeWGyP5SNYrlQZYBB7rq92l1Gt8iEiEUxI/2hFJKJYGb77haeZVNbD/IEuTSjgpKI0Y6twRIjMEw1yBim41/PWMM9HOV6Wc3Q7aIxBBFLleIARixGc0CDEg9JfCN6/hE3rfeQi0cvjKdsKWJCcSyVVne+oVCgC8V9+FF/mDDC+IMovznF6Am0uA+V0lpc0iH6noUSFlhoN0/Q7waDhQqpMYBDVqp9s4IRimB2n0AajwXGGUpTyGMfAmhV2+YRFs3mB0zHzj8IFnowiaxlDdOURuOBkgqMym5QR70A/eanzqRV6zO2B5GvL2XK382yYv7+Nm9kVRfLSjKzI7HBTgMFw/Z/f3/32vT08EAgw6AcTvWhY0fSwcbFwer7d0LNbnzgP7IFbG92feXX55moXnUJ0XUu3Pho3mJrVe4bPfLnrLnlh7u/nry786LUF7A1jCTHsFbLuwsxQmXtIhNxAipR4/iJPhRTwPPIbnCOeBk5HCqQrEqh/dseYF5cjwKD5jqLTs8LZ4ITNaRBgJCxhT4GtYb6KIR1fQRDAJScJL8JIyogRIZ7QWtE4mDAEVnEylpQLj78uxG/hGahqnsur0OAKUODL2gymwhKmQkuNhhn0k2wQWtg66BWrWXNJf32OxhLWoIYREOlhWpnBY1gi5CEdIQapAOOphAd3QSWuEENUubsCDcymGIh8fq2NzrEoupAwH1f62Vc2Ovf2Jk/RXxwW0LMc5Lc2wOArHX9+f+/dTwbFJOOD6E8yp9EDaIBiET5aIW1EF38zwVC5ccVi4K+uYAav+5Q9Zm1gmA3jDQgtX7y+SKv3TckUJqBeoZGI86ojsT5L1BrDISVrNUCw8lxZsYihjk1FKvmbqBRjWrxbTSAaWQLfPB/RZAHZ3rMILXAby4lwLcwWgAq2mTjB7+vHBp2kyl+1GJaMfI4u04KftVpZw89cOLGphkfst9Qyxtszg37SfIShRexEwRs8U1+WCvuJmf0oOhksMEIVUqGWyihCsRlOCWtxqiDGWQgJLz3r/falXval9Y62sJklPn16tf1nT9AtMdkeu6HHmGP/6YoAg1b8va0hNqP87oMBFhY0DUruP78kcRo8gI+vYKcW6uLyjz2skruTAA/hU/a3Nvodbp8+3BqhOYsFkl+4toBVlp7FSLGKMt4qBExJ+RHYJkJSxElJtcxwWgWG7vKwVIciPQoGQA2aeBpIqqJOrTIIgBfEp8N8eZIt8cMHzSIoWdTCYgNfr6mcYrCNXiiAk2JaARu1IhVwMlVNKqScNqZYzWVtwLAYTvRnYJudUC3G8XrlQiJpq4Gp0XALsfgbJeZnadjAOsy5AiOWss2SZwWP0VChmTU0SjkzPA9b7nL0BSWPgU1YlF+ojAdYeLXAMytOLy+1X1/Ori62r/azjX7QN0uS4YHRwZ+4hI6y9tY4fzZq3d2d3NvL6yf6hMI1qSDAYIQHK/DvPh++92jw0dMRRlbCzroaHQl91jyAOEE7H/s7W25cKYR7sPiBwWIXRa4v9DFPF6MvtJDFHypIgNfGoOfwd7+kld8lTdqARIyTapYnlRhEZXGOGEhnGeW1FWIequL1NP6t1BZw+ESsKsd8AepzRmc35lbo9DNRKMwB7LMDqYLKKIf3nFJW4o+o/hoV/BZjYcmLMaRHNOPseFhxDT9zkQBJWQ0lfmgpNBt+gCpb1mY0lxouTg4scdlVIQDJtMzDGGEkHmFjlR4mxYVmx8AYgYk6g/EVmr2jWIPLBWzioYif8Y6n4Md36Ds0NwzzHp8MMZKXYzD/y+tN3WKkIjw+u+oGVjF15fbO5Adbk28/m3wyaPr6RqggTnUxX+jB1hhbrGOLMMwTw6Zhd7dG27AxTQaLffVCpYt71BdLHiRJyQ3tYJ/Afl8yhwp4j2PAVxMWT7AyGf5IZyRSkTRaRJ/RGmThNMuPORsFBdYqUWwlsqA2k0tlVMFKAIM02KENi1DRa4EJF+CRznHgkQIMlGQo9ld0sjPZ8XAezEkn+rNUCwsnzv6qEdHCLC4Y0hPzSyYGb/hZEwmoTqehpB9aCs2GH6DKlrUZzaXQQjQpdJG71VCfo7HEaKizHNxquZrqMYzghMfAhOJaAOnwlsfDJSoVh4mFBikR4ZngqJRJ67Wl9q0Vmn+M2HB/d7Izbv3UpQ4mJR+skYDWDKYDoAG00R//0aPx/T2KWJzP/k5dNFbeubeHMIOVDXbX24OZtb/ME/cJeUDnOOktY2+eOqRO5Shua4aKpC+O1QacKiTYJAxIkjbpn/QAHzIQSQ9LEqTNqIENpLJsg4ZmVUqNgEpjwIMeaPzhO20SVIDBpYGf8aFnzBdHEoIwTywUJRUwZ8ZUOhX8Bd5rKGNYndMpGYUVKJEcRnIIVRVUg7caDMy8rkQCu/Ps+onzVISWqrJM94+7NN7n6ltGeAeyN8QlDm/4VcQ68PpC+/pi9oULnZeWXDj5zCptH45pY4esxhFmvrJObz6/93D0aBg8vDBglqP77fu0tAUrOWfhTjwvhgewjhJzNzCUIvcfPxlUMnsTVCN9+e2NXic4I77EVlghUJGGhTbBxkSIMkOkn4WCkgrG4SN1hlZPKZgqcy/INRA9fNg1wFBH2OOZvyMgmYraCphFmEon+cNPLSf4lRrBLC5Up8dgAJJOKxtQfY6eJ7YEeOaHFmdbID6DchaMhlvYJJYNtJksOLOqHAselMwysE5DrdesUmCZKuWY+UdhAA4W/7gyEk55nN9KGMXfWmp/9WIH08PsAD5eTjBpnrUe9oTw8uX1zoO9/JtPxtt+IvHsSruILmj7HDbSzZ5h4jw5D2CVH/YYxgCMrKzEXSz3sViksHvgGKtIpNxNz5DiFSC0SRiwFq86ARBs5EW8Tgkxs4g9GWmHruCxAgYuywqxrMEIBeWy+Eq4WVUkggcZM5sxQiOGiWwAswBj6ER/zFTLCX5/uYnHwiwuGNIjmgseycTgDT9zkYDqdBpK+qGl0Gz4AapsWZvRvI+GiyoMcuQEToIkzS5nwgiSER4GhzOuwBAnszp+poQYJ+UZiINgX3zRKUjhMRhhdBpYyIvH+VL8WOlky53WX7vc1YYLSR7BgRjz1Y3OD7YnOztS1iAP3KXXFrI1jmcYrXk8xGIvLVmri7bLfCJdkGlKnDoPYHAeX3C5tdG7ttJZ4I8b25tF74hqpC+NPAEFs8fjVwWVKkTFE4/lt7BhEp6A0yZCJaQzpEa5SCYlFkKXBRuYHalSkdD8eQYWz9r4i4kA1DchB1dPotmd6ceVQB5ng3d+rsb4ms5RSY2rxSKM01/Dz3JkHElZDSV+WFloNvwz6SfZfYQWsac+R2OJf52BbfKHnxo7C3yomf0fSbEKp1A0ewzZxsxBLo5KqhzeYcBOGPoLMcBf7GVf3qDxFVTrGHTR24RkjuZALjcWsgd7NIPA5oA+kM+tYneAzuU+WfHxbv5Hj0Z3dosBm0P30tncEnxkHsCexFj2iJbH9miC9SiY4Bdc52n5ou2C6cVvXV+Unn2wy11LgJGtRnoGcFYzGBUGLJjjXLxC+fVPun/ADFWzc5yGBLCZSgwhv6QiKYes4gSuktnyVmZhGSy8L2ZsLVPRiGF1bBWd6I+ViuYALjiNY6Pa0IirBtUHbQ4pqnBuxJT5yxivgS1t1MacZyq0hP6B68h7towMBy51GGEkL7NfSFD+LIaVMT5v/fjFDgLMMcQVsskf1xfbf7U1ibaOwqS1n7zYeX3FdbajKTOYdK7tTDBvBSjsjYSGzTHb6e1NvzN7AIMlsi7yQr+Nbd+weQ/WwGJShtyOs6jBxyU/e2WhIbpYVfIMQG0A+EclwCuHYSaGOnxo63GGFmuSWmHMVFxgfIH1UKWIJ9LvVAbL3ABDD+1y5jfvEbVcCjrRH6MM3mWNVw9B4sEuUx2GDQUsf85sJyiZeFk2kaS82moNJSq0FJyBte6yK1WUiw0C43yA4RZVqMVxABeTYH/DsX4gyIdlqQgT8kx3jlNuNTMcqHUYwjk8/+Akf2JbQRW85/n8heOOLrAEA/7FAgWk+bi20Ma2FDaEYK7Bj17oLPKmsc9H+OCYJXqx9HuyHsCC+RurXXyNGJUFJvi9ut796k35/EoLa1NeudDdGeV/cX8Pb7iz2Im3CXx9EtuLgZmfDyekwtVIr5rY7NOieJXnu9+jq7NgHcpCj7ok5MdoqhUnDZaP5SNElJxFRMyo5BRSWaeKkJRNzACXi9AghI1jsZuoZCEeA0x/jPJ4UuBgnoQmA7F4rOm5t5ycExD0xPOOaiqFpDDSObzWDRiQKqkwj/Auc8vDhtdSlfMIGi4u58KwwIdiLRutlgMIeYgSYriMXor4Qz0sQEiHF4CLLz4o80cYypH/ULNjjQBGO4DBykddO8UZHusJYyqS36SdTYLI4szAsJAeq116Q0rH6fIA4sFb1xY+f2UBsQSVxebeGPuy2FsKAyhfuEozwORaP96lTVxQBrBhB1JcUHSjIYluMSTRzMG3im+s0bp9eTyktHIrA1akYgjJTHT21YEiCTCsBqzHszY5RaFlFrVRjlZEdJYx1kLhsXYWUpVYX3xls0CNhGUJ/BAQZk5ILriKuAHkugkG5QKgMPQ5mDXjfQP8UnbgqZ6Wwz/khCAC/YEKUBTyL5FEojjXYEiQVRWcjPHajB6ngY2q0SZGce5HEFpIu7iErKqznHMHKzHIOSzLdPtJMws7DaawimHNxBViKEc8t3hgRQN6lug6Epp0Xllov7KU3VzK8N1VIPGs++vJHMd1QhWTTfLFwVCsHLfbw27n/m7ryaBzqZ+ZsBIYlMZgAnechsSVlc5Pv7wkDZYeVud2g90WxMIry52vvYbtjOlOQ4/ZHWzs0Gph9xfsi4y3CnSj4WYAjC/3YLAGL8LQJvcu2OTGFT1lpFIJ0LtcuPmsIkwvCIpXDSWGgiKQplU2EqGkMnFWYSooC9Nj/rLCsk4nKD+lc5RjiV6RY8QzVUMdP2oZvK5i+ikuM5TAFapK3CJJXGwkEV3wpwwi4jQrltMiCwY0aXluNCO8rPBa/cAQ0jCA6thEobGtwDueKuWhNtE8lz6xIndns5SDrJU/yYvzJ9OJf0pZpttfoZl1OrzJBWjKkQ+BkMRTfGMxu7KQYdkKG9TCTkL39/I7uxO8Qb601MaIC3YJO/GmwOYgb+8N+yPa1ZVLMO6NsZxzcmer/dJij4yvOmrQVawJdzweePlCt+93wq/LUfYHo+uc59gRGX9yzRnTWpedFPnORm8bczlNwmYxBDtiAOijoFQrVYm0qmLYqxNBFfdoZ4HibV5Cs6RIeZm5zFDJU8lWhwRejshmjy5+m00t+GaAMJcM2fGLBF2dKGvCMNKGlkqtlU8/kLg7xvjWAL/ji9l0LtW5gpHsylRYVciySZ6H7a2luuJUzBMzbQ6vqsiiPruCB6rVJAfwD06KF8hiQs3TjGdVpM0WkGGrU6jCAjyajuu91mI7wzontEUwkHpzsY1tKLFSUi8c2G7v5G9vju/sTL52pXNr2W3fogzHDwzz1sPnI3yXBS+q6BHhz7XQN1z2xqPOuEdOqDkq3o5rOBP6ODywttC5XvcywPkH19I9RMEzIwyWzXM5NqgpYwip+v0Do0grYpEWH+QIgj/8k270M0ltEMZA3Ca8YV5fUQon2MgMniijcnZ1mgt8mIXiy6oaGQu5GdlEAM1R1D0yoEJdn1RJubMkFcNod4qy0GRRjbEeJBFj8A+q0JsKXwlncbY1Zolax++8XuKH9lDzEfaJaUYE2Hz9LVFm8BiW4ITHkFflRgJG/ixG4ALPPD5TksMfXI3FK9h8Bf1dmF6Mpxwb4++MWq8uZ9GiSHCC51K/+97z8WmILigdGtNX2pPHWWt5sYOtci8ttlFT4QMu+HjxZzZqmy8QpM9S4icdp8EDGMT70vUFfFZS3ljLJuE21aOi4g6fInDKIyEiKqtIxRAnM9G5pIRwntX/ErciWYgwcoQ8ojIm1cpaYW+VV+yMLJKNzGCzuYhUKEG4MsZx1hGMSD1Lk2bRv68zMrJlkXxt7hYua7ZPuOUUGFTcbzjjhDVxPDbjIg0yBQ/9hXdFJQZ8rJAtLfF7KvMQ9QhDCzzgzGaIreJ8GQ8owoSlm26/KA/0sE6H9x5jt7m84FfM6P3SRvuzax1Mx5IDQxcOqvrBaDnWl1RRTgCHWWE/dn1hqd3CMm2spcOmt02mGwPTGIxxxkmD+EDLW9cWpVOr2ZY5Rhd52JAdAeGzJzbwA0egchLsE/63zOAo8qNsKlinkBSFeUVJqyEikaSxTZKEUcgDZQyxVWKNeA29Qr/Pp+m3LrsmmSra1FfEstm2dlCqhBled03d7GjTYJ80+dwceISNzqXKVDDOf+EtpPwsp7IUXRxGNPsbOuZnKowp8Zcxzp3glD9vleEs6Qk1s4YSj9VToZn5Hd6VRQwo7EEaW5B/eYMWJHK5z+Tp8lLnr726LDfJ7AVIYzCz++rIOW+udeuiC+5gPeRhVAwB4VNBCE/2vyRdRgrVamBlxIxD+QlmTB0yZHC8hXKWrdQWKbR6WKjIdyrnTAyiNDxbw5RSlFdRBlCqwVWAlZor+A6Has6lMvyU7ZeQo3hIoS4kWV+BwkZQkZfwFGeHYStqqKiVsLMaPk+AOQWkhMvrzk6OUFIQpRLgc1ekYJjCIiymVAAqRWROWkzByRBO/rehaMTjOG0Ba2wDmnUWlmDQAmP4WB0iJp3d8wFW36QuslN0uTFUW3lY9MGii7vlWbtqix4DEJVEsE/4XxKuRhLFHf5N1KlSWRUEnyIJNgkDkjabtGwRKVJCkqFsOcksQdYOIz8l8ToNnp1+IwstqRn2VVYzVzWVe7aqSYqtNKwcday3tX2DCgXbbsoMAugRnuLsMJxDLZV64fFdIUyrx4y4rXELw8ViEunxtwvDpF9ekGWSbn2OxhKjAeKqh3SzCyKMJj2VEZzASZBsFwkLRpCFzcBzYR1ecnEYwkX8SMKNDd8qZgUv7CkttDxFlxYrWrA1XPTVbLlf3Y3Lt3mI8Tc0l4NInux/i7pPMcol/IIPqD7hf0m7PGMqS6giN60rAnuIwagwYC3e6ozEI9JUapm/LKI81jYgFS9w+WzLVaYqxle8ipgnMFV5XQSKjI/ijboCkxlphgFmuiMn6OLIg0VWftIaq/FGiBSdPQbRAtPmMZaw3M1QyS7mGaZc43O8iDT4rCeiCHrhhB+aO/xdHHQlYYRid0IzrIYmeKhOk4srBDCwC+OX/GUdsg0xDJvVo8FUloJMoUHuwQDj7FEe1hHqYX6H9/ZzsrDH5ovRijdW6Est87zwZ0dX6iI7Rdfq42ejHzwZvrbeW+TLsotHhJdf8TOLe5lue/rPB93TPiG/dA4xhChhlEv4he65Cn5ls0oCJBL+8FWBy9/pVKWFXSSgJhHsNcivTVq2Ck7L2qjHaQ75VWEJHZsk4sRfZlUaA76mCrEzp6bqV01RPFB8Gag0qRx1oqytfq61scCOdCNg4BhktEmaCTOFx0Cnv3aG2hQRBauDsTYQZ6lcIb7SBYa2wNmbYNMqCgY4cBJmTN5FgAG8O25hhtX2iL6dhVCE5wA8+INyUPFw4DzK0edGUQ/6MQSNiVi0bhzLy3PaAuvpsIV9SvTb8iTufQHYXcwAw6UwGMkRWOYvqA7P9ggVLBGPFApItN5uLWd//UonmidGJpyPY9ZBflxIvGLAkTLodz6cc9ylxAPzx3d2ng0m6+hQyLInu2M86ljjgm8V4ynCqkk1iG5ouamL3wLyFH/jFxQVIkCrlQZ+yseT/S9ZEcDMIRjFq1SJmcTlUGYkA9gmQhJxNlOdbvcTMWtGoY4gd6ugLB5Qa+UsV2xwQDtQotkqVWnjhCIB+DrT4ZrjDZSgNsefHogQeCvHFNXdCS2gkSABOtoQvYyCEO5dxADcsSql3gYbGBB15GPcRiupV4MRZvD130EPESLHQ4AWCZo7OFADQS3EoR/xCeEH216ghYTqm1/JnAYkMeaBAPNokG+NiBMZYSnyM+wkz74TB4pV7uydgqT8qZuIgakOzwwe4y6F8jBvoQGLXb6ycX6jC7xBo8r2Q5ZARQdeCrCPL/bFwuIavLZgj0VsXoKXa31pjfhT8jAegHv/5M6O1YCpZViyv9LLfuJltx2Z3s0E+EMrHUVWYJhZxUW0gR8MZSWEFEmiOlB+3FnJhtOqshoiuIFtCgnk8PCmOay1UBmNpYorilygPORrIZ8u/UaZluhTEJX2RDJRpRxRbbLSGK3ElTMqVBRvVIkVRORAIzsb54MJTqQJ9bs0VsQ8OZdlpYBahDjJac0IL1SIZBl2s/CHXVPBSlST45AcoQGEtW7rAqqsPKMPH7RpSeOH262HA0yNc3ZJ7nT28YNBdwM4qvcOkhYjaMU4QcMjGDgKG70APrdH9+W13sPtESIHev/heb0nxCPtdoZ1f5+7unBlpSvvI9iG5P3Hgw82h7ybr3j43HrvOAp+H29ieIDbGb7mchVva9hOgr1uXa9XTZEVGDaWGMwzowWo4Fdd/rFhUZVw0UW4lFf1WOZKpChSQeI3CQMSYxNJFPmz5SRBxXvAIg0uyCLAFzosmuAor5hs0mqGwR0QnFFVXPX63CKbtTb3dL07CGGDjRWUGhyNDGwZgRYM8kK7RHKMzHNIxmpeymNFBEamklHEXNYjSgop7kCTUkCDiIMHtRb65XCgU+D1ZWpX3dulPjSQSIN5FsoYoTq84YcQAh8aYdBG79yjohPP6oR6RN/tUb7QuN6FjHtxj+wvHg1RhQ1GEwyLoU9mc3eMD1HgssneiOiW+dKNJUyf1QsJV+AV4DsP9z58MgCA3XJ0OfGL66VTUbLPXOx99aUlNGVgDd3HfMgNXcCC9GT/6/iFWZAFSSGr1iP9L+lVWF9DBOPOSjacJFWHZ1PlVMfTIE4koyHiVKrlsbCK2qwLZKxbKUFxCqyHKrPwxJP/tU9xpTVarZepPoIElDJ/lIUkY2SYtikLIyerf0aSZVNxRaJX7d5efn93gt37MNcA0RGXTP7wI5ePzhYvd5rD0P2CdtUrS+2Xl9A7l+1M8tvbkx/uYIIccSCeyZ7HqBURxhDVsJMY/jBKdD6P7DZmDvrj4fb4e5/Qh0bQF4O1mmjTXFjovHyhh20TPYv7/WR7jHYPNo2nHrPdMQDf7owYU3JuHkCQ/9L1xc9c7utnXaBa60cMhOJpsS8C8rQQD5ugj41irHglUjWEVNEEnNNMgGFVsBJppeoEgZ9CEg5/rsxIzSBVnlN/rUiBrGAkYiWzSJU1q7YImJ0zEjxAMn5c61U0cGrtHEkfINJILlFekX5LtTByt5yWVIs3Fpd5cCEwRQ27ST4eYBgpx0QANDIggf/y44AY4+4CjPq8tJj9retd9L9JPtibEt+r/8HWZB3by/JcA+Ch8tGAYgwmRHxmtXNtEVu/ZPgSpTHtXIDZR8+LAIMS80xZ2vhdVvwhDsMlDV5Bu+fO0+EPngw2dyf7+ADWufDt/AuJ96MvXl/EsD9mAeiSTLQ48c2YRzs0MIYd/mW0TC4Z+p3RylzouJnP9PzIUySApA2GqCWkR7Ask/elx+YYw0a1AQsbIv6KpBGLrCozE8bwI0mYfQaVkgJRU5ynMhSsxws1PMVqSB2PraYNcwV7mVOZygBURfzKQyTNiQHLaUm1eCOuPFYQFd/2qPXx3uTdZxOaqOZvBVxBuYgeQ3eNYrCH2E9e6mB7SlUPEvaB/HB7gn3D7GwxVJ6P9vJ3tybff069PD91iTZFVqlzAmQ/DAPMAYqNF+f3nwy+/3iwO5pgZ3gayDmAliQyswcwEvPKWu8CusBZBNHl/tboLvo5xxRg8KUy7Bck2y1jQtqzvfGlxQ7ao2iM9s2cQb1I+uRsDyf9Tlv2cdYrWABewPFz1h5HCcPJNGEowIKBmJXbCEZ4StaIR5zWJJGwghGzqvT1iSICqwpsaIbFCxzlVWZQjC21IucOaGU6VbOtbcvMldRK5eU2TZnNahM4wNhEGFpCShCQLMnmqHgFULpqhqyFdszbmxOccR3lD8x0Tfn+4LhDvlEMGiJ/+3oXWyATdoYDsQXKMZ/tM+cvusA9bpv3GRxVy4Irh5lOGOV7PphgQtrOaLI9pF02Z/zeYq3eRKjxwIPtMf4qiZ/sjPEXkdCUR5/nGxv91y/2ZYWN1nT02OAbeaMcMwNvPx1eX+1d9bM5gBcqASwgSYMkWTmakeCZzqAcrNGmLEyqTFpARSggVkXMgpwxrpRVFToVqgGshTUsR4iuy93WsJJ9VEZbHYNBqRavyq02dalGmjKbaBNVqhm5OAyjVGeZWW2AZsvWjA/0mCwAar54T7vczz7Bx05kTWjHLdgUD+BrCdjwGMP46OzCZBsIImDglXr2A4EI+vE3u8iLxNmdS3sDowJYHih+QbcMPrB47/kIwzMY98I3AxB1EGxoOoDedy+SC099WXAVEPvffbyHZs3lZfdpS/oQGVuOq4PrdfvZ8NkevRlgMjoaQHga9CFqji7KBmV6eQOk8Y8yEPMseMNDIkZGQEUoIBKW02GCDAlX5iGkcJfOdfg6PSUFhGhQUsl/AGRDNRaVV6tpzcWaZ/VU4lWb1VMXaZRHVdkbDAZIdqIzYnYktrLMJgqn4L1+6EAWoh+CIoXJ0GiU4G+tR4MraJqs9zOdWoyuswd7+d3dycc7E8wO2MSr85g+1nJzya0eVe8loNID2fv8McRK2iGRqLn26IMB+fPBGDUXemDQh4aXZSD39QpwSDOSuHoAs18QPNBRhscMn1WWLy5vD3Az54IAACAASURBVMeYaikHAsvr3NBZwVQYfv7K0UVrFohofVGJnIlBVRhtVlAMK+tXOQXKnA5TmEkIq0oYCKmQASqRQq9UYkSrFVqGY4alMm3IVKv1Mk+lbBlZ1qANGtUZ8agSATQJfssZ4FUXA5VsigQAWb1YqkcZJCNUR1jLiRhjR1DCfGj3mu89G3/nKYUZvEv/21e7NxbbZulzxJ6SzgPZ95/SMotjOOQ9+tH26MnuBC/U6EnDS/Qx5Juy2JcH0NX5+nr/1fUeZqgDxiEXyZ3NFVNQH2DFqJRkrQwWb5EWH8NGqYCKUKCcCyuJ6EVFI/xRRk6J0kIgsjYk7i+cxGZFug6R1Ap0Fh0NzLb+taoqRcrIsngUaSIG1SCAJpG15QzwxqxKHsz1wiIVrK/EgVaIdp8ESmBWRh1iWF224AY0jd4SiNcwtGb+9MkYAyqXeq2fuNS9cl47vkq+qUVk7801wCBkYJBfLiciCsb8i4M3nOAXY7RpJg+2KNJgqCaFmcJFpwNCXLm51ntprbvap+aOPnpaydoqshrpC6JUICqlYrwXJLwREFARCgi75WSFAT2iMoPIFedAoEAHNhh0UBaLt3CdTstzPLCtVetyrOOx1bfKVjJHyLLgsYUZRBcsrlztuVsXAQaDKJiLrHeCmAoL0aZHzxhC0ewHtGHABo3+ywvZzCP9s6t/0TizdzcP24LBg4TeMExhwkALZsruYc3mCCP8rQH3hqnDUG2htsKbAubXYlIT3o/RdYb1NE/3xhi2UbYEnBIPLPfaF5c6mIG22KWpZbhEuEiYywG8m2lmLpqCCqAU+jwT7EtVibQMlYKFuNcjv1YbK1FGopeoIlScA26PjqQ8uiiCYixQqcoyWLguC8uzX7hcoTdoiIJBxFlJrdRf5qzAhKiDhZkod1WpAIqgPNi0ZqOfyV0qRUN1hI3IsKZCSwpB3MyrPdrhRpEJmLsH5jCLDIP5WHSJdRjYRQZhpsnEvYKIMIPVNpjdhBeLITo403HKPIDBs53h6A43cJd6GRqjuFIYm/n0pYXLWMHsrbXXO4B9wv+SgK1YA7zXZnmEQdkUEN5QVUQMMiKdRr8TL2PKTFWCKlfFrkQCrIUB4WgSddlptWuzjYzXqyk8lqokq191KmfB5rMpMMxkRCitYUbUGirJQzbSXGYT/cLmYJ8RQouNLlCI+xWYnOdXCjM6xzCS76f6U6bpOAoPIMCIww+oHB1c97ZGmOGK0XuomF0XGj1ovmC3nn1JHdDKJHY4D+xiDJQPzDTDywSGZ9x0Z6PWcYQVazMS0spAsE/Ir08FPJaNxZULqUIDJULltZhAgXDFOTpslcKCVKVHqWVgn+xlBQGm4blTr6qA1uaKscZEqpRk8apTVZXZBKNSpQhB9IYwI4KRWqvE6gesGQFQq7SAFhBmhBzar9MSEnwEHsA05X1rRSsFcQWCOGP7svtbYzRc0rXatx/PpgCuONqsC91gJbMWRW8ne1spEmyKV4CQJgFQUwqI/pAtIFqSzcUJyo85R/xlEeUNslEsA2UlIb0oSISfe7LByHIdGpkdPblWlZVVfIBkrNUgbMoTSWnWIoJuVwxmoBpBpEGNj2n06Ej3JHIS9KgGSeIMJZojqJKXy5c/FqC5kwo+wI/VYJgaiZ7eCatEg2ZfQy9eU/rdnwf210WGy4NYsrk7wpssbguMtWC4HluWla/o/qxI3GfHA4gu2E9o1e9VY59/rT7KSLyU4Cax9YKWOJJSWQXAqTwEB3VOQGKqKibAKhGCVeUw8mPOZak6WSNUkZelluG5jDzKTL+ycsWUyxI9rdYheoFEXGWtSBmpGlS8goc1qh4VebIzwjIs4DHUt7bYQeOY1mz7W0X0IB0pFHHJTnkwto/vryzTN800H+cGpPFVTez9jGEY5AbPI8DETI43/czTA1NaMHrxkCfqCOw7cu/58PHOyK7S17tqnnYlXafYA492RhiG6Xc6+thrfQGrIySSmPqBOwefTcO0NJk5KoWDFB51vKbgWV+QeoUJqoG02QQpL9Ilkmh154JPdEZpY6eKlViIEuWizESyiRp4LlGkRjehm/VXhp/IbFvP2sLa51pFAmZvliJVXGVFsGBgEU3ixniyM0aMEU2bu+1Ly7QHEgZocTu0fQxQJZEZyE4ygkLwY7bxGsb2Vbs3T38Rd7CTWL+Nz9gQv+ITcHQe6CKkw9elkE85IqJsDbAKL8erAS4kXl3vb/FnYOj9Il2eo7sop10zpqEjKOjTrtWKYlAAQQKDnbbvPB1g5AavqPiqEGIMIg3uHjCg7YuN1D7ZHqFv5NpqdwVboZnbStWKO+YVWqyRXnOFw6PclaMsriQAzdW95VS4WaGyVQLGW5X0Cnvg+kjKGmBJ1gP6uCtzwOkzV6TIRlIFlflRseDSowtEKxPcKrefDj7Zbq8t0O552FQCdwpuCckUryDo1FIDoAMKkRHO+FbVWo++a2nvH29U/Etf3gz1xBwpPT8PdH+4OcA2iLii8tjjCcGFh378f743vvtsuIXheHtV+brOz4Ck6ex5AHsxYF+G9UmHZub4e8P/FhjMDd0Z0qZBmGGImIQXlK3BAC+nmOiMmw23GSaq7SHIsCS6Xq+v5nh7lVdLVcu3ououlIvXCgLfsdaVVkOZmdVadgeXpeo4RWCWiGKNrMjyEKhmzVqh2xxQQCsVxZuAZMTULVHMAIvNRcQVI1KRiFAluqAvpNzBjnUO+Hu4RdnjPkHwGI1pozC8glxZ6UnXlrUTQUhWvexnNUtgtiloAufsge6D50OsrscOIni2calQd2B5Cm4CvKJuc/MFGeodM+fMk7oz6wHEDLRIMNEcjQ5UsvQO4h96/CKF1xJsoIlXVIQiJPUWIvw42I5TSFt74zsTLKLK15c6+L6AvIoWStlRUmGJz3xulLIwJcN0mKrgL4uUdZIYH1MjSjk7L9r0u18p9WeD0rLOshR8pWx1wcZKqW+jsAEzlE0UFklOKz9WJCBgoM7B3xAfNG4oAHOCmVnyB/xpV9pMr5NJLAEB98kSr6ncV3RpzDMR5+mB7H9/++k89SVd58YD2OH00nJnsdOmtggvk5bxFdRBiCLo+jjA+llUN6sLHVQiy/0M2qSHBB7Veo1g42ELR2wRZzlZ5q/kARJHXVyJDBDm8nlGtrLggTHNFbeobeCJgk0Dv0aOOh7NBT7EuwZeYZ9s05dzpackKiDihPSJubASktG7RYt/l7sLPR6kwcclO9nFPnWOhYwpdVo8kKaCn5YrcebsoG/NNe6UGlU9MxYQDWiM/C3i44D9DtbhogZBmKFgw3NYrRJba9sIBB5LKicJE3KEKcoEmIiHsHyUmT2FfpupljOC67KL2JCcxbFlM8p1cMRjGWCMUG2ksfxgEJKYrSYpj2hDFEHvKCF5Nsf2YIKOd3nzUBEqEXrD2hkWpuCthRZfow+W9wHBLADbQY/XmAfbI+z9cXGpu7GEPSZoe8rynLGyxxLmpDyQQv9JeT7l2+QBLO3cHdLkIlRDGJXBkC+aNTiLjNZiSEb1siURVQQYcFWhx8ivMmgyUqj4UK5IRRoKgoEinbOIGOkYjLQJ2YYHW3ercJSp5RceZbAkNDtMdgTiP4eNHH2kMnALceXRrMEJ2UfbY0QUACJSNhUYiGAO8Uur3Vcv0LfypErCmNy9rfEHT0cPd2iZnRPkLSyx3RS+bDgYthYyDPvT+4dQ0/kUeiC1YE7hRUkmBR5A3YRNUTGbedkHGCFrpeaSgVARWoAGJ0Z3oAHNILwgl+caSb0pnICVwVVsoWZiK2EsQg1rZrMiEVwWnFqJWhE1AGpVMKqHLb9lA6wk6IHTMOQuStDzifYEBk6kxr+80tVJGZqLZI28EFSe7o4xPR3iUrrIAEHijOjyIxf7t9a7aK0qEjDiDTrE/vLR4MPNEdouqKrwOfDrK52bq52NBZpgko7T74Hu6TcxWZg8gBoNa3sXuvij/bhRi2EnCUASCbRChKMsTEneqh21JCYs4VUab9wXFqklRK/eXOFJhQhODA/gTRsZ4bxM63XiOa+qGUBREfK1ESXKwLj41EyNuUvp2cVj27wqLakwRNW91S8M8AN6tLBIZQDIkr3Cx9sjKMEEVFwToWvWiCmYtQGfa3TxQvEvZN/Y6L2+0UVbJKZhQK6Xvb7ewwgf1vbeXOm+udG7mHYwLrvpFGNSF9kpvjjJNOMBDMygoltZoF4RdOvjbXqx10aymAjgmVHZ4fUZu3MiCGEKG2q657QNK72G0/ylreHTnQyNIay6wVI+iUgQwebf8raOuLW1O15Z7CzhLZpWjbiKj9XmY3TX+GWhUqv6bINfIcEMHFU1Z8A830SlVSgD4XngRBgkZkjZomCDIg7HE/jt2S75HHLOBaGhID3eGsGlmJdBcZ+1wOfA42Kh+YJrVClo1VxaaF9d6lRGF2G7uNB+dbV7fakTNXGskgSfWg+g3cn3AO4i/MqtB2PlvhCk2K6w8OiNo0kFwG9hSapyK1iGIWiRkrXIRnhBWgbAwqO5R4AyALAZSRJnHDaXMmylIlhkK5EgAS8M/BucpopYWQtDi8hWIiUPIQHWsqhUmUH1iFrLAHGrSjlFG84Rg8pKvpFCNUbxCohCy6DKqbsGMQBfSRftrc4epgN0ULshWkiHCSio1NAbhjOqSDRHdoforifz7H2OCvQZNvDOuOtGtPkcwYiaF/MX9rZG7e1xn2Yr+YGfPB/gOxS8MHl9uYfwprsSeIucYfhBtUz17O4Y0qsYrPD6y5yFzDwgn0+sC/nuDCZoifQ6ZLaEAzCLPSgyATzLC0xouCC6oGcSeOs3Ugo+zYOmp7ewFB+xBN6gGNPK4O+9IX0rHQfFZmGWbBhFBEly9uj1whbdhKw54Dr0lYGoPqxhTOjT6AHfgpH7wJ4ja4UEJACF7d0mN4ncOnrD6J2kIqJBzkIFDH7lrGSoFAdSNVgGzR2q5LBUwVhrgaljAAlZKNUCgMu5RwwiXtZfKQs2tbwy04hB1dpMBVk2DHghybmSQfTgXGme4FlNcBIpqxyw6FeSXl+QojIqjyiVXNQ8vUzKJgycBSpx9HohhCDGrC5SUwa1Pzr9gSQFXknweq65S3Y4q2bBKAPXtrsDaHFDCE4io88WPN4aLqFmXOhg7RhV1l4buFErwzBYheiCIMfEbBmcqtkzH8WvL3SgG+axr0Z7Q9qUFt2M+DITRRpqodGBM1yHtgh6tBAetEesKBg4lFXzEAwVGStqvZeY6iiegWQVBoPC2HESswSneSaFluBynqlE4yC/3gd1RSozRBibtLAotBgLa3aVSKUCaGZopk4Vl4walDSQ1Mg6njr81ExnYWhWDg2HZDiAeFnEYixcNi+ihh7AsDN2X93cFaw7k0SllHI1U6eJ440fy5BRq6IXDYvLUUtCAjUn6mbU1KimAZAORj/bHQHB0Yiqyqk5q40HAIqQYIRhCi2aprBLjZLdIaKyIZfASiUFV3MBmqnQEjFEySKbBL0IHkDbk68wTvREhEclMmSpSFVKzY6s0BiioApHZO0hkTaHOaqyai1c6Q3LUAlXSs2OtDoPWcZKcau/Eq6Umh1ZqTNCQlt0Y4DhkEibRagKlTW64/awMUFFpn4LLarUUb9PMPEa/Uh9bj2g0XNEb+XIq3wg5qE5JSGv2htWJiyjoxwSafV7GGEM/ScwGDMCsM9xOl4wD8idaFowuIfKRyWyzBZhKqVmR0baKpOza5ud02Y0u1Qlp1VVCc9RqlJVJTKypJLnkMgoi3LylOuvNM+WopJhBiTaDjto9GAfpixDhx4aNFbr4WE/3BFowkOOwPIMW37x4+6aJpXWWrlKhkMijX7EV+yrjzWVGMC/upwmHBvXvCigvuf4MZgXpWCpHMkDp90D2C5lQD1m87VTxumtTjRZEFie76CDjoiVAcLyHw+MCWPri+1X1zrXl7Hp3Ckx6niKfl5y0eiClyo/i+y8lD2VM3ng5D1A3zsY5Rhjn5cp0agJ9zvlu9QvJwP2Zh7CvLKcTQ/G7zGGL6+xCHPoGLyx0sHCFyxwmU1B4jpLHtDQAqNpuA9fUohuzbNUmmRr8sCZ9QBG3VfRSTQn+6Ohl+29CSYgyBN+Ug848qXGSr99abG9sUARbnuYU7fYIla9zKnYSc1p8oBGF7nxxLS0kv80XaJky7nxwGDcwoTghTnVtTZQYVodprHZh/w4nYrxFTTMpNVy60L3lVX6PKUzYOk4DUl5HZ8HNLQgS3vjAT+3d6jjK03KKXngBfAAjflPUB335vEI2icci13QoPGV+rF6Cmst8dHia8sdjN7jMy1YYKrB5VjtSJkdowf03otCi5iQusiO8VKkrJIHjAfwQG7vjZdbHWwgfOB4EAliRvJwiE1xTiDCoEMM7ZXX17vYvNKUMoEvrAc0tKCEldEFLzppT9IX9vKngp0BDyDG7I762BhNNvPaf81sH3Ks7tyjjY5pB7D9azqUt9AUe22t8/qFLr7RcihFSfiMeMDeeBpdQiQtD/MLLc9IqZKZyQMvngcGAzQ7xugrw34y2MVZC4jnFu+A+LpAXQPH4hFddvd447XpO0xqDnMD0DOGaccpuszNoadYURhFipRCuGkVPkTj/BS7IJmWPHDmPIDvrAyxlWfpwCfo++h+QpgpkfAk48AJmx4PhtgDjdIVfCXBuSOuLHeW5zRhYe62JYVz9IBGDuhsaLhojinAqCsSkDxwGj2Apfg7e2OEma58o4bjjAQbPOHYuBirKWklZc4tl3IUOpYyXei3571y9FjsTpnM7IHK0ALpEB8meRbZCd2SMxcsMSYPJA9gwzM0UzC04r8egIhCf/pAV24Vk/yWPDAXD4RRxKVCpN6JLkOhphbMXPyflCQPHJMHcr8vPvKjd8PT8X6IhTeyUP+YvJCyOUYPaCDRPjFkrkiCzaBLREprao/xQqWskgdeUA88H+YDRJh0vFgewBXVi1oZXRBaqHvWlDqAMU35RIYEjT0JTB5IHjjzHni0N7kyxDBMqk7O/KXUAmioqAwtYGtouFDnLR8pwDhHpJ/kgeSBA3tgZ5Tf3RovtLPVfooxB/biaRH00YHsqYwuUWghNmO7Rhcg07Io45gEJg8kDxzUA/d3JsPJCPvwY4NL7BCDOHM6hocOWp7zKqehojK0wCtRdFF+IanbBJ8WWqpDEpA8kDxwKA883sufDkcb/faFfoa/tR4+Jp3CzKFcepzCYagoUgpFoQW2KYlgn/C/ZHvqIiMvpCN5IHlgLh7AkC/GYx7ttdCIQVPm+lK2vtDGPjj00bNWCzsrp+0v5+LnuSuxUUHbLiEyCCcwQKkaWiySYBrkn7ulSWHyQPLAufcAAsrjvcnjPTjCbU+AKQC36EOWaYvl03VzaJyAWRpaCPZmHqDhoiEHLRgbYkSnxWhGEdJnfny/c7ENSg5ZkLmYsS+vHV2O+/JGJXMlcl+lmwtzpRmVyLrswIzj8PdGWcO+zKgzrw5fqbwSWaehEr9fb1TmGCMHk9YHz7EvQQsxJm0rU+n340fKlZZ8NbqEyCLSODZvpUYRICIRzxJ3kZUfD3BWIlXDsQGVZlQiG0zaL39ZVaWGSmRZ9mCYSuWVyP3q35eSSuZK5H7NODx/pRmVyLq89sW8LyVz0XzMOe7X5kr+CuRw0nr/+fjpMH9ltb3KL7dlJlRVQ7R5slY/LdKru+zzwIchoUgVEPdxBUmTb2V0sUjhTV+0ND5LYPJA8sARewAtmIe7k83B5EKvfXkx21goWjOjSWtrmPMQTo7tmV9dacunZYBHP8uJN3q0qi0HxSP22fzVa1mg+igaLqSWrU6D/PO/eElj8kDyQLMHRpgLMJg8GoCrYgNpYPd28yeDySJPCcA3bi4vtl9d6ZzUfpqoK9H2wpDS7jjHSNKNpbPdttLooqEFDlckwY2L88Egh4qUGy5KwiC/xGPFeOn4V8N2M6eyQX6+nM3axNwZywLmfXHOkrXoPOWcenWm2jl3TlU49xtjqkK93EfBOdWTmvsp59QLNNXOuXOqwuACYW/PLZ57BiwW2eB8/DEGvoAZjwf5R1vjrSFMwHegc3w84fKCtZnwZ+Kwl1ajS4iMa22l2iiiSJTa4ilpHAFYZ5HN7q+T4jypfOGwE8w65W5u2FrwBC/QCWZ9ju4N1GL3tvOd0fiVlfbGQjAxqfam2D8BFeLeON/1bSp0zW0OcjRc9hgjV3owbt3Zmqz3OmfuY8Ba9WtogYcUSfD8Gi6qOfvnH1EzNR3JA8kDyQOn3wOo1tf72bXF9movs6Mys8f5ujLiW9NYKIp5bhpg6jjRb3dxIXtz7czEmDCKFCmFotCCgiuJYJ/wv+QYRVKCD6UqAHT2L26nAOMclH6SB5IHzooHUMtjhEZ6YBBsri21lzoHtx1DLA928x9ujRFmZjkoxvSzT52FGKMFmlfDBf6JootmQSTjPrBpF5lBJzB5IHkgeeB0ewCjM9uYKsDHFgOYddauasjsjGl8vt/O0OzgSQNBwRBaHu3l93YmoqRKQcAvCeT+aJBvPR6/tExz4U5nNRrW9UVKIQQAhaVcNqlRpBKpTlGqAiCp5mihpUolIHkgeSB54Gx4ABMAHu6hfpvcWG4vmBleCAP4UM2dHUxIAzXvbbUu9DJt6FCIGreej3KMteAIl5zPVPA9LOvZmtzeJrWLnVY7y1a62Xp/JtmjZgqre5cKkUF0iUhqXh0eDAFJBUx0AcPpDL3G2AQmDyQPJA9M8wCCxN2d/PFgvNHLZHgGI/NPhvmzIcUPaZcAQGOlrGnGVktZkDB5a5i3PmG1WZYvd5B77V44CGloKmGMB6t8EJOOYiVpVLzKbjFtXmiJrNRcGi7sGFKf/T93ePKdZpWA5IHkgeSB5IEDeQB9dBs0NlMRY1CJI9p97+lEGkyqHlPi1rrZmxfac4k3YahwqRAZtDxghlI1tFgkwcrBRttUAPsON4vMfvduCjDstnRKHkgeSB44tAcQYy50s5eX2ytmmxSsFb27S3916rG25o3V9kavjj4FH+mtbLhARdR2sVI2iijeIsUCJZE2b5RVq0ghZv9vCjDeTek3eSB5IHlgLh5AmMFoEHrMsPsAGi4Y7Jk6Pw1NmfVuhoU+OkpUackY0QOzs8x8BlunE+zDQoD3zQvVqVTPThRFGjVOIiA5HP2UowuGtGBimzsms+8/G2McDK02LJUdoo/QH7Afu9HJmJhMvcBmqNil7umwNTBsnj39Jg8kDyQPJA8EHqDRnUwr/IBUl8Bcg9UOzRRY67WWzOdzMBmBRpUGrcfD/Eq/dWvVRZiiyuZqXdWG+DByKBOHB02piA05QhXSJ3utnXF+aYEMA74cWoBEmHi4m2+Naa/SRQSZLUzT4wMqtkcoQI7pdzDn5eUMnYkmTApXCyNUt3lWRtkIx5F+kgeSB5IHkgcO4QGzVwGqcq35CUQC1C+so20UzE7QbjHDHcQAMUeptgJXJHgsnpIshiCB+RGPBy2aMYE+wF5rvdeCAWKB8CA0IAo+G9K+bXKAWgQYh+Nt3VAK9AkG5isZcQgxZjvHJgoGl8DkgeSB5IHkgWPyAAZ4PrvuGzEmJthKGeggaUwzEgWPRQovxBEsng5ytF2o3eHVSWzAwlZspiBGYMa29AEqj2gw41A+e96AoS64EBMaPr0muleUfpMHkgeSB5IHjsAD6G364Vb+ynKwT6Kv/5saLrBFY4DyW6Qai9EQzPNGRogxKiJUSY5ardHYGWBVqQYAFQHGkith5Lfao3iFjjZtDVVyJmTyQPJA8kDywFF44JNBjk0Kbi1n/XCPHNT+troPYJMwYCl+sLnPR9RZJd1dtd1ZvmB1LY6KLjIvMuUX9iHGYLcGjDttDnOM7aQjeSB5IHkgeeDYPIBqHVU/dkW7tpBjLxzka8NGlNRWiOVRpNosVEwouL1L0woOeWTPuQ1SF39m0Q6DZOlQp93C/DJ8kwfjPJgsgOiajuSB5IHkgeSBI/UAYgyG3F9ZDpoZQRRB9j7tf8miKLpY0r1dmjM8dWr11HJlTwdj2CWfHTtMmLE5wVCyNW9h5AdzwBFsqKllzbfcCU4eSB5IHkgeOIQHUId/ei3D6Lgctq7VKBIgwWfTJgU0Rl+wt9tchj+yJ3sSYGivNwkw8wozWlSEwU928/tzsti5MP0kDyQPJA8kD3gPYN3MaysZQowGDgJ8wv8St4YcEQ1ILWwP2nqwN7chjy4aFogo1IjJcwJcY4aQczmgBxtq4htBWKGD0Zp5H+KceRk7b+teKH1w9dny85kz+OzeLmfL1S9mpYHpXljheGXRtRNsFJEC4/YiQBN8u9kUPnqAT649G9GQh28LHfKezLuSJc6oPPDXzjAFQTrMSPW8ahSMP1UNQR3SehW3XlJkAubugTPn5zNn8Nwv2bEpPHOuPnMGT7mUiCif7KHCzi+bT0rbQmrIwXys3VELc89kpaYkt8f5FtZI5vl8xzJ8C4aNR2SBEThx+KIuM9g3lxiDRZ74S0fyQPJA8kDywBF5YJJjRWSGaVbXFrEEsqi5Kcz4ULM1oo8LRJN+QaS5zeH85rkYmd3fGYshOFNHGZ+hGjGGkjwwU1i6/zzR7KLtZ/ZyDPjrZgb7V5MkkgeSB5IHkgemewD1NvYAwwfQsNpf5i6LzM6ItgjD0D3ikA8307UdkqOLEXjEDxftpHsMmIzW16C3DG0YDjlAzNqUgUKEUNmaDZ/iQXnQowfFx1emQ7okiScPJA8kD5xZD6CmHbdo4i7aDtwJ5UpClTBaKscWWzjbLuWX0ZJJ12ThpLSVJKhQPGQmGZoBMjqwGAdtrmcj13lHZeBiSHvrmMsT2ZaSyQPJA8kD59ADqHilBj7ZsnddS0WbLAggPtjAsr0RNUfabezPTNsvd7ilAxa0S9CLB9LWiBZUoo2CZldlScoBqZItIZMHkgeSB5IHXjAPuBaM2OLptwAAIABJREFUBjvMLsDnYdC1JYeEQR6LIZQ2uIQOKuJT6vx6we6JVJzkgeSB5IG5eIBaMBPstEwtknyAISDEDI0YPsxwp1c4CFOQvBnaVGkggTeiHkwKekQw0qZ4MaqBGpEazBCdwg82K6g2KCD52nMlqVIPpKxyVaIaIikwCEYZVEQBISEZaa7Di04Vn4uU6oy0KV6ya6BGJDW+UlCpkVRzdrNIlRWKTuBF3DIAI0kFxFo9V+ZYqUdErHKrZI65i9pKw0BSPOCyMUqNSIoX5XXUCN+cnercl5TqPJhUudQNZti8wBblKBgRj0gQVFkAlhrpEfGIh4T5UOWRFIiCUQYnYH6EBITNXQSFK8JbUkkq+9cPsOmyqKLAUpYVnemcPJA8kDxwRB7obX/Q3/mwM9pcevb21Cx21r407q6Pe+u7F740lTkxnKwHMIssxZSTvQQp9+SB8+WBpadv93c/RCwBsPTsHcAHLv9g8bXB0msIOTtrX6RzCjkHduXRCGZ/fH94NJqT1uSB5IHkAeeB/s4Hq49+f/3+b60+/gO0VI7OL5tXfx5hZvPqL6Rgc3ROnl1z9o0UYGb3VuJMHkge2I8HFp++fenOP1l9/PtoqTTIZVcwFtzK1idZr4GLSPmwlW/STiP5Qzo3HGjcbF77hUcv/WLqSWvw0lGTUoA5ag8n/ckD584D7eETxBX8VcYVhJM2Ispyni3nBBz0yLcz+nvYpvMm/qpDDgZs7r753yLYDJduHTSrJHdAD6QAc0DHJbHkgeSBsgekyXL1w1+PSBJUXGiJaHNKonEz+biDSINza1vnQhXa0Xv26OVfenrtFwpUgo7YA9mfPEhjMEfs46Q+eeAceGBh8+0b7/0P6w9+25YVvV7t18b4m9r3ZaUOD0/QrHnYHr/XaQ3jSIPpAHff/O+eXU9h5vBunq4hBZjpPkocyQPJAw0eQKvlOkLLfRNa0Pd1c9x5c4xOsAbBYyBNPm6jQYNzFGkQZh7e+pXHL//SMdhwnrNIAeY8X/1U9uSBQ3kAYy3X3/u1qx8UHWJosnQ+N2rfPPjIyqEMqhHGIA1izPi73SjMbF77+Ye3/sutS3+9Ri6hD+sBLLRMXWSHdWKSTx44hx5Yu/dbL3337+sqltMZWqLrgk6zcph5cOtX7n7uf4o4U3IuHkgBZi5uTEqSB86RB9BwufWn/wlWtEiZz0RosZeHwsx7XTsRADPN7nzuf3ySesysm+YBpwAzDy8mHckD58YDF+791k1tuPRydIhhrOXMlR5TztCUmXwYzAJAj9lHb/2jSW/jzBXn1Bqc/ZvURXZqL04yLHnglHngxnd/9coHvyFGYW4YosuJD+MfxkOTzQxhJse0Zn9wjPmNvHfRI9LvoTyAADM4lIIknDyQPHAOPNDb+eCVd355RbrF0HD54qjz2tlruFReqPGHnfE7xfg/Jpjdfus30vr/Sl/tF5kCzH49lviTB86dBzAR+Y0/+XnZQwwjLt2vDY55XctRexzTzFyPGeeEIZkPf+yfHvPsMnw7eLGTLXTcwh18NmVrmONbw2f6yL75MLVgzvQVTMYnDxytB7LBk0//4ddktljnq8MXpuFS9lrUlPnord/YfOUXy2xzx+CLjsvd1sWFdr+d8UeD3WdTBuP89ha+1XWGj+4Ztj2ZnjyQPHDEHkDP2Kvf/DpFl17e/enhYbYOO2JL56AesRNDSqM/6IuuV/78l9Foe/T6r8xBtVfRzrIeb5mGz8wvdlpL3QxBReJKtx181A0SnW52abGNMIOP0+MT9WfxyP40tWDO4nVLNicPHL0HuhxdaMPKcxBd1J0Y+R/9cV8nMT9++esff/EfKfUAAPq+EEJWutT9BQBJHPgOFxor8hfvZmPyQBcZOskmeQsx5tHu+MyFmRRgzMVMYPJA8oD3ABa7vP6Nn1+U6PK1QXv9jI8G+HLN8otJzGjH6PbMT17++p39xxiEkpVu60K/3cmo4wtjKzg3xJJmw+D9zcHk/s4Za8ikLrLmy5qoyQPn0QPnObrgemMKQ+/nBqNv9mihTKu1cfuf4mxjDOIE4sdCp9VrZ6j6R5N8d5TnWaubZUtAdhBRMozSr1N0OXhQsXcecuyG0QnKV3sZohcyejKYoM8NlqCJk5+mjxRHNtsSJTh5IHngnHrg1T/9OrVdlvMeJoyd9IaVJ3UNul8djpdz2lqGY0x/YWPwlX/YpYiSo88KsYRaJFzpIzmc5BiORydYh4dSgM5bqP3nafvzYRCrLi20ZTiHAmK7Iw1MhDoEm+3RaQkzqQUzzzsg6UoeeAE8cPOd/2Ll0R/wuMv5jS5yHbGSFH4Yv0Mf2lz+/q/3L9xqffa/RoUeX+XMNWWqP3kWcx8k/WhvMpjkS50MzSNEEYQuH11Im8IY45nk7R1wHCST+cukADN/nyaNyQNn1wPrt/8J9Qj1cvQRndu2i718tBFOrzX+JsWY7p/9/XF/I3/jP7UMAiPmlMJOmevgmLVeGyM6aDCh2dTcB3aqls5kb3+S1sEc/KonyeSBF8kDS5/8/mvf+Hlqu5yzUf2pF5GWyHCMAefo3/3/Whe/PFXkpBju7UywQpNnn52UCUW+R9ekK/JIUPJA8sDp9wAG9l/+5tdhJ613OU9zxma5NFgig0Wmwtn53b/b2vpgFqkT4cF8aPSYyeDQiRhgM00BxnojwckD59cDN96mdYWoRl/s1ZQHvsAUY75IMSYbbnb+4D86sJ6jFlzuZleWaFOA0xBj0iyyo77cSX/ywBnwwMb7v752/7dpg+QXZQvLo3A6xmOwOAZzl7Mnb7f/+D+b/PT/dhS5HFInBmkwF+BCL3u01+Kpy4fUdyjx1II5lPuScPLAC+CB7vYHl7/3a7SLpe8FegEKdURFgIuym7SNdPv9/yP7y//liHI5vNo+FsgcXsuhNaQAc2gXJgXJA2fcA9e+89/gnRxDL2e8HMdkPsWYdVpR3/mzX209/tYx5brPbNBFdn25jbUy6CqbRRRMWMSz1s82Ftr4W+thIGcOnWypi2wW5yee5IEX1gPr7//66v3fxvddXuxJyf/y/1r+l7+58vie+7bYWz+7+/Vf3VxaPchyEazzRzAe/m6/Ncw63/jPxz/3z1r9U/cRTHSUYfN/WvvZxkaZtNq/4Q5GaFnhiGKWjmaLE3wvwAkNJ60xdgho0lGtPvvzNE252jMJmzzw4nsAM8de+1df66+8jxX7L3Bp/9k/Xv2df7waFfDNLw/+q//5UYScPTn5uE17YmInyi/8g8lb/2B2wePkxJqYUY69MvPHu7ROUyIEGivLHE7EEkQNBBiaeMZpDSIAaPsZTmOrzW36OI0SiZVW5PCunaKn8py6yCrdkpDJA+fCA5e+92u9nQ9f7KGXR3c75eiCq/vet/rf+J2lA1/m9s0JrfNHPfvt/z67/3sH1nOkgljw329TU2YDfV+8dxk237y42F7rtzHZDGEGf9x2ISsQLdDxJzEDOwEgmkAcO98gSGBnAIkt1DDqoietfQHdaP0O/lb7bWwuUNcPhw11jrSASXnyQPLAKfVAZ+uDix/8BmrJuXSO4aOQ+MMizdO2hub//vW1ugsA0k/9nZ066lQ8XDd52M4ftjGjbPx3/uhUdZRJPKAzhwaM+Xc7aMpQfY//cWOFuUVESq1tFSCxiedSt93vQBPJY2iGetKYj6ggcyZjik3xkbaKiT2S0skD58QDN975ZWxn2X6TXsNnP7CV/eTjTr6ZYcIuzhiHqJDt5dk6/iaY93zi8ebdb7kPiJXt3N1q3363+/Kn9+cBq6f704PhP1/Itj9EO2byY//Qko4f1gqew4OLEYLEGdcJLRJNOmaz4l+DCix3VAYASzuG40tJQ2M59xdgYJ/GLvTuUTOqUXsiJg8kD5xODyw9/L2lR3/Q+eoIQ9azHBRXPuzgT7+S0iQ1zPKH+GtP3utSm4Z7k+bSTmrKtIaGKFJDIfROI7VBUEjwHtox2A2z/Vf/6+T1XzqRLWSkEqazBBYND6Z+1opaoogmScj9LypzoeKsJM9CGEUSgGTeGtPojqQIgw2n0TOGtg7Q3cwQiFg6wCc9bAgtkMRZDujDEBCGfUg7o6ZpKqlOiOSB5IET8sAadrRczmdZVomOr/F7HQoVBzuGmUQmWsU5p+64fRmyuDJpiDFLK4f9hBdWX1KT7mG786e/Ov5bv7Mv2w7MrNW51OyuBmZ1Wg8XPMBzosAo5CgkCZyg6cyQJH2KkAHG83TaGb4WgPtDggNmRkuYQJBxsZ3aJRw/MPfZzn7G6A163zCqs4BvR3fpUwfglD8aPurQ8NFyD+NF/NfLwClByIchsjsdyQPJA6fNAyv3frvNCwYbDENoGb3TxXzcg0cXox1hBr1J+LwKGkPHeXz6y7UT5BB7DtM/pqVARxkaatmD3z/qpZeo0vFHQ/F84N0eMCe5PwkBgGOAsBEs/UyKFAZN+lF9aHA9UiUGUeJUce4FRpL87TWM8SBYdOhzONR2cQaAhIiy2G0vdNqLHdq+hsaC/EZpCCRou9D3czj8SMxQSQA4mActG/qDKogjxlBA4q9PS7Ahnjb34rEevSoJSB5IHjgpD2DbseY9xzAN14WWylGWg9qNADP83QWaDnBcx9/8D7brsmog1YlU4qWjDCSMxLQGTyp5DozUKpc7ovCtMzokrshcL4oivq6XYEMYjSIaMzxGmFWDU1KpgUVUpwstnhOGOVUgMJLKyF8TAAIRC51bXQQcBAA9wEgdYvzVNmYGExGJxbApqIAwIQltiGGYWUCZUigjFmFTK+AgzM7WqW8km47kgeSB0+EB+iL9N3v5x25N4gGNWs7Lgy4UV/gPoYv2bL7ClcsBM5hVDC2Yv/H3tn7vN1ciAayD+Zt/bytCHjiJjrLxe93s/2fvPcAtO6oz0ZPTzamj1K3QQmolBAIRjYn2GOMxGNtjD+Nn3rzP8/wMzPf8PLbh2c9jj22MA3hsI3AaEGAyCAUwGCShAEJZrdBJ6nA7d9+cTk7vX2tV1a4dzrnn3L7d6nu1d98+u2rVWquqVtWuf6+q2nsX5mNP/s6qvKOMRksZtfXwLRQMqSpgxnQEmGToJKgj+qy8CjtJ6cfJx09SWlKfDYFV6VKxNCdpPnWmUzR6cL4jf9UFJCQnam3QIYoBE0lXXHpPm2JgUcAmAKbKKMeE8Ce0QGiB82eB7d/dlhibSfpeD4PlFvpIcPdeC+0Z29ygd6hgZ1rrt/0DY7C1lzcLRM/nV2fwyAset5Qn+TEzht3J7/qNxdU1N+pV+wHtWKu9Y2+kZ/sKlOshGvBAQYmqX52mz86Y7lBMyCMrUZ2qz+00GB5XMQjbKMWkBsKYJAtP9Pm57gGGcUOBh7aiiXqwh+gWv7ARDzlxeDSUnCyOkU/H3p/WGJ5DC4QWOGcWGN7zwYHxT+K9jYQKORoNMCeGxWryMPgo913XSA7EqvPpxWfalQJwsrmO+3e/v9JOCtnxFufz48S0L8kqplYfJs+vOfZjna/2O4M1yqFxRRFXz1kxuehMqNJCpF+drM+GQCXygoqPX0lZpTUs0X2zywEM9zfV6SDHhx11hXVEnx0XhxZyLHHBGJTMABJqIpADouyHlpcXIAo8x/tLMaMHEFIFoPUhqjxNIGq14Tm0QGiBDi2Al8RseugdgeABaJm74oOFTe+AKrxo+eJ7rw/UCXACrqwzhAisaedE+GfYyAB+vKCsueENbQTNqLVunBVU1lRKhbFAsnumHcAYSHAsZeGEEA2PgQqHwhwUZZLQ1a+bomQ1WmAhB+lCRADlFiypNrB408QqEd6cQys9ap5N2sgpYxgKLRBaYFkLAGNGn/4NbCcznMXh1y9c8n8JtBjihsf/o80DOqAlsd5fjmmq320Ay1c0ARjkxJjxlwIYvGRkkwz00CdERWMBI0VJOqLPPDYytz/Jz09SWlKfDYGUSymcJBPScopgldZSyaqYw8hFn1nuZZeCB1wFPeQrvNA0dSaqYXYCHJKo86uJiqKj0GRAhWhaoWKDW80uC29LExpR+FkcWtE5HyuGprJhILTAi8MCfYduHtn7IbuuqXeW7GgYti1gnJga3rLMTowZbde3s+JUE+bQkQRWQbyHGroV2RXTKGkTJaw2P1vYo3jgJXHIiCAa5Uy1IJVGhblkxMCZg82RZSKimBlDXlAgPLJpDZuk4/xKatBp0gyvaeN3tFGpeG4Nfg/o4RFaILRAtxaoDgRPkXWr50XCj7UoPFIKJyb25G/Xf/JhGnV42ERAjUDW7b8Zk2RkNVEtRDYzRAQkrIdhJ8nw28wm2UUklR07KyxpxEmQxVXAnUoxHyUIYIwOGcL1UK4101mn6DBhhhIzSQhQGEO8jR8kofFDh0VE81MpVZg5PWGkSV5EZ/wQBkyaST4CJCACe+SgjdeNiHlbtaKGp9ACoQU6sECl/zoPF7ZLhUsvHpvYUXoJJgBm7pnasTuaF/2MjIx6gJRBmNiJzmlq6ETMhFSKYhaySTVcFOCIQ9EhfdYZCSNhG6Wo1NZQ5/AYZhPwSNGwS/r0cEs5ygFKosP7eo+wHaVBXtdG6CqVfQ7YDFGHjhC/0RMlICKhhVMyqPI4NyZqK5Ew9AJpSAnpoVJIGC6O5wDS4CFQwAzm0BqosOwOQMlgKV1yj0gYDS0QWkAs0EwONhIDsdp8aJAOLWCcmPjzN1e2/owyoxaWMcceeMwoZIgISNifBDUeDcSpJfXZEGiYU6rcBZCYk8QhI26pZFVWKoZPGmKZYsZawRidA51FVYK+Lt3ikMHdk2g0gk5h/PfmxBIeqGBO4ufhXZQQKGh0URQlqjQb7LGBB5zyxyo5jLjAGKEMy7Ie+4dn0ohA6MYAg5xheJQdGwewP81mDsOhBUIL2BaAE5OZ+YFNCcPtLYB3VMOJiU8+EJm4H9vJaHzhMcYMNAY5dIqk069hNkkq0EKD0Wn4WYMbVzxuBw2Z9F/J8sipohxmDdCnSkUBHqsVujhk4gk8aCyGBxOwBqPZhUPH1FmIPJBz0PgQ1shOJeSCW8xu1wTKtP9h8fDSiuix8IkQQWtzwkyErJtC0ApeQJeo9RSesuUElcywC8O1QVm/hpASWuDFZgE8EPNiq/JZ1hePmkZHG3gDZmr3h4tjzn5lGdExRmFTEsZe3PhiZkVuiiWJZll4wRiviZRbcDDjw5KNBo91NO6psY2+NskDI14uKaVt46yYJHCKlA6wCiVPNAnyr3IxwI8MMFjymyttBou3RbAdwIiIKjsiHDJR4984FDV8C05QOSSJRnOPp2JTlHnJoQCZUiCgqkTOmPJjmM0JawYRwS8OZKkai0xCNKHLL7PQc53gAydY8A+uC5rZZhC28De0QGgBY4FK//U5azezoYeBNhaIX16rTaXiUw9EZp9uDl6PMQczJfwBY0IGjDwAEkAIvZZLRisewTAo8dAkgxKS6ODxisZC/qeJPI4hNQYBHJyo0nh8Uz+UxqAibByVH2fcs5M4LElGm+b3ECxdLYLdAAyU8yjvyUyVkpMEdYSifnFSiy4KeQ3euNhYKZIAklitpyQ0AOIaSEAAkejISBORLjkCwk3W4IGJ6CEZtoagO6dLo3JOpJ5akn8VJTyFFggtEGgBuu7Co0sL4BUJeGsO3oyQeep3Ft/wnWq9SY9S8KDDIxOr40fIMRSJhR16UF58SxyQoG6RfY2kRsAAiQ5JqlQdcgeyBQOMr6gkaxO9YcT1oM9DN4MBM5lxnzWQzxcjTvXMiiAEGIlO0EK7kNUqPYGLMTitl+BAjUUhxcCgM3W8ECqJkSJ5KQXzhnBCNgyP0AKhBc6PBeDE4FtkCTgxhz5bvug91sjkzd8Zs7wpHcVJXP/vSOB8MSWyeGUqVw5zRximpZ4YlGm6LYqJQiLKIE0ESebC8cBNIWCDiAkFv9gxDJAQayIKH1BgI47pQyAEs0MtnEROJWZyQThTYeAcnB8qF+GNOsDpP1SqYdIcTHBalkobHqEFQgt0ZwHfddWd+IuUGw/E4BXLcGIGnv3g0oa3R1NDLzZDJIaSavBFD8KIbw4ZhwVy8rVIsc6rF5xshmhPIIlPkNFXYSJpARgGEvDgD/hBf0Y7LVsBgUgB5rJsusXiBCUj+XWoYSi0QGiB82MB97XX7Xstz08ZL8Bc8J2YxMureMUyNnmPPf6eydc4b+W5AEt7LoqUACQse4AnU4+U6xGsUAFyABUAJXrTvp6hAiUTj/TECWASjCXL6mQPyQK0ZQVChtACoQUuDAuEANN5O+CJVHmwPzP9g/T0A+WRH+tcdh1wAg6WPzIxQo5anBAFngdEgAwUZoBAFHNccFzw1wFaLZ9dyBFaILTABWWBROGoUx5+t78TDUPLWSB+XRWfQsAndoZ3/cbpNzwQSQ4uJ7F+0jtFBPABY7BgAzclx7/9ichgkv4GkpHeBE2Ldapr/VgvrElogReFBRJFB2Dok2Lh0Y0F6IPKl9OzdjBj/+FPdiO65nlDUFjzTRhWILTAubZAct755libr1We62KsXf14OxltWY5E+p/7SLxwZO1WpNuSdzRF1q3SkD+0QGiBdWOBWOGI/SIyPKC+bqp2PisCjKk/kUSOwJi5G14sfkzowZzPPhbmFVpg7VkAq9NOoZPN8D3KjjW6CcW31QWbe45/ITX9QDeia5g39GDWcOOFRQ8tcB4skLIAhp5OD4+VWgBODLYsQxpOzPRrXhTbyRLhg4cr7S2hXGiBF4UF0i6ACV8Mu/JGh/OHLRLN+RhMCiemOrr+MSacIlt5dwklQwusewukph5wtpDhW42hB3N2TR6/rgYFjx3JfOyP/2Dv00+dnbI1IJ1YA2UMixhaILTAC2SB7LEvmJyximDCYWAFFlhYjN39o76bPz52ch6r/bPz2c/+/vUfXYGeNSQSrsGsocYKixpa4PxaoDqXOa3fboLl/cvp7js8VmCBEyeTN//T6N339i0u4eWP6vjhvXefOXVy0+YtmrAOz+EU2Tps1LBKoQVWxQK9hz5pNijjUUE8MBge3VrgG3cO/Or/ue1tP7vjtm8O2ugier74qX/sVuHa4o8emS+vrRKHpQ0tEFrgPFggWp0bu+t6BTC5ZvJN5RBgOjc7XJbbvjnw2S8O+0HFVhKLxb7yb/f19vXZxPUUDneRrafWDOsSWmDVLNC7/yPGfUlcVw3RpUPLPvJ4Drhyz30dYUaj0bjty5//lV/79Q6Vrzm26NGF0INZc60WFji0wLm1QHLqgeEH3yF5RDfXk6+qntv81r52LOCLy3LyFD3p0vkxtmHjv9z5b53zry3OcJF/bbVXWNrQAufeAtW5gSd/Q2WTbCZ4Z+25z3Wt5rB3f/pzXxr2LOB3Upn+/oHRkbFkMvX044+99MZXdCKy5njCbcprrsnCAocWOLcW6HvmQ3H9+mR8Lyv8+ksrc2MBH17Lo0/0tGIIpGPdZWhoZGhwOB5XO8oevv++9Qsw4Ue/AntBSAwt8KK0QObY57PH1bMv+JBJ+GSlvxd0uIDvF0wkknBZenv7BFqa+kvu8GAKS/lcT3dA5dd/AVLCRf4LsFHCIoUWeGEskD76+f5danIM32GUr5i8MEW5IHO9+97eb3xzsMMFfLsG2WwOLkuf2i2mvvIYxefiNcY8/MB9b/6pt9si6yOMKbLQhVkfTRnWIrTAWVkgffQLvc9+SFRgYR+TY2elbh0Jr3gBH7NhvT19IyOjWGiBPTSaNPkNkApmxE4PPXD/m3/qp9aRzVRVwjWY9demYY1CC3RtAUEX2Zccbhsz5pMFfDwjaSgdBjAbNjQ4hNmwZBKPp7qwBBoYaQRmKIb/J46OT09OjoyNdah/rbCFu8jWSkuF5QwtcK4skN3/kZ79HxHtNDN23Yved4m99N775//2k9F9z2W6NXoqlcZsGHaIQVC/q97MErmQRjs0KoenHn/0Lf9uvc2ShR5Mt/0n5A8tsFYtcPrkye9+646evr4dV1wpdbjh+it6nv1QRr/REujyop4Zi26PJP/vSPydD/7oxEc++j+OHj/WVUv39Q3Aa0mnHUwyEOJGmmCYeei++0OA6crgIXNogdACF5AF8GrFz/7zP3gKtGWg+orto+955cLVb8u/WFf1ByKJd0YSgJYbYJwHf/jDWz51i8dKbaKJRAL+Sn/fAM+GgRH+igtCiKR9GEYaHXGzHT96ZP3NkoW7yNr0nDAptMD6twBeHX/H0/jru+qB0vt+bfItb1xa/3U2NYz/LPyVSPK9htAVumQzWXgtPT29tO04qrZLMbYEQwhyEaSxHRp7L9muxx5969vX1SxZ+DZl07XCQGiB9W4B7421q75Yb/jAb1/8c++5FCvbroT1FoG/8quRzPcj2cORzG2t0GUpn29Vb+wNGxgY3L7t0q1bt8F3Uc9LAlP4T59F2h3TGgEzxqdRYiz8/N49mmWdnMM1mHXSkGE1Qgu0t0Ahn7/nO99uz4NUwMx7f337O98x/77/Mtnf11iWvysGvAhycTEWuHJ+1UtKfZzdTTcWutLZKTPWV+CsxG6g2bBowK6w/fv2f/mLXzba6vWAj99gNmxgYKivrx+g0tJTAabw0WQOjelC1TFh0JxKIBJ5bv0BjKvGpqJhILRAaIF1ZIE7v/61u7/97enpqU7qhDfM4+Va+55L/91fHT9LjIEzBDjBH16p0v7F9VKwLZsrd91xsJNCdsoDXEm8V+FKa5llZ8b68Er9vgE8L6l0wAXRQyefDVZoKviYRj9Ma8mm583AWMgX9u/Zc9XVV6tc1v4p9GDWfhuGNQgt0NoCmNb/ymc/Oz01hYmdVML5nGJrCZWCV2zBlbnl74+sAGPgqTz6eO7u+/oCnZU2Wa+S+zLAiMK4wuv2bXJEUht0YZdlsCfXay3gizK95CI40h5CBGk09FhIo0j2Mszz6wxgdK3bN0GYGlogtMAas8Dk5ORn/v6Tz+3di3In4vGhwf51ZagIAAAgAElEQVTjJxa7qgPgoVuMwXu6PvDbF3WLK6ZUmCgz4a4DsR9Xnkr8jZ3LtkKXXK43l+vL5rTL4tXodlk6cVa0hDV1JiTXGAwP5t9781rD8XAX2RpuvLDooQU8FsAcy+kTJ0CE43IXr7gkk4lkIt6Ty8GD8TB3Eu0cY/A+lc99cfjmfzqrZ9Ff+fIuF2DMDBgWV2KXdFIjm+fO2++48447bYoJYxm/UqmqnWFeN8VwIaBxQybCBGk0ZPDZzaAlfDCjEp7bu1vvMbNzWavhcIpsrbZcWO7QAn4L7Hr04X+99etCHx6kh8nto1YLWLi2GQLDgjF9vXVJveolZf/6P15c/5GPbexklSUwC0PceWUH3z+EpwIfBYiC36DleqOtfeDT/+vTP3rwwdY8AAY3Ngh4QMCFH0aBxayDFoqATahaWLRxjH+cbWX79uy+6uprjN41HQgBZk03X1j40AKOBbBP7NDuR524L5QvtNx66+N1EewpL6zNYMX+w//9pDwxg+UWQIvN4JLsJvLKl7coHm0AA6IIqNCzkGd5FAoFbBhriy6RRkOjBGVmh1utvphCGWbFSXELSJiP41oxM0QjOsdj40fWD8DoihrrhIHQAqEF1p4Fnv/Rl//5M9+KxnvUYxnnsgbwVPDEzAf/n9OPPN6zgnfXtyqas8JPqymXkI8if2fhpvjzOnb06Kc/dcvxY8f8STalqr093whp4QcEOOaGEKNGOFmBsHHQiRtXSOthyebUxIQvU6NzjQU68mDK9flavZhODCRi2TVWv7C4oQXWuwVKk3tv/9rXvnsf5u6jG8fa7RObX1hYRWN85GObVlEbVF117UciuXefzazXsuUBuvzVX/xVsVhcltM4LQY8IOIe9wU/NFkgRMcsTotNeDiNf6wkVSCiHDsyrmJr/9QRwNQb5aXKicXKiWSspze9JR3vD6x4Ez5esxGNxqKRlSwnBuoMiaEFQgu0scDJx/7lnz/zzSOTNDAlE+0u56X8hf4OmFe+6hci0eCxpY0FOk968oknP3nzJzrml9HfBQTuZ1+MJjdOcMy9+iKcWqEwgBY1iGU0EOfR8XE6rYtj+df11xq0cbDRrC2Uj8VjmUJ1Ipfc0J+5GMZBUjQST8Zz8Si+eRCp1nFf0EjEcxZ6rwsjhZUILXABWqBw9Juf/eit955G0WR8SqXoq1atjtV1X1rlsmL6li1b+vvPIbrc9b27vvIl50H9ZcsJtOZZMnvoP8vVF8lTFCrcoogFM5KGJSIsp/Wsiy8oJwAY5fpiLJqAdxKLKv86iZncaAoeSbE6XakvzRSeqzcrI9mrgCWHZ+86Uvn+SG5nf/riVLwnnRhMxFIRBhj0c2iIRdo56cu2a8gQWiC0wLIWOPHYv/zTLcpxATMmx/BIYDrdDmAmJiaWVfsCMlx11VXnKPdOlvT9WY+ODE9Nz5iVGGYwYOO4NYIQSHXfVQunxcZBi8dShZcCsDw9bums849fdc162EiW2DPx1Xz1TCKaySSHY4wT8ViyJ7mhJ7UB34ueLR4YzF7WiNTK9YWF8nHgzVxpfLrw3LH5h7YNvH7HyNsz8f5qo4CZMWBSKt7rbyehAKsq9cVms56K9wPMWrG9GOhAdFQzFe8LF7ReDM296nWMFo7e+ZmPfp0dF1GOVX2gC8Jtlvfn5+dXvIVs1asQqHDnzp2B9LMkTk1NfeLjn1h2Sd+fCx4bAsacmZqu1+sWMAijBQ8gcExAAjGL2WKzeCwGLQwhgRnli9Is2ToBmH2Tt4nNzG8yngXGZBMjcGJqzfKW2isRPTb/4FLlVKNRbTTV+++mC/t7UhuXKicL1emNPddv7L0eqy9GiScArKrV86XafDE2gyUcgFn8BYWZerNarE7VGtVsYhDQaFw3T7E7j9YblXx1slLPJ2IZTBjCYrnkaKB4uTYHerk2H4ulYYRcasMLa4rAQobEC9MCU4cf+9u/+cejJ6kL4cAVh1eY4M4X4VgMi5/usYt55Gd6ZtqKXYjBV77ylateLLy/8hMfv7mjJf2gvIExI0ODk1MzGL4MbrhNbEEINAiKMEcQG9OMv+LKUfQ4QlOTE60b0yV5gUcCnAkspeCvVFUbTuaK44F1WCyf2j91O4NKtNooZpJDfalNUZ5k8/solfpCJBrPJAcXyyfzlTPJSk9vahOcpK62A2AdqN4sA/bE0wosVYdE4B28sWJtpljtQRWgM5sc6UmNYUlpWQ0oxnz52FDmUuZslmsL8+XjgA1ZrOK9dulkLNsKYFKJvlxybK50CI5jPBqvNGjpdSB98YodGniQhepUo1nvSY5h0tJ1C7VsZc4ZQ6NZxf0EPNdMYiAeXd+vfz9nRnQr/t5XP/mN275bqNJ6Jw74K3BdBF0kyuTgnwvcfUGht27dGlz0lVLbPKXfucpUMjk2Ojw5NU0YwyBDUMBA4KABqROE4DQOBrEJD8u1hJmopBxZL+v8CWMYslKXR7WuXhx0bO6HGGdHslck4lkM0/B+MNLBOcDMsKjEWDNdPJBLjgxlL8doeHrpqZnigZHclcOZy+BAdJgt1oHylUnaWYAbN+xnS23oAGkwq1lqNivJeC/m8arwMGgLXAyj+VjPNVh8mi+Nz5WOYHROVyeWKqdRbCAf5q9QpGakjkplEkPu4jXBtvvMV16//XegbaZ4aLKwr9YoJGO5Lf03DmUuh28EBqzblWpzmDME1gKQoMGALhzBxcrpRCw9ltsJX+dM/hm4gFjoQn6D2UuyieF6o1SuL8FWHUIFdpAvlk+jDMXqDMrfn97Kc5Xu/u+uw3mIwaSwAP6WYrghwApfFvOunbf1qpcQgIeeg0XETu4hVj33s1Q4deL5f/7EJ/Y+j3fAELrAV8GcmEALD3ykHu+DaZPLjh1XPP7E420Y/El4e/DiYnfvLvMr6ZyyigCDRRc4Ls/tf66T3DF5CPdu28XbZJrRL8IYM6IxhtN5i1gQhCDVDKj6KUsvGrkYRIl1raqZsqmJSX9J1iIFAGDVbqU1wACHv4OR72GCaCh3OW7ecTe9oedq3M4TGNBVHcVe5xPzDxcrUxt6rt0+8LpjCw+Nz35/IXt8S9+N6URftV4Q7wcjLwajwIJAOQZQrGEUq3PxWKpUm8XoD5iRPWyBImiuZqPUaGCszzcaM0s1zCpcGo/lUBigC4Z+YGH/wLZUPDdbPIy1JWDYbPxQX/qiwcw2KDyx8OhlQ29BFcAPQ8ViSXhgB2e+d2rxSfCfWnry2PyPUNmLB149mLkExctXTp9eevbM0lPbBl+LUX4k95JoJFFrFCfyu8HWn74IY1xvasuhmbtg9fniUdgHxOHsjsn87on8HhRgOHdFT3L48Nz9V478DOwGsKk3a4AfGCcbH4D3I1tOao0yKBi40XgAdfiOyG62dHC2eAhl6E9vG8hc3MYsgbZaXSLK2Z/agvZCkYq1WRQmn5hAIWEHYKeB29XNtI02tDX5eZUatqXkElhubDcct9Fz/pO+861v3faVr2LQlKzJbQnCknisZY1GRkbe9fM/9973vrd94YEoWGm/6aabMFuF371797773e9uL7Jaqas4P9bhc5Sm5ECXk6dPYYvddddc2zHGaJBgfBCQgEL3SCo8GmZ0ssXjMIgGKykyNTlpR01p11wg4bwBZzXKDp9mYnG3aDqS3pRJ9MHJyCaHcYOPMaXRrByevXeq8Py2gddc1P+qWCRxaObu+dIx3HTj4u9Lbe5JjaYT/UPZy/xTZxjiS/WFRDS1te8mTLzAS5jM7ytUJsvVWczOiTeDyaJidVaWVaQM0JOID+KnVH5qrvhYPP1GucXAVBumyDDc1xtVYBUGeqDatoHXYq5vfPb+iaW9/enNvenN2MsQbUaTiR44KwAz6D+18MShue/DLXr69BeOLzyC4fKaDT9/avGpkwtPYCkFd8dIrdfLm/tePl88VqzMZFMjKPPpxV3ICIM+gAEjHe7ucaOze+LrKADgdiz3kv7MRVv6Xn5o5vvHFh7e1HP9gdnvxSOp0Z4ra/VSoTa9hEnFWBZmxACdjGUwtQjT5asTcBb70pvJg6mcxCxfOj7Q27vpzNLTpxZ3AX1HsjtgTHR7oCaDzXntsWjrQmW60ijAIxzNXYXmmy4+P186Cu+wN7URVYDp0BZwcQDMmcRgh70P+0RgvVgMpm654BeoCgbEZB1QHD2klJgByHEBAnkvFOLkxMQ/3fyJfXv2SIHgsojjoq/Zpp6mp5bFSy1blfuGl90AwLjllltOnDhx8uTJRx55xOYEqMB7wBDvWWZHFCIf+MAHzqcfYxdsBeFu9yIji8suvQwbgp8/eODRJx4DxvT2BO9UEj9mYtL/QR3GiZY+jUYR5OQw2lCkGdSkGQBJLXLv3b1759rfSBb96ANvWEFDdiuCZQ6I5BIjuN0mLElvuWTwxzBWAm+mCwcxXmDY3dhzLYAHt+24qR/M0h7oegOLLhgcU3EgRG1hpvA85o5ksQQ3obiFXyqfnijswdYDjP4AJwzfJxYeT5PrcEV/Zit2E8B7yFencLs6U3zu0Ow9O0d/Op3YEKfVdczbxOB1Ye4OvgjWVOjmOjE0nLscWDiZ3/vc9Hfgr8CvKlVnAT/wsXqSo1AFD4YcmnoF1UEBBrPbBzPbZ4oHwVmo6M4XjfLI3qzUFuHEgAHQcnLxcSAisiZUq6s3+qWTA+XqPFT1pDds7LluKHsJColFL3gqtUZlS9/LMCbSeBqNo2rYxcdza5kNuWuGs5dMFPahSJv7biCfL54bn30AqaPZK0Z7rsKGPZQTo/ZYz1WApZnCQQRQBegE0phZ+zaNiBsFmC4WTWHHBwwlnMBIdpu8Izv2faD5UEhM18CeqCDajn2XccyFwgMD5MO8sAmKivsJwCFuOwAzqN1Ufj8errpo4JW4/8BUIb8woh90hhwMpA3oqdQLmOACMqEkQFy0GrxPgCsQAh0DZUO+uDxNOdvUC/4sxOFQQhusDSUXrCtz/z3f//wtt9iOC1yXVlWDWzM0QPO6gcdv/fZ/u/KqKwOTliUCk26++ebbbrtNOPG0yrve9a6FhQVQVhF4fuVXfuVDH/rQsoVpw9DVtJhfD55CfWb3s9gwdsXlOzZu2OhnEEq+UJiZm297p8aJzo9HkxYNZiAquqjI/Nr73vfjb36TR37NRaN/dV4Axm8XjDUYoTFemCQ8T4PxHQMiRquL+m/a1Hst0KhSWwLGYPTBHwavk4tPLpRPDqS3YtSG18K+UXahfOLY/MNwPjD0T+Wfmyo8N5i5GB7ScPZSrKOcWcIrNOL1Zn2udPySgZtmiocxbGENBvCGZSGssizxuk4m0V+ozKBUI7kduL+GTqiSsmEMyiaHME8FXMQoX2N0McXuMJCIp3GrXmI4aSOSSfaXqpj4lvsaTH+lMIGGGTyUBxODKDlAQj7nDUDFpjWgICajZMEGdYGJQL944FVwCk8tPZ2O9w1kth6ff/Sy4TcBYwCBACoM3xjcGTlokg3DN/RjxAcwFKoz6OPYi1GrlzGvBXeBLB9LZGh2rncyvx+b5QYyF6GB4FSVa5hjBAP2LiVAl5EaBUB7YYUM+qEQnLDbLNzC4hFohr8FrAVmTBcOYPkKAFmkdZr5jb3X9qY3wk0ETqNpeCYN02jQHMNmCoAHGhcoBYzEU1YT+b2A6lxqFB0AFcf0IPAVdx6YToSFAWMwCLAQUtTHgg6UlvZl1Bc35K7Gfr8glheYdutXvvKNr3xVFwKOSxymkKjttWiGSCad7u0JnljOZrN/8/G/NZyrFcAE2u/93u/t27dvVRS+j48Vq+riBTCt8yiVSnv378NuiC2bNsOtacUoGCOpBAgtD06UGW0vj5ZTLHZy1GzT/blf/MV3/4dftNNWK4yZGFwguDbxhzu5VpdJt9lh/MGwhavbvml7wQCmVekBBmgUDDEbe68Z67kSt/zwGzAyYvE8mxyEU4LxaGJpN+52MUoCDDBgwTGqNUsnFp84Mf8YRiijGUvKQBrcQc+XjmBHMqbC+lIbMQbhUR7Yl26i03QTDVXwhIxUiwBWPJIYmFqkvvBk3I+jgkDfSg2vpG3mksMbeq+BuwAMAFSgD23qvZ68itJh2BajNioO+wA4MXmVS41kE0PAA6CvTAZmkwNgA4RgFAbMQDN8vsOz982XjsNnSiV6sIcQ/QkMS9UJMMCDgDhyQXMA4eAlYA4TFoYSmBoTknBByrUlKEd50AQMJ8V8RT36hx45kN1+cf+rUGx4k3Bq4YGBEyiFxTxAIwFho4DURDQNwENGS5UJeGbIYjR3Be5LoIFdriQcUGAM/M5yPb+1/+V88ZB/0+GUGjhRVFT2hWrRfD7/jx+/+fFHH5UCAGXhnbRyOg3Y9PbkMi2essT82G+8/33nqDpwbnCcvfKzAZhV2S0mVcDnDJ478HxvTw/W/FtVCh+JmZiaIp9ZWx+cGjH8Qg6G+Hg0wWEhcfMWZ8yP/f4f/5Ff49lTMKJWsYu2UcQdKsYBXFy4dcMlj2sERNwEY7DFVdxqLbxVATA4YOYjHk+jQhgxcskhXEfRv7z/fEyRtSpTGzqGDNQcd9OY7MJ4MV860ZfehDBG+bnikbyZj2IVuIcF/AB7eHhto/XFmwQX5OL+V+CqmC+fKFcJG3BTDD8AGIwA5hXR1eA94O4GYzdwGutJMPhQdjswfmJpz3Tx4FL5DDaqYUzf0LtzU+91cEcwFp9cePL4wuOlqnoy4yztCwhEOYEK8NVwV2G2KcK7xWoWOi4o6APZxAAjQR2Ami9PwJHd3P/S0ewOgBBcEzz8CwdrqTxxzcZ3AZxwv1KozqKo6CHAUYAWCik7IKAEBwZxBNCv8NQX8AmeIi5z6nt07bVcOT/LmgaKL+Xzf/oHf2heRYXnMIAu4NRDGQ9FQZKD/eabvt7kX/yl//DWt73VS/XFK5VKrVbP5YLdIB+7Q4ArA4y55557HFL3oZUBzIofouy+gEqi0WgAXapV92d1dPOAqUULMdn5sfPXEjoVWUjy6NjY3/7D39usJoyZBtxFnf3zc5gOwXWdr0xjMaInNYIJ52odu5+WcMu4ue9a3M8FO2CmHL5AoTo3WzqKcRgTfRiTMapcuADjK3xIWAULYPjGOkcuNQbMxnSZaMSwTpNv9TIGXwzfmLlCJ5spHKLN0zRjNoCpNniWAHW4IHYhMEMFHwh7x9GlbPr5CYuzCzdfsoOL2ZvehMJjzhNYCETBXdjW/htxneBODXdtqCYmV+H44vYKM6IAV1wAqCM8KtQCi/9w+ODVNRo1oCxgFUBFD8ziwlslhwaeHIra6qmgI4cPf+zP/xLbh6Q6ZiOyx5h6NNMDEycP9AFggldo/r8//INt21rej4tyoEs+Xxgaoq0W5eJUPJFLJHOefNtH77777j/7sz/DDoL2bK1S3/zmN3/84x9vlRpIx6eO8U2XFT9EGahzWeL07Gyh0OJNzLphoMTVNo5SjSEBDFoCZ7rnUTPkX9DfjjM6cPOHzozJg9HcS+RWySR1Hlgon6LJAJ5AxoT2fOnkgZl7MVWOCxlzQjuGf3wgvblI810N3MnhTqsTzSw+hXs4bOxC/WaK40fnH1uqTEX/4r4L1IPppFYhT2iB9haAc4aV/I29V2PJDYs3C6VT4MdCF/YvbOzdOZK7DPgEUNnQsxNYgqm5kwu7cCuHqxfuC83gRaNALIR709gNv8J5M0we4k1LeLYXAWxRwWY/f5mBLn/yB//dLOn70EUPQJakHtAoaWQoQCfoWID5u08sM3Djlnl2dg7oAodpburZ/MIhCPb0XzY4eq2V2/JBrPx/7nOfW9mMGXZIP/zww8vnwRyw0i2f+vSuJ3d1yL9abPMLi/P6waCA9jDZ6IYBoQWbcgx8qURgdFEA8/v/44+uvla1Am4H50rHaA68Xtg+8CrcEsHPwD2WybaTADZtorePzz4EdOlLb4DIQunkTPEIbqfGei6fnH3s+JGTueTVmC6bXHouGTt1ef+e8aMj+TytU+I5vXr0epxe8aqbLrn0Uk92i5WJw7M/xM3Thp4rhrJ4bDwDhsn88yHAeAwVRtenBXBFYboVC048A6bqCFemP7OlJzmC9R7MB2KiDBjAa3IT2IgoswS43QM4YWsDzdCmNwOHOjQQFp/wqgjs6AOGVXA/2GxgPz0eLoanyOtJzgO844ccdMFyCybG7EUXa7ySnH3jUkuAib7s5S97/399f/sCT0/P9GHrOL+J+eT4vzYb5BHiUc4tl7y9vWBgKvZAA2Me1WtIgTyBxD16N3ZgqiGe5dtfjJ5uA5i9nJnV88BWkwQ0hqhenicQZqLsvyiA+fX3v/+Nb3kT9C2VJ+GCT+T3b+2/ATtIMeULygC+nJLsldzQgf3TuSACjUq1RSyH0GJeNL174vaR7OX9mc3PTtyxUDqDtRZMlV+/6Z1D8Su/+63vfvvObxbZP0P3SyTwEqKAHaflcgld5SN//bENGwmf7GO6cOjZM9/CRbSl77rRHHLBgnc6/tb/fbvNFIZDC6xLC/DFlq/ytyfo2ucH4EAE3gBCsCthqnAAAVyl2IyAP+xzgzeDrW7w+uF8HJy9Dzd69EY9vE6CNr7Tq79owzRNN9eTsRRwgbWSYmw3wBM/heqZqeI+vLgBE3ED9OjrRZlkHxaxMHe3WDkVi2DjBH3Y4sihQ3/8B38ovgsu7DgUS/mCmsEatZAMaXVkMtgv50Q1OXLTq266ame7txRjwieOzZpZtfQCFKyUpiE+MLwzlRk2ehCAo4Oxz0Y+O9WE8UgN9jHjqRp55sbQlw1gGaY9D0z0nX/99i2fvgVL8e05Vz3VhS62dqs9AqwvnJqnBYMfZmhlUETh146OjfSORTFfjVufq0bflopnp/IHjsw9NFs6srnval6ojqEHYnDvSQ6hdTCHhgXIxfIZzHcBkE4s7Dq28BjukDAVvFg589iJzxdqc+DE6stzk3dBsLfa/9BdBz/1d597ZtfTtWoNGlKpdCaTabW1BL51sViYnjtx7Y14ijyCjLAghA01mLiDbC45OFc6OT73MKbIYtQhm9E/D6fI7B4ThtepBXCZyxWOa5c6Ps1FdFpV7GvAvBkcEQDPUHYbAtsHb8K7G7BAGonUMYE2lruyNzWGOWtcyfj8K7bYzZXHsf8N0NKT3IhpsfnyeLFyot7Epu/eiwde04g0sQl+S99LJ86c+eBv/Y6DLvoRfSmqLp87ZqgOOTo4QF9ScQia53c/9LttAAaYMT+/IEsvWiJSqxbqtUI6i8dgXQegqNstAPBmPvvZz3ay/r/sFBkcly9/6csreCmyqw4rigBdptl38ZvX0bcMiqBtlHSQEqaZ/kkujLdrZnPZSy69tH84m8Xrt4Ym0tnku974X+EfYN6sQdBfPbW05+L+l2PT/+HZB6cLh+G1wDuZLR7Dtv7hHJ7V24qZsZOLz8wXT/RnNqE/Y664NJmdenLoucf0Ts5YHC4L8MOpVIsQVuwi8ep//vDr8QjEmcW9wKoUFu1iGbzBEndsA5nNuGk7Ov8E1m+29l8X/ci94RpMC0OG5HVhgRhexsBXL28Ww3MG+HoeJiK6r5saAuQ+Pood82O9l8ejsYXK8Vi0dzizvdEs96aHsFMA8+PXjv0c3klTqBw7sfjYtv6X4j0uT5z6TLmeuHrslwBRGBowLze/OPeh3/rt6alZFAV3f56ZMSqfGnnsogYMUKjdgP5Ulyf5E3//iVxPy+V6LL0MDPRj6cXOIDBcKpVTqWQnnH5xbDPD2ox5VNPPAMo73/nOD3/4w4FJQN+7v3fXnXfcGZh6romELjOzGrqVdT1GdsqgUQSUYB7NEJTKNPxYAENuMT4Sg84Kvxi/7l6bziZGt/blBmMDI72XX3ZFMTpZ7R9vpvA2k3m8PQSPZ2C4x2aW/vSmudIJhDE/DBWN2fr0c4nnHszWypQjuSzJlG/Nz6mTPwSAqVQrb/oQXu7nfWwDE8iXD79uvnRqqoAXbm1AVwfA/LhfRUgJLbAOLIBrE+giU1fY/Mm4IhcVwQvme3x1FNgxdIoKODEnTRDxR6EIn+iqx5vmYk3aTBztr9M7VUsRGg2y2wdeu23gZXgSqCc1uHP0xlxjVyXx0qfP3L1Unp4qTuMWD7vyLh9+wx/97l+cOjYlZXDPSJgCWAVkmjvBiQ30ux7jl3FsdHT0o3/9UUuFK7iwuIiRhefWXHR/BHfIGGf7+1xZ+NnaU7AF4O677wbM+Jdn4L7ceuutgS+7fAEdF1QHiy6LS7SR0jmUyd0nJ5lDGkUQcVrI5tEMQan0NmXCEj4IXohZM/ItDiXzATqYbcUSHthWT6Sb/RtjqYFqBm8CYWq80Jg4niqON2em1F4V3PQAV+C1+DW0p1Qq5Xq0/NrfbLGbzhJGPc7qbcqWqjAYWuACsgBgIA5oiREk4HtRdXr3G65UROlyA+QwQDgYQ1DE82Z8OZLHQ3f1cH2Ime4fEWB8wpWNMCuLNundc3HQG7Um3r4aQS61OibEy4dn7zk2f28uhb3dzW0DlxQXflTtSU8X9hyc29VsYJZ8A2YwvvHpe08dU4MXEIoHC2VA0u86eHxhmkpggsXGtbJEuJCRi1vvTsYyBh4o7QRdoFX2mFnqVxLE55CxNoPDCJtXogFa/OgCxwVPUN59192G/3wGgKlTMzPFovOeEZW7agDqBDjkxEGrdBoe0OOEPZghOFU6pqVN8qFf7rXQxX6NcHBWCm+oa/Ixf4Q67zS9h8S77xGXQwL3Mlh2i2Oxb3nPVRR6fmGcwUvrHqJEdRGcxOVn3BzeMBRa4CwsIBdUkN9wFkpJFNeVcwkjF+AH0AUBQAKWLQkNCD+0N4NlE5oi49tIHgHAT44OnrUEEQc4Y8AnQiQcgJx6gxAGbA3ye4gIfiCKXKH8JCSVAinIF5AjcngiGmuw94z/QwZvPJr58nThKN4yBS6swY4/lHr+cYUuvKoPlSzPogKUX6oAACAASURBVGqcAI0VWUCiScxBP5oBL9HyjBdIbfP4y+zc3Miwaw0fygIPLL2kM3h7wgoHo0CdQsT7N1ul4hmXO2+/c3qathuc/wPoe3pioob7BbGvOdlFUY1EEMNBagluDYtJ+or0+45TqbPqZy2pPzr6kI/KDDc+QpdODMQhLpCUZ0NnlSFzEqbQ+yDQjGfbjtAM+/RsoEr74cQprA7hLZM+u+i08Bxa4CwtwBcA9UUE6ELDyE6d37pqzi4DAgb4DIwBkkU8hleQMbTUY7hOQeRBnxwaZAXIQYeHFK3H4CDwIeTgJOKENkQ5jdPp6sBNn7qWcHXiWiZ+FlHVAD+QB99N0HSK8IGJ76mlAwjSSMFKwTJ/Orbve/SUAA6QcUiYf03OEqMkRWIuq2gc5zT81BsNtx4SHx0dYS3eH2BGT66nk7EG96p4j/3mTS1f/uhVfdZxOC6df8rlrHMLUIACTE1jp59YXQ2OZoy0m0oJCyO3rrB5eURVG5jhDgA1XkFkQFcM5aOTVGZC10TmAwslWt6NlkPHkD3oRDjrg3zfSGTDdbVO0AWc9Lp+KTWyphJbpQ4szHLpgUIh8UVnAbmgaPjm/oWhnvwAulxMd+vUJkaV9D3TYxFNxJvJOFYzCQCADYAWEGuYE+PxFqm8RkIoglzBQ55LhDAGHZ28EHgbrBRJ8EjkMKMJMSGVGRDgM7PgkmFE6bwmfEdJstVS5MkvZxVeoQwEj6wTPzoDfQbJpCFIZC448fuQBjlYzMQSwbtG+Oz9wdPvIyPkvkyffqRUOI1HXobGXpbt2ezl48kxs33An7rqlDtuv+Ou734PL51cdc2dKASazszOLuWdlxmSlDKq6hSmb1htxLotNuHxMTBHIMxIwwUlUfdjOeq1Th1AovanFIfORC6wxczCtqijZIWhSrXcs6Gewauagg4/1eXBULKfxdQMSbo+clkGZRHSXtQWwGUi/QXDN/emaI3noxCmJEXEYGh6FZlL0ZkoYaJSdyN3gb0KyKoLpdagNXai8zwVZ9NMJWjOCvRqnfJIJvDCbAUeogqQAFxBErk40KvzJ3HTrYVV/yoWSDET/+i0tmc/p84tcuC+dHFeQRmeeHFdb9omSpxljKDDyWyGR5AGg6P2SByJ7du3+YuJtX3sHAMd25GBLghgCWlp/pAfYLBzDNNE3W5N9ufYCWX/vn2f+udPzczMgNnvinWi4Sx5iqUSHjjlabEWmpTFXUjj2NoIERvxMLtvmGyNJaqTce9XWSmdHMNF5OoPIHIcnVNfF7qHMPY4RFOyVQjAfWnUG1te4TyH5C5qQBa0BrMMk5WMa1di+KX6nZtqBBQzJF3wFsClgS6BXwybwA9Z56A+wvNOSBLIgW9hoQsx81VI3Yo6FUVpvR2/oBCKaMei3iDwwBwX6AAJmvgiPsTgx5CgXLxAGt9lzZrxRADxysFiOmLOiroaiGJ02oEzexNHHlbrrjSMciWtolCVnYNr6pCca82hYXShSJSmyOKK7KTiO1qONg4BhzB7KM864G1jyVR/tbKAlP6hgK/FYHLsPLgveGEloOW5/fupHv6W81TgHERhOnZcXC/Zc4ztz9HYWaMIldzDJjx0I6QSXQztYYaM4DSiVsxIggSnZCoP8FpEsIN+rjCmWq3G082RK+r+8ulyes/dLfI7egVpLI/RZUFvLmF8PVsAyIGLAr/AA+BHlSasePxEz2c6pqrQ6Wt1ShWKmAMDLNbScdBCIO3IaiDK81eEK0hBGEuttH2Lr2HwJLB3C+iioQWypICVIBV/cjgdVRF0goq6qecMUZzcmpFKKfL0HRlTMLwIQIYRQ5FaQESX1UkhmlxxOtnFA/vQU/Y2f2T7Jdud3HUIu43xVhgdi2y46I2VMr2lNJX2vsoM6zRwsDrcZmYUdhUo5Avf++73br/9dmo3XZ+uNJw9M3Yhz8zgTduW6bgklrFbl0yEGOJlIPSytmewYMYlCLouDs5WElPZlXETdd9wYY9DxFW5Kgc6WK1W3fbqWkItIC6jVerXwSeTnXIHaFSm0DahizyAKySdWwvw9ambgu98z1F+cB2gmUZ8zk1ABUQUACsfZdq7SGsbslSeiGHehkACngeuGXT0dAKvwWcY4H5C+IHFGZrRolQ5KAcO04XGuUimSAWutBqJmFFp4JNWZ9PM5ao1+6Tc3Fasc04lZAlI8MB9qRotLlCMp7MsDpHRDacSuAa6GhYzs1HcYcC2I3ySx+LB12P1219EN37hvuBXz6Qpsh9aJAHbzDZuCF7CUZJnd/rBAz/4whe+UCrgyaGzU7RSacyJwXmyt4opTbYV9SgtScFjm+JvMy3G0hqHvNVFq4m3bjqnu0ZQ7xZB31Vuq6ZrFkoxzA6x5TXjzmjZGB6vxGc07Pkxj4i7A0piFM/BtLpmtTjKrYL6rFO8Z9SYmXXNvelhfHUtgJajS4CnkqiX8jPq4gGsPCPuo1Arjc1NqjwSDPTZFN3tlaoxjFUY7gEhYMCiCNAFuQMkwAMPAy4LyoYBjSbEMIUFh4PUERF/5J1wKvH7XWjdeyABBpoi0xS7UlI8TQnisOVgGxZwS2npoHPnnEraErCCKrE4FzWTY1T54DHFLWeABDq4frqSms0wUGt5r27N5NStUCx2+LAkHB18IrOTt4Y42jsOPfH4E1/4/BdkCzL3tY4lV4mxWqsBPlFHrY/tqCLaxhI1RmSyDIQtyyzMLafFWKNOdWUjTefrEuTWIclHl2uJYMYpisobV1kwUaYUdIVXcEb/wmsut73e5b54+1zQhbrMGgwMYYws3dxlGk9JpQVIxBFS/I4tPDJhtGsL0AAFC9PsE/7I1BjH8YgfAtwbQWnXSgH5QY+lEMLkedBDG3QQYvEerVSStl1hzioZZ0eEHi2MVuhBE4IQwRXCA3PwBYJUFBKCdhJfOIYvOIDamXpISSy+4Ao6VHRBuxdakq2CvixaMWq6FtBnTQ86P327M61AhdSXJrWiOThoxS3FBkvA7FxKmoH2Xnsh5pprrjaKJZAIAHMPi4ouLi6NtdjiHCzQGRXvjPnCv3zx2LGj1E+tenYmvQpcClqWDLSoDqbtiCxagI3hoAtPRZx2sIsmiXxVSuO6KqpTg5I4TV3AVhbSVZjuUkUFsTGGCk/1IbLdq5Qq9I+zMTpecIkM4L7onouYuzi2EXQYecODkRIoblsI4wL6AcYXa1VWcWsNrc7Sf6jCrJ0yoYitvZVoSG9tAXQzDLswI0ZzcMF1qNCj40RBEqyLuSmAjceJkSTwM526GXVD6SDcIux28Mo5r4NDITjBBv30KAk+oJKu07MgLIcCpJPEgM/64TeF/VoaPEQttzjpBaIAkxDo9giS4YL6FCkqdVFKCxL0yTChc04lbwlYwWDlHur0eHzmiNphAOtTAziHpYyDMvRQOnNpVsMWOMJRqudZSwwoTiaRCLaEdbiggtdfYnptdd0XQMs3br0NW8VoDNBVsot3rsOYEMNyy5INLZKlbSQumCFIZ2Yuq8SuZBVxjee22nYwIxcTaba0050HKWXFLkuB3ApjWIVWAknuIRzXRCkT6XbpVOTlT9g8hmPDdfVExqPSK6ssYpFpxyYO0x0NgifjkVS8WcESK82CEAv/yg9R2mZlmHUgoBEsfWFwOQsI2MsEFK12VNF56VIlyOFH/wAtaCKzz4oayKCOXn5Hm5EzwfuvKBX3OqDoJ9KBJXgPOjTwBjBqX2SXSTTTSYIb/JdDBLEaH08iQ1ClM3DHQZBJ3J2I3uGhddvsweKKemEjiqc6e/8NO8cMTW65VE2DKqk5+UzjEA7n8tGpIOq5eE6PNOBOom3O7sA6DeaOVvHJyiNHjtz69W88+cSTVMizLd1K6gZomZmbM8/WWEWwgqLYMi0MbsXMoGiJSDITuMtbTWSKqXjoJO1oyXOP0AjkpuucPfbSGANtFj8zu1wZUFTpUW6Lk4q1MowR9wXzY6TCOnRBLZIvqADGUxc8vJZJNss1eo8TimisjQiqSVe31blFJ1I8lXHlJY3gIoWR5S0Agwu0oEUQxotP8lW8AY9ahKECO68oUG/EgDqEAdSR6T94MG0FhEAekMLTt3B60rhpoEU3mv4ST0hKAEGIV6rksoBOiysJfFKblACN0Kz8WCHOFJbcZWeXuLZcQmpgXvxv1wtMhYO6ZrCgUOm+jmWCBI1WV6BzTiVmCVhBl85WER+/U5cz++KLp515Q1iPLiF9UKO6D29cV1tGKLQdDs3DeviyQwjbbe2HNq1McN9Q69B9weQYtpl5NgK4C9hpbM+evd/4+q379r0w+4/x6mC4LPlCQUGLy2RSBbKeJruDiJkmYg4dM0OclpMExSMKdZJkYlQFYwkz0cIMSfkkVSkcujRqK1fGgRNdLFyUNBRAAShKTbcYUyqXsLcd7ktmwLGKqVz7AHLFGoxTfuHGqJRLwXeJ4maWDnDwKIMAkjCI0IPTlmK5RuxpNCsxDHZkAdjQHhEgQ64JjfXNZIJeTVSuqt1VGP3hrAAtQMebE6v1SLmOt/liXYT46eB+loBUPVKpYWiDC4JHH9SGYOlqUILD5MhvaaSnSeCsIEkalDiof+IJRVmaJP2Sg37GBb2AiVR4dWNO8EYloA7C+kXC1WFYM35Uko6qs1BJlnQECnokVJTZg5OCqZaAFQzm9VDd/MEVEZED9zpvq+WLya3JtIEm25Dj1st5qh/VEsygyoJeYikDUdG1Yjrj4crC0jEEevsvw+c/7CQJYyPA2bsvgJZbv3br3n37ULyAKvtzXVVKuVwBruAhHtk1p3R7jKEta5ENeEBCJyNoOCxbcye32CweuZHWF4rKnE7CE7zIz8mk1LryiMYyfjgB3U+EtMuPkSxVSYMlwLLcARtibR9cG68zUxjtZIwlKMARepsyVUsMw2H4LjjTviBskMewhRthAphmFTP+8Gm4ISACCv+SOFix35Qfv+F2aFeGMM1rARgQy+ZAdAFpgRZQ4EOgZ9CWLe56BCr8ZhTw0zMlPCMC8EjinoTHd8AMgEQagJowHskl1PymzpJS0dTcdZ2Wwgp8Is5ein1pQQMx0zWBPwEeCUMb93BiwB93PR5JqJNzv9J4o/MlCSvsBA2VioQ/9eMwtAkxe5t0X5IlYAV9bEEEN78pdRCrRZs+HFs847gvymoWQ4AiMoQ62oENcTGMO4MZbVZW7z2EGbUajBHGI8ET+/mFQ5As5U/hIRiVjT55npLR5C7O9913/9e/diu2/1KhAurWhapuWbEE5XJZHPmgcmjjKC5mMTQ1KlOaJRuQrK41h014SJ5CASZQDGgc0mxp537P8AMWiNNjUnIQLzW0m1kR3Uro8kOZLE5HzlbTuRODN7OhND0bGgPbpOiqUOYkVJVmsZgy0C4yjFwYI/ghONwa01AiPgqQJsN3OQCPYhWTMGQ2ghN62C2S5NcCIgnzKoAWGWVMxmGgQwvAmICNnkyjUYzjC0HwErBsnob/EYmUK3inFgYHWgiBvwLLg0qN2KRldvQm+CiI0hq78h+cPNHAxC893UXmUYuSqDElRR75Q5xo1kEapOcjxEBC3ZTFjLAJoAO4xZVySx8FhUqc+FM/FFj2YPZluSwGS8AKWgytgz7+4LoEKrCNMP4w3cDJQSrsNKbaEOKwScjNbzitorBuamI1qBCW4C6Djw36KRaDLqSvUZXUZMr7ZCXo5VJZ3lEmPJ3/5vP5r3311vvvvx+PZ3JP6Vx0FTiBiwItLXSRlSyj+WIgmEbiRCvmgxDDzBqFk68SS61DpZBrwEccB5Gp0QglmKB+RJCTXZ4fuo3c0NkVkb7kxR70Bu9tB7+RiHLQaijPTjAGD77U67TusvmVcvfJSuiHi+iciOKqCBHUkUAJIQ1QgYONoSqFmfcYfT8Dz76lE6SoVKX5eoAQeFBEUMitiUbKtUgRW1TZKPzL5eZqaOXh2bEAWUf2gMlIzSkwYybVwIQktxjNZWWT5DJiOQTbw/A0SS5dh9mdw/22E3ge9iFtYVP8YXRV9C3kiy5L9wTcfNLPRRwpikbCDnAZXklFmgkIW2DuVGs+KJUFLCmdFnTukM0laslYQRdLq4iP3xS8lYRDD6w4kvHsy8R+tJDSbXwLRxIhn7ABEiS6CqE5DYOVKv0nSuv89GkZOgzASFR+B0aujSdz8US2p2+bTUcY28z8r5bx8Pij4+Pj//qt7wBaqD9RgaxC+blXlYKXquF7LZgNc02F2VlYZXG3r4EN4bb4QDCsTNYxI6KZdQLjBOlZCcyo4dMHM9SeyMCiS+t74YT7j5fIJbNcGYgaRRwmzVRRzHuYBKqB68D8O6/tN/FumOErMElvWYYZtSFcUnZELJRIJnCbLABDk/von0jAh5khj/yxrQjOCg68/wMjHT/NQEsCpSrpx2gIIjkxNL1DChHG09wy1UNi6+VAI664UpDFgA7bqpWSWFMWVOB2AMJpiQVr7LVob4bWP3AgSuiedO4aWllRel2rVOkB0szCo/mjUI2uRU3sF9Zi6pKiGyLisqovQsTniDsh7rzET8kW2Z+Ti9I5pyNmyVhBJ71NyMcv1W4j4SRpMzqUwND4Q3yDptPkzpJjTl5OSLOx4VTEYAniDqfO3qTqJKoTRlsZNZ55Zvd1111rtEoA6y6Brx1DarlclpdgekRaRb///fvuu/e+vXux89gZv1oxrxYd78LCrjC8DRouSwud2hhI9rUxiXC6O8WAh04mPkvcEvGiiGFzEkS3LoaOyaXg9WZUKlqU+LUM7MnqCH7cCMAECBlOLidxeYl07dF0Ge0IoovRwRJbqU0nVdaBzRFS5uGXNOndMFJEi8EflNp46LTfPQpMAHjQgwtUJxrYuIIY6WL8Cj1MjsG5wfBHFecLJc2v7MP2pFKZ59N0G8lcDZfMZQRPrmslivqixvhD3bGc3oGRqWYwArZC4Bfi8PzgiGA6EdiMvcW0MQ87tWKEzfBXxA6AH/t5EXIvWhxonc4PD68tizBSKR/8R9hilTARQFclcQrEqU7UFIZIkGE9ljKTHhDokM0laclYQRdLq4ibP6AKrQRBt+3Ths0kSV5n9tm+pzIO8zhl0RYGWRXJVTIrYx+cOMWSJBGkaVN2YriFTYmWCWCbWU9PbhkmTp6YmHz0kUe/8pWvYTsAcmxzC9yJtg55AH7wVIArQJflRBzbujm1XT3pTLZopkE0P7SYZB4VWa2PTXg0g3OWQjipFAqAGZ4p0HCC9uSeA17GGBYRRdzoDCeBRKvQSKcL2BSUq2HSSbXWGHDGYl65UpaEjdfxanwAl2OYoERF49f1c3Uw6iFT5QrpoVRsgSEPxZE7ahpzo3jrGXYokb+ibmyRzEbEwNoms7WUBLeDoQLIimpiwqpV4QVOkCqWwYYILM5X6/QCeQSALhAnlwUWq0ex3NKbbtpw0kqt0K0Rpj2jSl2eH40nTNT9pLGkt1H76WbXeTmjlKdZWQW4WcCTpoW9Z+4gXuIycUvGCi4jJMlu/g7LqDQvb0Z3Edx5URrQpaRfy49oy4HYkeSQHpnk+ncVWpdJt5o1QkhrcGvyay+5rzqa3WUNitVq9WX3MT/88KP33nvvo48+rkqlOk+QutWgAVSwxVhApeUk2HIZWQb0mEOn2GSmaYIZyDQn8pI0i003l+bRDN6zlBNUJQvlWsQkIaDgxEoiEVKG68yhSk/weC0geiik2cnITneH0aEc3SRE86UlqWx6oDm4jdiFjl+pmom2D4A5IW9ehgLxyzD6iD5kKlold4piuEFWlAOlpbDOzN/YwACKTQHQ01Xe7Uv2Aqai0wBQaX9wvImN2gV+7kQ8M9lBZ8oGIm3ciuOBIWp/LE1hfR6LWJhCzKVppguBQpmsCB6csJLfxjsRtbBwV0dX/NDN6CINq28OrN7DWXMLW4Xgq4hbnTuA9HXVN6grtDy6rArrYZkVCPpE2pTLW+CubAhhX15ehYhP7HOtj7kvDqdsTkh0OKopxIMcsbjYpLg8mriSmE7wg25HqY4u0d3mN4WLucVx+PD4N7/5LaALxnouiqssLYRWSEYW5UqFJ8FKKwYV21h+E+jSe1KYbGiuGDcCVcgn6sCLSLoZAlM1o7SOHmK1uZCKdmNBrUv3NsYehwgJNLcHUTTFKiuP6tQTSFSn+8MujIH7guV9KdPoS+R9tVJuokkZdFwqqWI4Uel1kUVDolohl9p0Tno7OpxsPGwBInVUWndBKlG46yKMP/Rhdl9EifqVvF2ktRYhzGBogStWLNOcoLwfHjNd5Ro/K88WRMtix4Ncldi6nUs24K+kEgQqDE5UbSy4wlC5NFm/Da6Ap6uja36fdvZEvW0lPcPFy/0F1cT9sJQRMiwWXOJgqkujL6Jl9NnH0JrgE/HWqLWo9PY26d4kX15eBk8cbQQPxh7i7akKbU4SMqOXmNZbB8qY/6sEXI760P1AHBqbzpPcvJSqeZc92zvNhHliYgKgcs89946PH5Fc/fe5y6ptz4BRjD9P06hWaGWF7ppX5QhsLW0gT6KPzATD5IqZtnILaSDRjRmc6kIN0U8k6NT8UneVhNa12hpJoHeIMWB2Aw/rInlSY+l1hx2MwUKX9DrwD2yj0aL18AUdzsGzX7ZWSkrA+aC7HR5gDDvAA39y4JVTKBtminAAfgyPSl4vJzSKzG7BZIUKQQsjDSEHVl/gx8AI9Bg8uwDYNww2mI6mvHqcvmC3BFbv/bbp1nrd8ts5muwNeIBCYT6BU0VJhnh5kyC6NfJU3ypBl5Tu774ISAAHyXR7aBl97kLeJxJYqGCF3ZrRl1ewWkP16F84Ha2VnOK1G5qdnCikxzCSdeQpQbIyOy2s0YfzFpgRKbQgHr1+6uln/lPkl0Ws899Dhw4DVJ59djdwhbT5CtK5Kj8nVnoqlWq1VsWOtSrQxWM1XUm/4FlQtBUdO7MyH9lHABtfKZI3J4sOTXVLOAzSht5UlvUlkS5KCYAZNV1mdQMwBhBxsdKUg86PiwvDaqIs5zBBakIDmNUhvaJgwqP7VCY+Rq/k8U5HfWcnW1Fk9UvFSxtdpKGNUp8W6t9YdFm3B7+OBevwsA7tjmNoUQ+j4AEggE2EXpwD5wZunCzXy64HG05aGcd7EbXi0/Ru+bUcnX0tqJrf9AIOUA4IAEPgb+EVMjiEAb/AGPxiZY0YKMV1+PS7UoMjWkafg7kCqT4Rf4kC5YjYrRl9ebXULAnt9Z/c1WZ+DIZtXRFVDjrJaCTt4AhoBk4lskqSAvGwwiVE23ZRJ+DK3Xd//+GHH5mYnJTiWWOQ1LjrX8xx1apV6MFqCm6KgSx4FtLS0q547dIsFYFBx1aU7NfE6R6yBg1RqDUIk5tfczpnkXHzBqRqNa4kLYXG8vYKJBFwoALWoB1MdOBEykK/6A+qM0gerEl3FjYLFUhzSZiAp1anjyKTBnJfdH4S7+zX5CfsCTgwnQmuQy7UHK0ATwW+C164AtNgtxigBVu8QC9VYlhYopes8KtZsKXYHJgNa3W0H3r8Ut3y2xo8bWlGG5sHYdPAlBc6HifT/CccWDOOWTJmP4NPv8XUKqhl9LkVn5fu4zel9nIGxrs1oy+7QK0OsSv9M+PGhKzBnZm1X9nR7x1fkKKk6OSFE5VKbclcegxyShk9eOCQoz0odObMxDPPPPujhx6Gv4KPS+JKIIt3Z3WXXkx54YAGAAkCddyFuQ63FTgpgOQS6S5yww0vbSXw1K6ndJInT66woXUY0yihWsZYTfToVOeMvAOStK2RRKzE4eoGSgSNqtvX0eMhKjjRGrmuzMKTn5QBxzgnlMVitxXBW8GNAAvTz8B2JDqHHVbV4WpJpq5Uqx+5tuo7yl4EIXgkWFnBHBf2DWN9BdCC7y1mk7SoheUTEPE4PQyIhRZXs/ks42oEX6qf0C2/rcHdisHlsqmUV9tbWZsZGbn12zm3DmsZfW7N6U7x8XvK4uZ2x7q1oS8vtzpfrFv9uH5lpQrTD4XZyMIZ1MXJ0zVqIC8nRWesxxeJe/mVCIl5kaYZuXj7JW/5d+8YHhmjT1o2I9OTE8ePjj/yw/vy+aXTp89s2rRR50HnM2fOPP30s08/s/vwIfwbl3ELyNKF6fFIHM/R07cgm01gCSa+cNurcvFWbbk4i/X29nzpS1/s7XW+5ay0rd7pjW98s63Mqq8pIdM6jAmbI8HNYsYJnWqddYYuko6gZDrYypVxYYzwe5Zk0PbssuicuLrcJUzrMosygx3m7JWcPLovTNhCBjYpmhKzkMNQPAxCN8TWt+JGwXoJCKLgjWqwElwWwAlABTNgsAVW6XNp+q4JZhZw4AkVnF1NZRmB0ro5uuW3dbuzCi6RoVJGvg5ha/OE3co9iS2iWkafW7D5yEH8puA+bh+hWxsGZedTahG61W+JksnRnQAwVd7L7nVffG2Cam+75NKfePvP7Ljq2kEAQwPDNO5ymrsef/jRH967Z9djtovjBRuqGIYSueyjN77ypg/81oewmIHVcgAMtt5I+F2//N7n9u5eKFY3RSJYjDl08PBTzzxz+OD4mYkJGm4UogTYH3ChcqQdPaSMrgM8XMOzW4ASHoxU7V1G7jBiG06Hf/7dP38u0GVpcenAgQO74Lv4KmoXVie6aSbGyRJzc6o2EOXM0AZmfEmONEQtxUQHs6aIiYgFPZSIToImWhSFMYZN2pkk9TINEMO6nVBZ2wwMMKDTQQAjIevXT5HEQDqI0f/3395kia/bINAlh5eypBtLpRi8k540rp5IvhzD4grQBVvmENWvcXIZIcDGrnRvpFt+W97XSE7nsdkMlS7/bg6f/g6EtYw+dyDCLEH8puDLKCHZIPk2Yl2y0yxBywPFbJOKRHdqLNbAmxcqFVzEVMFnbkucfMq1BmMywrtY3vzWt779Z352ZGwDEKXGuEIBwIOOHh0/9OSjj0CTGAt4gDd2nD5+BNESB4y2sbENf/rRv85mCQHTxQAAIABJREFUewVU+BdPCxDYoDPzb3NyYvK2L3/mmScfgRTKx/+k9FYl3NVx1c+VpCJBNClU6xRTaARacMGP2bFjh2FEGKiziQ+XhOHQATGUxHbt2oXA6dOnAS0HDhzULHLWjPrsTqWYL8UitA96U6241qtJ+uyie4mcaBE1M8roolLETdEEpGB+LJGgDeiaw3ArHUw3YQrMzs3gV47r/mN98BJ3c+kkapH2raKNGf3gd96kpdbbWZuVABzoMpDFNUjvIYbjwq8uJk/FDyrWldeRQbrlt5X62kg1ts2DsKGec0SxCmQFPcUJjgbxm4IHixgqyQbJGwZ/oEt2Lyr4FQoFXQV7NzBAmw1boLdpYvBjlhUM5L6w7A8+mbI/AGMy2rhx43/7nd+69trrBVEMuhiAET8GYFMoY++F6ry0kYTvOREf7k1uG6Xn7e+97wcf/pM/+Yu//pvtl1xKDwwoUCEPRocJYIxP89TjD3/xf90MfNKFsSrksmNLugi6ebUyd8u5eAJYlks3IqsUaNEFNVmfPbm5yVasfVCnes/Q7iLpyHJ0fZthlY5EzcDGdD9FsyTiONQcFcuofC0nRjoX6RGG2VkHYK59T31gO2fh/hEtwQ3p5kQsaC+tj2ltEWAp2vFFf3TThksUj0D2Z3lqjLYaU22yNDGmDuuq0qS25275bWVOroqqmtzmQdhQBVF8Uh52J9o5p5KxBKygo7BNyMdvSt1GyMrWJ99erEv2dqjQJiPgCjbRYcqLXxBu10iAx6aQGsTR3/BALkK4WcF+kMXToKnCmjL/0nv+0zvf9c7B/r54DNvfo/gAAziN14IooQtekIHXaeMJrGiiWsOvKFejQSoeFXRBpm/88dfn87+5Y8fl5IYjL572QLmpcOxGiTOFX7i4qMgNN75qZHTs43/+h6Vi3hRJl5FqIQUOSlK0oCQlxeJuZUJy0h1pb4qJn7OAJ2/dfppMZ03TZ5B0sqRZMQkyZ0BQk7xno5FnxpzpsQC6LgRUtJ0u03xcVs96DKnlWxQCDVakCCbcZqIMwuqQWuiYc/bQPVHw2ZR1tQYj0II7SvgreEdnvoJPykdpZgyvK7aObhGiW34rK5etna5sc7ipIaIY27jazFBbBFbURjQzjlxsZwXqKUovJ6XXjjqvPnIuaKdNCQOw27uB91LTU1PwjGdPWncupCuSy/Vk3vq//WNh4798aU8uHrtqrOetLxl9447RTDIOgMFtEH7jABi8SwgBnjQDAiXoG0A0ugFeKOdoZCDnulTf9hNvm5gvV+kpNuJJJaIpiCEMJ4Z/955ZODiVf+T4XKHaKNYbhXpj+zt+ffKbn8RWq+2XXAY8k3m5Jx596MTRw46pfSEfQRpAkZ1UIbdODOa0pRBeUSt6dDhRtpwT5ZBdDN2kmkZnpukExCVNE3RMS4BdkyxeTbLOlgJHBOleOid6iC2XZDQfl9KPMaQd9xhSRsNrMlUBmNzYybPGBvcFTPbhiSrdNocvrD6Z7KOvJQIbiO746LHHFCbEm3i6Pl/GNR/pz9WBNN322275bWO528C0q81iuhURgShuERenP9IVM2egdHQrGMQfXJ3gQgbJ+zmF0g2vrs4KZHT2dvui2+APFFsf4Qp5EmqAQRLNf+nhhufQxBS0aGoeG8LzA3MngUuuY2LTtfnYWFbTjs4Wv/j4iQeen/7NN1++oS8NTADAkCvDvgucGIpW8IMi0W0mioac8AefZr6gtpAiOjFfmc1XkolYAmgUpw9mVxPYt4LX1UYXy7WHDs88cXy+iGk4rhf8GCi8eucV/+VXv5aOxyrVRrnWkN+f/Nlf/Nif/v7B/but+itLOAZpH9JV0xocbqS4IoZTAnYzeJJWJerXTy3qHHbZdALT6IcJLioJMkHkXME2JCQ5mAIVmjWArvioxZ2siEgy6KdEloOEUT2rPgEUdlM4GyVkCfiFwYMlBMpJH54bL03u7kwvu7yQDzYhFdFTW7ryuOS4c8R+YvxhzzFW7EEr49vy9QgcF3lyxWWzFlXthCdQ1Gc8qxNYAoa6phwUVMAU3KpMUJBbKCihBc1ntxZ8FnnFbQQdLWQZM4KKAhreOydYIem2Br5kmMyXPi5bZCG+Dp7ht8dUpDeSaakEBPiPBGcK1f9598E3vWTszVeNpZOAB3Jiao3G3pn8/3H77lds7f+JS0cu68uJ9WUZZrGIr1XSiEI/PNhk4bPE8PpUAhiGGZp8o3A12p9NZpKxPF65ynlnE7EPvmnHq7cPJeLRcpWKj+pIEoaUHVdec3DfbmYUmlUDRUBiUIhldIrD4OIWHsXp4rFTTHh5DsPaNhDcce1WhBGtw+SrqUygH7a15hQ25gkIBpN0j+Czpd5Ph7xW7TA7RLcrQ3TUx6qGm0K9hA9WoLSwgApzmxKPm6irutzZtqXwQq//cPnd/uQXlgLwkBVUrMnDXKZKwBJ8XgXLqql4ozdNb3OBsyLmxDonQr0ZuQsILr7RE5zcluozompFj5ChhogilvHZzWOwgOhZNVOX+Qm7O0d8p9XR4oRQUrQux+nHJHBg4ZRpeXRXIsULczYXwnIAACYXSs8en98ymE0lYowT0VId/ZfkJkvVK0eiaXzzgfGElOpveyAsRNDAKqAi4uLNbB3Kbh/N/fR1m354aPpzjx5DLd7/ust2burlKwhFgpD6lVAhn+ciUWnpvxztQy6eIFaths6WGW0ypXjiqxf1a3YaRnKxSwXT6MMIapL2H8DgkIibY8Kug64zWJDqghFQmEXzsRbN1AmxC4yhj4KYApBuzgdnfcAAtEjN9eAws4CgD2Mhi6bTrHP7VCzyc8UsgQshiDLhK/FAF6AIPskMIMFsNT7bjLLhY/XpOI3bqUS9L03PstgVQBR/nsNYykPvJOozn52bo8BQQ0QRo/js5tgqMET83cpYirptYndW1HpE4ZsYvsNn1TQkO3ngaqSLBRS6LLWAk06hxdMqgcnElju6q3T5qyPDW5hCgy3+Nvdl3rFzE7AhFYstFmsAGPgx+L3posEe9G8ekiuR5nCGZ7AJWiBNoyD+0x9+OADXB4FkHI8Jw3eBN4OvoEbv2H369j0TuyYWSw3MGMc35lLDPUkgFZSgQFQA/oVGKl8zcnD/szooZZSYhIkFhzpJRMUdmhMyDMQTQA4g2SImHCRrEpcJwCJBh521l8NkZ8kafmbmmIUOyEEYnFTpG0jQvcabpOPSh1QZoUXFOSTUdsTOMYbzo2JqGGHlqKsXV3RR5M5DxeCUm9ByAcnJ5jIWvUDXYPAUpLzAGE5+LlkH0uQr9Dk0BOhhe96ugxe62FWyw6Z6NrHDsE+p33qkyVDXDqKYIndkCbKDzxZtJLvhJTXd6vdk3VUT+8rmmAJ6kApQwR+o+MN1pZR7xGR8oaI74ojRWM8iYK/y1xmkqEZ64Ae3lF7zy82Nl3NWJLulH98IpEMGNKMOay//8+07b3niOGbDq80mFvZpNQYrQMxHGfHEBweQabSCpRvciil0ofmxf/jB+Lf3TyxWG0m8BCzSXKrUlyrFTz527I/fcgVEsWmB1AnGcJnz+fzJY+OmqNwqVDBisk8SUeQgdofBSXVoJuQPdNWQfnE/JVChGFoz20U0xqdEI2vxCzOzcZB+uMlZmzcVSZqkz6SXRHTcFXElWgimmYLQqCOMoeamXFUpWcYhqCJRoiKi6vyUpQhE4jyz6zKOaAK7+wDBR3M4Lrg1GLQs3gaGyTH4Kyh3T6qOTcb43hdW71FquDL05Ip+u7Oph+kYhtJ5wG0dv0lJk01dl4jSrQHdRlve2MTfrYyl9ayLZzegpRctS2MFbUFG6bBKjy1htHAhl6O3wLJTmfwJjOssgu1eRIQKLPstHNGDiOTQjGQ3XZrbdGl6eHN209ZJPCnp5EyqpUz0yyGJ3rR1IF+uPTOxhCrDpwG0yFhHuRC+SIEpRBNcvBEAXgv+wP/gwenHjs6msDCDvyj9VdhwECU1XDoQKG/8UjUjz+97VtVSnTgNP/7mEjFOCkp15DULZ2QiJsBFMrE2gQCNbbi1PYNZ7EzFoJrP5CL2V2TDr5mFTfOIEZeDGeaGoD5DN7eB7iYqArLF5CFyipW5ii+PMVRwpVbrMKUnJ8apqAlLQSQhu5F6iGSsWN2nNkmakfK4sNZgcNVk5A0u1RguGayv4AJGPbOJBi57uCw0r8iH6QAq3s3JbRptabcGQ107cIIKmFK7KxMU69aAbqMFaXTTiL9bGUvDWRevvSlcJTN50YMs8Sa+IY4+hwEdeFOm72RjCxm5NUnue/JkLlKxOxH+gJmPxddL6+orTZFYMtOzbWf/jpcBWuIptYMMb20pNiLADVy2UwVmlQGKS0o/Ovqai4fABOXIFI+/kCHZmgQKZs8h64kDWvC4dgzw1pxZqtz59GnMuWHtP4UPqgJjGgpgfuGaTSjw8Znik8fm7j84fSZfWajU56v1K8d6Lq5lB3e+dm7Pg9r2nJOOqLObRjH7MObTRC+D0H1smp3OwSI2RwfhQCUB/cAuiTW4GnGXiDBrNuHRDAEw4yQJlqDYDpxIRZ04tLngRDO7iB52R0c7jKG7CT44CwmSkR3NRDOJKoCTfXiiVpKupY9km1YSL6AHLYEuPfT8SnOxjDnl5kCmDkTBO5Awz0xbxfjy9lfAqmNw0GemAOtA0lBDRBE7+uwWbF5DJf5uZbTwCmR9WZkG1EpdZxe7rxe5ZBGRyxMDdwpKeNyHy6L2u7P7YmDGzgQLMH2X3zB09euAKzbdhLN4oSrNfTVOLljOjPQ9526Y2K/b0Hd4rgAQqWHZX4MKjWdcD2Ounkwck2TlKu1yfnQcvgttFlAeDPsxWM/5zzdcdMVIz6Gp/D17J88slUtVmgmQY/9UPppJbLjpp0duePPS0T0LB54onj7sthQYHYITEnm3Hb2pJBpAU6Jy6vC3tR5SoAfTQGWeErhaGgJGs6XEiDjMwqZ5hEGnolE4yD9Wkg7irJP8Z07UHFQeYnZ+NEWfNafiaIkxvMLPQnixHXUtl0pKCHRiwIU/OShA5eUyO3ZSqRajw27SrNQL6G3KWFwBuhQrUazh92dobxisgIscroxV8uWDPm4xkVfQUENEEdP47Oa1mCdO/N3KaBUrkHVnZVpPa/SeXexmGGGuZWWdahkHhWeo1FAm6GJnWK9nFhZen7j0dZu2myde7HQnDD34mna1WDwys7RjrA+Xr6s0HBUgGUomAQXYaYxlGFN+CYn1sE25UscumAbcl2KlfnSmQL4LYQx+GwQz0eibtg//+5eMPX1s7vA0XkBD0AJZaMNvLhYZ0fMXcLMGdtyIv3qlOLvnwdk9P2yUBQKVGdVJ6mFKo6vlSqU8vAQlp/mDzy2kgpltahtBDQmG3S6Zy/JGiSUizA6b8GgGK5WDLWEm0AdBiZxhHybjXPgHypwUTXGxayKxtcIY5pFqs0IraMWpIwgnBep151uW4JcnQ5BgH56oneSELaYLxYMBusBfwbcjgSv92BvGbwvUTemUPDBkVUfSLeNaAoa6dhDFFNmqRuuguUZas7hSfHZzpfojxN+tjNayAll3VsuawsXuNsUysi5JXeAOz8hobu6tCwuvazSWgRZbIQq07/TcP+w+NbFY7k/E+5Pxq8d6XrVt6C1XjuJhSeg8vVSaWKzg+Xx4JJipA4UNSNXiMMXxlCUW+eW5FgSGc6lCpZ6qEcYAaZL1xi9ds/kNlw6dnCuCnsUGgFx0MJss1Rr4K5Yrp2YX7SJJGEgzesNbhna+FhhDMFNxPm5IDJS/c7giQnYzgBbAYxT4mE3KqgU8WbgHFFM2V/8wIppZ2BweYQhIZUZrwEecpbQCjuuI2EYhSeuI1uHi0ESl0MpSsdEjljaTYtTAxc3CeyJ1rVAnVMi5kVHdDOrcBxQFHS3IxKrvYYLEzg+Npr/oCfw6zWsnI3hYctl83RzaSG4xmxoiitjGbTe3vXwxYu5KwNKwAllfVnYDWqpV0MVuxgTN1152xdUi9Z68JiZ+pVC4Rue7/LkvkxzI0gtu8RqxojVbdXyutFicfP7M0q+/4VIs7E/nq3cdnLp+y2W45uFFIVNUGGH+VQHM2mF3MvwYEPFUzZbBzORSmZyYeHQ0l/rZnZuu3NgLhpHe9EA2BU8Is214HYB4PBCpXDT8xNHJU/PmDZhO4ePp7OjL3oq/qSfvmtp1t0qwag5x12ElGbqXRxKCOJcRMcldBgI6gZ27RghoNUV1iQizZhMeh6FlKjsVUMqslhSCDCecxBHJ2UP0pjgQZLE7RKXVizFUaq0JcnbYJlOSk0ZVwp8ccexzlNsaTenkbMQN8wvpwcAIcFyw7oLNx/x1L1Mqb8BdbqeVbT6bCkRxi9iMAeGumEleC+hzgM5Ako/fLnWghEO0rw6H2jrky6s1K6d0q99WR3l1k18Qb3tTuCR8RW0v21XR7GpR2JeXwzA19Qvt0aU3nbx0pLc/mxrrS28b7sWeMNxF0SMpCMQir5srfurJ40dmiriQ+S8yV6x+6gdHXr9jBBsKxieXhnqStK+Yt1ATg/BRkTisAygQ2PAkzb7TiyM9yWu29r384sHeNL0xU+AE+zHxcrMqvWezkcBLZRhs8Azoqy/d9G97jhYq+nNhTs1UCBiT7B069cBXTYqrGUD1WcfLEMTTUptJoECAJld6cMTpCR55J0EETck1hNhZOsxuNtHpTdUakMpJzGWN+RZdp7sgAjmrOHO62DWFeaSINq9DcfKjXR982Iq0HidjErVWYkTE/OY2qAZgASJDA9gNQ4sAiqGeRIRy7MzCQkcLznNGxi0XNiLz45PNwWwdM9qeIniiqtV85TF1XTsOCupgSu2rj4/QbdP47ObT6CZ0q9+Wpry6yS+It70pXBK+oraX7apodrUo7MvLyyDxiTM7C8Ubg9No91fsuq3DN106BkSBG+GBljg99hi9crTnL3/yqiNzxW/tOXNgckmyLtXqTxydxaswR7MpEK8Y68UmNp5ngATlRj+8VEPTIIw09CxMBA/NJN/18q1jfSlMqZGzgtfPaDjB0zR43zN+BV1MFDybB3IHJxdIb4tj4ApamJl4+JtIb9MkriRR1cKOAZxuxS0KwmRbOLgL2ByiSfHZCS5RU06NExAT5gA25vGmigZvEm4HWAH/QESfod4DEZKhTbTYFVnz6DNzeNgUxugtZFwAUwfN61KACB2UhkrQ9x60NdBF2TcWBvrFEh7tbJRK0bNZkKKDTgxUcLVNbpSAno9JKQqdrwNXBB5n6U/jbX743L3sQlZ5q8KqmKucpnSKyvdxILpFDFdAoHNOJWwJWMEAzX6Sjz+4Ln5BUHTjBiYGEH15BfDYpG71u2QR6SY/H++ydnBJuIu6rGxXRbOrRWF3Xt5Uf1wK2miM+JMMJZ2Iv/qysVbQgltMhhx8WTX6ktGeq954OTZ3PXF8di5fOzVbhBLsHRvJJs/MlS8ayOJCxT8yAeMKnTniUARvItH+TAIL/tAMbyaB/dbsrFhwAoxpJmrkyohDg+We7cN97QEG2Q1f8/qZ3T+sLs0iTIfbXq5mC2IgCaG7fjuluYTsSJACOx3m4sPDR1RDUiyKUZPZvsFsUncvlkg+jjsARayZFaphX2Wq6Q6cQNhP9MCKVigF5Qo4HJqoz7h70UHK1CjnsPMjPKiQri4etKzbgqadIYMDt0r8SzEEjRRR+UCCcGoC2KLnCWAALdgMhtkwrOTDd8G6S5ZfIKYLxGU35dIBRQ0RRRtEm0vHlzubLrIcY0A65dVNfj7e4Da1cnIkfHktK9tV0aw8UScnWxe9VaQVe34pH6fFlOADr5vEIrw9ISZeiw0tJoxAfyLxlis3gB9vUsZKzEKhlq80lso1bA+TG1KyiAYSCRCB7WQYgGf0BCiWbXgWLpOk50BtOKnG8AgzuTLs0NAEWtUaU4JrwtTcpsvmDzzusZ3XMj7Lehn8jebjkDK0ILcpoEpy9RuPFpVmU/VNOI+YjnapiDWCioyjHAw61ZVkCVp0lycBOuvhs2byEh30cfEGYYpHlNAMh0PV8ObUjkPMoLl0GuLmQNiOCl0wxuYxYQ44FjL01XwXGepFbwlr4iJxIBQ5oZcDWvBlYtrfSTMGMkkXUBpFWkuIElALY1x/wHcN+llcFH8bu5J9kW712wq6kg0qWHtTOBIUcmJShPayPna73MuFu6pXQNFa6AfANCPzA0MDgekYf/AGF3JTaJ89TYgZOOHRX3kwRIzSW5AJivjyTTRjV2zowxwX/vKVerHSgCqxDo9p8uOmRCP49Mtd+ycWSrVcIt6TivemEr3p+M4tfS/bNphJ0cv88fEZODfwaWx0QXT3ae2XBFZDE8l9sezobT0rSSTcDO1i4Hcn6yy951Zcrp4TyKQ47DQvKQhpTKXY5KacWpTVWUlOOSDopWNEgwLVkAgys+vsjzClBVlKE4RDcrdB2ekC6aDBOU3QFubyeok60XUGk/vQeVhUD2nVFvmBIniPC7wTTNLhVcf47r3gTRLokga60Pwe8ob3JsZ3lWOdIorpopb92wV97deOGWnd6rfVdSsbVDZXG9rKOexIUMiJCWN7WR+7T3sbwmpUrY16x+wH9z1//StuSCQDpgEmF0u1ZqMnDpTpFFoAAPyHi6j57OnF8YXS1t5UqUKzFnLJ4PX7h+eKMBz2GeNRTbwPBiB0Yr64UKzlknFAy//P3pvHWJad92Hv1Vtq6+q9Z6Z7ZjibhsvMiCI1pCyKlARIVBAIluIgMZXEiQIEQcy/giRIgvwbBMg/DgwEQYLEBpwFThx5AQyJdiSLsQ3akiiIpBQuo+E2M+QMZ3qW3qprf6+q8vt9yznfufe+raq62d3zTr265zvffpZ7vnvuenaxh7iCy/t4xyW227v7L7+5/qHLa/0e/OjgUr+uYHBtZsiXke//zrfeePXW9hrD24TuSHWudmPZ1iV1+lJq7VIkoccBY0SsUpGjiqqVE3NuEa2jNxEYGkkq6PqkJCKBP03xaf53IWFyzlzIEFogF0YwCg/OuiqrM5mgNmENmRFFG+OekdMwmCsq1ErRJBqx0Kv78Mk8aIlTXj3cprKPL+vhkuTBFpblrcOlDt9Nie+yrMoHJbvyaAudknBCD6ZOMzFTaxAI4FT2avyNDdisqtzdmnkitmYrEhvgWfVHFbPKNvk2vimyBKFcUi/Gy9bYo+uT4JOo2jgbo/Tv7ux+7ctf+dALH6mvY/BU49/541c+98knL64tcY0Swkx91ZJCy3sbe1/54c2vvn7zGh5dwWP8+PgYL6vi+iqBvYPD9eE+rrUu45mWbhvfx7S4stRb1YULQosGmMUOboY+u9o/t4KzeO3hkO9Y6nXxyrIOToth4fKFb775uy+9NRjsL8vqakzleb+apwwBE/AsOY/kodQMJu5ATjgAI9CRZSScB1pFCwkRVZRNSumZYmhKCsljBhAFaVT4qfIXMcaVQHPTYmQiWutTiqI/gWYScc0MBCqcMXOkcreGw0Hs08WzqF+uojFJ1ohNwwFqYzqBFQzWLrjbGNEF5766/K44Xx2Gx1lw0QXxhvcfzyOKN3ml9R09Mk/dNpJjNGFW2SbfGsdSMpklCOWSMoyTrfImldMBJ1G1cZam178/3H/pz775yGOXH3/yA5WlzFu3tv+bf/ISnn/8hWcffv7y6UfWlvDW/MoJsRRaEEK+987mP//2u1uDfTyE/9BKf4jQgvvBDg9wV5gGm929vc3vv7r+zru9Rx5ZeeLxsyureLc/Ygy2ceFyerl7dqWPm8rOrvTWlntY5eBhzAW8b4kv6Gy/tb7zrbduDw/bH7ty9pWrt/Tx/lFtcYBPK+PqLs5IxO4tWyd05URQ7QS2EYiKPzWBgl4dZ3Vu44gEolJ5RCGjTQFlRKgaNsbiq7GncZaH2jJQ0LuIkaI6HdE1jJ0iE3GXkap6HSp6oYA6OEWDEpMLjIgzib0iFlUAbljdVzjGF3EeDMsUXIkE22qXZ8GweMGV/KUuYiWT3kMs4LjNeC8bJINAABsY66gaf27KOnMFk5q1gh9VrNkaxWj4WfVHdbPK1nyb2A5ZglAuoTBBtuCNTk8HH7tqE8zMqr+i7uobb7179Z3Lj105f/H86toppWI2v7K2+JMfOL+02P3+9a3vXtta7i08c37liQsruPwfQwtuF8YZte/yKZb+Gfm0JV4Pg5ADHgD4BCUCzBtvXP3G174+HPCZlZs/+hF+jz7+6Edf+OD500s8JyYLlzUsXBhX+viqDLa4tANmVI23LOMjZhu7X39rfXvABwM+cmnt7OPnWy889pXX3vvKD94DtlIjhJZ9RDa8Z1peqoE7lY0htFTo0wYwoFS0RJSlJo6KRyOLTZrInEdk5DBsQkkTie6CktHUpNzGAAQaoRo2REUjXlvMY5IouVMxhj0OX7Oj4lUTKhCyQGoUpVbUaD0iD+5FxPJa3ihT4aUC5TzWczC4FXqtzyMshM2zS/xqCy69YEGD1wJOTNHRicxkCAIBnFUU/A1tMUaLNusYhgppZt9mFQj2ju3bxKbIzhHKJRTGyRaMweEpwWPXa4KdWfVHdUn2jW+mc76kYynzxmuv43f67OlLjzx0+uyZf/VjT/7ihx65urn7Jr4pdnAIbiwXXnpn4+V3N588t/LIKVwZWcDUL5EGi4x9PMKSggoBxBVEl/2DrZ3df/Klr736w7eiG4B/9PqP8Hvs8qVPf/yDa1cuPnRxJYUWPN6fmKHne2/fujk4vLnDKLLW7z5xdmURZxukC3/mqYs/8/TFb7xx44svvQn3sDPvD3F1hq8/6+BdzRKiwLl7/S3Oqp4yFMeEYz1X7lAKYI3mqi2vsVbo44o2MisqqthaOfGTooWCpwwz2hoeNiDhvCLpeENSocUkkAWJiVmErOBI5MKR2QrMCLQ6zBvI0K1uCYoaToglpKuCrCT0vIPMu4vW4eAblXDUJr6bAAAgAElEQVS5HR/uWsQbVfFiiP32zhAPn+Qaq9SxVjA4M4ZVPMIJ3nysT+Xgkv4ob0YSphCYVbbkr9Z5lEHFh/1oPKNRS1sTRGZVHtXNKtvk2PimyBKEckm9GCdb5Y1+T4KbbE2QmdXcrE0Xzc8qu35zHT9o+Gv/zqfg56NrS5dW+rf3hlc3dm/v4Sti2G8PX7m++YMbWw+fWsTTlOBEjMHk8PSlVdyjjJAzwKMqDvzg6rXf+u0vXbhy+cmfeOq1770aHVMYa6ffegvfmmn97AtP/vpnnv/4T1xe9g8EAPnl77/zey+/s7rUf+oiFjnty6eWLqz0/a40mdSkV3/q8fMffuTM3//yd7/x2jt4kzkS70yIyVshtHwD2ICCkoCtldRGyRHtjhCosOj07Mi6NlYyYouyjWulZ0oJqQLDmQRxE5YyWWlgBtI1pOme7glS8rxxuxkzmlFOZkIg6SpAlxuF5ELBexk8yw/nO+tQrCfow7DdGnS2BjhrhcdODrDGwBlVfBlycICqWBWPfg0Gr7HANzD41ZY+7h+DuWpqQFVZyrILeF5SR5dq/N59o0USJTRpwo0DarbGMYM2q/6oblbZmm8T2yFLNNkaJ54lo8fTwZSdUX5G9rvR7A9duXXrh+MqrGeosBZYwtsnu/0Ly/2NvSGWEfjK5NZwiOXCD25s/u9ffuWFR868+Nh5nDS7cGr57GoXr62UZc0Bgs3vfvnl//EffOknPvzs+Uv2UOdwmF/rgkVSNH91Y/N/+t2vt1r48es1+wudlbM4fbaKIkLKtZtb/9aLT+Kyv4qkrvUzPXinWfeR00vfiBprcOgFB6s5ZBw1ElS9gW0EQtFTbWvKKJUqGV0SbGIny4iCojNDgDKJ4lLyJUs2C7w3LjjMF0cGDceNMbCoKR03OCLm2YWIBSwEbrhWGJvU58SCM1UIJ/rGZSxlNgedzQGuuB/gM/Ys7rVxRzGoR1nB6IspcfUeD0vqCbGK7eTEOCDIBHCcRKLV+K37EsMYoGkmHcmO9SoGSX3dN1LAx9sYhjGkmXyDntnbIUs02RrXjFlyTAVGkCg7o/yM7HcjoqTKqW/P/tRbr712fbBwPuErAAIMOPGPpsapJkQaPGmP6yVoCsAb27v/3Rf+FBfZv7q999VX3/3QQ2eevLD2wuOnn3uUYeNP/vz1//Off+s7V9d/+mc/ke4duPz4lYqJWKzfyZaog729H129/td+573PfviRX/74M4pnZ3uHW44z3QIxB4Q/Sbe++9XQHQ5Wc6gbg0q+OI8iytJoXKO4e5+IAmRsRbkREpZlLRSUspAZalBGUNGIcAKStCmYXXGd8xgxRqqgp9XSK8iCN1mzVlZ8KJDAa0qP8cPVlYeJ0woauSnD9RFcg9kZ4j3/GObUvTtYwA8fjcT3VnDSDKuZma/B4LQY1iurPb6eUofjRD/Mt8AXwCbHa7gav3VWjbEB0TSTNrAlVLKF+WGhczgclucKEp8Ds+p3OeazyibfRMk0jZAlarYmiGfJ6PF0MGVnlJ+Rfeami47XmiISq/Aox1bPH37yF775h1/8eGtprSojZQ0wsMVfGWnwMNg//NLX/+gPvqqCnW7n26fwzEx3VRYc3W53hUAbaxQ8ztmovI7Ezog5YntzG0EBEWUwwLMCC1ubmx18G5avueRZr68tDD/7089Yx0umG27lLZyQ5TzFTGIL73pr79lLYrwlqjmEx6DUU2cIvEqoIQJn4mgGmjkda7WEqEFOqJcLihYKGTtZRFymAjKE8wqtEk4oYhHFBAJG9Yl4nvSdTfK8CbwAU8oM8vhhrKy5JWNP+V01SkHOZHANBkhN3UWrsiP4sDzqgaUJtprw9O76fgdLljNLWPq0dwbt3SHup2ek2R7yLBm+R3x+ZX/aFQwMIE7itmOcaMNNYn7xLznQBLgroAWwibOGq/F7a9U464jUBHVSI6Zmi1y4Ow5vc9obFnbRArg4yvMPcteca2NrYFz5DRWObsqP51vhTJN64HJtSluTZbPkCNWj0BScRXgWXrNZ1mWUI834WWWndw+PnxzuD9rXftg6e6XVqe5KEmCwW8prBNFCtUiT3MUNAnrZ5sZ71xNyVoABgRdPuOnAtsJ4Qo0ewAe7/MqIAdU+HCyXjA9BS0SBKBO04AZlaz5vFcm9AEUOeh5QI8FxBNBOJmWHBAoVTRTD5bJCRGcoF4DLEoEp48mbwwlKzp+RFYxqF+Q0MUYc0wULXTQ55tqtUDcyOX8zA+6Jzxf5u3gBHlew9qkI3LqFcMLr+XhJ8T7iB5/mxIe7MOPhvNr6Dkc6bhs+tcojqd19RprdYfvW9gLWMVNdg8EFHIQp3pGMb77iXRbWSDVPUQVPAXTU2LzkH2WgWcWkGQQrLS62DvzSU2mrQadGF96lKV2IIiDEG7QmHvdJw4ZsclMD319A5Q1pkm+FSM2xZp1BJkvUDE2QzZJB3ZQgZWeRn4XXXKhVZ0rXyDar7BHccy9bbSxksIK58aP24kpr5VwMM+UKphppJk8IM9RYa61hhLHEjGHQo25hIADBnZdzR0rZEQlKElcQWXB3MqcPvpDDOtubaVQOjU6aCAbG5EgCxhIT1zggVM/ZTClmesUwS4YMp+XG9YpyN5IgFfBktHBiMsgINcUY4Nm8qZdGxBjKa6It5c4QKPzyb+VEi9sTqlc6GcomlY670tWAbh96rPXQ6hCH11iI4L4tHKVsDxhXBrsLuMSCZ+cRZuRjRnh0t4VH7BFd4A8++4DRgnuJl7oA+EAkzpLZk/zdDk98IXjgCP32zsJuOC90anH/wgqp0KGH6tkVaJXkeaZMhEoR6+GJUmBgVWZJ6Fg2Nu7oX2CEIBgS8BUMy8KCuA0YUvxm8wJXLcAkUTQ6T6ANQAPSfAL/TKnGnvWP0JMlarYmyGbJEarHoCk7i/wsvGa2Vp0x7lRJs8oewb1ksm6rjXdeXnwCSxmEmRZewnLm4cNFPgrDACMzBrcybgWwyX/kUVqyNDvAXRS/Nl7XJMGGRit15RIlKSbkJeS4f6zbx3eW6TYWVQCAMWZRE3Q5WM3BPh0qOREkIk5h11WnVDFeD8FXxJpoaa8nUfmNzQoZV4MKRJAH3nUISxE8ZARUMKESLptjTCYKLTPASMYYuhZgkrTLJQSBhDSAV/gBeuot8U37fJxRRhC8RtjAu2OwLtGP5IG07BUf7st3XxbAr5pNC1YjvEKPL7LgFfqQv7mzgMUOLminMYmbj6kIl1viTWKyt7gn0+bBeRWxjphGPvkzDTPaDqphLg0gkWKlsCDBzoV9L5Dol+sHTK/wjx8O3YDHFIGGxt56wODMoirXnXQw4HhB+EEGtTQk8Qo5TlayWEvCFLHNbIEjS7ifiThBNksmiakBys4iPwsvnZhVf8XxWlNU6NXirO5F+dLWyDbXMAPBgxtvtm69jUUCJmeMNIjbT8YGPNEiTlVFKycCM3ZRP/ZhHlPLSAcgtZeVCGzy58YIegE5XBpiTIMFUSgeEYsC2UByVN5AakapdVejpcA5GpEoTYDr8/rozqycTmMp0w2rswHRiS0X2IwmVIOACIwqT/5gAbqNxZDo+xEYsVNsXJXkeWOG6G2yhM4VtdL3Ckl1nCHzZigowKO4gwEoKS1e4mu5VZGrIxErENyG6FqNPb0DLGpIqrp4zzHO8FzbxutWOQVDL95ZifuP8fLj04sHiEJQh2aZNdUkKl6N0zerudIW9ygYk905GsWufoh1IFEioGxJFu2odjkh8B984MXDbrn6bHRg5XILYA0zABD+VXG9Vkm/k6JLjivyLFFrhwmyWbJQOFWBsrPIz8JLB2bVX3G61hQVerU4q3tRvrQ1rs1lOERRwu1zvNcLCxr4oKMFGTih1n6iMu63VRXHKGORzqW6Wgp66ImeAhPDViv1xNkoiyOjsMRxShoa0q7euJ6Dy8FReU2RIpw9aEicRwSySodiXbOn7BtLZBRm7xOVJINBBcIEgQvhhCXlDzGJCJunjT4VRmYmseJSkueNGfIMHZ6fqwVydHJ9NY7KU5a9ZdbcKloyNyJLlqKEt722ut2DSx2e/cHVf51DsaDR77WAF5amSTW2GTxBL8yUJrFbH9teJkdpENGjNVTQk7GhiJElJxUMSLdTFDcoiyA3riGxuULmTlTcNI2QJcp2mCybJaMH08GUnUV+Fl56MKv+6HXZDpHSDM/qW9RSszWh2ae0hQUNh5/upTLyOHtJpAEWgxCHbssry9tb/gqW6NMxYIQWGOXP/jnskfBYPm5OG27cTOHDjnnFFuss7o22DHWSZs1LqbLkuhRb306iVyWau860pKMB41J0IaJjIYSZzEoIEpah4IisJpOdpv5Bq6g0OhVNxIyLMaqVW9GIDZaeWXkgmxnnVErmzJB+agxlSw8/IfXz4nHy7mKnhSs5OE7HKTI8k49bmLF84cUYttLIlH0xlrHcNTXakzX0SETN3EhOJWT9si6RE1ZobRsVUZuOJva4rN6wldMME/Q7WTVZ3WX2mKYdsv3sJzVOkM1ibn76vDQ0WW5WW+SfVSZ4cafdC6Zk5o3lpmbHqJAzn3hTy+hXU7RaSytLhaaywOfNOCZgwPd/6WEgcVi3/84ruy996fSzP42JHkGh3V853NvCU5b9Mxe2Nrf0nWOlvmlLWIjgBBeenllcXOz1e3iDcreLe5U7OM9+46U/brf/Er3wsWa5OiYW6EwyJd731s4ZQro49LODBd6RKhNKDnqerNQ4K5Rpi3XFuSbQYWTJSOB/EsmcOhhlYlBq5rNDUkOU+JFIWrGpHvrINhVmRIwRl0WJKKNiJtU6YpvNBoYCiVOjiXTmMm2AfCKpu7HHd71A3aXVA96LLK7W/a3Zq7OM8+eOziBjlMNL1AhnuXimC4s0HSG+B2HXBkNY06AwrhYVmvZsOiRMg6dkyy1X83NCG2bJUuM0pZqtCUKz2iL/rDLBhTvtXjA1VUQp+GVCQOW6vM65v43vqPi0ADaEDI4oGUJYFkTBCow6Qgn6mFO2RBqKWshh22F9vD5wDYNdXM7Db+fm+uHeNt5KftBfldWIaUXM4B3GmngBB5BNLo5tI6ggkhifcfMqPUILPaGEnNeFoNeIQ9CHIclNqX/qfOpr+s3UmDuyZHHuklrjUUR9O81cl6pTFY82i9qRoN1qaOXMPDpCpUkyySBkZCzwfgzRiCTzicQYMWpDSD3guAAUk7kHVIYimHmFjkf9ilvIcH7sBFMXTxbDOO5FSxMl2k5bqTST277EN5Tu9PQxUT/2J1wXycFCBmnTlZIRlZIBi0v6Oo8gDsnBKEcVNKNDcf0W8IgdMjdezc8R5rwJs6Rjps9rtiaIzmqL/LPKuAtHkD2qKZosm2JCm4Md/YjBjyuR7q8q4bIe9wriyeIUY8CJlT3GFUzAw9JQlCas931wnNhxDQBKAMNFAiDcrNOU2v1l7vE17SprkQUXVOxP4osWeKpEViC0IeMTSnSYCoDlUbqLzGqb52bwGa5umu5kVwX0cjUPrA0kVeKErFKgaWJJRcT1VTXmuiSBxOK11DoJmij+K09gyEEIJMMTKksqqUevrsfURc5jxRiph5jNG+KqASb1uAg0bLLrRsT7h4BL6eLTuf4JeWSgW3+NmBubwUxtX5jgj5uYwJbIs+rHfIHrXrSCGy7xvaZDThap5eM5AOzo2LGUZFs5dMXMgvojJsnyjjsudDK6IBj7Qae7l2tT83NCG2ZJ1zV9XrM1QXRWW9p6E5SOIB9Bdlb3ouWyKSa0OQRLW3KGqs3XKKF/cXeuzilgw1EFTpHhFsrF3qG8iZiCGApYCsMizqFtvV1qij7JsQh0YRgxmMjcohMMlegUHt5KWYo2lPTMlQ5WWqVm3ismLokFvXWM4cSwcDIEF+rs9BcxjNNMGUBOi8pMvlryehZ5UVCRKsrLJTWqF18j4mTgitoi3qhTrHxKRGm/E10wGKnEA4m2ZzL82IzcwpzmoGkwKpG2LiK5F9Blsi4ll+OSRCPQwDUY7nmdKXL6Mof3SaX8+DHal3pdtbjebIUsztbMUcPOyK77X03LdIhK6+CQEw+s4PSD7m+INNtDuI+HUfkkqjzfwz6Ch9jiNedgkBDCIQHARoZksnMCnWtT2jLeMW5myTFMI0ilrRFMAT2rLfLPKuPmZpU9qh3aq7XDhGafwhaPPzAYMCTwfDISV658Ugwv7LNRweeWpchjF/jQPlx/8/Dlf3zQKl446c0hORVRDQcbXIQbjCtSsH2tYJ+hQFVQS2VMlqshtUB7MELTADC+ySnsOh9Zk0mmG2zppSeoiTOXoNWa1CRuVKQgAuXlkqolIZcMiVAHpmEMntcVRHM50iS1WZYo6R/RgVIgsSUVYXiVZ8OSkDNy5ZLTDENOszAOA7akEqrlICVghCwMOB/qhey4YSQLVnJ1MlJ44htUgVg5l6sdVR0NRoAxdcg4wqSERoAT+FYYXcl9MoMJCM6UZPDPJJGZJ8pqDXX/wdktnBXEbsfH4PCZP2SiSfsdnPGWPxWUrjRzpS2nZ1+q0KztkORLQwk9EpjVEPlnlXHjs8oe1Y7ZqzXFhGZvMod9VKvbIKv8GAyIK/h6Co5IsGzFuMcVFgSYAzxgK0EFg4Z4mT5wD9i3fzefgvWGKXJELIwtmRxYA3GAY1BgjL0mNwsF0xZUOfQi7KEWsCpbWpLIIjbJROu6ggGge3rOiRqTxFt3uShAaBQ+kFS1zCujrbge56iWHV/LjTHUIYCROzmQZzWVzfzaMTJbFCQWcnBAgSJAVsJJIzKwkZ7VmNkKplKEFY8xkFajYpmv9hHMqA3tCi0BJSdvaMQXgPIrukE+eyW3Rcl9lFJewRTSHKXmGyrLXQX7WGkXeDifcCjNlCguKQFalI410qisIjKKTfFuJ3Hh5QcKm/dahWA3S9QMpeombQWQJQv0VIWarQlSs9oi/6wy7sKsske1Y/ZqTXHkZueVRfygEGPYd7bcDE31auOENL4giQMRk8VLHDD+xTVsAUPq2quH119rLV3yBmrK+Ti9SXFwQUocoSrTN+PlVGrQpvHBKjortsU/RjZww6BZdQlUSpwKey75FOdMNbVA2OARyAvV3Inkrg42cUgJ5TYLNUEl76QSNUhV1LqBjiqk1Z/cDGrcJSCvfUREQSrxRvbJMnMCCsgKG3XKlCq6zaZjzEsvUhFRlscir7v5EYRJzZZRGR6xjEKnL1t1I/I4MAMM7KA6/IkmOXoznagbRh3wOFrDaQTA3F2FCIw3oTGPyaA8Ji0qzto3d3VkJFyRrZJr5dIUyGahxpgQWaJma4JslkzKpgZqtiZIzmprVv3RPG3NYm8W3mjH4Jqrx2127HcYqNCCuIJViE4W5mTwtTTDeKBzLFh40iyNySCiur71j/TGm0io1guVAplTvdysCDL0wQSRGNTI+s0X+auKJpahS/12TjHBPUfOjjkVX6a5eBlTUuRlC3griFf5zJgrkxwabUQIpLSMdGLAKyiEIBKwDpLaxOH0GfOgygK8aJdKek2TSp3zUj+bH8amjnlroVTHG5IZuZWlRFKojiHS+4VyORkvEBUGJ3gul/dTISsgNAJdMklpMNjziZ/li09z+m/gOyrKXtcPldqQ2CF5rCfXtL1paRFmEVFAirVGMUaj6APYGhPwqfLQ31iVUbKNCoGsmWrUWpE2oZqtCbI1WxW144o1W+OYQZvV1qz6o3namsXeLLzRjsGlqxPafBbXMD/yRi+4x6UGr4JrvWwpg+soDd4YiszRsQhHqdtvHdy+GhHNsK5goBPDnFv4EyINHZspwZu8Q4qkqFYdGkoa9dEQyHKOBZXXcyqpFXgILPUEW65vhrJKcVg2VGj4AhnwSpZ93ThzZrLMXE0mniwU9EuwYVmqnuov9tTPPBuBLTNoW0jTV/ERabR6NhLjVc1aYSqqrDJwACXH0HHV+8ecnx2ZhkrWztbO1XLm3T3cH5/TmRM9Pwa9DDAwrK2odnhqWZCyd5pbcJjO8SCH91Yl/xFjgK/7LTqoJ3GqIerIrYQSU7IOT5AatQnFNsoWMOMlyE4TYjfZcvHxsqz+kVPN1gRNs9oapV+qZMqkfxrskjyLvVl4C3OYweAPXLXpnsQTbnPxzUILBqS+51UbB9ZxsgtX78FTuRFZvKQUL+mPSHz7HL3nw8jKguJbfyYXJ0eIJDQvYeqQY87GRolbThSc8hPn9IAoAbvn00s6p3pC27rjo72Y6I6BUq5shEk5xbiQCyR1ZCHRnYuEjMosMJY8qVTlqJYTowDWNYYsS4nTVUhns1CdhtRnwyp3VoXm4UAw1w0fkIEGUSt5VseYVxUF1B9mzFA0DTRvSvHEkyk5Qubq8AEhvuYypDO8hQzkE0vdpr2O2mEl2QGIvYINzNohyf6qIDm5ExpFukBhE5fMfAabcMYqZDgocd2WJ0+knExVuFKxYM/6WaOJsrnWSd30QLY1nUzh6BQi4/WnuonaVKJeYmYxNgtv1W/IwnbqaIwOmbkKfyoyM5qz5QguliA24JhHL5bACs6GyWTO2mIdo9dRgMdrsHFQBCTv7OBC3KSAw6kwJCqRiy4cIuIptlBLRRaxcEG11Zfn+t/+c+uH8W4zCsmAQ5BqjDStGa/B0BtNskOO3l2cTWqCSqSTYvB7XzoDgDqvNWEJf1YtF2fd1XFgvK6SF4VAFNCJSY0hmNVozlQQciFDztiUk0v6SoixlLFZTnVylZs4A5tjBeWsqteHhlTDRNBk0srgdAwgK4Us091HZ68rICbzuwWrgBOmfv9Yrngd2sPyBQo94bmsM1eOEbdcT8xHXOSPLIRZYQ6/4E1g4V4rFCNLpg1IIWl7D0LCqVjT0LSjmCLh0EFu/WEylUx2DddTKPdurwikYjSUkFMCpaFCKHkb9Ue44B5RGKM/SsAWxjiYo37CsRwFmuBZeKvy0RY8wcyOhHlMpjJtCfS+TOpwktwcTpI0T61l2JRBiuNdnkBCDm6I211eeKqDJ3IZXYBHnOA4kRCCuCI7PZmJFw1qWEE8VgwA59BA0/UN+CFMP2DPJxLQpQq8eQyP1pO40Nq6frh9E+DkpAt9iHG6gE5WO0caYmZ5Dob2UB+t2DjjrMSotNDr4zY5UsvdkN0ydgVjCk1U5A1FVSmJ1lRKJHIErjqD0Zt5AvsYsJSVZYpp9QbxXJUov4wdOOdzhxtARTIKrCaLRkKSPiiQVQy7WoXKjK1AVcwMZMm6NWNoxXkFDkW6hk+gVpida5o8i27v7KCQ0oWnyzZKhGMAU31wbGr9df+I8V5kk+lPkNTK/c6q6GOC6FJP7mqdJSiUONA7ogB6VJHMBFSSeaRkG7MWUVPDZmEsvzqmVma1NY3+aBy2MLQhhUmDtprsgacJ3YyMysfAjbYw0dMZu1Dn/SMBQCZtDTmOp+cSG2xeY/ixYyfxmEXRZrVDBRFOMNF3iFctiA00J4+wAImXCEMqG4AJfH4UHHKlUO48ljrZgLFACFQUIYfGM1GlPkADVGl671XRKIW0MjBamWHOBitrA7+kLjHS3N7YKNmnLanOabkDHzzpnT6P5mJbQoskAASlrFhsxV3nMEYbRoJ1kudUIGoSLwFS/b8gmCrBjWCo8M9ejK5Z/+oEU3a2srFzCBWjp0CBmgXRWOhPqYWrrmEaPDYdIctaXaWJedF5q+rHv6OowXYTCufH9vERo5AuPx+/yxIIxwCnXMEcwwI7wrojakHbxRT7NpG8+9j7jmQuR4QJY1yCzioT1gUzaXpI9rtp2TmJyKhstKj+VEgz6edkF/ZjLTK0VJS6v5xtRQSmo6DTZ8hpobCSWpdxAlZSCJFlBLk544OL+654KDwo6RlfkhSPhYi/pojsrhhSWjWtnZ7sYo0oZ0mL7Q7f4YUUScYB5VSaSgKUSkqalZIbKFM6aNi+kfuAT+qOTiBCDhzSCQKnSNM6/O53X2218FrBGZKocn4tFCgnhbgXHCcVjckVjMcXbVvoUMS42oBJ6mIbLxBLlJC1IGVlK7FCNhSzBmrSkICpmIS7UtWkIRuSCEOFwhr41QiHai0ICUpYnUkUo+VkjABpeioYEowYsgBCTeBxb42BRLNglFDEl6ydvZpn8SqloVy5vA8OuYWsgfM4qLsRYKbxD01TT01I9mcTvio9DU9VRrq1jmzEYHyh0zXpfISiIwoJeKzMoCaRgmOKAjSYEp4X4gE1zTVZpDkdgcrQxDPRICsildGqOb/uTJgmhS5LCszgKOgyAjsblhEwTinjpSiDimrDEkQoUjI2ZXQTOacOqXVtQsg8gEaJF0wnV7j1pvpOjZULpBUjmLXRQew1qSjEdMjAYWD4ceXiHYMV6RFF0SiqRjBU0N460iPsNlyDoVuSNLctRpPjKzq070TGBBUDturgKhSXapwkUiUpltyCjZhAyhRHeuWkbGTHee68zJVFBiwKwhHYhKpBqDgGQR1zGUwmgsZio1JpM4YEI4YsgNE16KnpE7rxOy+KeDu2l46Vb29tpX6EInzve+V8aI5j6c7CJ+Nr1ndnoMXOUrfT39xbvzPq2bnTJxlWxp7gxqM/7S7oJnUWE8kZ6oegrgaAFQABRg5Ds0oakrlY+UkFxi0CiR/rKKpISSTnMg1OoohEKdr3U3B6UgvWqQm7g1zqAKAwIwe1+O5G0HZNvSoTScIoHCM2YFBtI+g/NvTeTmpXVFzXY83OoBfYemwQTt3sAmxsujpsLa218AqoY6Ri4hujp2zHfTxE6jUIEFC2Hgvrn6xUxosPmpw7pIws+X8WVRxJJXfgyASDMiJw1cEmNo0batRHmeeqQaVkFINNaIEBVJJKvLaYhRnhEFXaq2LLNFQwZDX2kGUFbC5ngEaXtpo2FbsnFF329vYqh0c4P2Z2TzSz52COo1OPZ6HBT48cR1mzLG6mO7N49gOnP7S+e+3tzdcH5alDlcFTrYudfvjTw+YAACAASURBVK/T29jb1BfZNus6Nhb9npLCASEUKWODnw48bCOPIhPGBqfz64RgVoSJ4g7AAGGZvMgpo17nMiDJpSQAThWczdeYEYnGvycrin5sQIJ+0mWrsQpFrsttDwsakhuqzZW47mou9CryPitr64vTlV20UhFdEaDp0EiyBd2mPzSkdmhF5CSLoY8JShFG7S4ydLJ2Vu4yBJjQP0FcvHJSzh1Sp1mK8lGohs8ilCpKWjjGNriVgg3qz9Ebk7LlMBOoQhJZbAq8l8FheFRNW3YUhqzGXmasN5UEBvfPKE3F8VdfgrMuPCLf2dmpUHCFf0Q/VRhnKx53BYPognPoCC24E3Q2y7NwDw8G17bf2t3ffGj14WfO/cQb6z/Y2NuKCnqdhbX+Is7ZrO9uFftJZLozMEaDJtQfPZQGB4/0E03GUtpnlQ1SEAESRUaItEwRdYnZtJdZpEIctlJKNiOP0XFiRvjUASLTHiQcic24qFm4jJCMzAFpgb1NfNFrsFdcKU1NU6xggGUX21yjRwKJc1qA+xlU2JxWl2Jnhi4MAyD3n91FhkGXnBAAZVGs3e1aRMXe7etmy8dWEiXekJAuE8v+X1KSiHFUqI3FmnrjCpWsy7lLGi1Al3rlxjBHGGbImlqPmoAQfAV5vBhDxUyivJoJoexc6ZLEj2/HkefYCRf3d3aLT6niBuU7toI5hrsY7D2+fVbfxpEV8fE0ab3KI2zsMOndWdc66P+Dg8Gt3RvDw72HV84+vHpmH9//G9g72vBusVM9qB7e2uWDQ9mPuwtVhqgWowvEaAqDVpH6fHVmcMapcjZrSL7/FMhAJ1hzINKhD7dB4qH3dI1gnKoo+T6BvTlO9RbwhuXm8MLzojKveWNjJsSuwv1CI80JnevQJud5Le93wzDLWBA1vOGbBHCfO60kgQkBozhRhY2ok83GW98TDhHgfu31p1j4N7oiiQ98TjNUE8lZmE+iZ946p3qeOUSfFG1H0W4JzaVOkQpSiTckxB2fmSBmSDghVkdinGA5M0eZoyOLrhs9Eq++uDsmPlNWiS6QfeQO3D+mLuUVjD6DJv01rfO9DjoEbzXHEsZEcI0Xn8WEEj7alpCyykEPOH6m1sjMePHnxh5u7tw7v9Rb67d2hnrgL7Nh62BzF1/k7K0tru4Nh1uDIj5nFfcmNG173yXv+z1EF7ky7zuQGpbjb3TiPebuXWqVZjPLB+u3W2uNNIx2nUjk6RcOfswRxHBHkGswraOMUpuJOBP6bBimVPQNsEQ4EoVY1BWMRxMGAyjUJL5J54qsyHGz8eb3ElNg10CCmpSJZf+PFOOr8SeeGqWqOXGOAGxcRj3eCCrhCmUE6zA2GdJBlXAC0Bs2IUmOSC+IDIW1e5lTWhL8KMwbpcycn1in1KKVqOv2eqr3mFscYWxvF6d/oPADL57M2qjuWw4wiAe9Do+6cBWwnERQcaTQFVJGLMHJMQQS/BCcAOvtc/hkk74GClzA41gYkuDhU9bsh6oeUTbtBp5t8unTvZVOa3Ghtb3Pcz54/mF32Frq9ld6i7d2d/f2i7dPT6v6QeTj+ZQZG1wOGhC5IWk9BSU4aEDz4BO/OO3jiT2up+bAzEs1zu8MD2bOisoEqtVbvPbt3sVPNZ4l0xWMzBr5zBjaVCYeTmVHSXHW4ozHAMB+MlhU+h5GgpGJV0Z/kp/m9V8dYa0kBJo+ClLpjW//yWD9hugFf3BahENZWEYiaa3KbEoLdFFQhqm3UdbaINkspnqthoxXbLy56KLYkjCT8SOQLglyNiZmMkbUWZFZAEmqFIVbRcrYhHd7d7vaL5nnqNDGxu3K7fXL59oXn9EbT4+qdLRccZEfsYHzS7s93IcP1mwIG2iI+pkn3hokl14wAUEK041+kUlPPQMpUYeLDA0tOhlxyvOxdrRZCdFrc+9wiGfoDlQZH8nGZ10WO/vru9s7+PwnDMyTt0C/e6AHAdM0Cxq02zngIQKPBuygAfubaWDHYXSwu9G5iDd4z5CqfZ9EFzZqOboOttfPDa6+07rg7Z3z/C4ytprOJjnSVBVluZkhdIkmHjEDkqjCXADdCgM1y23KagIHH7k2gNnnkMJHlTUttA/2dq5+5XeNO/Oq77UBxZZpRpKgWuI28DZQI+fscFKYJ38oYZvkBB6JJSR4kCDV8ROQaDzjEAHRiypFG140hsynzLAbUARDMXkCjQuz3TwWXRBLaYOrL7ty9QWGUnrkOZx0SqUTBhC4sm4EFbzUD42OYIB5RE2hrN0CjCCBR8vygAcRAjneJAiGwT6nGyTI4ofwgx8YoBMhCi/n4JMbEmwwW8kxbz5GnrVOiChYu+A3GHL9BLXdhYOt4XB7Hl3KpsTMhiZC42gfJSKLxb5mFK5U0GVyv8Zi9xA/6TUsSY0bhxH4hDB6H98S3sd3uLA/ce/kUhU/Hx7JzgMIXHg6H+thd8V+0r/28tJh9ZwDao4VjP4wPuVYCg2LXYBIYA47RznjkffVsmm5v0rCN0IYIBgjFIUtesgSxBFg9IdzZRneJ4ykfFQhUebNP/yHg9tcvnBYpEQQNQgJBSLqSOMsmBUnvJSRX9AVwUR3AFLpZ6JOih4GHYlMnMrWqHQBfCFJaTIyc5TiQZvUE5qdwfIyc6ozkT/DvTEnx2y/DK5XwMAAcHNzA3qzamF+5jP5PFZF+vhFvpSTIws2YV8mF5xgYoAhgmj8a2WxBV7ZMGoxt+iLAoGSc2J0Rhc6OnkhiphWTHO2j0H+ZBKOtvj2KZqmLzjo5oeQKy13MqbuDy2Y3Nk7cjYyesyDhv0FrDnQcRqMQWUHsbEwn0jXmwAPDjDJoMPxYhXAcihAdgQkkeFT97w8cwhOnhGFCj2GkEMNDBrpjAe+F7yCbItO53Cwe3HzO++df3FnL90VwQZFm7CZ0XzcEGYDCcBGXzrVat0m3/GTqIYaiSnIUphAlMDjSkyKAg0nJ9Qgd2sDORYAMr44J/hxcgw/MAvRvaRIkhNkHSMyVTZV4KJuWbFx6xTPTVlkUdgZUHtP0uJWCGjBKDux6oNOUk5iH5ED7SUo1hogkFKuIzMGHF6gKLSLapEXXRlSrbFMARrKqVJEdEFfZLJBGZOhwNSIlJvH6ncnL6ycz8dMQcfJgF1MFvDGqgBIrs/HGqPBUGfBcPdA0iZgLBF+IpXggDIYTsStTwMjFR0jqc96azT25OE+Z71j6LvvRTE7SIfITRYyu2k/AY84gabBjWp8DZWEkNRS6BfECYYHWYWAjPlH2xYAuhiSMlEy9iChkcFLuM0znyBRVJAkvw+64PTl1HhoH0QULkQON69fbH/tvXM/HWMM5m80Drh1xhGYrSWNp0GHbXacpLsu4wp+kjFXUDOJLhI1bFFj6ydY9fii+yY8w0yAxGi00L75na+8/s/+Drmkh81Juq/shtDuJzqmOhuoLldlNkFBO83zqHQkXDDL6BXWBOX+Al6ZiVJ/2IJMjkd1c7wA0vqpjgwY1UAVrkx7PGGMUmZOdbEKlT4d4sI+usP0Hztbv32rruOZT9/B5QvMdTVOpE7QZk9HYlprIsEhjU8XMfWop8BLUUt5q3gv+9Dy8snlOIbGCMGpOTh856ycnL93VhNaABME44GvZmAPkz+iAoIBxhHnIBxAyAvBtMfBq/MMZNFpHAySGHLkp3jglMKOld7H1ApZ8kjy3IoPcLZ8Fk1o1R0Oh/1Fq+vhxrWLra/dPP2Rjf2+otgRNl9xbMoOxPlMYGKOktgf8vPJTPuRqqhbQgR6mXFFYkUCEDQk6QoG1j2+5B0HisneWXj7K7+HX9U9ely6XceQpcbmCFIakjXnCGqDwHhU0sNDISTPohQo1m6oENvNkuCtzxTlnI3IJOXRxrmloYJetlss6hiQthLjJufimuOZyvxYZfYxue5Oa16oT6Qk1t7d3RnsVV8dgcv7vEEZ9u5YwgpGdgM3ILbyxKFoti4JAT/SJyWgYsYBqLnubvHIORtPvueB7vXxcmRlD4igjhWe5krHYQC4CpHzmWwyJnS6DXmeusTEQyQ6jHhtS+s9wyPjlS5vZSVCiC2PbWBm+YFO8YMZQ1yDQULzSRMcbFw7fftf9C+9cLN/GXdWYK2g7c0esAnKGhH73JEbqaGxpYvVEfjCPyloROEWDiDhWHgBw4AKtMuktxPMigy3br72e39r5703qYFDIlor+zmrUV5yS6qwOda5Qm7qo41AjeB4lubGTIaFrE2eOZXKMvzVHUAMAs9pLu8/rFYWy05VeFygwp2Lplh0ZWy2GTXjpDTuG+vq2sKMW7cKW/AngxnKqrLnt3HzWMAr+KHPHuVCYE3NOATrgINT2EY7sxPqXlC8yXk5TAbBBpTsZewpHuHyc096UgXCzSqp9rgJmrm/xLY/rsr7X16am52izaJF6WXtCVJk19YtkOg1RY6tfDkGpKPBL+rHyj1wxAtPLVx7lSu64XDgzZArufTuNx9aeuPW2rOyQ3HPkamIDJzobV6ynSaLHRdiBJGJktt8JYXrFlnFcGlCDl7MV1scA2kZ09ra3PiT3/8HL3/pt1OPkp5SAIlj0fUoj2CMohhnqYgK0XQ3kVTYKZ4nlU2AMOXhmaGoCy1Pv0nMDMCxoFXh5MUkSHiI1lLElJggIGoscJkNVWLa3UpzsdfFM/vdZN2cOEa2tbUpp3MLFVi+PP6Jk/1cS6FfC7i9mgA2aAeen8XwlLMm6cYhUr2hVUZLMYQQg39nI+iwity5LQzdNVt3rhYnqBn9iIStTQBarhpI3SPkwKONCYRxePiBNhwx5KYOIlXdD3oZN5Jde8VOJuKbgD0/TYYW4xnbw8OFnZtnd/7kb/9vf+NX/+JfOnfhEvcoaU+ZtNg6bNuTa0BOhPxD7yBxq5CGGUQWhpgONzgFJneL0QexbwHm+y9/4//6m3998+Z7JEiqRRcbTU4v3acu/88cNQxJ40OLOmUqpJDUTQI0dpArQTaEVVK1SU8YWOApJ2NdsODgQVcIGdNgVCFbwixnSLVmA8IUyAls46p+Z8EeeywqYNqROdrzTCGxisW1/c2tho8P3YXlC9zhCkY9kmGJEqrKpsbqHxBXIXIjMtnseq+89xDlICgl38hY98Kdzd3nO2vl/tKeBxj6T66X4FQNDxr0LFeojPS7DUdl4K3GMgKwpR4d9gKwiN88tVpynZ+7CdJgMGCAQetUZ+DWN778T7/7Z1/+N3/z889//JNsQs4uNr+xlU8oSTjRnpEuQlkS4wpXMvIn0WUBHxJpL9i7yGSeR3h59dvf+Ke//X+/8p1vSmfbpnCNFS3rJpiCRwrWIkoQiQJDPK3WkIIvNmQ9QkqaZbECBWhxbIu2Jo+hAWaSFaST1LRgposxridzu25XG03RAZcQU15EB+G0GLpNHcjbGiKRGikZKdDt29UnKyGO5csHPqGn4JKyOwIUNpJnqGNfP24GFHcM2sZGz3oltjvi0VzpSbQA+kjmGxnJ3G0wSRzuyV13xPPmMSAw/fAWAHmEBVZ5/E3B5IBDOgAS+n0O4LpoZ6k1lBs+8dWm1dVTmCIqSdq4tbO99bf/l7/+yGNPIMw8+viTMgHZ9FIXqWgYWbRVh9BTxzCosMsRVPinkYULlwV8Xhc5owuQnQV9F9n1d99++f/74z/6f3/n5nvviCeFO2UUaIguFW6MnBLDUoHRUqlXKiBceVOvdKmmTs8YH6zBtESa5jDjS5lCioUZYwztw0dXk2OMORbUCavPpiamoowsHXlW3/WYtOvNB+0ZAotzp2HgYpKTur29vYcvTNTSC79mt6LUKCeMKJ7kj7rNd+1f2SoIngRE/jl8T7eA7GX6LXqMRvQgn7CV9QqOqn2csmvnnTtNPz7yXOeNr/EKP97YjxjTr50lEyVoVzbn1Td+8D/8t//V5Uef+PQv/+qLn/pFw5Zz8jRGlUc7KM8zhNClGltky3iCUII/TFwIMDihTxi/7Y2b//L3f/u173wT0YXarLO9zz3PzlQwLJZ+N2AElVWImeZxZdiKkeRWRUdRTIU4dg1ZRTWGGRit44mEkhAUBFNEjQqmUkx+sW2zI1KnpiJ6pdvTVUsiC5A7OKscAyXhyIPntG5vrMORSsI53keeHznzV5iPWWz/11/8xWOqGC2OWqfaVWAIJdJoBUekaGsn/RXTCX9E7SchFl06CX1H1BHdGAUfUfVYMdhC0o6IMJDRDeE64U3UH01HeLLJa6/s/9HftJs++73+2ukzlJG5l7XySZgzqNQyIp/64EfA8sO3rm10zgzXrmz6bc3UME3CW3WxIMG5lIU2Q0dKWsCRMIFupwcAW1ww7u7denvjhy/d/O5X8Fh+cic7FiDYN48FyjVRx+LiaQSDoZWf29QGGZWMiDMlPpWc5nkiNADaeSRkqKlg1BoTERnpXBVMnvKFkIsmHJYRRgsKCJZFdhLfMIbP9smfMyRZsyL4bAyHEMAIEhodzoBRhOPWrRv17yKD8nP/0dLFZ478dkvYTH1SgaE7kegBEk6RmZNaPultVB5h2KkUT9pyoT/aivCJG51e4T3oRnQpwtNXaibOaGIUPJPCKZmjLYjEYoTHabvwdHf57N62TNe4zn+wv4/1QRbA/m4xBgq5yzEzsPXqd/5cJ92l1tuHN769imXQyqVhb+1w5Xxn7eLB0tnB7t4Q13aGQ9zrnHXWIE41XLHIWTFdrvS6SyvLmLYGN97Yvfr21iY+cHF1+/qbB3vy2ubqvq8aC2yOLkKs0AoXSPNAapoEVWGqaCR1RMgxJcqhhWm32U89HwY59qSiCVnBzpYBb0jFV06XGRmV83lbMHDb5vlKUdSLtaxVcIWdzFCsWkqRhhJtOtpztViWzIuE3N7ZbowuT3+6d/GZ4sqISc6QJSOQiXC92Lrjt6nN4Pacdd4C908LPPnp3ktfsEXM5tbm2tpp9R07HCaWnHI5Q6RKSVELm+/2W++2bn4fgrj0ubx6dmHlNKLL0kNP4O7S3R37uu3tW/bJ8JVTq118mwIXW/iNEH65erj+7uE+P3x28+or0M132GBbWXCYY+Jd3tCX0uOECfUgWIaTSlGIQUCUVqOLWa2yiUH1oSQpIZAjwmA0YZFUg5z+ag4zlXACYYhUkMSQkGNMYUNFIDci5GSCiZkidFm328PJy+h0hNUsbJfIbDzgHcQgyHSDcHiygef2Kz2G9cRS64O/0h/dyDVFx0YcM5Qd2/49r0CORes9eM/7PXfwDrfA4y92v/PFPbvUv7uztLTU6/XzLi2LGIwbOWjmHk1YygJjQtPdPLKYx8PNm61NLo4G116XqUxYD1srrv3wZmvgsOY2ZcijnYBxlT/QhWgclUYpsO6S8lQnpwproUh4CwZOvlZD52zCmKkKp2NdcmxemvWZWbGNYQYkwdtyJhkbH2MoxSqNnPuFoeapY3FZDCcrcWozcCRVGAPULlmgC7K53MBaMG7g0ku1A8nwsc8t9ZYnCReajluYr2BGtiDurcKtdHhLtDz7PJJtTnh/tkB3uf3UZ3rf/aJ90HJjY+PcufPaFNiDMbHklMsZIlVKAZWDUqAFOk/ZyLQRBR2XzTmkh7bY+hucQch+NUEumWmCYTGgpJjLx4kuoiWrorWRpZJAVjRDTlZQrrKQcYBIMgRLhlFkJcZk5QIJa44xlaKxeARKfFy14DI+HkRSdWUgMWS0lPgEmdlL1rKkrBgKTBubG3uD6lthgMeF/Ude6MHtu5nu0r0Ed7NKJ2KL0QXBF88DYRP6BH0IEl4feSJW5kru6xZ48ud6r/6LgS5i9ofD3Z3txaXlYrhYoLBaYtA0LmIYNkgDm2UFpNhMUW1F2aWjpgwjxvCF2PgirA7lMJ7NMxqP2DjkwTK+mHQoQE1Rl+oOGAfrbEmTsDhfwlaBgkEXJGBBW5h9QrkAbiNlfCWikMX/VVAkxp8oExuyMQuOQKvzPgt544uYNLtCT4HDKJEh8rky5gHvIGxEjlZrZ3cH7+QvcSzh5NhP/eWlSkfW2U4c0634d+IG7gWFvBMXT4lOHxXkm1pYvmzs6Os0WQl8wRPfR8FlV372xmsFzfL1Lb6xBvgZTLiGeX7/tkB/uf3cr/W//vd2tQrYsRlgJGGE6FP9VsK8hemHiRSF6iUjGwuGmQYeF4lKC9gZKd8ICzfuXT7kN2v5/jm6ENygK54q6AnFiqJjR5fUTu7O9Ll6ygiBhBrXwowED8WTbBD4naDIuCWRfBZjpAgXU3gQHbUiro4htMhXwsyQ6YxyqjkaA2zskpE5ijtcYl0zqXhof3294ZXJIH3yN5cxXI35LmYn9i7ou+jzzKbQrviUFr+JUkvYHWs4Pk+62D3YG/LDaFivLPUOlnr7yz186hHfBUAUoQRCC/ArPRZwGi19aqWubY55gFvg8Rd755/mwMIP77fc3trkFF8mKRuSmdPDRCEygcV5nLVQ6gaE6ELMx8LGLc/34z5nrmropgz/clavHOaGIplDkfJN+4/gjViodmNVZCNetYA05c+sGrdmxBWQu1tHAmPcwmNFlVeSboUwkoqOwrteFheXLLpYq0PUOkeUpJ43cuYq+bLdJEGUq/KBoGy4s+Pmres4HepVhpP2++Bn+8e+cyz7MhP0vrgGg8+aYOWBAINwsrePwxXrIQQPQJVLLFyU8PubbXBqdMHXt/TbJ/jcp76BDeuaxR4/Rby7z6+NQi1M4CQEVjnoUrzGbX4ObaZReF8zP/vZ/rW/IfcB44uBW5tYxOjbPjC0wiJGpgWbl0jRKmPe4IvKWRJk3liTiBJjr8IUalyvjMKbdjleh4+8y4xnzWLIML/MurvpxUoeBUliRYKCWtFYohZhz5tECmpEKhEaAFSLKYnkMmuKRAQgzwzMSPKERLr/ZzT3c9NMZFYiBVnE6KqFL+hRMcmyTBEkxBtlS9tmsaALYFZHfCzdvr0+HOBrkbkhyME3Gy089Zm7eueY2tXtg7aCwRjAYgU/7D+pnhgbmPRxCgu3dKZ1DPqGP+kibBBLEj8GyFA+UKCnvyCINQqGBwIP3rDSlcszCCGIOpACD+8UZVyRL9Pwg9BJ0xx48FvgwtOdh5+zu4MwWWM/L2YiGWE+ytgahKVcaZqAyzI2QqNMhF1fRVUqms6sTxA203ERo8/740J0EikHb4ghJMSilJMYprUiumSCQKK1ypCRAqkIQC8JCJOKGrlNBLOpZRYMQmYlzwyjeLFHTMaWpUAQCeErmBFalhaXet0e79+zZG0vpRhbElz0hQo1yyQJMklfKnfattsbG7fx4At8ym4JFZdePvYby3f5zrHkF4DUHBF5P8M8wcz9ABeXEGa4RuFnBXiYhnggIQFhhhgeO1p/cg2CoKKny7BGQSdhxQMiGCQyoUEQY9gsQGIIwQQCjB6oAo+VDb//iIWL/OTE+f3chnPfZ2yB5/7iYndRhh1e+La7g487qYJyvpDRY5rznEHI+HIcMFbHU4iwD9iRsBDUhPNqSUVFn20cpnXcRItTOryJVrAmUpmrDJuzsXSGhYKhKIIixBFIygqp0ECRyi97SoISMy5AIDGFLIBGIMaw5GUqizQQkpTwXMvS0rJ92Dh3oPWpNzKlanBQ5eSSKzF4r3hOgp3iJLiNM7NNF/ZB+rnPr565Eu+NJv/dTJ1f+M0n76a9O20LnY5wgdOQeiYS8ZOdLt2N4cFPAEsn6UghDIinGegXiog5sr5FRFIiL8Mw/vBMGjDUBRJ/YoIX9lmkuLIRmqf3WQvgCHF/2ML7Y7TeeLYfk44efxDDoaTJAMkSUkg1SiQHOOvKekl2vOSuTAhm2liEZBtj092DdIx+eI2dRgZ0ykxDmF8DKERGA5NhuVY0DZo5Y0XEiU72ciE7puC1QUXAVZYMYciQBdB5SkmWApM3M7AIyXgHHdYu1tEjW57ThitNsCAM3wjXJMSRoMlcwR3Jt27dBLGePvq5pYc+dMc/KVa3GzFTXIPRDvf6RuG7Cs/mhk763A/s1Jf4j2DAT8YClsENUBNyR+OLwlygZIJAiuDWSYbhRRzb25zisvd+Do+P2a3H13AirXR8N7TzjtEaz/7K4tVvDW+/xZs+sFzGzTx8LEYWs6obeI4V/rPOJYxBalxOJwuPfKwc4YqsSIo6O1KKvBEuVIpeTFdilruEQNzw7QB4egGv8eR9zfQVyXMt1REVeigKmKoX5MfyBGISmQCoCOpFZ7VebCkpZeRYjFigtABNG+zrbJ8Ozobpy4GMFe2cUwnnUooOgjJ8A5z4RKXLM0+w2cMbhW7evG7dU7bZYy/2Hv/EHbj0MrZ5chs4hAsKDo7Pp2Qbr+T41CncUBbZthEt0Cf4YWAonqe+xipBEJropnI4n+VenCh9LzGMbYqpHD2+hqnMTGKa6Ea7hbswMAzG9e9EJWO9ePE3l//lf7+pj8UMBnv4jODK8gokMDC4+rXjEJnKzVCGCWFXJD7GhEZY9FFn+K+YaZIDS6leBqwYpSZxExufmvn+5QW83V8S6LltAgidFM20SlEIBX1qjKhOm6pNIaCWtaSueCVQIk/IAmgEw1ATQf9vLCK04N2maBf2kuqmnCVxBy3IYt40wJG/ATaUaBE9iqhWF9Hl+o1rHNO19PDz3Y/9Bt78UCOcCGIWtVOsYE7Epx+HErQ8fnJIOVtToyfRrzhXxmWN7HI4kkORp91wdcdG12w6fxwNMLdpLYBO5D1+7cPB4cIse8dsDbhybgF3lP35F9JjMbfx8hi8ICQ7YQsSDC56IZnBUswxhgwNXEmCQPW/ohF1Ltc/TofhQIIZmY2xEZOgim8SFXgTgHysDHdM4g8aGlPRpEU4IXugClgwVDCBVyw1TZ7ZhUhFnUJSPdVgAQYQBGtgKUIVZAjYBPJdL70+XlRNjBjLbLlYiy6GEDUlUcRtU8KumHmERYlYBxZxf1R0wW1jH/vcSrUpXfou5w/cRX5vP/QB+h1RARftAaC5QYlDWAAAIABJREFUebEEl2cO27gmjx/vDZMtMHopBdftMWRxoT5JQYlexcF9Yjhq0XuUZTi5mXl+t1sAPam/GQzjtnL0KXo5TUnoWYQcvQ0kKsItIbgHBL94F2JkGA8/9ZnF80911EGcX7p18wYmAojAXEqEfQwJnCgCCOsUc5GrdBVWFs3NcBNJOG2DrLHIMMMX/+dP+YbJqwgXRTRhK0SEFQtZYXCM59IM6KnUWd7jYGj8iZ2CX1SIA1RqikNmoAjWGJKcUnCLHZ5rwUW1GF0oqSm3auw0oRkCcIJyA8fGLmFTDKRwBzNOwaB6F1+KCw3kFN6U/KnPn/ox3jaWPFHggQ0wqB53GI0xuDtZblDGfcaYU0DCsR1I6CCdYrAFM7a9TqvPe8woCAzjimggRtY0ekdypRHnxbvYAuw46aAwSYw1z9sI5d2PekFB7ypECEGPApO0YH3D2wvlChzxiTBWeZ340b+8jO9dQho/HPXf4ClyJoyfNGMILFilsFxCym9okc2wcDepMzVooGxJ+FxW0ZmNnKqcIgkSnBRtQy4NM/1+H6eJkr4qENqTpHFFad/MkJsbLe+Nr62YSVVzVs5sLpgYKev/BiaaUurYxIDQgriytLyCKudGs9YRrtiAwmFs3pjK5A3rRNGQrGQs8V7ynGwZC7h9sD+8fuO9xgcq77XoAt87P//vPck6POgJIyH9MD0hliBU6M9CiKxRlOdBb4z7u36IDOwmTg9yNifUBvj6bKTMQxLkYVgZCSjh/KcuakHAagZsiCt+QhXqgWjQFqw1gzh47K+133mJj7wh4WATc8Gif/JStCrFpg2ZSQwGgZCg1IEmOOHI7rwiSnFJzBJJCplkRWVULpOCNCDbUEMqCGQYnCzSGMMj6BwhQI1tH+EKyYtZNjN7hMgYcM+SrCpeeRUlMv6HYgBdFCjcGIZQinULL7eoLDPXAbgoWpeZAm1BkxJcpI+DXYEotwIzr027jesuWBYPhza66Ian7lL7L3z+1NLpe2vN8CBfg/GWr+aIK5ZChyrmyOPaNc7zk2wB7Z96pyAwyCKGh7qJCuZYVD9EA86LIjEsIYGHUQTBiZGKsyJUIfGWQuVxNtWc9JNpuvTYJ/rrbx784A/sjbZbW1t4WgJHwmLNVAhsiAiDjCloqgv+wprvH6AW/6+SgGfNxZDMVwITR067JCNF4ZTArdGbCz1wZTQLSPgYI+7QxaPjeP9V6oSirRIWekX1CGpGo0eMVXPfOt7LZe6zr2JVhXeucQLJ2kglLI8ocDmVdcNlfJwPlMGhIqJFzIiGSjFGDJBiUVvNGo9iJdHIgic1JWPTcq6f3jOGBk+MCTh9pfPiv7+6cv4OXmJMtmYC7vQXLWdyZs48b4GiBWS357SIBDglzHGIGcDXSYLzmZR0znPy1CxBAEkPZaWA+QsKxVYRohKn20n2JwPP/fry9Vdw17LNBevrN6F6eXmFDsmEDhU12PwR0knHGCq1QMJ66awVQw6QOepIuxUbkrW5Q+Bp4UX0uDyDKY/H1Lm9MgSxXCsplMXM6VEkYyiZSxkyNczgovHkaZh4MFdiDLGCzpmgQvGw1V9cRHSxxlHtyiTaaQzJLUkxRgzSrImETzfG1kQ0C1GRsZkp1UY9eOHhcHj9Os6MNbTD6cudn/2rp3or6cBZJe6Jbefn/92n7glH5k7MW6C5BbizcaeWPYszh+12nOh8bwOZbJIqMA/rda9UQKVsK6fUQEUxmFANceu6Z8kvfrD3xlf2Dvxkxu7uLtYxOOqno3GSYpmJ9XJYMV4UbiPVYJFUjaJZy4UB4CvSI4tZvQjljalVN9VTUcLVjJwz41UKvaNBnfeukdL41Qz60bizkGMgnpGquWlLX7zOiV5BSpF89h9EeEIMS0y+odK1kEs5cptkG0KN4YSs2spGmhJhbGZNfXPTah5bvoQfz7uE6JLbhNHl82u95XsxusDzo7iFy6TdDl/syKrP07wF7ngL4GgUOx1/AHilRH6yjuFtgY7JVGFTPL+hIDwBoIj85AsLCuMeQtxACJjxpjIhHqmCOF+B40qcGU/St9Zv4iyHFX0iSxMT8DHGxOkKFGoxTTXYSM4S2ZRUkRhTJL/pETXYiCO2URcakIgy3V4fl8TtFoA8N2QIujVaOMpzIcRA4tEFDBUeY61lZNOOq5ESIqpyGKuW/uKp1VO4SMbXiBV1rzRFpVj2j7YSGwvJNhEWrCDEnUgyRYI3GyWMN8HcunWjvKpvHPd4dIGXuMj/lDk7XYbogg+loIGwN1pTTic455q3wIm0AOYGTCW4joK4Qth/UA4YeMUkIDGMAdQxTC+cYWSL/PhpcW0Bv7df8qCCQ1F8lKy/aLOwT2diMlnLE45B5krmtmko4wXiJv6ziLLQDDTYKCQFall0a8IgjMotPo1CYjWDtwBgoYaeGbOaSVVVwMOJob2I7iqS4zNSfMxFgehawDcVycF/PNeysrLCNSUEXEaqJioEY0VX6sWyZ6BOCHETYTPoTJFkkuAQplwkREa8xZKvT602Btlxqe9n/sPTnZ7oI+JeTHwKrMn5Zl9xRkGjC54gwbGeMgEpN+8e6gFggcRpDHmyJDE3651j5y0wugV0ZtFwolyAJdV3LSUoHjAA2yoEKQFyCXcno8AZRkiq19Rr4XjbRz/Rv/Xm8Ad/YE9f4iwH7jE9f+4iLiMnK+aS7CwRFm8zVtyUtRwl4XKC4XxigwIUhQSIlZN/wer1H6JZJGfWEYp1BsEIPyCYsk1TTuttBFG8TGVvMNjfH4T5JdVY9GFD+5I5U6VoNPJEWUWrLKPD6ASpSLYifMOjLXqHWDW0QJdrNMlxRWGpbWoIKqWTGjQcJiYlkoQHGOZYcOP7LjfTi1MTowKPvdj/6G+camiUCt+Pu4jojbWXDJkpXEEgwS03eHc9nlnjC4ntSRG+siidW4BCnI7FIwUYKzg7ASYAPm6msDFnmbdArQV0R8J+p2GGAQY/zqMFa7GLYl6VHVWe4ScbpHSugByKIivPPLkOwXrh5PKP/NrKcPvwR1+1m8oYY66/d/68xBg4JH7AU15Dx+4il9ITDC8iFiULHvTVYYAiwDqJIiOJsMQXbyppEGH2lit0iBy1UQ1z/IOBkGEEKRifM6o5RSiHDwEsdRb3h929vb34FgDSpk7u5RghNGeMMeDkSU71Wu3EIuI63qs/bWiBvCjS1kABf5q0CQjXoBoiM9VIgjB6AQ8HAzxB1XjDGNgxop76+R/D949hetaEV4HiPk0LD0kYSPSR925C80k0+WYwmh1PLCLYsOOxcAGS+zzvHycPmkqfipfpwBsuqZkD8xaYsQUwhnTKwBbDUm8sxrSHx+SxmIYyUjFk5bqgDDhMOnK7lhwDCdFeykBmsc4Bm2cMQd2xzU9+bhXmYox579q7Z86cxcvKipvK6Jr6JVEA+5fsVhNijFRE5SrhB5QYclg0ZjakF6U9PIQIw0iMSougtiLaUFzMOfQ6CY3f7Sx3lzFRMszgjdPGCwUxGdYnnFhsFojCqFM9xgQGaKA/OHeHy/jx5CSQ2VEdXuMwNlZcRPI8fmLRYNc/iiR4Y3LzKLbauzvbN3nRpaHuuKT30c+deuSFPhnvh9TFWoRPmXHk2UjRkcdu427LSuqIwV4NlN70jjUKSowfcokVPLrPI7oAlsszFMYtBHH1ApoP4/uhbeY+3pMtgHHluyZvUunKeR/11AMPRx3Gng1fDkImFDVpUbUYbJQ7mCHGQHuKMYDxlnVEyNXVU0WModN0SndJ7pTiIipNSLBasxA5WN8qCSqEgxJaccmydghQiNrFnjD5/jkOQwFTKbKqHU6JozkHUd2SyX0ZS5ndvV09VWicTVOokSjclFQkdaWzVGIMmzDx4N4wvOkF11oySprXZJ3PqyGtKzTH5AFXwTQVBWebMfRMyvZglJ8OW8d1F69Xka9d7uC02Okr99PDi3gvNx8OQHVxxKcDDXUCEv0sSOkqVpMdj4iiV1NA1wehSfEELRpygACsSnS82KjhnjRP8xY4sRZARMFXslLS0aWDTeF7arx99HOrg+2Dd8I1//XbtwbDwem1M7yFCTuM7HRFvMFeOD7GQIZxAhWVWV90SK21SNCiCFlYCkHFiAGTRUWxsBOKEcWRVbzIikq1VIItXJjBUya4XXtvYFekwDAqSWNoTxpLxGhTlbNJjDEQpDMeWuypSVXkXoZaKLeRje5sFl1yEWxSmLTJEjXOTIpO4OsIN69fx1JPHalsH3q+h+jSv1dvR654m4qdT8tzMOgQ70yrfDoC4OiVRB6sV4QTAJYpKqIYsKDXeSXGdfv5MYinn9Pm+bwFTqIF0sBSQFVG+CSMnKSOKx9b3L6xnx7AhOrhcIA5F5Ovfl8EGPgvh3y0SxgbyRRiwYo+wcYi4IYiUfbvGXKCmeBFYmDC+YQlYZTdBBNnYHa1mss2gngFAJ4F6vQODvb9FJBNGBIz1FjDNkaXQI5XX8Qb2JKER3NWV3ACcpWtWrpHellBEyqRbB5ihF10CiZtqEVpyISvUhSZqCDTjQQ5wbG4s7t97do1vBdBaNXNc7++8vy/duoev2Gs6rSUcYoMZ7dYTXQhulobgVv8M8jgbjFpBgktjSrqSFEiqlLDK6rOOsfMW+B91gI/+blTh4cb8VwZHo7By3HPn7uAJ8m5H+rOx72S+6TuiGkdI9T4nH9m0gkryZRF7oF5KYMC1yTyr/aEmJcyRFKEB5XMYMUxLJQLmpLEEv5zygedisOdzKvdNURWvETHw0zmdsgCD4ojootQsNwrjeECPh7HwU1iqqcgBtZGvCMtLEBDxnghYwSacZOlQ2u2bq3fwteDtI3V7bRdPrfwF/7qmZULndwciXY/ALwGAz8xsNJKBUWey8bNZdJ5MgJ0sE9VIYjiUn84Gy5S92nzTFXjOdO8BWZrAcSY7tJmuncZwtjLrl1/b3Vl9fSZszqhchfEfinnx7iLAhJYLZGg87YwUYEIkI+zYlMRNGEyRmb4575PikBaUowjyaP6CBinIFnIkaZKIi8ZsHFuwfgG9wqvrZ3Gg0FyUkgnCN2qkPNNneNzz3gZj4aWqsXG0NKAnC60wCUxMOPGnWJutvFhujF3iz3xmaVnf2UFT+lLK7IhOiKH1R8L90PiCsYHideftUcFcBcZMATkJ4BGDl3rSFBCHROT3sSMc8lohBRg7odGmPs4b4G73QIf+fVVXK39xt/DcWtOm1ubuCRz5sw5/fSI7FkWY8AkQcWmbCtKDNLgwN0RAkicfLALVopA62qITBpCnD9ghOZ0Z1N92CK5VoL4t3nSvFL7ZFMqssQgSCFQThPOneA01mK/v729jXdtOXrmHKsYrFr0+6FZuDQdfYteOT6HFmjISC9kjEB5IwyVYsYZ5NKmzTzDmx1k4QJsNeFuMYyQxz5h6zCQMaOuLfY67d7Nne0q9z1clhUMYwdvSs49jxs+ZQzi5QlA6lEI4gfeo4T7xPTpFtx7xkjChHuXyS/fVrG6BlWGmWfzFpi3QGyBK59Y7Cy3v/l3N4Y7eXfBrVbvvnv19OkzqyunwIwdLK1jrMidzvZVnRR9ZaN7o0QA6qsUoYqCDUHFdmJmFnjUEraCyEgilDtrAi5bowhJ2DifYGRjlUwanNLp9k6t9XaYxpwxc+4yR2hZXl6uP9qSuAo3gumAnzq0QKmIjdwIQ6ZasTClLYjb6fD2l1GPuVx6jg9RcuHi1cDsen4ZXdfeGg75anDHY0Fzj69m2v/xF35J2qG1M2zv7eNmFrjf5udSvFlwDQaPvGBEY4vPdiES8dQZ2wk4VJlbuU6TT4t59ef5vAXmLTChBXBf2Z/8z+vxsr8K4B1Zp8+cwXkkLTKk+LwieS6CwQrG4BNQc5HsTnHdGiREkaBKuuFrSJM2vJU0i1u3FnGNMCbcjc3bOu2GWVTdLaxAnKFFvgZmT00GjT51OSrEFQoaWvKioISML4jToStctdiF2fMAV1zwejF3rsixcHn2X1l58ueXIxY6T/cPVvqtGzvdHZxxknRmsYcbJjb39gajP2Udlfy44PZ/8f9YgNndb+3tM5YgWmCxogEGMBKQSKgnekpa0Ia6wiCBaxRMSaGmATKGc5Ry1YBtVBJh2qi5oUjojJx1OPqjIpVt0hA567BqVny0oo4lZ6LyKFJhq2uoW1SRisWoH3BdKmoeBasSUKO4IoGZVSp6WFEYSclb1R85R8GNLgFZ11BRXinW3Wisu5qLWwjWOaM2ZVCRCqxIdfUbv3X7R19tuHkXVylwYUbnUHKGyTqGHFK00qqOqoW1UhQ+Eplcl/GIeqNoRh77b0Jk3Up1fQVvKtSBGr+yYPLd3tlu8j4bxIWWlZVVe2pSxLTNCyPNcQUsPosVgq5A8nphHFpUFnqN29UIDQfmm5sbiKAxdooLtnnoeSxcTmPhksRQYcC9hYOziwe3Bws7Q07EOLI/t4zHv/pbw/bWYJAWNOBMDaQaVFy1N8KJP7pBE15OUomzYiXimw39lxJgQAMrOhWdotvkYrTnduf5vAXmLXDCLfD2N3e//ndvx9NlagCH6mfPnsfROoqyP+e1S6UoDIYTWZ/CBTcdhqyBXYQckfHGlBEZUgkyNOBMLvGMAPB1GbzhEbcyR7roO0RoQcSNoSXycP4KqSiUcQVcTi3yeqHAiJhgCnQFU0QwirTxhOntjXWc/wzeZRC3in3k19ceeWExozJ0uIKXC7dbmxJdgD7d3z+12Lq+3dk5+kWrrP1OQ7aCudNm5vrnLTBvgYktsHVt/+Xf2XjnpYZH7XDGbO3U6cXFRZm2p48xsOkzfZ7wJ2KMtcyoSquQNTXhCqoKkK0ZnegVAK963NjYiI9kou4ry2VoKcOJavCJP5QaUA1U56oEC3DWKRXMiKKIDof7t9dv4oMuarKyxTmxJ39+5YnPLPdHfS7s8LC/cDjkUyK00sPyZWl/Y4CLMXzAeKnbW+r0bu1uzda4FSfuZLH9n/9jniKbp3kLzFvgHmmBH31l53tf3Ny5YWfbo1e4mr26umZhJkzZMr/kqAORyhmzSrGY7/Pk5BoDRlS5CyW+ICmLMWS+Bh5XNk2OdQxeJ4w3VOKEGN6u3yjis3siCqIZqzxOqzLmcsEBoRGUjBaeysJluD9cX7/V+DpkbeiLzyz+8n/w7JmLSzd2rm3sFfcTpsrg3jp8fMtXZoerXV7qRoDBPdkXlrHiwTrm4PZuuEskSQZgsH1487Xhhnxf9exT3XNP8SX6dyd1PvVXnro7luZW5i0wb4FpWmDtSvfKi0sL3fb6j4bpg5gqiHNHW9s48b6HN2vh7Y3VY2ufF8GMyY7znWOkKBOlYUh1MB2jOxIE/UlWlpTZcIkEgCmhTRPLaihyKqwS47cIpTgnhqdbcE6srsH1OEVNOTa7Q7+cJ4DO6CTJ84YiVqOAHIMRfqkPQguu5ONdc/ySdFNCF3/sr5x+7lfPr62tLHb6V05dXOwu3N7bqhxT4F2uuPcKEaXtV8GxbNk9aPe7rUsrC/1O9/be8PbuXhHPa+bwJu8/+1sbOF7pr1HLa/9sBzFG4RrvySM6PzcPMCffqnON8xY4VgvgpSDnn+lf/qnF9TeH9aUMw8zWJr/BjHkX73CUZJMgJ9lsmgUhKAsKJNYwk5AqQFkTbYAyFURLiY1e+c90aNkLrjlLOAY3OAiypCRtBJxVrKYSACcEngAa1QUk10JWVCBzwdkMo05QCl1z89Z1CS35K3OizjZ6ueX5f+P08vkOvmKwsbexPdxe6S1eXjvVXdjbHOzhHY8p4a4rlBBOYABpf59v6up1Di+uHOAG5fe2DzbAMSl9/f/Y7J9auPiR3s1Xh4grT/7SEuLNlU8uLtyVL5XdvbXSpHaY0+ctMG+BogUwB/3M589e/94ezpjdeKU6Ye3t7bx3bQchBifN8GXGBTnKxUQUn5uBOplR8SiBzFvc6GSVHogRFplred5MJjK51EJISo5E2cjA+yyYoUwVQWdAQVIuqwlDFwXDzZLV5EuElzxX1V6SvCiAXpSLghMLpDYvSLjzDTeJjbqMDwaElp/4lVOPfrK4BRn4neHuKzdf39s/8/DqwmD/8PV1nD8zE8gWPbrght7dYbvXPzyziLNkh+9uHW4Pc6NCz6h087X9D//ryzs3D3C9540/2j37ZBcATpedffpuTP542fkox+b4eQvMW+DH3wJYyvzMM/23v7X7/d/fvP1W9ZQLnhpZX7+JHx5lx7OZOKMkk5N8gQP7tu/dE8IMaknOMvYUSBY8voyIJTHYhBgESSTxyr1RVG1bIdssW2MLiBpLQAQQEl7y3FHVchXvdMkrBStiNYk7xEY9NQmFFlo+IaGlUkmQse7ZP3h9/cZgv4PbkVe77Q0/lujhRZ0gi8hgH91zuNrnNf8b253tgZw1E/GJG0QU8Gxc3QeA82NLZ0W2yZOJqmZluJ8+LTBr3eb88xZ4YFrg0kf6+L3zrd1vf2EDR6OVeuGgF29bQcL1cHxgBu9m5udP+L4yME4OM2TS2ZKTjoYZ4kJEKfBF+MhMo9CQlRQ4HVXk6kKBGl8oBcoSJAPCwWoeuITkdMd7ucg1WuNK2MbmBt6l1vhci17GX8Kq5bOrj0poOcAD6vkRl2rF8M3Gq5sINK2lhRYu96cOTlEAHqz2DhcXDjcHiEC6IK0qaSxf+HD3rT/de+xTi2ee7CLGvPvng9tX9888dZdm/vZ/9o9+qdGtOXLeAvMWOMEW4Of5TighzOCkmd4U1KhSn3LHu5nx9AyuYYjhHGZUpHZfGdA6KzIkhcRCRmRIWVzESkGOYI27Qj9G0af8qKLEhZKDnkPIwWruJME7MSPbuMqCoIL3QOOtcW67Wk3gzz3de+LTKw+/kF8m5szjcqxO8IA+VjB6VT+yor9O9dsMMMPW3sEMyxde5P9fN7BqOXWZdzZf/dO9F/7tVYWj/jsEt//TeYC5Q007V/u+aYEjBI9yYh7fUg3zFwRuvLL35ld33vpa87N7qhFXaLCawdkz3IglWkaEGXBnI8G1jDSOjMiQmqoxKHoEW5I5KhCm/qSixHnJc2XzUjUHtUB5wfHoYlxlQWjBLxmsAzgHhTsA8Vu7Yu/4qfNkS420w9bWoN3rHuL8WEx4XdeSYLZ55T+4F5mgummRhBiD25Q3r/KOgAsf7t216AJz8wBT9s+8NG+BsS0wUywJU3VU2jTpNuBcZDQJFLzK7OrXdl7/w+36eTOXtxxhBj88sIk7nEM4ITWHncJWcL/AU6JAFAU1Z6gGithTpiNum2bXgAugGggIBz0Hg4OSe8HxOOu4u7ON74CNuXqvRrBEeOqXVy89t4h3vbi0UmrbYCTS/ApYaxtLI7xnuqeNZ9w4KdbFm8za+YP0UXY83Bh1xoucFHUeYE6qJed6HuQWmBhXyhk3NUV1gq2ylfSyVE7jJa2qBwuaVwdX/3Tn6p+NW9CoW3iBJs6eIdhgcZMcVeAIkQaCpWv1cjKSGTOUiNMB5eRclqKGQHHQc2XzUjUHtc0LWogr8kq0CZ5iyfLIx5cuf3xp7XLDTVnpcpa55sZYLGmRIl+jx+3ILiSv78IzMXwUKJ8bixKZ06AR2d2PNO3/ZH6KbERnzNHvlxbAHNKwt7ZGBZXa5F7MQVVqIAZwZPCoiOcLyEE4gGE2F8nh9sG7Lw+ufXvv2rfTFYLUjYWcYnFTgEYaPCcfX0tskaYqUXpXpUIlUVV0tZz8OTmg1n2O8DyZckQ1x1pwuIfXuuhJsNzsSbAEOovtCx/q45bfRz62lCNFglw7hAKYC7hIFvXlUkRnLJ6A4UMwWHl29MuWka0aqmo2S+ZktznYoLNG8CfBmYD5bcozNdec+QFtgTAJNsaVUTNrxrsGz0MIcVRmlla0WUyozqIEI2tbG0nZEl+cAiOp07r0fO/Sc73hzsE739i79cPh9e/WI40q5hZfa0a6LQisbJBwyQbPb2KFA5w9PUNIOPJRN8vFTWHOAHyYoARb3L6sesqtyZbISikorVBQDMQAJr6AEzCX9/Bg4z6DCp5aHXOfcao/VD70k/3TH+hd/GCvi/u98PDjQG/4ok5+wYQZN0iKMliRssXG4reGECUlOeUhKbcLnoBBK/JLwaZXtIYIpFbctH+oS7DhXsDcf6Ac+iOd1UiTzZrW42QNy7rjqJvLzlvgvm6BSnQJIcF2u4wRRN4ZE0HxTmiIIkoSfuPKzNJ4ZfDIjMKW7SiEucrFKQxZLS60Hvqp/qWPItIs3X5jeP17Q2z3bkfWakfhtij88CoaJSDe4DUBCDko4oUBvF9gUU6pUQdnQZ8YWS6CDcv4RzIW51QktqUbQi5RidNVZIRCNZWRIRAdtBz3gO3vD/G9L4kogCc/Cd9ZbK1c6iyeXjj3TO/0Y3xKkT61W8M9u5eY83yY66VIb2SZwmoZ0VwQtMHSbELGRlhFkA3k7x8TPN44gwf4cfOyRTPTaIEkNL7ptQZOVhLaWU0BrXGlXo0xgj+RzTzAnEgzzpXc9y0wOrSgaj5rE7Sd1+Z1mRfjFG+smU1aRrGJWQRYShiDyJy0UQh/wpMIWlRSYk5Fw0RzrdapRxdOPYo3Rfa33t3fePNg4839Wz+YPLFqvKncNCVRB3EHF3EWEXK6eB+ahACfwWif/6GMoqVUkaao0SjhkqPzmlhAtPFKZqxRGEYQVHZ3Dw8PsFwbraug9E+1zzzVOXW5iycT4a/OyJjjB7t+fksfh0EpmSQbC4apFpVPP9donMIs7aJyyqKa0ZKiHCsN3JWBtQsWSLzKz+alCCBt5+BBJeSIUu0SCNAxCIoGtUmQSQf/nQgzd+lxG63GfDtvgXu2BWSPM+/ynK7TpdJyzJBynPqxi2owgAIQRZ5MyqPTvZIUSYJFDhNUE6SKnBSVZLgCTzZBqAkXEa3iAISYGxvxhDunWmc+uHDm2YUrh93Nqwf47Vw/OBgJDHJVAAAOiUlEQVS0dq5j6qXIiCTeCA3zdYuc27f1tJogEWkQa3R9gzfW6KIH7/vt2/uPXXziubIR5kehfXoknSsTWZoA3pd1Ch6E9DYapaABv/Jwe+2xhVMf6C6uyezMT7kwGDNmWPQIMAn82Z84RC4DRCTBomVM7OHsD1HhEHOiBo2GAAMlBy28xYFNCA4UzQhN2AO1IptGhaiRbgdExSJMae0OIsAsbADvVLIDkDulfq533gL3QwvIERx3OSTbRW1OFqTskrKzKtR2HjDrpA4xzgTCg1ylrAhNjhf1KABjKAXsEFKQ5gRgFl0nAYoEpJwuIVoVihnlCczingrKk56m87DVP9vqn8EH0m2iGWwcbr93sP3u4d4t/MSHqTdcIYy9kRf3RqsyO8k2teZGRo0fSpp493Cjhohc6LVWLreXL7V7K+3+2XZXXrWDWXggr8Dn/KsTOnJ5xEQwxEGJUgXgFG5/eH+CUHHHV44HxowMfyzARBLn6AHe9Fs0EKquSChBMcmxRacBNFrG88UNZMEW2mVUqCPAgVkji4wF8VyUgi3z4JszTY/RkPGoab6COWrLzeUelBaIJ8dsgtaIoPuizs6oLGgWGFhzzuv8A6QFAhSXCb+KVOwBWYxNGYkRiBmTOmN6BJkwphhxRWVigFFB88dDjntoFaR7IgmjkrsnOHXUOuy2lh4+XHoIpPbB4HDnWguX/nev0yMAh0Od28TF2TcpDCRgdh0nJtFZQjWxzmotnmstXZQJmXM0p3W8zWXA27wxGetsTsBelU+IPmAKFhlh4lRu7JzWPQKJvAoCiyscIgiszPHCJtGhwLTaOAJQSUQmtUXlapY3KKthKlGkUtGV1AMTPHNmUQcdDJ4izKBjlYs6SRcRFBymkxgqJxtj5tdg2Kzz9L5uAe6i1QaQKRg7nEzmIKLMCZpsNk0LLEhCmKOdYAAxigJdpT0k6LVa6DGF/hYZGgnrDFVr5lwbRVTQtlJSE5RHUa2KSwKqJ9FV8ZhxRV2kTiT/vDuKvXOHvbOt5ceEESdnbh8ONtoHu218n2YoX8YarsusKXL38qZ7+mCh2+quttrdw8ULh53ldpru0enDPZ10ZbathwchRn7O5Qs2hwNAxcFiMz4mbFmUUEhXJwdKavNrlFzLeKziQoFFiQFsPIYMZyAb/4nHhRdRobxkBI3LFDKLJ+hrFNi1ILb5lIzQuS6lkAhKmFF9Hn6oCb1M0UqixEmm+W3KJ9mac133awuk/cp3S+6bCYlapaICSiIskCAJCoYoBRRDrjybgyScssEULxpkk9kIxdlfYolJUTvjkBVR4IpEbHI9xHuNpCDrErI6Z7IrXhEtqgpbblQUSbQTnoXlw8Ul8psMgIPD/S3Gm/3d9uEeJ6rhbW4P9nB26a7HngVEjoOFxdZCn+52Vg4XusAcLvQxGQOBmRRJZlW8ZwWXVIDm+Sse8wtBilJ3zNGcncGiUQGcwFNcJmfKcE7nDA9TVHrIMIA/feUb+BCBqJkiLQYtTOReVBFZaNAEz1CCAYmTPZXigj4yiRPEoCvdQ7pNzWIZGZQcgMaIwwIJHAnMBCOAFIEXL2gnJXqihQwZEYiTS/NTZCfXlnNN92cLxB0qwQnQOmkxboGPxYmwMqjUeOYKT4W5UqwwjymCFKlajBhoVuWKVIaIqZheWOE5mc4pxh389R6WXJgkFrX2N3mgTgSC3ZY9mA7uWZNNwirWbndW8OZ6Ftqdw86KAChyzuUsa3/CoKYA1gGIAZlI1OJJRFlIniomFhMMtooSLTYi3ULOK5pHacsCAlWU16UaMYrENjqP4h1N81Nkd7R558rvxxbw/dfzhjoIiYecmF54wGjTlaExvxLCXCc5DzF5hMtFiRynUiEwWIXg4BezNE58g1+wOP4lEXej6hExb0ulPGcFzuQ8cqV6PHQnRZESS1BOESqiT8RRhPopQjUsyiEvYMegTE+RyMZjZ/yoHEX1injAKoJcT+Lh2JwsmR9mWQYb/+hw54yXgD/De7EoQRlJDnhuaPFF4ATB6dRAQLJmQgMy/RlCKEqGjCL93BeZHSmQqFWFQoJViqhaxXBLZ6hLMMIgZSPlc252Ms3NJRERNBFVlU+7yWIvecXrH/zD4oZWxZaYJ0Z8MCSJykksBYBJW8GkolCqG9M6nqkqdITyPMAcodHmIg9+C2Cn5XSJ/VDmP+yynDVl5pQZwKZO7ttgAiunZtCxv9v0yhMgJKkG0BhtZIYVJDkpRyZDyCSOOEFNAoMHawDRoFuSeAZMFElY4HSPYEM8jdMtJgOaMNRAPbRN70QA24hx+P9v51p0I7dhIAr0/7+58yBHtGTngb0rgmA3jU0Nh0Natqj4ctdy0yuyQgxKRPV4TM2S4tnf1rdLmjJFjNXGPHf70/SWg13TeJ+rt2omOYk2cFR35pDtu/ovg0DBwcSyCxYum7gpfe49wLEpwwaL4jeLRF5pVwEcSMrbCW0ixRdTiAKJu1gSGKhR8w0UQ2CTO+wK0qtENuZQNg9U++uf9wbz16f4neCHzwD6gn8qR51YdWyOXLV8q6BNk1eAZoD+6lUpmC1BvdxhoLDz9zajEHZt/mCvLaH87NQSlMv2KgD/PxBGOgR7Cal+M1giavMIaSLHCpGs9EUJWOkkxuweO3WDJkeTQ8n6fcVDBBqEgFWoBh/dNPyfQ4XLa8skcftQlfRwnqv1NlTd0LPfnROzzS98cGA/tSXDDkBlKMY2WL0TMMBh2EXKUrgH1rYIYsWsRItconROECNq1leX0Rpg65dAnQyFzG2plXRdVMG3bFu273FSK7yTSpwx+ujcI+uVB6fszQt6zXr/Dua1+XtH/4IZQAMcewyWpdqiFyKboxqkTlqX7rGFA7EbMfqDLpy1IQCWS16+YnRAtWTStGOpR//Df0onihq6dyk2bb+mIFw1UYM2Pc7rHl0gHfaWWOMKc8QWq8JII8Unp6Dtb8PSlUvaLqBdClb01BGxDmQ2u8/T/2h3K2SLXbbp1Str6uhthuzus4bJ0jdpsghIk3CRS2D2aEDmM1B+ei9qIog2pAg6VmDlKMKSolBeueCVDI4ySGNgzhyRUV45ikJQZD13JmLWXTJvjp068uHUBxF931gGb0157H/1+P5bZK/O4Dv+N8wA1lXWmZZYN0GuNqzBHpKm9Y2zez+vnquyG4EYXLUduQS8zWDPqEXNXu/V3PoQQq/hTqBqsAN1VW7oTIYEADFeLkPC6W4Ba0SMURnYLrmLlBNUrGjLTf5KTJsEf7pmjRzOY7mj0UCiypinvcX1eM1x5tsuHX1fqAOrQzjyoJFq+s4HUN7waRiRju6i7ng0mUZaZNaXskgR6nIWMoaktk9ZyI+YvAKcv0QSYap9LpDhiOLBsrYxxpSXrVMPgZNYj5wDc384rFtTd0zIy4fP32BU4/ZUfDstr+vbQZeAdxlzOn7ObPya28of3/CU+gUCc60p7raIPlAXOq5XjD6g7WL1wsvftPhpN9USermpO0gc1KEUrzB0aotQhwhbOjuRI2qTqOGSKSoLB7FwhDrKuWUHoqu8PN0Mo0P3klia2lWcke44ijyDHK6LKfOTU2RHl03r7FhOtj5qsg4hJjzGGJPshtycohYYVLDI0WIsPmQ63eLE0QTyZIMqw4294joQHH41eZp7Ct8BB1qxIisRNYxTjp9sJU0HVs+xkb5L9QqVoaLvD8j/FVqCP/8dzLfkorsZr4u8roCSXhd5XeFdxnw2ftp8cpvJHsMVW8X2q4YRVS1XOqoXOzHhOLiPE++L9Lm3KrydZC+aU4LAi7TfhUpkSdULAyK7BvrKbpqjitpg85W0B32uSlqnYjYvSUutrQqVc2LTLs4NNKI3U7MxsQHkBl38QQfThHi29n3rPUACl/1AYx4qEU9tm9oV+KxjQ0VdfAQzXoegzca5zCDhKC6x1GiOPDXApAO/eOzuP6DT6JPDt+4ctD7fYD5J+Ha/Z+B3zUD+QPx2p8G1ZrOBrZWsRdcLN724f3BNY7isbe0uiVkzyC7AHNTmOcn2lV2xSdd7S3f+8NsYO9JI115BNViarGCRp73U4p9Myx1IuK8b1x4qvZ7OiF/a6fQOe+gsdIDz9jWhz76jGaWvX8JTDYymrlcNIQ0vArmPKheamDPHSCP4SSbP+Rb8Z4fvDebPzudb7ffMwFyBT5uNrpb9IU35up7r9SOTMmjqKm7Bq8GkBTHiaROiqxUrlOOlgsD261yjRZjejVuuA70qTtkpNiq7whjd7EkH5wPgsltsvNsrO8ADYBfflDC8wwbrGrFvA5t3xNEc3j1wMgeNQddhE2/QB2ZHQOo7Lysr7AVrbTB5gLbCT/wrCEoCzVI2HAUkRso2gmH4dqWSjfAUCPxknulMm5WEA+NMCv4JTiR2CvugEqs91TlzbWrJssVmaL5pBmFPI65IISThAZ+QEFLYp8yTkIxQg9eap+EUZ/gT8kptqCMr0/pnbViZLtI7TcpAnU4NhYC5KLx+bIVpvJq33Qg0lEDLugcV+9pfI+uqtuniP99UWEqqOjVOiA0cY+RyeFljQ5jpmGtdAUdf/PhlbJfqCbTIWRtwhBBP5BfzmXY0cki1p4yFCHC64hTF83F5XFUSi3K4q4vUDA9YVzAelcjDgNbOpHj/1qQTkdmzcfKnILzO6KcXriAJNH8Vr7VgL8DJN8f8hAd8Qv49H5VQZ60u7rtIpD4wpmZoBrfhbQ1fZH4gFZeNDD8obKvkNiThp3ci0366lif8jH0qzMzwY6TILfA2423UF5lnrJHgp/G/1cZrT3pl/ag29bmsq7r88Wsbqhnt5d2jnNWVRLplbuL85zfPn5DnJTDgrk73mwrplysMjUSqsl23NIPN6fNzYadne6+6lQhoYw6PneLM8CUkmmE/IldHRjZ8zL2BgSkPJ+IwDlD3ZjJkb3fQpBk77UlGdMqY7yjhT3KYM/8EQzYYV4ynQOMb7T+5HBeXIOo9hwAAAABJRU5ErkJggg==
I've started my first day of holiday by working.
From a regrettably private email in which I'm trying to encourage someone to operate out in the open:
<<<
For me the issue is that there is so much that can be learned, in both directions, from and for the community if you engaged it. Everything you have asked me I've seen asked before and the answers evolve with each iteration as more and more people learn from the experience. Sure there could be some argument but that is the nature of wide-open collaboration. It is often in the more rigorous discussions that the most interesting observations and learnings are had.
<<<
!URL
http://www.nytimes.com/2011/03/13/magazine/mag-13riff-t.html?scp=2&sq=boring&st=cse
!Description
The review, not surprisingly, came from France. “Here is but the latest manifestation of British narcissism,” grumbled Thomas Sotinel, a reviewer for Le Monde. “It can be summarized thusly: We are ugly and boring, but, by Jove! We are right!”
red was a much better movie than I was expecting it to be
Wedding preparations go pretty well. Sarah and I have selected a spot, [[Abbey House Gardens]], and have a plan for how things will be done: We'll do the actual ceremony in the library of the house, retire to the gardens for an hour of bubbly, photos and strolling about. After that we'll host a tea in the Belvedere. We hope to use mixed and matched charity shop bone china on the tables, with usual tea things (sandwiches, scones, etc) supplemented with a few savory bits to keep us all from fading away in a sugar haze. All to be done around seven in the evening. No big party reception drunkathon thing.
The next day in [[the village|Brightwalton]] we hope to have a casual picnic-like thing in or near the village hall (depending on weather). This will provide the casual laze about chatting that seems so often missed with weddings. Given the distance some people will be coming, this will be good.
Even better will be if someone besides the bride and groom arrange that day.
!URL
http://mike.teczno.com/notes/api-authentication.html
!Description
!URL
http://www.hxa.name/notes/note-hxa7241-20110619T0909Z.html
!Description
This might partly explain the popularity of the blog-form and its attraction to producers. It exploits psychological function to hook people: it makes the content more compelling than it really is itself.
!Notes
bliki instead
!URL
http://www.nickblundell.org.uk/projects/wikidbase/
!Description
Does it mean anything that Oxford and Cambridge were two of the few places outside London to vote yes on the AV?
!URL
http://blog.ianbicking.org/2007/10/25/prism/
!Description
if you are trying to improve the web and you don't love the web, you've missed the point
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
losing more skin than weight at the climbing gym
My mind still refuses to accept the need to turn on an electric plug.
[[purple numbers]] rise again http://scripting.com/stories/2010/10/21/newBloggingTechniques.html (there is nothing new under the sun)
!URL
http://webseitz.fluxent.com/wiki/z2011-07-11-WikiwebWagnVsTiddlyVsOther
!Description
Tiddly Space has a pretty big stack to install/maintain, wonder whether it's manageable on Cheap Hosting.
!Notes
Some parts of the stack are optional. There should be an ec2 (or similar) image available by sometime in the autumn.
// Substitute date components into a string
Date.prototype.formatString = function(template)
{
var t = template.replace(/0hh12/g,String.zeroPad(this.getHours12(),2));
t = t.replace(/hh12/g,this.getHours12());
t = t.replace(/0hh/g,String.zeroPad(this.getHours(),2));
t = t.replace(/hh/g,this.getHours());
t = t.replace(/mmm/g,config.messages.dates.shortMonths[this.getMonth()]);
t = t.replace(/0mm/g,String.zeroPad(this.getMinutes(),2));
t = t.replace(/mm/g,this.getMinutes());
t = t.replace(/0ss/g,String.zeroPad(this.getSeconds(),2));
t = t.replace(/ss/g,this.getSeconds());
t = t.replace(/[ap]m/g,this.getAmPm().toLowerCase());
t = t.replace(/[AP]M/g,this.getAmPm().toUpperCase());
t = t.replace(/wYYYY/g,this.getYearForWeekNo());
t = t.replace(/wYY/g,String.zeroPad(this.getYearForWeekNo()-2000,2));
t = t.replace(/YYYY/g,this.getFullYear());
t = t.replace(/YY/g,String.zeroPad(this.getFullYear()-2000,2));
t = t.replace(/MMM/g,config.messages.dates.months[this.getMonth()]);
t = t.replace(/0MM/g,String.zeroPad(this.getMonth()+1,2));
t = t.replace(/MM/g,this.getMonth()+1);
t = t.replace(/0WW/g,String.zeroPad(this.getWeek(),2));
t = t.replace(/WW/g,this.getWeek());
t = t.replace(/DDD/g,config.messages.dates.days[this.getDay()]);
t = t.replace(/ddd/g,config.messages.dates.shortDays[this.getDay()]);
t = t.replace(/0DD/g,String.zeroPad(this.getDate(),2));
t = t.replace(/DDth/g,this.getDate()+this.daySuffix());
t = t.replace(/DD/g,this.getDate());
var tz = this.getTimezoneOffset();
var atz = Math.abs(tz);
t = t.replace(/TZD/g,(tz < 0 ? '+' : '-') + String.zeroPad(Math.floor(atz / 60),2) + ':' + String.zeroPad(atz % 60,2));
t = t.replace(/\\/g,"");
return t;
};
Date.prototype.getWeek = function()
{
var dt = new Date(this.getTime());
var d = dt.getDay();
if(d==0) d=7;// JavaScript Sun=0, ISO Sun=7
dt.setTime(dt.getTime()+(4-d)*86400000);// shift day to Thurs of same week to calculate weekNo
var n = Math.floor((dt.getTime()-new Date(dt.getFullYear(),0,1)+3600000)/86400000);
return Math.floor(n/7)+1;
};
Date.prototype.getYearForWeekNo = function()
{
var dt = new Date(this.getTime());
var d = dt.getDay();
if(d==0) d=7;// JavaScript Sun=0, ISO Sun=7
dt.setTime(dt.getTime()+(4-d)*86400000);// shift day to Thurs of same week
return dt.getFullYear();
};
Date.prototype.getHours12 = function()
{
var h = this.getHours();
return h > 12 ? h-12 : ( h > 0 ? h : 12 );
};
Date.prototype.getAmPm = function()
{
return this.getHours() >= 12 ? config.messages.dates.pm : config.messages.dates.am;
};
Date.prototype.daySuffix = function()
{
return config.messages.dates.daySuffixes[this.getDate()-1];
};
// Convert a date to local YYYYMMDDHHMM string format
Date.prototype.convertToLocalYYYYMMDDHHMM = function()
{
return this.getFullYear() + String.zeroPad(this.getMonth()+1,2) + String.zeroPad(this.getDate(),2) + String.zeroPad(this.getHours(),2) + String.zeroPad(this.getMinutes(),2);
};
// Convert a date to UTC YYYYMMDDHHMM string format
Date.prototype.convertToYYYYMMDDHHMM = function()
{
return this.getUTCFullYear() + String.zeroPad(this.getUTCMonth()+1,2) + String.zeroPad(this.getUTCDate(),2) + String.zeroPad(this.getUTCHours(),2) + String.zeroPad(this.getUTCMinutes(),2);
};
// Convert a date to UTC YYYYMMDD.HHMMSSMMM string format
Date.prototype.convertToYYYYMMDDHHMMSSMMM = function()
{
return this.getUTCFullYear() + String.zeroPad(this.getUTCMonth()+1,2) + String.zeroPad(this.getUTCDate(),2) + "." + String.zeroPad(this.getUTCHours(),2) + String.zeroPad(this.getUTCMinutes(),2) + String.zeroPad(this.getUTCSeconds(),2) + String.zeroPad(this.getUTCMilliseconds(),3) +"0";
};
// Static method to create a date from a UTC YYYYMMDDHHMM format string
Date.convertFromYYYYMMDDHHMM = function(d)
{
d = d?d.replace(/[^0-9]/g, ""):"";
return Date.convertFromYYYYMMDDHHMMSSMMM(d.substr(0,12));
};
// Static method to create a date from a UTC YYYYMMDDHHMMSS format string
Date.convertFromYYYYMMDDHHMMSS = function(d)
{
d = d?d.replace(/[^0-9]/g, ""):"";
return Date.convertFromYYYYMMDDHHMMSSMMM(d.substr(0,14));
};
// Static method to create a date from a UTC YYYYMMDDHHMMSSMMM format string
Date.convertFromYYYYMMDDHHMMSSMMM = function(d)
{
d = d ? d.replace(/[^0-9]/g, "") : "";
return new Date(Date.UTC(parseInt(d.substr(0,4),10),
parseInt(d.substr(4,2),10)-1,
parseInt(d.substr(6,2),10),
parseInt(d.substr(8,2)||"00",10),
parseInt(d.substr(10,2)||"00",10),
parseInt(d.substr(12,2)||"00",10),
parseInt(d.substr(14,3)||"000",10)));
};
/***
https://github.com/tiddlyweb/chrjs/raw/master/main.js
***/
//{{{
// TiddlyWeb adaptor
// v0.14.3
/*jslint vars: true, unparam: true, nomen: true, white: true */
/*global jQuery */
var tiddlyweb = (function($) {
"use strict";
var tw = {
routes: {
// host is the TiddlyWeb instance's URI (including server_prefix)
// placeholders "_type" & "name" refer to the respective bag/recipe
root : "{host}/",
bags : "{host}/bags",
bag : "{host}/bags/{name}",
recipes : "{host}/recipes",
recipe : "{host}/recipes/{name}",
tiddlers : "{host}/{_type}s/{name}/tiddlers",
tiddler : "{host}/{_type}s/{name}/tiddlers/{title}",
revisions: "{host}/{_type}s/{name}/tiddlers/{title}/revisions",
revision : "{host}/{_type}s/{name}/tiddlers/{title}/revisions/{revision}",
search : "{host}/search?q={query}"
}
};
var convertTimestamp, supplant;
// host (optional) is the URI of the originating TiddlyWeb instance
tw.Resource = function(type, host) {
if(arguments.length) { // initialization
this._type = type;
if(host !== false) {
this.host = host !== undefined ? host.replace(/\/$/, "") : null;
}
}
};
$.extend(tw.Resource.prototype, {
// retrieves resource from server
// callback is passed resource, status, XHR (cf. jQuery.ajax success)
// errback is passed XHR, error, exception, resource (cf. jQuery.ajax error)
// filters is an optional filter string (e.g. "select=tag:foo;limit=5")
get: function(callback, errback, filters) {
var uri = this.route();
if(filters) {
var separator = uri.indexOf("?") === -1 ? "?" : ";";
uri += separator + filters;
}
var self = this;
return $.ajax({
url: uri,
type: "GET",
dataType: "json",
success: function(data, status, xhr) {
var resource = self.parse(data);
resource.etag = xhr.getResponseHeader("Etag");
callback(resource, status, xhr);
},
error: function(xhr, error, exc) {
errback(xhr, error, exc, self);
}
});
},
// sends resource to server
// callback is passed data, status, XHR (cf. jQuery.ajax success)
// errback is passed XHR, error, exception, resource (cf. jQuery.ajax error)
put: function(callback, errback) {
var self = this;
var options = {
url: this.route(),
type: "PUT",
contentType: "application/json",
data: JSON.stringify(this.baseData()),
success: function(data, status, xhr) {
callback(self, status, xhr);
},
error: function(xhr, error, exc) {
errback(xhr, error, exc, self);
}
};
if(this.ajaxSetup) {
this.ajaxSetup(options);
}
return $.ajax(options);
},
// deletes resource on server
// callback is passed data, status, XHR (cf. jQuery.ajax success)
// errback is passed XHR, error, exception, resource (cf. jQuery.ajax error)
"delete": function(callback, errback) {
var self = this;
var options = {
url: this.route(),
type: "DELETE",
success: function(data, status, xhr) {
callback(self, status, xhr);
},
error: function(xhr, error, exc) {
errback(xhr, error, exc, self);
}
};
if(this.ajaxSetup) {
this.ajaxSetup(options);
}
return $.ajax(options);
},
// returns an object carrying only the essential information of the resource
baseData: function() {
var data = {},
self = this;
$.each(this.data, function(i, item) {
var value = self[item];
if(value !== undefined) {
data[item] = value;
}
});
return data;
},
// returns corresponding instance from a raw object (if applicable)
parse: function(data) {
return data;
},
// list of accepted keys in serialization
data: [],
// returns resource's URI
route: function() {
return supplant(tw.routes[this._type], this);
}
});
var Container = function(type, name, host) {
if(arguments.length) { // initialization
tw.Resource.apply(this, [type, host]);
this.name = name;
this.desc = "";
this.policy = new tw.Policy({});
}
};
Container.prototype = new tw.Resource();
$.extend(Container.prototype, {
tiddlers: function() {
return new tw.TiddlerCollection(this);
},
parse: function(data) {
var type = tw._capitalize(this._type),
container = new tw[type](this.name, this.host);
data.policy = new tw.Policy(data.policy);
return $.extend(container, data);
},
data: ["desc", "policy"]
});
// attribs is an object whose members are merged into the instance (e.g. query)
tw.Collection = function(type, host, attribs) {
if(arguments.length) { // initialization
tw.Resource.apply(this, [type, host]);
$.extend(this, attribs);
}
};
tw.Collection.prototype = new tw.Resource();
tw.TiddlerCollection = function(container, tiddler) {
if(arguments.length) { // initialization
tw.Collection.apply(this, [tiddler ? "revisions" : "tiddlers"]);
this.container = container || null;
this.tiddler = tiddler || null;
}
};
tw.TiddlerCollection.prototype = new tw.Collection();
$.extend(tw.TiddlerCollection.prototype, {
parse: function(data) {
var container = this.container;
return $.map(data, function(item, i) {
var tiddler = new tw.Tiddler(item.title, container),
bag = item.bag;
tiddler = tw.Tiddler.prototype.parse.apply(tiddler, [item]);
if(!tiddler.bag && bag) { // XXX: bag always present!?
tiddler.bag = new tw.Bag(bag, container.host);
}
if(!tiddler.recipe && item.recipe) {
tiddler.recipe = new tw.Recipe(item.recipe, container.host);
}
delete item.recipe;
return $.extend(tiddler, item);
});
},
route: function() {
var params = this.container;
if(this.tiddler) {
var container = this.tiddler.bag || this.tiddler.recipe;
params = {
_type: container._type,
host: container.host,
name: container.name,
title: this.tiddler.title
};
}
return supplant(tw.routes[this._type], params);
}
});
tw.Search = function(query, host) {
tw.Collection.apply(this, ["search", host]);
this.query = query;
};
tw.Search.prototype = new tw.Collection();
$.extend(tw.Search.prototype, {
parse: function(data) {
this.container = { // XXX: hacky
_type: "bag",
host: this.host
};
var tiddlers = tw.TiddlerCollection.prototype.parse.apply(this, arguments);
delete this.container;
return tiddlers;
}
});
// title is the name of the tiddler
// container (optional) is an instance of either Bag or Recipe
// optionally accepts a single object representing tiddler attributes
tw.Tiddler = function(title, container) {
tw.Resource.apply(this, ["tiddler", false]);
this.title = title;
this.bag = container && container._type === "bag" ? container : null;
this.recipe = container && container._type === "recipe" ? container : null;
var self = this;
$.each(this.data, function(i, item) {
self[item] = undefined; // exposes list of standard attributes for inspectability
});
if(title && title.title) { // title is an object of tiddler attributes
$.extend(this, title);
}
};
tw.Tiddler.prototype = new tw.Resource();
$.extend(tw.Tiddler.prototype, {
revisions: function() {
return new tw.TiddlerCollection(this.bag || this.recipe, this);
},
route: function() {
var container = this.bag || this.recipe;
var params = $.extend({}, this, {
host: container ? container.host : null,
_type: this.bag ? "bag" : (this.recipe ? "recipe" : null),
name: container ? container.name : null
});
return supplant(tw.routes[this._type], params);
},
parse: function(data) {
var tiddler = new tw.Tiddler(this.title),
container = this.bag || this.recipe;
if(data.bag) {
tiddler.bag = new tw.Bag(data.bag, container.host);
delete data.bag;
}
delete data.recipe;
tiddler.created = data.created ? convertTimestamp(data.created) : new Date();
delete data.created;
tiddler.modified = data.modified ? convertTimestamp(data.modified) : new Date();
delete data.modified;
if(this.recipe) {
tiddler.recipe = this.recipe;
}
return $.extend(tiddler, data);
},
data: ["created", "creator", "modifier", "modified", "tags", "type", "text",
"fields"],
ajaxSetup: function(options) {
var self = this;
if(this.etag && (options.type === "PUT" || options.type === "DELETE")) {
options.beforeSend = function(xhr) {
xhr.setRequestHeader("If-Match", self.etag);
};
}
if(options.type === "PUT") {
var callback = options.success;
options.success = function(data, status, xhr) {
var loc = xhr.getResponseHeader("Location"),
etag = xhr.getResponseHeader("Etag");
if(loc && etag) {
self.etag = etag;
if(!self.bag) {
var bag = loc.split("/bags/").pop().split("/")[0];
self.bag = new tw.Bag(bag, self.recipe.host);
}
callback(self, status, xhr);
} else { // IE
self.get(callback, options.error);
}
};
}
}
});
tw.Revision = function(id, tiddler) {
var container = tiddler.bag || tiddler.recipe;
tw.Tiddler.apply(this, [tiddler.title, container]);
this._type = "revision";
this.revision = id;
};
tw.Revision.prototype = new tw.Tiddler();
$.extend(tw.Revision.prototype, {
revisions: false,
data: false,
put: false,
"delete": false
});
tw.Bag = function(name, host) {
Container.apply(this, ["bag", name, host]);
};
tw.Bag.prototype = new Container();
tw.Recipe = function(name, host) {
Container.apply(this, ["recipe", name, host]);
this.recipe = [];
};
tw.Recipe.prototype = new Container();
$.extend(tw.Recipe.prototype, {
data: ["recipe"].concat(Container.prototype.data)
});
tw.Policy = function(constraints) { // TODO: validation?
var self = this;
$.each(this.constraints, function(i, item) {
self[item] = constraints[item];
});
};
tw.Policy.prototype.constraints = ["read", "write", "create", "delete",
"manage", "accept", "owner"];
/*
* utilities
*/
tw._capitalize = function(str) {
return str.charAt(0).toUpperCase() + str.slice(1);
};
// convert YYYYMMDDhhmmss timestamp to Date instance
convertTimestamp = function(t) {
if (t.match(/^\d{12,17}$/)) {
return new Date(Date.UTC(
parseInt(t.substr(0, 4), 10),
parseInt(t.substr(4, 2), 10) - 1,
parseInt(t.substr(6, 2), 10),
parseInt(t.substr(8, 2), 10),
parseInt(t.substr(10, 2), 10),
parseInt(t.substr(12, 2) || "0", 10),
parseInt(t.substr(14, 3) || "0", 10)
));
} else {
return new Date(Date.parse(t));
}
};
// adapted from Crockford (http://javascript.crockford.com/remedial.html)
supplant = function(str, obj) {
return str.replace(/{([^{}]*)}/g, function (a, b) {
var r = obj[b];
r = typeof r === "string" || typeof r === "number" ? r : a;
return $.inArray(b, ["host", "query"]) !== -1 ? r : encodeURIComponent(r); // XXX: special-casing
});
};
return tw;
}(jQuery));
//}}}
!URL
http://www.bbc.co.uk/news/uk-scotland-12428765
!Description
Drunk people should pay for the treatment they receive at accident and emergency units, a patient's group has said.
!Notes
This is a toughie. On the surface it makes great sense, especially when constrained incidents of drunkeness (rather than long term illnesses). But what about those long term things. Should people who drink, smoke or don't exercise pay for their health care?
!URL
http://www.sicamp.org/
!Description
bah, these things are always at a less than ideal time for me
/***
|''Name''|BinaryUploadPlugin|
|''Version''|0.3.15|
|''Author''|Ben Gillies and Jon Robson|
|''Type''|plugin|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/BinaryUploadPlugin.js|
|''Description''|Upload a binary file to TiddlyWeb|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig TiddlyWebConfig|
!Usage
{{{
<<binaryUpload bag:<name> edit:tags edit:title tags:<default tags> title:<title> >>
}}}
* {{{bag:<name>}}}: optional; if left out, the file will be saved to the current workspace
* {{{edit:tags}}}: specifies that you want to tag the file being uploaded
* {{{edit:title}}}: specifies that you want to set the title to something other than the filename
* {{{tags:<default tags>}}}: specifies a default set of tags to apply to the file (requires {{{edit:tags}}} to be set)
* {{{title:<title>}}}: predefines the title of the binary tiddler
!Requires
TiddlyWeb
tiddlywebplugins.form
!Code
***/
//{{{
(function($) {
var tiddlyspace = config.extensions.tiddlyspace;
var macro = config.macros.binaryUpload = {
locale: {
titleDefaultValue: "Please enter a title...",
tagsDefaultValue: "Please enter some tags...",
titlePrefix: "title: ",
tagsPrefix: "tags: ",
loadSuccess: 'Tiddler %0 successfully uploaded',
loadError: "An error occurred when uploading the tiddler %0",
uploadInProgress: "Please wait while the file is uploaded...",
membersOnly: "Only members can upload."
},
renderInputFields: function(container, options) {
var locale = macro.locale;
var editableFields = options.edit;
var includeFields = {
tags: editableFields && editableFields.contains("tags") ? true : false,
title: editableFields && editableFields.contains("title") ? true : false
};
var fields = ["title", "tags"];
for(var i = 0; i < fields.length; i++) {
var fieldName = fields[i];
var userDefault = options[fieldName];
var defaultValue = userDefault ? userDefault[0] : false;
if(includeFields[fieldName] || defaultValue) {
var localeDefault = locale["%0DefaultValue".format(fieldName)];
var className = defaultValue ? "userInput" : "userInput notEdited";
var inputEl;
var val = defaultValue || localeDefault || "";
var iContainer = $("<div />").addClass("binaryUpload%0".format(fieldName)).
appendTo(container);
if(defaultValue && !includeFields[fieldName]) {
var label = locale["%0Prefix".format(fieldName)];
$("<span />").text(label).appendTo(iContainer);
$("<span />").addClass("disabledInput").text(val).appendTo(iContainer);
inputEl = $("<input />").attr("type", "hidden");
} else {
inputEl = $("<input />").attr("type", "text");
}
inputEl.attr("name", fieldName).
addClass("%0Edit".format(fieldName)).
val(val).addClass(className).appendTo(iContainer);
}
}
},
getTiddlerName: function(fileName) {
var fStart = fileName.lastIndexOf("\\");
var fStart2 = fileName.lastIndexOf("/");
fStart = fStart < fStart2 ? fStart2 : fStart;
fileName = fileName.substr(fStart+1);
return fileName;
},
errorHandler: function(fileName) {
displayMessage("upload of file %0 failed".format(fileName));
},
uploadFile: function(place, baseURL, workspace, options) {
var pleaseWait = $(".uploadProgress", place);
var iframeName = options.target;
var form = $("form", place);
var existingVal = $("input[name=title]", form).val();
var fileName = existingVal || $('input:file', form).val();
if(!fileName) {
return false; // the user hasn't selected a file yet
}
fileName = macro.getTiddlerName(fileName);
$("input[name=title]", place).val(fileName);
// we need to go somewhere afterwards to ensure the onload event triggers
var redirectTo = "/%0/tiddlers.txt?select=title:%1".
format(workspace, fileName);
var token = tiddlyspace ? tiddlyspace.getCSRFToken() : "";
var action = "%0?csrf_token=%1&redirect=%2"
.format(baseURL, token, redirectTo);
form[0].action = action; // dont use jquery to work with ie
form[0].target = iframeName;
// do not refactor following line... won't work in IE6 otherwise
$(place).append($('<iframe name="' + iframeName + '" id="' + iframeName + '"/>').css('display','none'));
macro.iFrameLoader(iframeName, function() {
var content = document.getElementById(iframeName).contentWindow.document.documentElement;
if($(content).text().indexOf(fileName) > -1) {
options.callback(place, fileName, workspace, baseURL);
} else {
macro.errorHandler(fileName);
}
form.show(1000);
pleaseWait.hide(1000);
});
form.hide(1000);
pleaseWait.show(1000);
return true;
},
createUploadForm: function(place, options) {
var locale = macro.locale;
if(readOnly) {
$('<div class="annotation" />').text(locale.membersOnly).
appendTo(place);
return;
}
var bag = options.bag;
options.callback = options.callback ? options.callback :
function(place, fileName, workspace, baseurl) {
macro.displayFile(place, fileName, workspace);
displayMessage(locale.loadSuccess.format(fileName));
$("input[type=text]", place).val("");
};
var defaults = config.defaultCustomFields;
place = $("<div />").addClass("container").appendTo(place)[0];
var workspace = bag ? "bags/%0".format(bag) : config.defaultCustomFields["server.workspace"];
var baseURL = defaults["server.host"];
baseURL += (baseURL[baseURL.length - 1] !== "/") ? "/" : "";
baseURL = "%0%1/tiddlers".format(baseURL, workspace);
//create the upload form, complete with invisible iframe
var iframeName = "binaryUploadiframe%0".format(Math.random());
// do not refactor following line of code to work in IE6.
var form = $('<form action="%0" method="POST" enctype="multipart/form-data" />'.
format(baseURL)).addClass("binaryUploadForm").
appendTo(place)[0];
macro.renderInputFields(form, options);
$(form).
append('<div class="binaryUploadFile"><input type="file" name="file" /></div>').
append('<div class="binaryUploadSubmit"><input type="submit" value="Upload" /></div>').
submit(function(ev) {
this.target = iframeName;
options.target = iframeName;
macro.uploadFile(place, baseURL, workspace, options);
});
$('<div />').addClass("uploadProgress").text(locale.uploadInProgress).hide().appendTo(place);
$("input[name=file]", place).change(function(ev) {
var target = $(ev.target);
var fileName = target.val();
var title = $("input[type=text][name=title]", place);
if(!title.val()) {
title.val(fileName);
}
});
},
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
params = paramString.parseParams(null, null, true);
macro.createUploadForm(place, params[0]);
},
iFrameLoader: function(iframeName, callback) {
var iframe = document.getElementById(iframeName); //jQuery doesn't seem to want to do this!?
var locale = macro.locale;
$(".userInput").addClass("notEdited"); // reset editing
var finishedLoading = function() {
callback();
};
var iFrameLoadHandler = function() {
finishedLoading.apply();
return;
};
iframe.onload = iFrameLoadHandler;
//IE
completeReadyStateChanges = 0;
iframe.onreadystatechange = function() {
if (++(completeReadyStateChanges) == 3) {
iFrameLoadHandler();
}
};
},
displayFile: function(place, title, workspace) {
var adaptor = store.getTiddlers()[0].getAdaptor();
var context = {
workspace: workspace,
host: config.defaultCustomFields['server.host']
};
adaptor.getTiddler(title, context, null, function(context) {
if(context.status) {
store.addTiddler(context.tiddler);
story.displayTiddler(place, title);
var image = config.macros.image;
if(image && image.refreshImage) {
image.refreshImage("/%0/tiddlers/%1".format(workspace, title));
image.refreshImage(title);
image.refreshImage("/%0".format(title));
image.refreshImage("%0/%1/tiddlers/%2".format(config.extensions.tiddlyweb.host, workspace, title));
}
} else {
displayMessage(macro.locale.loadError.format(title));
}
});
}
};
if(tiddlyspace) {
config.macros.binaryUploadPublic = {
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
var options = paramString.parseParams(null, null, true)[0];
var bag = tiddlyspace.getCurrentBag("public");
options.bag = bag;
macro.createUploadForm(place, options);
}
};
config.messages.privacySetting = config.options.chkPrivateMode ?
"private" : "public";
config.macros.binaryUpload.defaultWorkspace = tiddlyspace.
getCurrentWorkspace(config.messages.privacySetting);
}
})(jQuery);
//}}}
!URL
http://prog21.dadgum.com/93.html
!Description
When you're trying to help someone learn how to go from a problem statement to working code, the last thing you want is to get them sidetracked by faux-engineering busywork. Some people are going to run with those scraps of OO knowledge and build crazy class hierarchies and end up not as focused on on what they should be learning. Other people are going to lose interest because there's a layer of extra nonsense that makes programming even more cumbersome.
!Notes
You down with OOP? Don't be.
!URL
http://code.google.com/p/wsgi-intercept/
!Description
fake a web server for testing a wsgi app
!URL
http://craggy-island.com/news/05/2011/pippa-mitchell-advice-on-what-to-eat-and-when-to-get-the-best-out-of-your-climbing/
!Description
Indoor climbing sessions are intense workouts and put an extreme workload onto the body, so it’s not only important to stretch and warm up, but also to fuel up by eating the foods that will help sustain you through your climbing.
/***
|''Name''|LoadMissingExternalTiddler|
|''Version''|0.1.0|
|''Author''|Jon Robson|
***/
//{{{
var _loadMissing = Story.prototype.loadMissingTiddler;
Story.prototype.loadMissingTiddler = function(title,fields,callback) {
var matches = title.match(/([^\*]*) \*\(@([^\)]*)\)\*/);
if(matches && matches.length > 0) {
var sTitle = matches[1];
var space = matches[2]; config.extensions.tiddlyspace.displayServerTiddler(story.getTiddler(title),
sTitle, "bags/%0_public".format(space));
} else {
_loadMissing.apply(this, arguments)
}
};
//}}}
!URL
http://hbswk.hbs.edu/archive/5289.html
!Description
Most companies have it all wrong. They don't have to motivate their employees. They have to stop demotivating them.
!Notes
Weird, how is any of this news or not self-evident or any of that stuff. That so much business writing is //completely// obvious is a very bad sign for business.
Tool builders, as a group, are an optimistic lot. They build their tools because they believe that with the help of their tool they can make any process some combination of easier, more effective, more fun, more engaging. This can be true for a significant subset of all tasks, but is not true for all.
A tool can deeply impact any task which can be adequately described by theory: That is only if it is possible to delineate an algorithm which captures some aspect of the task. Braking a car can be improved by augmenting the pressure generated between pressing a pedal and moving some calipers. We can describe that and from that description come up with hydraulic braking systems.
Many tasks we want to do are hard to theorize in any complete or holistic fashion. As I write this blog post I'm doing reading, writing and synthesis in a way that I think you would be hard pressed to describe in detail. You can describe that I need to get data into the computer and from that build I/O systems that translates my tapping fingers into letters I see on the screen. Can you describe, though, in any adequate way the way in which mind is gathering the disparate memories of the conversations I've had today and the things I've learned over the last 40 years or processing my emotional responses or inferring connections? Probably not, and it is those things which are creating this paragraph.
If you're a tool builder in the world of information management, seeing this distinction is critical to making useful tools and critical to knowing what work you need to do. My synthesis cannot be explained in whole, thus no tool can do it. Only parts of the process can be helped. Those parts are about accessing and reusing existing information. The hard part, the thinking, the synthesis, that part I have to do for myself.
!URL
http://permanentrecord.firstround.com/2011/10/31/term-sheet-negotiation-tells/
!Description
Another person didn’t want preferred shareholders to have any preferred rights. He never should have taken investor money and probably won’t again.
!Notes
I'm in this boat. I think the notion of preferred shareholders having some primacy over other equity holders (notably employees) is bogus. But then again I think options are crap: they are not real ownership. You want people to have skin in the game? Then give them real skin!
<<<
I’ve not glanced and seen one interesting thing within it. It’s like your peripheral vision as you drive fast along a road.
<<<
[[jaggeree /Blog : : Frictionless and frictionfull sharing and where the meaning lies.|http://blog.jaggeree.com/post/13640038173/frictionless-and-frictionfull-sharing-and-where-the]]
<html>
<head>
<title>Social</title>
<style type='text/css'>
.button, button {
text-decoration: underline;
margin-bottom: 1em;
background: #FFFAE1;
background: -webkit-gradient(linear, left top, left bottom, from(#FFFAE1), to(#E8E1FF));
background: -moz-linear-gradient(top, #FFFFB8, yellow);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFB8', endColorstr='yellow');
border: 1px solid #666;
color: #888;
cursor: pointer;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 11px;
font-weight: bold;
height: 30px;
line-height: 30px;
padding: 0 10px;
text-align: center;
text-shadow: rgba(0, 0, 0, .1) 0 -1px 0;
text-transform: uppercase;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
border-radius: 5px;
display: inline-block;
}
.friend.active {
left: 40px;
-webkit-box-shadow: 10px 10px 10px #555;
}
.friend:hover {
-webkit-box-shadow: 5px 5px 5px #ccc;
left: 10px;
}
.friend a.tiddlers {
display: block;
}
.friend {
border-left: solid 1px #333;
position: relative;
-webkit-transition-property: max-height,left;
-webkit-transition-duration: 0.6s, 0.6s;
-webkit-transition-timing-function: ease-in-out;
transition-property: max-height,left;
transition-duration: 0.6s, 0.6s;
transition-timing-function: ease-in-out;
-ms-transition-property: max-height,left;
-ms-transition-duration: 0.6s, 0.6s;
-ms-transition-timing-function: ease-in-out;
-o-transition-property: max-height,left;
-o-transition-duration: 0.6s, 0.6s;
-o-transition-timing-function: ease-in-out;
-moz-transition-property: max-height,left;
-moz-transition-duration: 0.6s, 0.6s;
-moz-transition-timing-function: ease-in-out;
padding: 10px;
background-color: white;
}
ul {
list-style: none;
}
ul .friend {
border-bottom: solid 1px black;
cursor: pointer;
}
ul .friend .tiddler {
margin-left: 10px;
margin-bottom: 30px;
padding: 10px;
border: dotted 2px #CCC;
color: #006100;
}
textarea {
width: 100%;
height: 150px;
}
.friend h2 {
display: inline-block;
}
button {
display: inline-block;
}
.friend.inactiveFriend {
background-color: #ccc;
opacity: 0.1;
border-left: solid 5px red;
}
.friend {
max-height: 10px;
overflow: hidden;
opacity: 0.9;
border-left: solid 5px green;
}
.friend:hover {
max-height: 200px;
opacity: 1;
}
#friends {
position: relative;
width: 20%;
float: left;
background-color: white;
}
#message {
display: block;
padding: 20px;
background-color: white;
margin-bottom: 10px;
border-bottom: solid 3px #CCC;
}
#message.error {
border-bottom: solid 3px red;
color: #900;
font-weight: bold;
}
.section .section {
font-size:0.7em;
}
</style>
<link rel="stylesheet" href="/bags/common/tiddlers/profile.css" type="text/css">
</head>
<body>
<div id="message"></div>
<div id='friends' class="section">loading...</div>
<div id="container">
<div id="header">
<h1>social</h1>
</div>
<noscript>
javascript is required to see friend's activity
</noscript>
<div id="displayArea" class="main section"></div>
</div>
<script src="/bags/common/tiddlers/jquery.js" type="text/javascript" charset="utf-8"></script>
<script src="/bags/common/tiddlers/jquery-json.js" type="text/javascript" charset="utf-8"></script>
<script src="/bags/tiddlyspace/tiddlers/chrjs" type="text/javascript" charset="utf-8"></script>
<script src="/bags/common/tiddlers/backstage.js" type="text/javascript" charset="utf-8"></script>
<script type='text/javascript' src='/_socialjs'></script>
</body>
</html>
/***
|''Name''|TiddlySpaceInitialization|
|''Version''|0.7.2|
|''Description''|Initializes new TiddlySpaces the first time they are created|
|''Status''|@@beta@@|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/blob/master/src/plugins/TiddlySpaceInit.js|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig RandomColorPalettePlugin chrjs ImageMacroPlugin|
!TODO
* robust error notification and recovery
!MarkupPreHead
<!--{{{-->
<link rel="shortcut icon" href="/recipes/%0_public/tiddlers/favicon.ico" />
<link href="/bags/%0_public/tiddlers.atom" rel="alternate"
type="application/atom+xml" title="%0's public feed" />
<link rel="canonical" href="%1/" />
<!--}}}-->
!Code
***/
//{{{
(function($) {
var versionField = "tiddlyspaceinit_version";
var markupPreHead = store.getTiddlerText(tiddler.title + "##MarkupPreHead", "");
var tiddlyspace = config.extensions.tiddlyspace;
var currentSpace = tiddlyspace.currentSpace;
var tweb = config.extensions.tiddlyweb;
var plugin = config.extensions.TiddlySpaceInit = {
version: "0.6",
SiteTitle: "%0",
SiteSubtitle: "a TiddlySpace",
flagTitle: "%0SetupFlag",
flagWarning: "Please do not modify this tiddler; it was created " +
"automatically upon space creation.",
dispatch: function(ev) {
var title = plugin.flagTitle.format([currentSpace.name]);
config.annotations[title] = plugin.flagWarning;
if(currentSpace.type != "private") {
return;
}
var tiddlers = [];
var tid = store.getTiddler(title);
if(tid) {
curVersion = parseFloat(tid.fields[versionField]);
reqVersion = parseFloat(plugin.version);
if(curVersion < reqVersion) {
plugin.update(curVersion, tid);
tid.fields[versionField] = plugin.version;
tid.incChangeCount();
tid = store.saveTiddler(tid);
tiddlers.push(tid);
}
} else { // first run
tid = new Tiddler(title);
tid.tags = ["excludeLists", "excludeSearch", "excludePublisher"];
tid.fields = $.extend({}, config.defaultCustomFields);
tid.fields[versionField] = plugin.version;
tid.text = "@@%0@@".format([plugin.flagWarning]);
tid = store.saveTiddler(tid);
tiddlers = tiddlers.concat(plugin.firstRun(), tid);
}
autoSaveChanges(null, tiddlers);
},
update: function(curVersion, flagTiddler) {
if(curVersion < 0.2) {
this.createAvatar();
}
if(curVersion < 0.3) {
flagTiddler.tags.pushUnique("excludePublisher"); // XXX: never persisted
}
if(curVersion < 0.5) { // v0.4 was faulty
this.setupMarkupPreHead();
}
if(curVersion < 0.6) {
this.purgeSystemSettings();
}
},
pubTid: {
tags: ["excludeLists", "excludeSearch"],
fields: $.extend({}, config.defaultCustomFields, {
"server.workspace": tiddlyspace.getCurrentWorkspace("public")
})
},
makeTiddlerIfNot: function(tiddler) {
if (!store.tiddlerExists(tiddler.title)) {
$.extend(true, tiddler, plugin.pubTid);
return [store.saveTiddler(tiddler)];
} else {
return [];
}
},
firstRun: function() {
var tiddlers = [];
// generate Site*itle
$.each(["SiteTitle", "SiteSubtitle"], function(i, item) {
var tid = new Tiddler(item);
tid.text = plugin[item].format([currentSpace.name]);
tiddlers.push.apply(tiddlers,
plugin.makeTiddlerIfNot(tid));
});
// generate public ColorPalette
var tid = new Tiddler("ColorPalette");
tid.text = config.macros.RandomColorPalette.generatePalette({
saturation_pale: 0.67, saturation_light: 0.53,
saturation_mid: 0.43, saturation_dark: 0.06,
pale: 0.99, light: 0.85, mid: 0.5, dark: 0.31
},
false);
tiddlers.push.apply(tiddlers, plugin.makeTiddlerIfNot(tid));
this.createAvatar();
this.setupMarkupPreHead();
return tiddlers;
},
// remove _cookie slices (TiddlyWiki 2.6.2 beta 6 remnants)
purgeSystemSettings: function() {
var ss = store.getTiddler("SystemSettings");
if(ss) {
var lines = ss.text.split("\n");
var persistentOptions = $.grep(lines, function(line, i) {
return line.indexOf("_cookie:") == -1;
});
ss.text = persistentOptions.join("\n");
ss = store.saveTiddler(ss);
autoSaveChanges(null, [ss]);
}
},
createAvatar: function() {
var avatar = "SiteIcon";
var host = tweb.host;
var notify = function(xhr, error, exc) {
displayMessage("ERROR: could not create avatar - " + // TODO: i18n
"%0: %1".format([xhr.statusText, xhr.responseText]));
// TODO: resolve!?
};
var pubBag = tiddlyspace.getCurrentBag("public");
var tid = new tiddlyweb.Tiddler(avatar);
tid.bag = new tiddlyweb.Bag(pubBag, host);
var callback = function(data, status, xhr) {}; // avatar already exists; do nothing
var errback = function(xhr, error, exc) {
if(xhr.status != 404) {
return;
}
// copy default avatar
var _notify = function(tid, status, xhr) {
displayMessage("created avatar"); // TODO: i18n
var image = config.macros.image;
if(image && image.refreshImage) {
var uri = "/%0/tiddlers/SiteIcon".
format(tiddlyspace.getCurrentWorkspace("public"));
image.refreshImage(uri);
image.refreshImage("SiteIcon");
}
};
var _callback = function(tid, status, xhr) {
tid.title = avatar;
tid.bag.name = pubBag;
delete tid.etag;
tid.put(_notify, notify); // TODO: add to current session document (via adaptor?)
};
tweb.getUserInfo(function(user) {
var avatarTitle = currentSpace.name == user.name ?
"defaultUserIcon" : "defaultSiteIcon";
var tid = new tiddlyweb.Tiddler(avatarTitle);
tid.bag = new tiddlyweb.Bag("common", host);
tid.get(_callback, notify);
});
};
tid.get(callback, errback);
},
setupMarkupPreHead: function() {
var pubWorkspace = tiddlyspace.getCurrentWorkspace("public");
var existing = store.getTiddler("MarkupPreHead");
if(!existing || existing.fields["server.workspace"] != pubWorkspace) {
tweb.getStatus(function(status) {
var tid = new Tiddler("MarkupPreHead");
tid.text = markupPreHead.format(currentSpace.name, tiddlyspace.getHost(status.server_host,
currentSpace.name));
tid.tags = ["excludeLists"];
tid.fields = $.extend({}, config.defaultCustomFields);
tid.fields["server.workspace"] = pubWorkspace;
tid.fields["server.page.revision"] = "false";
tid = store.saveTiddler(tid);
autoSaveChanges(null, [tid]);
});
}
}
};
$(document).bind("startup", plugin.dispatch);
})(jQuery);
//}}}
!URL
http://www.newyorker.com/online/blogs/newsdesk/2011/07/rupert-murdoch-news-of-the-world.html
!Description
The phone-hacking scandal is one Murdoch cannot escape, because he is culpable.
!Notes
Let's hope so.
started working on some python ostatus tools: https://github.com/cdent/py-ostatus
!URL
http://blog.ianbicking.org/2011/03/30/js-on-server-and-client-is-not-a-big-deal/
!Description
You can work fluidly across client and server!
If anything I think this is dangerous rather than useful. The client and the server are different places, with different expectations. Any vagueness about that boundary is wrong.
!URL
http://www.danwebb.net/2011/5/28/it-is-about-the-hashbangs
!Description
If you value the content that a web app holds then you need to value it’s URLs even more. Directly addressable content is what makes web apps better than desktop apps. It’s certainly not the UIs.
Back in the UK. Still finding my britain-legs.
!Upload an icon
<<tiddler spaceIcon>>
!Describe your space
If you haven't already done so, you should provide a brief decscription of yourself and what you're using this space for. To do this, just edit the [[SiteInfo]] tiddler (keeping the title the same of course).
----
!Change the title
<<tiddler spaceTitle>>
!Change the color scheme
<<tiddler colorScheme>>
!Change the menu
If you'd like to change the menu items along the top, you can edit the [[MainMenu]] tiddler.
----
!Change the default tiddlers
<<tiddler setDefaultTiddlers>>
!More Advanced customisations
If you know HTML and CSS, you can edit some or all of the following tiddlers to customise your space further:
* PageTemplate
* EditTemplate
* ViewTemplate
* StyleSheet
/*global window,tiddlyweb,$*/
/*
* Bookmarker code
* The tabs object encapsulates all the code for each actual tab.
* Each tab is an instance of the Tab object, which includes functions for
* populating the tab with data, turning the data in the tab into a tiddler,
* etc.
* There is a Default tab, which can be extended, with specific values
* overidden only when they differ.
* The app starts up when it receives a message (i.e. receiveMessage).
* This triggers a callback from details (an event queue like thing) that is
* listening for the data to arrive.
*/
(function() {
var details = {
queue: [],
set: function(target, data) {
this[target] = data;
this.done(target);
},
done: function(target) {
var self = this;
this.queue = $.map(this.queue, function(obj, i) {
if (obj.target === target) {
obj.fn(self[target]);
return null;
}
return obj;
});
},
when: function(target, func) {
this.queue.push({
target: target,
fn: func
});
if (this[target]) {
this.done(target);
}
}
};
function _extend(target, obj) {
var key;
for (key in obj) {
if (obj.hasOwnProperty(key)) {
if ((!~['string', 'function'].indexOf(typeof obj[key]))
&& (!$.isArray(obj[key]))
&& (target.hasOwnProperty(key))) {
target[key] = _extend(_extend({}, target[key] || {}),
obj[key]);
} else {
target[key] = obj[key];
}
}
}
return target;
}
function Tab(opts) {
_extend(this, opts);
this.$el = $(this.el);
}
Tab.prototype.extend = function(opts) {
var newTab = new Tab(this);
_extend(newTab, opts);
newTab.$el = $(newTab.el);
return newTab;
};
Tab.prototype.setTab = function(data) {
var $el = this.$el,
self = this;
$.each(this.bind, function(field, selectors) {
var res = (self.populate[field]) ?
self.populate[field].call(self, data) : data[field];
res = $.isArray(res) ? res : [res];
selectors = $.isArray(selectors) ? selectors : [selectors];
$.each(selectors, function(i, selector) {
var $subEl = $el.find(selector),
setFn = ($subEl[0].nodeName === 'DIV') ? 'html' : 'val';
if (res[i]) {
$subEl[setFn](res[i]);
}
});
});
this.setFocus();
};
Tab.prototype.setTiddler = function() {
var tiddler = new tiddlyweb.Tiddler(),
priv = this.getPrivate(),
self = this;
$.each(this.bind, function(field, selectors) {
var fn = self.toTiddler[field] || function(txt) { return txt; };
if (tiddler.hasOwnProperty(field)) {
tiddler[field] = self.callWithValues(field, fn);
} else {
tiddler.fields = tiddler.fields || {};
tiddler.fields[field] = self.callWithValues(field, fn);
}
});
details.when('data', function(data) {
tiddler.bag = new tiddlyweb.Bag(data.space + priv, '/');
details.set('tiddler', tiddler);
});
};
Tab.prototype.getPrivate = function() {
return $('.modal-footer [name="private"]input').attr('checked') ?
'_private' : '_public';
};
Tab.prototype.setFocus = function() {
var $el = this.$el.find(this.focus);
// use a setTimeout due to weirdness in chrome
window.setTimeout(function() {
$el.focus();
// HACKY: changing the text forces the cursor to the end of the textarea
var val = $el.val();
$el.val('');
$el.val(val);
}, 0);
};
Tab.prototype.callWithValues = function(field, fn) {
var args = [],
selectors = this.bind[field],
$el = this.$el;
selectors = $.isArray(selectors) ? selectors : [selectors];
$.each(selectors, function(i, selector) {
args.push($el.find(selector).val());
});
if (typeof fn === 'function') {
return fn.apply(this, args);
} else {
return this[fn].apply(this, args);
}
};
Tab.prototype.figureTags = function(tagString) {
var brackets = /^\s*\[\[([^\]\]]+)\]\](\s*.*)/,
whitespace = /^\s*([^\s]+)(\s*.*)/,
match,
rest = tagString,
tags = [];
match = brackets.exec(rest) || whitespace.exec(rest);
while (match) {
tags.push(match[1]);
rest = match[2];
match = brackets.exec(rest) || whitespace.exec(rest);
}
return tags;
};
Tab.prototype.isEmpty = function() {
return this.$el.find((this.bind && this.bind.title) || this.focus)
.val() === '';
};
var Default = new Tab({
focus: '[name="text"]textarea',
bind: {
title: '[name="title"]input',
text: '[name="text"]textarea',
tags: '[name="tags"]input',
url: '[name="url"]input'
},
populate: {},
toTiddler: { tags: 'figureTags' }
});
var tabs = {
post: Default.extend({
el: '#postForm',
populate: {
text: function(data) {
return data.text ?
'> ' + data.text.split('\n').join('\n> ') : '';
}
}
}),
link: Default.extend({
el: '#linkForm',
bind: { text: [ '[name="text"]textarea', '[name="url"]input'] },
toTiddler: {
text: function(txt, url) {
return ['!URL', url, '!Description', txt].join('\n');
}
}
}),
quote: Default.extend({
el: '#quoteForm',
bind: { text: [ '[name="text"]textarea', '[name="quote"]textarea'] },
populate: {
text: function(data) {
var text = '[[' + data.title.replace('|', '>') + '|'
+ data.url + ']]',
quote = data.text;
return [ text, quote ];
}
},
toTiddler: {
text: function(txt, quote) {
return ['<<<', quote, '<<<', txt].join('\n');
}
}
}),
image: Default.extend({
el: '#imageForm',
bind: { text: [
'[name="text"]textarea', '[name="image"]input', '.imagePicker'
] },
populate: {
text: function(data) {
var quotedTxt = (data.text) ? '\n\n>'
+ data.text.replace('\n', '\n> ') : '',
text = '[[' + data.title.replace('|', '>') + '|'
+ data.url + ']]' + quotedTxt,
images = this.setImages(data.images);
return [ text, data.images[0], images ];
}
},
toTiddler: {
text: function(txt, image) {
return ['[img[' + image + ']]', txt].join('\n');
}
},
setImages: function(images) {
var selector = $('<div/>'),
setCurrent = function($el) {
$el.siblings()
.removeClass('current').end()
.addClass('current')
.closest('label')
.children('[name="image"]input')
.val($el.attr('src')).end();
};
$.each(images, function(i, img) {
$('<img/>').attr('src', img)
.css({
'max-height': '90px',
'max-width': '100px',
display: 'inline-block'
}).click(function() {
setCurrent($(this));
}).appendTo(selector);
});
setCurrent($('img:first', selector));
return selector;
}
})
};
function pickDefaultTab(data) {
if (!data.text) {
return 'link';
} else {
return 'quote';
}
}
function receiveMessage(event) {
var data = JSON.parse(event.data);
if (data.from !== 'TiddlySpace') {
return;
}
details.set('data', data);
details.set('eventSrc', {
origin: event.origin,
source: event.source
});
}
window.addEventListener('message', receiveMessage, false);
function saveTiddler(callback) {
details.when('tiddler', function(tiddler) {
tiddler.put(function() {
callback(true);
}, function(xhr, error, exc) {
callback(false, error, exc);
});
});
}
function closePage(timeout) {
window.setTimeout(function() {
details.when('eventSrc', function(src) {
src.source.postMessage('close', src.origin);
});
}, timeout || 0);
}
function getCurrentTab() {
return $('.tabs .active').data('tab-name');
}
function saveBookmark(event) {
var $successBtn = $('[type="submit"]input');
tabs[getCurrentTab()].setTiddler();
$successBtn.val('Saving...')
.addClass('disabled')
.attr('disabled', 'disabled');
$('.closeBtn').addClass('disabled')
.attr('disabled', 'disabled');
saveTiddler(function(success) {
if (success) {
$successBtn
.val('Saved!')
.removeClass('primary')
.addClass('success');
closePage(1000);
} else {
$successBtn
.removeClass('disabled')
.removeAttr('disabled')
.removeClass('primary')
.addClass('danger')
.val('Error saving. Please try again');
}
});
event.preventDefault();
return false;
}
$(function() {
$('.modal-footer [type="submit"]input').click(saveBookmark);
$('.closeBtn').click(closePage);
details.when('data', function(data) {
// some initialisation: if there are no images, remove the images tab
if (data.images.length === 0) {
$('#imageForm').remove();
$('.tabs li').each(function(i, el) {
if ($(el).data('tab-name') === 'image') {
$(el).remove();
}
});
}
// figure out which tab we should start off on
var tab = pickDefaultTab(data);
// populate the tab with data when the user switches to it
$('.tabs').delegate('li', 'click', function() {
var tabName = $(this).data('tab-name');
if (tabs[tabName].isEmpty()) {
tabs[tabName].setTab(data);
}
});
// initialise the app by switching to the correct tab.
$('.tabs li').each(function(i, el) {
var $el = $(el);
if ($el.data('tab-name') === tab) {
$el.find('a').click();
return false;
}
});
// now display the container again
$('#container').show();
});
});
}());
a TiddlySpace for and about @cdent
The 21st century network is struggling today.
!URL
http://www.ft.com/cms/s/2/454b1108-9809-11e0-85e9-00144feab49a.html#axzz1PonvDpz4
!Description
I’ve come to accept the light drizzle as part of my daily regime and have almost forgotten that life is considerably better when you can stand under a concentrated torrent of warm water.
<!DOCTYPE html>
<html manifest="/manifest.mf">
<head>
<title>takenote</title>
<link type="text/css" rel="stylesheet" href="/notabene.css" />
<link type="text/css" rel="stylesheet" href="/bags/common/tiddlers/jquery-ui.custom.css">
<link rel="apple-touch-icon" href="/touchicon_takenote.png"/>
<link rel="apple-touch-icon-precomposed" href="/touchicon_takenote.png"/>
<meta name="viewport" content="width=device-width,minimum-scale=1,maximum-scale=1,user-scalable=0,initial-scale=1.0">
</head>
<body>
<ul id="backstage">
<!-- no not add a newline between li elements or you will get a margin with inline blocks -->
<li><a href="/dashboard">dashboard</a></li><li><a href="/takenote">takenote</a></li>
<li><a class='connectionStatus'></a></li>
</ul>
<div class="takenotedashboard">
<div class='messageArea'></div>
<div class="header">
<div class="siteheading">
<h1>Dashboard</h1>
</div>
<div class='siteicon'></div>
</div>
<div class="toolpanel viewer">
<div class='section searchSection requiresConnection'>
<h2>find note:</h2>
<input class="findnote" type="search" placeholder="type search term" />
<ul>
<li>Access all your notes from <a href="/tiddlers?select=tag:!excludeLists">tiddlers</a></li>
</ul>
</div>
<div class="section incompleteSection">
<h2>Incomplete notes:</h2>
<ul id="incomplete"></ul>
<a class='syncButton' title="save all notes in the list to the web">sync these notes</a>
</div>
<div class="section recentSection">
<h2>Recently created</h2>
<ul id="recentnotes"></ul>
</div>
</div>
<div class='footer'>
<span class='version'>v. 0.6.4</span>
</div>
</div>
<noscript>
Takenote requires javascript to work correctly. Sorry!
</noscript>
<script src="/bags/common/tiddlers/backstage.js" type="text/javascript" charset="utf-8"></script>
<script src="/bags/common/tiddlers/bookmark_bubble.js" type="text/javascript" charset="utf-8"></script>
<script src="/bags/common/tiddlers/jquery.js" type="text/javascript" charset="utf-8"></script>
<script src="/bags/common/tiddlers/jquery-ui.custom.js" type="text/javascript" charset="utf-8"></script>
<script src="/bags/tiddlyspace/tiddlers/chrjs" type="text/javascript" charset="utf-8"></script>
<script src="/bags/common/tiddlers/chrjs-store.js" type="text/javascript" charset="utf-8"></script>
<script src="/bags/common/tiddlers/jquery-json.js" type="text/javascript" charset="utf-8"></script>
<script src="/notabene.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
var space = window.location.hostname.split(".")[0];
dashboard($(".takenotedashboard")[0], {
space: space,
bag: space + "_public",
host: "/"
});
</script>
</body>
</html>
I had occasion today to think about //following// in TiddlySpace. From the outset the idea of following was to become aware of other content, constrained in a collection of people you have indicated that you care about, and then through that awareness //curate// your own content. As implemented that meant that if you made a tiddler and one of the people you follow made a tiddler with the same title, you'd know about it and be able to improve your own tiddler as a result of the exposure to other stuff. Effectively there would be a kind of dialectic going on, the other tiddlers informing you, allowing you to synthesize your tiddler into some form of betterness.
(This was the original idea, things have changed a bit in the implementation, presentation, and use since then.)
This dialectic and curative (?) process is a powerful one and had we stuck to it in our implementation we might have created a unique interface for information improvement. However I now see, with hindsight, that what we've ended up doing is creating a hybrid between curation and conversation that is neither good at curation nor at conversation. I think this is because we conflated conversation //about// a tiddler with conversation //in// a tiddler and reified and encouraged this idea via the reply link.
Our recent thoughts about making backlinks more visible in the interface may help to remedy this problem but I think we still need to go back to think more about how and where we want tiddlers to be engaged as [[stock or flow|Stocks and Flows]]@cdent.
!URL
http://adrianshort.co.uk/2011/09/25/its-the-end-of-the-web-as-we-know-it/
!Description
Social networks have changed all that. Facebook and Twitter now wield enormous power over the web by giving their members ways to find and share information using tools that work in a social context. There’s no obvious way to replicate this power out on the open web of independent websites tied together loosely by links and search engine results.
!URL
http://theoatmeal.com/comics/facebook_likes
!Description
\o/
!URL
http://www.thinkature.com/
!Description
whiteboardy thingie
!URL
http://www.blogotheque.net/article.php3?id_article=2577
!Description
!URL
http://arstechnica.com/tech-policy/news/2011/01/netflix-charging-by-the-gigabyte-is-ridiculous.ars
!Description
Wired ISPs have large fixed costs of building and maintaining their last mile network of residential cable and fiber. The ISPs’ costs, however, to deliver a marginal gigabyte, which is about an hour of viewing, from one of our regional interchange points over their last mile wired network to the consumer is less than a penny, and falling, so there is no reason that pay-per-gigabyte is economically necessary. Moreover, at $1 per gigabyte over wired networks, it would be grossly overpriced.
!Notes
I've been wondering about this sort of thing. The pricing structure for network connectivity has always seemed messed up to me. There are large capital outlays, but once the infrastructure is in place...?
var user, userbag;
var host = "http://tiddlyspace.com";
var app = {
friends: [],
tiddlers: {}
}
$.ajaxSetup({
beforeSend: function(xhr) {
xhr.setRequestHeader("X-ControlView", "false");
}
});
$("#message").hide();
function printMessage(txt) {
$("#message").show().removeClass("error").text(txt);
}
function printError(txt) {
$("html,body").animate({ scrollTop: $(item).offset().top },
1000);
$("#message").show().addClass("error").text(txt);
}
var simpleDate = (function() {
var measures = {
second: 1,
minute: 60,
hour: 3600,
day: 86400,
week: 604800,
month: 2592000,
year: 31536000
};
var chkMultiple = function(amount, type) {
return (amount > 1) ? amount + " " + type + "s":"a " + type;
};
return function(thedate) {
var dateStr, amount,
current = new Date().getTime(),
diff = (current - thedate.getTime()) / 1000; // work with seconds
if(diff > measures.year) {
amount = Math.round(diff/measures.year);
dateStr = "about " + chkMultiple(amount, "year") + " ago";
} else if(diff > measures.month) {
amount = Math.round(diff/measures.month);
//if(typeof amount == "")
dateStr = "about " + chkMultiple(amount, "month") + " ago";
} else if(diff > measures.week) {
amount = Math.round(diff/measures.week);
dateStr = "about " + chkMultiple(amount, "week") + " ago";
} else if(diff > measures.day) {
amount = Math.round(diff/measures.day);
dateStr = "about " + chkMultiple(amount, "day") + " ago";
} else if(diff > measures.hour) {
amount = Math.round(diff/measures.hour);
dateStr = "about " + chkMultiple(amount, "hour") + " ago";
} else if(diff > measures.minute) {
amount = Math.round(diff/measures.minute);
dateStr = "about " + chkMultiple(amount, "minute") + " ago";
} else {
dateStr = "a few seconds ago";
}
return dateStr;
};
})();
function prettyDate(t) {
var date = new Date(Date.UTC(
parseInt(t.substr(0, 4), 10),
parseInt(t.substr(4, 2), 10) - 1,
parseInt(t.substr(6, 2), 10),
parseInt(t.substr(8, 2), 10),
parseInt(t.substr(10, 2), 10),
parseInt(t.substr(12, 2) || "0", 10),
parseInt(t.substr(14, 3) || "0", 10)
));
return simpleDate(date);
}
function endsWith(str, suffix) {
return str.indexOf(suffix) == str.length - suffix.length;
}
function isShadow(tid) {
var shadows = ["MarkupPreHead", "DefaultTiddlers", "PageTemplate", "SideBarTabs",
"GettingStarted", "MainMenu", "SiteTitle", "SiteSubtitle", "ColorPalette",
"SiteIcon", "ViewTemplate", "EditTemplate", "ServerSettings", "MarkupPostHead",
"MarkupPostBody", "MarkupPreBody"];
return tid.title.indexOf("StyleSheet") === 0 ||
tid.title.indexOf("SideBar") === 0 ||
shadows.indexOf(tid.title) > -1 || endsWith(tid.title, "SetupFlag") ? true : false;
}
function isPlugin(tid) {
return tid.tags.indexOf("systemConfig") > -1 ? true : false;
}
function isArtifact(tid) {
var follow = tid.tags.indexOf("follow") > -1;
var type = tid.type;
if(follow || type) {
return true;
} else {
return false;
}
}
function chooseTiddlers(tiddlers) {
var _tiddlers = [];
for(var i = 0; i < tiddlers.length; i++) {
var tid = tiddlers[i];
if(!isPlugin(tid) && !isShadow(tid) && !isArtifact(tid)) {
_tiddlers.push(tid);
}
}
return _tiddlers;
}
var tiddlers = {};
function collectTiddlers(friend) {
$.ajax({ dataType: "json",
url: "/search?q=modifier:" + friend + "&select=modified:>3d&sort=-modified",
error: function() {
$(container).addClass("errorFriend");
oncompletion();
},
success: function(tiddlers) {
app.tiddlers[friend] = tiddlers;
renderFriends();
}
});
}
function removeFriend(friend) {
var tiddler = new tiddlyweb.Tiddler("@" + friend, userbag);
var success = function() {
printMessage("User " + friend + " removed from friends");
var newFriends = [];
var friends = app.friends;
for(var i = 0; i < friends.length; i++) {
var f = friends[i];
if(f !== friend) {
newFriends.push(f);
}
}
app.friends = newFriends;
$("#friend-" + friend).hide(2000);
};
tiddler["delete"](success, function() {
var old = new tiddlyweb.Tiddler(friend, userbag);
old["delete"](success, function() {
printError("Unable to remove friend " + friend);
})
})
}
function showTiddlers(friend) {
var tiddlers = app.tiddlers[friend];
var container = $("#displayArea").empty()[0];
$("<h3 />").text("Tiddlers from @" + friend).appendTo(container);
if(!tiddlers) {
$("<span />").text("Tiddlers not yet loaded. Please try again later.").appendTo(container);
} else {
var tidList = $("<ul />").appendTo(container)[0];
if(tiddlers.length === 0) {
$("<li />").text("No recent tiddlers from this user").appendTo(container);
}
for(var i=0; i < tiddlers.length; i++) {
var tiddler = tiddlers[i];
var item = $("<li />").appendTo(tidList)[0];
var win;
var space = tiddler.bag.split("_")[0];
var spaceUrl = "http://" + space + ".tiddlyspace.com";
var path = "/bags/" + tiddler.bag + "/tiddlers/" + encodeURIComponent(tiddler.title);
var link = $("<a />").text(tiddler.title).
attr("href", spaceUrl + path).
data("path", path).
click(function(ev) {
var win = $(ev.target).data("win");
if($(ev.target).hasClass("active")) {
$(win).toggle(1000);
} else {
$(ev.target).addClass("active");
$(".text", win).text("loading...");
$(win).show();
$.ajax({
url: $(ev.target).data("path"),
data: {
render: "y"
},
dataType: "json",
success: function(tiddler) {
if(tiddler.render) {
$(".text",win).html(tiddler.render);
} else {
$(".text",win).text("Cannot view tiddler here.");
}
$(win).show(1000);
},
error: function() {
$(".text", win).text("error loading that tiddler");
}
});
}
ev.preventDefault();
}).
appendTo(item)[0];
var space = tiddler.bag.split("_")[0];
$("<span />").text(" in ").appendTo(item);
$("<a />").attr("href", spaceUrl).text(space).appendTo(item);
$("<span />").text(" (" + prettyDate(tiddler.modified) + ")").appendTo(item);
win = $("<div />").addClass("tiddler section main").appendTo(item)[0];
$("<div />").addClass("text").appendTo(win);
var toolbar = $("<div />").addClass("toolbar").appendTo(win)[0];
var extra = $("<div />").addClass("extra").appendTo(win)[0];
$("<button />").data("bag", tiddler.bag).data("title", tiddler.title).text("give feedback").
data("revision", tiddler.revision).click(function(ev) {
var title = $(ev.target).data("title");
var revision = $(ev.target).data("revision");
var bag = $(ev.target).data("bag");
var revisionURL = host + "/bags/" + bag + "/tiddlers/" + encodeURIComponent(title) + "/revisions/" + revision;
var space = bag.split("_")[0];
var area = $(ev.target).parents(".tiddler").children(".extra")[0];
$(area).hide();
$("<textarea />").appendTo(area);
$("<button />").text("save feedback").click(function(ev) {
var tid = new tiddlyweb.Tiddler("Feedback for " + title, userbag);
tid.tags = ["feedback", "@" + space];
tid.text = ["In reply to [[", title, "]]@", space,
" (revision [[", revision, "|", revisionURL, "]])\n\n"].join("") + $("textarea", area).val();
tid.put(function(tiddler) {
$(area).empty();
$("<span />").text("your comment: ").appendTo(area);
$("<a />").attr("href", "/" + encodeURIComponent(tiddler.title)).text(tiddler.title).appendTo(area);
}, function() {
printError("error commenting!");
});
}).appendTo(area);
$(area).show(1000);
ev.preventDefault();
$(ev.target).remove();
return false;
}).appendTo(toolbar);
$(win).hide();
$(link).data("win", win);
}
}
}
var cache = {};
function renderFriend(list, friend) {
var bag = friend + "_public";
var srcImage = host + "/bags/" + bag + "/tiddlers/SiteIcon";
if(!cache[srcImage]) {
var img = new Image()
img.src = srcImage;
cache[srcImage] = img;
}
var item = $("<li />").addClass("friend").attr("id", "friend-" + friend).appendTo(list)[0];
$(cache[srcImage]).attr("alt", friend).attr("title", friend).
css({ width: 48, height: 48 }).appendTo(item);
var heading = $("<h2>").appendTo(item)[0];
$("<a />").attr("href", "#friend-" + friend).attr("name", "friend-" + friend).text(friend).appendTo(heading);
$("<button />").data("who", friend).text("remove from friends").
click(function(ev) {
if(confirm("Are you sure you want to remove " + friend + " as a friend?")) {
removeFriend($(ev.target).data("who"));
}
}).appendTo(item)[0];
var tids = app.tiddlers[friend] ? app.tiddlers[friend] : false;
if(tids !== false) {
if(tids.length === 0) {
$(item).addClass("inactiveFriend");
}
$("<a href='#displayArea' class='tiddlers' />").html("<span class='count'>" + tids.length + "</span> recent tiddlers.").
data("who", friend).
appendTo(item)[0];
$(item).mousedown(function(ev) {
var friendEl = $(ev.target).closest(".friend")[0];
var who = $(".tiddlers", friendEl)[0]
if(who) {
who = $(who).data("who");
$(".friend").removeClass("active");
$(ev.target).addClass("active");
$(ev.target).parents(".friend").addClass("active");
showTiddlers(who);
}
});
} else {
$(item).addClass("inactiveFriend");
}
$(item).mouseover(function(ev) {
if($(ev.target).hasClass("friend")) {
$(ev.target).addClass("hover");
}
}).mouseout(function(ev) {
if($(ev.target).hasClass("friend")) {
$(ev.target).removeClass("hover");
}
});
return item;
}
function renderFriends() {
$("#friends ul").remove();
var list = $("<ul />").appendTo("#friends")[0];
var friends = app.friends;
if(friends.length === 0) {
$("<li />").text("No friends.").appendTo(list);
}
for(var i = 0; i < friends.length; i++) {
var friend = friends[i];
renderFriend(list, friend);
}
}
function followWidget() {
$("#friends").empty();
var container = $("<div />").addClass("addfriends").appendTo("#friends")[0];
$("<input />").attr("name", "friend").appendTo(container);
$("<button />").text("add friend").click(function(ev) {
var friend = $(ev.target).parent().children("[name='friend']").val();
if(app.friends.indexOf(friend) > -1) {
return printError("You already follow " + friend + "!");
}
var title;
if(friend.indexOf("@") !== 0) {
title = "@" + friend;
} else {
title = friend;
}
$.ajax({ dataType: "text", url: "/users/" + friend,
success: function() {
var tid = new tiddlyweb.Tiddler(title, userbag);
tid.tags = ["follow", "excludeLists"];
tid.put(function(tiddler) {
printMessage("Added friend " + friend);
renderFriend($("#friends ul")[0], friend);
window.location.hash = "#friend-" + friend;
}, function() {
printError("Failed to add friend " + friend);
})
},
error: function() {
printError("No one with name " + friend + " exists!");
}
});
}).appendTo(container);
var friends = app.friends;
for(var i = 0; i < friends.length; i++) {
collectTiddlers(friends[i]);
}
window.setTimeout(function() {
renderFriends();
}, 1000);
}
// initialise by loading friends
$.ajax({
url: "/status",
dataType: "json",
success: function(status) {
user = status.username;
userbag = new tiddlyweb.Bag(user + "_public", "/");
userbag.tiddlers().get(function(tiddlers) {
for(var i = 0; i < tiddlers.length; i++) {
var title = tiddlers[i].title;
if(title.indexOf("@") === 0) {
title = title.substr(1, title.length);
}
app.friends.push(title);
}
app.friends.sort();
followWidget();
}, function() {
}, "select=tag:follow");
}
})
!URL
http://blahsploitation.blogspot.com/2008/01/i-promised-to-explain-that-little-bit.html
!Description
some sample code for using generators as pipes
the teenage tolerance for poorly recorded sound and video is beyond my comprehension. clipping everywhere.
I'm enjoying @kosmaton's continued ruminations about stuff, including [[Free will]]@veminra:
>To believe in free will is, roughly, to believe that humans have control over themselves 'over and above' the physical, material processes occurring in and around them. This is nonsense.
The radio was talking about free will recently, some professional philosophers going on about it. One conclusion was that though a deterministic (or even scientific) view of the universe renders free will nonsense, we can't help ourselves from acting like it is so: believing in it (a bit of an irony in itself). The typical example is that because we experience gratitude and resentment we therefore (internally) conclude that people are responsible for their own actions, i.e. have made decisions which led them to behave as they did, and thus we attribute them with free will and in that action declare free will "real".
Huh. That's a bit roundabout. The speakers weren't trying to suggest that real doesn't matter, or social construction or something like that, but rather something very close to what kosmaton says: With an understanding of why we attribute free will we can better have "honest and correct discussion on responsibility and compassion."
Myself, I tend to think of these things in terms of utility. It is useful for me to a) grant a perception of free will on others b) expect such a perception from them; otherwise life is just too damn depressing. Not because of lack of meaning but because putting free will into the picture provides a locus for problem solving, discovery and learning: Change and knowledge starts at the individual. No doubt the individual is part of larger system and no doubt they are subject to the whimsy of their molecules but each individual exists as a focused place to push.
/***
|''Name''|TiddlySpaceSearcher|
|''Version''|0.2.5|
|''Requires''|TiddlySpaceConfig TiddlySpaceFollowingPlugin|
***/
//{{{
(function($) {
var tiddlyspace = config.extensions.tiddlyspace;
var tsScan = config.macros.tsScan;
config.shadowTiddlers.SearchTemplate = "<<view server.bag SiteIcon label:no width:24 height:24 preserveAspectRatio:yes>> <<view server.bag spaceLink title external:no>> in space <<view server.bag spaceLink>>";
config.shadowTiddlers.StyleSheetSearch = [".resultsArea .siteIcon { display: inline; }",
".searchForm {text-align: left;}"].join("\n");
store.addNotification("StyleSheetSearch", refreshStyles);
var search = config.macros.tsSearch = {
locale: {
advanced: "Advanced Options",
header: "Search",
resultsHeader: "Results (%0)",
find: "find",
noResults: "No tiddlers matched your search query",
query: "QUERY: ",
error: "please provide a search query or a tag, modifier or title!",
titleAdvanced: "where the title is",
modifierAdvanced: "where the last modifier is",
spaceAdvanced: "only in the space: ",
notspaceAdvanced: "but not in the spaces: ",
tagsAdvanced: "with the tags: "
},
andConstructor: function(container, label, fieldname, negationMode) {
var tags = $("<div />").appendTo(container);
$('<span />').text(label).appendTo(tags);
var id = "area" + Math.random();
container = $("<span />").attr("id", id).appendTo(tags)[0];
function add(container) {
var el = $('<input type="text" />').attr("field", fieldname).appendTo(container);
if(negationMode) {
el.attr("negation", "true");
}
}
add(container);
var el = $("<button />").text("AND").click(function(ev) {
add($(ev.target).data("container"));
ev.preventDefault();
}).appendTo(tags);
$(el).data("container", container);
},
fieldConstructor: function(container, label, field) {
container = $("<div />").appendTo(container)[0];
$("<span />").text(label).appendTo(container);
$("<input />").attr("text", "input").attr("field", field).appendTo(container);
},
advancedOptions: function(form) {
var locale = search.locale;
var container = $("<div />").addClass("tsAdvancedOptions").appendTo(form)[0];
$("<h2/ >").text(search.locale.advanced).appendTo(container);
$("<div />").addClass("separator").appendTo(container);
search.fieldConstructor(container, locale.titleAdvanced, "title");
search.fieldConstructor(container, locale.modifierAdvanced, "modifier");
search.fieldConstructor(container, locale.spaceAdvanced, "space");
search.andConstructor(container, locale.notspaceAdvanced, "space", true);
search.andConstructor(container, locale.tagsAdvanced, "tag");
},
constructSearchQuery: function(form) {
var data = [], select = [];
var query = $("[name=q]", form).val();
if(query) {
data.push("q=%0".format(query));
}
// add tags, fields etc..
$("[field]", form).each(function(i, el) {
var val = $(el).val();
var name = $(el).attr("field");
var negate = $(el).attr("negation") == "true";
if(val && name) {
val = encodeURIComponent(val);
val = negate ? "!" + val : val;
if(name == "space") {
val += "_public";
name = "bag";
}
if(negate) {
select.push("select=%0:%1".format(name,val));
} else {
var prefix = data.length === 0 ? "q=" : "";
data.push('%0%1:"%2"'.format(prefix, name, val));
}
}
});
var dataString = data.join(" ");
if(dataString.length === 0 && !query) {
return false;
}
var selectStatement = select.join("&");
if(dataString.length > 0 && selectStatement.length > 0) {
dataString += "&";
}
dataString += selectStatement;
return "/search?%0".format(dataString);
},
constructForm: function(place) {
var locale = search.locale;
$("<h1 />").text(locale.header).appendTo(place);
var form = $("<form />").appendTo(place)[0];
$('<input type="text" name="q" />').appendTo(form);
$('<input type="submit" />').val(locale.find).appendTo(form);
search.advancedOptions(form);
var query = $('<h2 class="query"/>').appendTo(place)[0];
var results = $("<div />").appendTo(place).addClass("resultsArea")[0];
var lookup = function(url) {
if(!url) {
results.empty().addClass("error").text(locale.error);
return;
}
config.extensions.tiddlyweb.getStatus(function(status) {
$(query).text(locale.query);
var href = status.server_host.url + url;
$("<a />").attr("href", href).text(href).appendTo(query);
tsScan.scan(results, { url: url, emptyMessage: search.locale.noResults, cache: true,
template: "SearchTemplate", sort: "title", callback: function(tiddlers) {
$("<h2 />").text(locale.resultsHeader.format(tiddlers.length)).prependTo(results);
}
});
});
};
$(form).submit(function(ev) {
ev.preventDefault();
var url = search.constructSearchQuery(form);
config.macros.tsSearch.lastSearch = url;
lookup(url);
});
if(search.lastSearch) {
lookup(search.lastSearch);
}
return form;
},
handler: function(place) {
var container = $("<div />").addClass("searchForm").appendTo(place)[0];
search.constructForm(container);
}
}
})(jQuery);
//}}}
!URL
http://www.geocities.com/bnibali/PedroMain.html
!Description
!URL
http://mechanicalcat.net/tech/webunit/
!Description
/bags/common/tiddlers/jquery.js
/htmljs-takenoteedit.js
!URL
http://conferences.oreillynet.com/cs/os2007/view/e_sess/14016
!Description
taste of haskell presentation video
!URL
http://www.davemacleod.com/program.html
!Description
That Bolton doesn't know this[1] means he doesn't or can't read. Yet another provincial, illiterate ignoramous speaking from a position of authority.
[1] The existence of right wing extremism in Norway. [[cf.|http://www.mediaite.com/tv/john-bolton-raises-doubts-norway-bomber-worked-alone-or-has-right-wing-connections/]]
I'm pretty sure Vince Cable should be congratulated, not censured, for targeting Murdoch.
!URL
http://www.dabeaz.com/ply/
!Description
!URL
http://codespeak.net/py/dist/test.html
!Description
!SpaceUnplugged
{{unpluggedSpaceTab{
{{wizard{
<<image unsyncedIcon width:48>> <<message messages.syncExplanation>>
}}}
{{wizard syncKey{
{{keyHeading{
Key}}}
{{changedServer keyItem{<<message macros.sync.syncStatusList.changedServer.text>>}}} {{changedBoth keyItem{<<message macros.sync.syncStatusList.changedBoth.text>>}}} {{changedLocally keyItem{<<message macros.sync.syncStatusList.changedLocally.text>>}}} {{notFound keyItem{<<message macros.sync.syncStatusList.notFound.text>>}}}
}}}
<<sync>>
!Menu
<<message messages.memberStatus>> <<homeLink>>
{{unsyncedList{<<message messages.syncListHeading>> <<list filter [is[unsynced]]>>}}}
<<tabs txtTiddlySpaceTab
search "search across TiddlySpace" Backstage##Search
tiddlers "tiddlers control panel" Backstage##BackstageTiddlers
plugins "Manage installed plugins" PluginManager
batch "Perform batch operations on public/private tiddlers" Backstage##BatchOps
tweaks "Tweak the appearance and behaviour of TiddlyWiki" AdvancedOptions
"import/export" "Import/export tiddlers from/to a TiddlyWiki" Backstage##ImportExport
>>
running TiddlySpace@glossary version <<message extensions.tiddlyweb.status.tiddlyspace_version>>
{{autotable{
<<tiddler Backstage##Resources>>
}}}
!Resources
[[blog|@@blog]] [[documentation|@@docs]] [[featured spaces|@@featured]]
!Search
<<tsSearch>>
!ImportExport
<<fileImport>>
You can download this TiddlySpace as an offline TiddlyWiki:
{{chunkyButton{<<exportSpace>>}}}
!BackstageTiddlers
|upload a <<message messages.privacySetting>> file: <<binaryUpload>>|<<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<saveChanges>>|
|>|<<search>>|
|>|<<tiddler Backstage##Tiddlers>>|
!Tiddlers
<<tabs
txtMainTab
"Recent" "Recently edited tiddlers" TabTimeline
"All" "All tiddlers" TabAll
"Public" "All public tiddlers" [[TiddlySpaceTabs##Public]]
"Private" "All private tiddlers" [[TiddlySpaceTabs##Private]]
"Tags" "All tags" TabTags
"Spaces" "Tiddlers grouped by space" [[TiddlySpaceTabs##Spaces]]
"Missing" "Missing tiddlers" TabMoreMissing
"Orphans" "Orphaned tiddlers" TabMoreOrphans
"Shadows" "Shadowed tiddlers" TabMoreShadowed
>>
!BatchOps
<<tabs
txtPublisherTab
"Private" "Move tiddlers from private to public" Backstage##BatchPrivate
"Public" "Move tiddlers from public to private" Backstage##BatchPublic
>>
!BatchPrivate
<<TiddlySpacePublisher type:private>>
!BatchPublic
<<TiddlySpacePublisher type:public>>
Today's trip to London was especially debilitating. By the time I was on the train home, I felt I was drowning and needed some kind of combined shot of adrenaline and glucose. I don't know what happens. It feels like some combination of diesel fume poisoning, lack of oxygen in airless buildings and some hidden variable.
I really makes me not want to go back.
----
For the sake of further data, this morning I was heavily congested and was blowing black particles out my nose. I felt swollen throughout my body, and when I went to the climbing gym I felt under oxygened.
/***
|''Name''|TiddlySpaceRevertRevision|
|''Description''|Revert to a previous revision|
|''Author''|BenGillies|
|''Version''|0.1|
|''Status''|unstable|
|''Source''|http://github.com/TiddlySpace/tiddlyspace|
|''CodeRepository''|http://github.com/TiddlySpace/tiddlyspace|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.6.0|
|''Requires''|TiddlyWebAdaptor TiddlySpaceRevisionView|
!Usage
Add a control button to revert to a particular revision.
The button must be called from within a revision, as generated by TiddlySpaceRevisionView
!Code
***/
//{{{
(function($) {
config.commands.revert = {
text: "revert",
tooltip: "make this revision the current one",
handler: function(ev, src, title) {
var revElem = story.getTiddler(title);
var tidToRevert = store.getTiddler($(revElem).attr("revName"));
var revision = store.getTiddler(title);
if ((revision) && (tidToRevert)) {
tidToRevert.text = revision.text;
var newFields = merge({}, revision.fields);
for (var fieldName in newFields) {
if (fieldName.substr(0, 7) === "server.") {
delete newFields[fieldName];
}
}
merge(tidToRevert.fields, newFields);
tidToRevert.tags = merge([], revision.tags);
tidToRevert.fields.changecount = 1;
delete tidToRevert.fields.doNotSave;
store.saveTiddler(tidToRevert.title, tidToRevert.title,
tidToRevert.text, null, null, tidToRevert.tags,
tidToRevert.fields, false, tidToRevert.created, tidToRevert.creator);
autoSaveChanges(true);
}
}
};
})(jQuery);
//}}}
Ipswich bound, via a night in London. Been a while since I've been on a train.
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="2 724 68 55"
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
<g>
<path d="M 2.25 756 L 11.25 747 L 24.75 760.4994 L 60.750004 724.4994 L 69.75 733.49902
L 24.749977 778.49976 Z" fill="#101010" class="glyph"/>
</g>
</g>
</svg>
/***
|''Name''|ImportExternalLinksPlugin|
|''Author''|Jon Robson|
|''Version''|0.3.0|
|''Requires''|TiddlySpaceConfig TiddlySpaceLinkPlugin TiddlySpaceCloneCommand|
|''Description''|Turns space links into ajax links so you don't have to leave the comfort of your own TiddlyWiki|
!Notes
This maybe should hides the editTiddler, cloneTiddler commands. Ideally the toolbar commands should hide themselves but we need a strong concept of "this is a sucked in tiddler" to do that.
***/
//{{{
(function($){
var tiddlyspace = config.extensions.tiddlyspace;
_createSpaceLink = createSpaceLink;
if(_createSpaceLink) {
createSpaceLink = function(place, spaceName, title, alt, isBag) {
var tooltip = "Click to open in current document. Right click to open in original space.";
_createSpaceLink(place, spaceName, title, alt, isBag);
var workspace;
if(isBag) {
workspace = "bags/%0".format(spaceName);
} else {
workspace = "bags/%0_public".format(spaceName);
}
if(title && spaceName != tiddlyspace.currentSpace.name) {
var link = $("a:last", place);
var newlink = $("<a />").text("[link]").after(link[0]);
// very hacky
var updateInterval = setInterval(function() {
var href = link.attr("href");
if(href) {
$(newlink).attr("href", href);
clearInterval(updateInterval);
}
}, 200);
if(link.parent(".replyLink").length == 0) { // don't suck in a reply link.
link.attr("title", tooltip).addClass("importLink").click(function(ev) {
if(config.floorboards) {
config.floorboards.pushUnique("%0_public".format(spaceName));
}
tiddlyspace.displayServerTiddler(ev.target, title, workspace, function(el) {
// TODO: the commands should disable themselves based on the meta information.
//$("[commandname=editTiddler], [commandname=cloneTiddler]", el).hide();
});
ev.preventDefault();
});
}
}
};
}
var _cloneHandler = config.commands.cloneTiddler.handler;
config.commands.cloneTiddler.handler = function(event, src, title) {
var _tiddler = store.getTiddler(title);
var source = _tiddler ? _tiddler.fields["server.bag"] : false;
var imported = _tiddler ? _tiddler.fields["tiddler.source"] : false;
var realTitle = _tiddler ? _tiddler.fields["server.title"] : title;
_cloneHandler.apply(this, [event, src, title]);
var tidEl = story.getTiddler(title);
$(story.getTiddlerField(title, "title")).val(realTitle);
if(source) {
$("<input />").attr("type", "hidden").attr("edit", "tiddler.source").val(source).appendTo(tidEl);
$("<input />").attr("type", "hidden").attr("edit", "server.activity").appendTo(tidEl);
}
}
})(jQuery);
//}}}
http://www.abbeyhousegardens.co.uk/
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script id="versionArea" type="text/javascript">
//<![CDATA[
var version = {title: "TiddlyWiki", major: 2, minor: 6, revision: 5, date: new Date("October 6, 2011"), extensions: {}};
//]]>
</script>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="copyright" content="
TiddlyWiki created by Jeremy Ruston, (jeremy [at] osmosoft [dot] com)
Copyright (c) Jeremy Ruston 2004-2007
Copyright (c) UnaMesa Association 2007-2011
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.
Neither the name of the UnaMesa Association nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
" />
<!--PRE-HEAD-START-->
<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
<!--PRE-HEAD-END-->
<title>
</title>
<style id="styleArea" type="text/css">
#saveTest {display:none;}
#messageArea {display:none;}
#copyright {display:none;}
#storeArea {display:none;}
#storeArea div {padding:0.5em; margin:1em 0em 0em 0em; border-color:#fff #666 #444 #ddd; border-style:solid; border-width:2px; overflow:auto;}
#shadowArea {display:none;}
#javascriptWarning {width:100%; text-align:center; font-weight:bold; background-color:#dd1100; color:#fff; padding:1em 0em;}
#contentWrapper.loading {
background-image: url(/SiteIcon);
background-repeat: no-repeat;
background-size: 48px 48px;
padding: 20px;
margin: auto;
width: 50%;
border: solid 1px black;
padding: 20px;
padding-left: 60px;
margin-top: 10px;
}</style>
<!--POST-HEAD-START-->
<!--POST-HEAD-END-->
</head>
<body onunload="if(window.unload) unload();">
<!--PRE-BODY-START-->
<!--PRE-BODY-END-->
<div id="copyright">
Welcome to TiddlyWiki created by Jeremy Ruston; Copyright © 2004-2007 Jeremy Ruston, Copyright © 2007-2011 UnaMesa Association
</div>
<noscript>
<div id="javascriptWarning">
This page requires JavaScript to function properly.<br /><br />If you are using Microsoft Internet Explorer you may need to click on the yellow bar above and select 'Allow Blocked Content'. You must then click 'Yes' on the following security warning.
</div>
</noscript>
<div id="saveTest"></div>
<div id="backstageCloak"></div>
<div id="backstageButton"></div>
<div id="backstageArea"><div id="backstageToolbar"></div></div>
<div id="backstage">
<div id="backstagePanel"></div>
</div>
<div id="contentWrapper"></div>
<div id="contentStash"></div>
<div id="shadowArea">
<div title="MarkupPreHead">
<pre><!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
</pre>
</div>
<div title="ColorPalette">
<pre>Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
</pre>
</div>
<div title="StyleSheetColors">
<pre>/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}
h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}
.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}
.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}
.tabSelected {color:[[ColorPalette::PrimaryDark]];
background:[[ColorPalette::TertiaryPale]];
border-left:1px solid [[ColorPalette::TertiaryLight]];
border-top:1px solid [[ColorPalette::TertiaryLight]];
border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}
#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}
.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}
.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}
#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}
.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}
.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}
.tiddler .defaultCommand {font-weight:bold;}
.shadow .title {color:[[ColorPalette::TertiaryDark]];}
.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}
.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}
.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}
.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}
.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}
.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}
.imageLink, #displayArea .imageLink {background:transparent;}
.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}
.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}
.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}
.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}
.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}
.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}
.readOnly {background:[[ColorPalette::TertiaryPale]];}
#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:alpha(opacity=60);}
/*}}}*/</pre>
</div>
<div title="StyleSheetLayout">
<pre>/*{{{*/
* html .tiddler {height:1%;}
body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}
h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}
hr {height:1px;}
a {text-decoration:none;}
dt {font-weight:bold;}
ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}
.txtOptionInput {width:11em;}
#contentWrapper .chkOptionInput {border:0;}
.externalLink {text-decoration:underline;}
.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}
.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}
/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}
#mainMenu .tiddlyLinkExisting,
#mainMenu .tiddlyLinkNonExisting,
#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}
.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0 1em 1em; left:0; top:0;}
.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}
#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}
#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 0.3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}
.wizard {padding:0.1em 1em 0 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0 0; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0;}
.wizardFooter .status {padding:0 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em;}
#messageArea {position:fixed; top:2em; right:0; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em;}
#messageArea a {text-decoration:underline;}
.tiddlerPopupButton {padding:0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em; margin:0;}
.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}
.tabset {padding:1em 0 0 0.5em;}
.tab {margin:0 0 0 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}
#contentWrapper {display:block;}
#splashScreen {display:none;}
#displayArea {margin:1em 17em 0 14em;}
.toolbar {text-align:right; font-size:.9em;}
.tiddler {padding:1em 1em 0;}
.missing .viewer,.missing .title {font-style:italic;}
.title {font-size:1.6em; font-weight:bold;}
.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}
.tiddler .button {padding:0.2em 0.4em;}
.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}
.footer {font-size:.9em;}
.footer li {display:inline;}
.annotation {padding:0.5em; margin:0.5em;}
* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0 0.25em; padding:0 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}
.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0 3px 0 3px;}
.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}
.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0; font-size:.9em;}
.editorFooter .button {padding-top:0; padding-bottom:0;}
.fieldsetFix {border:0; padding:0; margin:1px 0px;}
.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}
* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0; right:0;}
#backstageButton a {padding:0.1em 0.4em; margin:0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin-left:3em; padding:1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}
.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
</pre>
</div>
<div title="StyleSheetLocale">
<pre>/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/</pre>
</div>
<div title="StyleSheetPrint">
<pre>/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
#displayArea {margin: 1em 1em 0em;}
noscript {display:none;} /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
}
/*}}}*/</pre>
</div>
<div title="PageTemplate">
<pre><!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}--></pre>
</div>
<div title="ViewTemplate">
<pre><!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}--></pre>
</div>
<div title="EditTemplate">
<pre><!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}--></pre>
</div>
<div title="GettingStarted">
<pre>To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>></pre>
</div>
<div title="OptionsPanel">
<pre>These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser
Your username for signing your edits. Write it as a [[WikiWord]] (eg [[JoeBloggs]])
<<option txtUserName>>
<<option chkSaveBackups>> [[SaveBackups]]
<<option chkAutoSave>> [[AutoSave]]
<<option chkRegExpSearch>> [[RegExpSearch]]
<<option chkCaseSensitiveSearch>> [[CaseSensitiveSearch]]
<<option chkAnimate>> [[EnableAnimations]]
----
Also see [[AdvancedOptions]]</pre>
</div>
</div>
<!--POST-SHADOWAREA-->
<div id="storeArea">
</div>
<!--POST-STOREAREA-->
<!--POST-BODY-START-->
<!--POST-BODY-END-->
<script id="jsArea" type="text/javascript">
//<![CDATA[
//]]>
</script>
<script id="jsdeprecatedArea" type="text/javascript">
//<![CDATA[
//]]>
</script>
<script id="jslibArea" type="text/javascript">
//<![CDATA[
//]]>
</script>
<script id="jqueryArea" type="text/javascript">
//<![CDATA[
//]]>
</script>
<script type="text/javascript" src="/bags/common/tiddlers/jquery.js"></script>
<script type="text/javascript" src="/bags/common/tiddlers/alpha_jQuery.twStylesheet.js"></script>
<script type="text/javascript" src="/_tiddlywiki-app.js"></script>
<script type="text/javascript" src="/bags/common/tiddlers/backstage.js"></script>
<!--POST-SCRIPT-START-->
<!--POST-SCRIPT-END-->
</body>
</html>
<<view title link>>
//''<<view 'server.content-type' text>>''//
Once you have some content then you may choose to determine a tiddler, or set of tiddlers to display each time you load ~TiddlySpace. This is determined by the [[DefaultTiddlers]].
<html><hr><html>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<title>This Space</title>
<script type='text/javascript' src='/bags/common/tiddlers/backstage.js'></script>
<link href="/bags/common/tiddlers/profile.css" type='text/css' rel='stylesheet' >
<link href="/bags/common/tiddlers/admin.css" type='text/css' rel='stylesheet' >
</head>
<body>
<div id="container">
<div id="text-html" class="main section">
<a class="app" href="/apps">back to apps</a>
<div class="left">
<h2>About this space <button class='toggleNext'>show</button></button></h2>
<div id="siteinfo"></div>
<h2>Site Icon</h2>
<div>
<img id="siteicon" class="siteicon">
<form id="upload" method="POST" enctype="multipart/form-data">
<input type="hidden" name="title" value="SiteIcon" />
<input type="hidden" name="tags" value="excludeLists">
<input type="hidden" name="csrf_token" class="csrf" />
<input type="file" name="file" />
<input type="submit" value="upload" />
</form>
</div>
<h2>Vital Statistics</h2>
<div id="info">please wait while information is loaded about this space...</div>
</div>
<div class="right">
<div class="ts-membership">
<h2>
Add Member
<a href="http://docs.tiddlyspace.com/What%20is%20a%20member%3F" title="What is a Member?" class="help">What is a Member?</a>
</h2>
<div>
<p>Add a new member to your space by entering their name below. Enter a space to add all existing members of that space.</p>
<form class="ts-members">
<input class="inputBox" type="text" name="username">
<input type="submit" value="Add Member" />
</form>
</div>
<h2>
Existing Members <button class='toggleNext'><</button></button>
</h2>
<div>
Your space currently has the following members:
<ul class="ts-members"></ul>
</div>
<h2>
Include Space
<a class="help" href="http://docs.tiddlyspace.com/What%20is%20space%20inclusion%3F" title="What is inclusion?">What is Inclusion?</a>
</h2>
<form class="ts-includes">
<input class="inputBox" type="text" name="spacename">
<input type="submit" value="Include Space" />
</form>
</div>
<div>
<h2>Included Spaces <button class='toggleNext'><</button></button></h2>
<div>
This space includes the following spaces:
<ul class="ts-includes"></ul>
</div>
</div>
</div>
<div class="clear"></div>
</div>
</div>
<script type='text/javascript' src='/bags/common/tiddlers/jquery.js'></script>
<script type='text/javascript' src='/bags/tiddlyspace/tiddlers/chrjs'></script>
<script type='text/javascript' src='/bags/common/tiddlers/chrjs.space'></script>
<script type='text/javascript' src='/bags/common/tiddlers/chrjs.users'></script>
<script type='text/javascript' src='/bags/common/tiddlers/chrjs.identities'></script>
<script type='text/javascript' src='/bags/tiddlyspace/tiddlers/TiddlySpaceCSRF'></script>
<script type='text/javascript' src='/bags/common/tiddlers/jquery-form.js'></script>
<script type='text/javascript' src="/bags/common/tiddlers/siteiconupload.js"></script>
<script type='text/javascript' src="/bags/common/tiddlers/ts.js"></script>
<script type="text/javascript">
ts.init(function(ts) {
if(!ts.currentSpace) {
return;
}
var address = window.location.hostname.split(".");
var spaceName = address[0];
var publicBag = spaceName + "_public";
$("#siteUrl").text(window.location.hostname);
initSiteIconUpload(spaceName);
function countTiddlers(members) {
var numMembers = members ? members.length : false;
var publicBagUrl = "/bags/" + publicBag + "/tiddlers";
var url = members ? "/bags/" + spaceName + "_private/tiddlers" :
publicBagUrl;
$.ajax({ url: url, dataType: "text",
success: function(tiddlers) {
var numTiddlers = $.trim(tiddlers).split("\n").length;
var html = "";
function printFullInfo(numPublicTiddlers) {
var totalTiddlers = numPublicTiddlers + numTiddlers;
html += ['This space has ', numMembers,
' members, <a href="/tiddlers">', totalTiddlers,
' local tiddlers</a>, <a href="' + url + '">',
numTiddlers, ' are private</a> and <a href="',
publicBagUrl, '">',
numPublicTiddlers, ' public</a>.'].join("");
$("#info").html(html);
}
if(numMembers) {
$.ajax({
url: publicBagUrl,
dataType: "text",
success: function(tiddlers) {
printFullInfo($.trim(tiddlers).split("\n").length);
}
});
} else {
html += 'This space has <a href="' + url + '">' + numTiddlers + " public tiddlers</a>";
$("#info").html(html);
}
}
});
}
var space = new tiddlyweb.Space(spaceName, "/");
space.members().get(function(members) {
countTiddlers(members);
}, function() {
countTiddlers();
});
function complete(tiddler) {
$("#siteinfo .edit").show();
$("#siteinfo .value").data("tiddler", tiddler).
empty().html(tiddler.render);
}
function siteInfoEditor(tiddler) {
var errback = function() {
$("#siteinfo .edit").click();
$("<div class='error' />").text("Error occurred whilst saving.").prependTo("#siteinfo .value");
};
$("<button class='edit' />").click(function(ev) {
var editBtn = $(ev.target);
$(editBtn).hide();
var val = $(".value", $(ev.target).parent("#siteinfo")[0]);
var wikitext = $(val).data("tiddler").text;
var html = $(val).html();
$(val).empty();
$("<textarea />").val(wikitext).appendTo(val);
$("<button />").text("save").click(function(ev) {
var text = $("textarea", val).val();
$(val).empty().text("saving...");
tiddler.text = text;
tiddler.put(function() {
tiddler.get(function(tid) {
tiddler = tid;
complete(tid);
}, errback, "render=y");
}, errback);
$(editBtn).show();
}).appendTo(val);
$("<button />").text("cancel").
click(function(ev) {
complete(tiddler);
}).appendTo(val);
}).text("edit").appendTo("#siteinfo");
}
var tiddler = new tiddlyweb.Tiddler("SiteInfo", new tiddlyweb.Bag(publicBag, "/"));
$("<div class='value' />").text("(Loading SiteInfo tiddler)").data("tiddler", tiddler).appendTo("#siteinfo");
tiddler.get(
function(tid) {
tiddler = tid;
$("#siteinfo .value").data("tiddler", tid).html(tid.render || tid.text);
if($(document.body).hasClass("ts-member")) {
siteInfoEditor(tid);
}
},
function() {
$("#siteinfo .value").text("This space has not published any information about itself.");
if($(document.body).hasClass("ts-member")) {
siteInfoEditor(tiddler);
}
}, "render=1");
});
function toggleNext(ev) {
var label1 = "hide";
var label2 = "show";
var target = $(ev.target).parent().next();
var visible = $(ev.target).hasClass("open") ? true : false;
var label = visible ? label1 : label2;
$(target).stop(true, true);
if(!visible) {
$(target).slideDown(200);
$(ev.target).addClass("open").text(label1);
} else {
if($(target).parents().is(":hidden")) {
// see http://forum.jquery.com/topic/slideup-doesn-t-work-with-hidden-parent
$(target).hide();
} else {
$(target).slideUp(200);
}
$(ev.target).removeClass("open").text(label2);
}
}
// setup hide/show sliders
$(".toggleNext").each(function(i, el) {
$(el).addClass("open").click(toggleNext);
toggleNext({ target: el });
});
if(window != window.top) {
$("html").addClass("iframeMode");
$("a").live("click",function(ev) {
$(ev.target).attr("target", "_blank");
});
}
</script>
<!--[if lt IE 8]>
<script type="text/javascript" src="/bags/common/tiddlers/json2.js"></script>
<![endif]-->
</body>
</html>
!URL
http://worrydream.com/Tangle/
!Description
Tangle is a JavaScript library for creating reactive documents. Your readers can interactively explore possibilities, play with parameters, and see the document update immediately. Tangle is super-simple and easy to learn.
!Notes
Nicely elegant.
!URL
http://www.itworld.com/security/208851/closing-net
!Description
Looking around at the state of the Internet, I can't help but think of a net that's silently closing in on Internet users, as Software as a Service (SaaS) platforms increasingly try to get in-between users and the open Internet.
!URL
http://clearleft.com/jobs/
!Description
this guys look nice
[[Replies and Notifications]]
<<activity>>
@@Please do not modify this tiddler; it was created automatically upon space creation.@@
!URL
http://oxfordgeeks.net/
!Description
http://en.wikipedia.org/wiki/Purple_Numbers
An [[Engelbart]] idea that [[eek]] and I made webby with PurpleWiki and associated tools. I had it on my blog in February of 2003.
!URL
http://www.readwriteweb.com/hack/2011/02/pinboard-creator-maciej-ceglow.php
!Description
I believe that relying on very basic and well-understood technologies at the architectural level forces you to save all your cleverness and new ideas for the actual app, where it can make a difference to users.
!URL
http://www.bluesnews.com/abrash/chap70.shtml
!Description
If you want to be a game programmer, or for that matter any sort of programmer at all, here’s the secret to success in just two words: Ship it. Finish the product and get it out the door, and you’ll be a hero. It sounds simple, but it’s a surprisingly rare skill, and one that’s highly prized by software companies. Here’s why.
!Notes
Being obvious doesn't make it any less true.
!URL
https://github.com/PaulKinlan/WebIntents/blob/master/static/index.html#L144
!Description
window.channel.send(
method,
{
"data" : anObject
},
!Notes
Not super keen on the interface here. Would prefer something a bit more directly like HTTP. But other than that, cool.
/***
|''Name''|tsScanCountPlugin|
|''Description''|Provides ability to count tiddlers at a given tiddlyspace url and display a button that when clicked lists them. Also upgrades tsScan to replace any options containing with $1 with the current space|
|''Version''|0.2.0|
***/
//{{{
(function($) {
var tsScan = config.macros.tsScan;
var tiddlyspace = config.extensions.tiddlyspace;
var macro = config.macros.tsScanCount = {
cache: true,
countCache: {},
handler: function(place, macroName, params, w, paramString, tiddler) {
var container = $("<a href='#' class='button' />").attr("refresh", "macro").attr("macroName", macroName).appendTo(place)[0];
$(container).data("params", paramString);
macro.refresh(container);
},
refresh: function(container) {
var paramString = $(container).data("params");
var options = tsScan.getOptions(paramString, tiddler);
var url = options.url;
options.cache = macro.cache;
options.callback = function(tiddlers) {
options.cache = true;
macro.cache = true;
var count = tiddlers[0] ? tiddlers[0].fields['server.page.revision'] : 0;
var lastCount = macro.countCache[url] || 0;
if(lastCount != count) {
var interval, step = 0;
interval = window.setInterval(function() {
var last = step;
step += 1;
$(container).removeClass("step" + last);
if(step > 10) {
macro.countCache[url] = count;
window.clearInterval(interval);
} else {
$(container).addClass("step" + step);
}
}, 500)
}
$(container).empty().addClass("enabled").text(tiddlers.length).click(function(ev) {
$(ev.target).addClass("active");
var target = options.popupSelector ? $(options.popupSelector)[0] : ev.target;
var p = Popup.create(target, "div");
var container;
if(options.heading) {
container = $("<div />").addClass("heading").appendTo(p)[0];
wikify(store.getTiddlerText(options.heading) || "", container);
}
container = $("<div />").addClass("followTiddlersList").appendTo(p)[0];
tsScan.scan(container, options);
Popup.show();
ev.stopPropagation();
return false;
});
};
tsScan.scan(container, options);
}
}
var _getOptions = tsScan.getOptions;
config.macros.tsScan.getOptions = function(paramString, tiddler) {
var options = _getOptions.apply(this, arguments);
var optionsClone = {};
for(var i in options) {
if(typeof(options[i]) == "string") {
optionsClone[i] = options[i].format(tiddlyspace.currentSpace.name);
} else {
optionsClone[i] = options[i];
}
}
return optionsClone;
}
// every 5 minutes make tsScan update.
window.setInterval(function() {
macro.cache = false;
$("[macroName=tsScanCount]").each(function(i, el) {
macro.refresh(el);
});
}, 1000 * 60 * 5);
})(jQuery);
//}}}
!URL
http://twitter.com/#!/bayworx/status/108997321118859264
!Description
Best REST API I've developed for? Socialtext, hands down. It just does the right stuff and doesn't complain. #Socialtext, #REST
!Notes
I made this.
//{{{
(function() {
try {
var pageTracker = _gat._getTracker(store.getTiddlerText("AnalyticsConfig::tracker"));
pageTracker._trackPageview();
} catch(err) {}
// CustomTracker as a namespace for tracking related functions
var CustomTracker = {};
CustomTracker.track = function() {
// if (readOnly) {
try {
pageTracker._trackPageview(arguments);
} catch(err) {}
// }
};
// hijack displayTiddler to trigger tracking
var _displayTiddler = Story.prototype.displayTiddler;
Story.prototype.displayTiddler = function(srcElement, tiddler, template,
animate, unused, customFields, toggle, animationSrc) {
// log with the tracker
CustomTracker.track("/" + tiddler);
// call the original displayTiddler function
return _displayTiddler.apply(this,arguments);
};
// Call once for the initial page load
CustomTracker.track();
})();
//}}}
going to erlounge with zbir this evening
/***
|''Name''|TiddlySpaceCloneCommand|
|''Version''|0.5.7|
|''Description''|provides a toolbar command for cloning external tiddlers|
|''Status''|stable|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceCloneCommand.js|
|''Requires''|TiddlySpaceConfig TiddlySpaceFilters|
!Code
***/
//{{{
(function($) {
var cmd = config.commands;
var tiddlyspace = config.extensions.tiddlyspace;
var fieldsCache = {};
cmd.cloneTiddler = {
text: cmd.editTiddler.text,
tooltip: "Create a copy of this tiddler in the current space",
errorMsg: "Error publishing %0: %1",
isEnabled: function(tiddler) {
return !config.filterHelpers.is.local(tiddler) && !readOnly;
},
handler: function(ev, src, title) {
var tiddler = store.getTiddler(title);
if(tiddler) {
fieldsCache[title] = $.extend({}, tiddler.fields);
tiddler.fields["server.workspace"] = tiddlyspace.getCurrentWorkspace("private");
tiddler.fields["server.permissions"] = "read, write, create"; // no delete
delete tiddler.fields["server.page.revision"];
delete tiddler.fields["server.title"];
delete tiddler.fields["server.etag"];
// special handling for pseudo-shadow tiddlers
if(tiddlyspace.coreBags.contains(tiddler.fields["server.bag"])) {
tiddler.tags.remove("excludeLists");
}
} else { // ensure workspace is the current space
var el = story.findContainingTiddler(src);
el = $(el);
var fields = el.attr("tiddlyfields");
if(fields) { // inherited via TiddlyLink
fields = fields.decodeHashMap();
fields["server.workspace"] = config.
defaultCustomFields["server.workspace"];
} else {
fields = config.defaultCustomFields;
}
fields = String.encodeHashMap(fields);
el.attr("tiddlyfields", fields);
}
cmd.editTiddler.handler.apply(this, arguments);
if(tiddler) {
tiddler.fields["server.permissions"] += ", delete";
}
return false;
}
};
cmd.editTiddler.isEnabled = function(tiddler) {
return !cmd.cloneTiddler.isEnabled.apply(this, arguments);
};
// hijack cancelTiddler to restore original fields
var _cancelHandler = cmd.cancelTiddler.handler;
cmd.cancelTiddler.handler = function(ev, src, title) {
var tiddler = store.getTiddler(title);
if(tiddler) {
tiddler.fields = fieldsCache[title] || tiddler.fields;
delete fieldsCache[title];
}
return _cancelHandler.apply(this, arguments);
};
// hijack saveTiddler to clear unused fields stash
var _saveHandler = cmd.saveTiddler.handler;
cmd.saveTiddler.handler = function(ev, src, title) {
delete fieldsCache[title];
return _saveHandler.apply(this, arguments);
};
})(jQuery);
//}}}
Frameworks based on the goal of making you type less miss the point of code: communication to other humans.
<<newTiddler label:"new html file" fields:"server.content-type:text/html" text:"<html>
<head></head>
<body>
<script type='text/javascript' src='http://tiddlyspace.com/bags/console/tiddlers/jquery.min.js'></script>
</body>
</html>">>
<<newTiddler label:"new javascript file" fields:"server.content-type:text/javascript">>
<<newTiddler label:"new css file" fields:"server.content-type:text/css">>
<<newTiddler label:"new cache manifest" fields:"server.content-type:text/cache-manifest">>
<<newTiddler label:"new tiddler">>
<<binaryUpload>>
<<closeAll>>
All files
<<timeline "created" "" "" template:TimelineType filter:'[is[local]]'>>
!URL
http://techspot.zzzeek.org/2011/05/17/magic-a-new-orm/
!Description
zzzeek says: Indeed. The moral of the story is, SQLAlchemy isn't a framework, and never was...it's a toolkit - you should build things !
!Note
Huh, where have I heard that before?
any process which involves artistry, such as making coffee, cannot be captured in theory, and thus cannot be automated well
I'm worried. This day has made me want to come home to a gin & tonic, a pipe and my smoking jacket.
The village where I do my living.
http://www.brightwalton.org.uk/
http://en.wikipedia.org/wiki/Brightwalton
!URL
http://kylecordes.com/2007/07/12/youtube-scalability/
!Description
/***
|''Name''|RefreshTiddlerCommand|
|''Version''|0.3.0|
***/
//{{{
(function($) {
var cmd = config.commands.refreshTiddler = {
text: "refresh",
locale: {
refreshing: "Refreshing tiddler..."
},
tooltip: "refresh this tiddler to be the one on the server",
handler: function(ev, src, title) {
var tiddler = store.getTiddler(title);
if(!tiddler) {
tiddler = new Tiddler(title);
merge(tiddler.fields, config.defaultCustomFields);
}
$(story.getTiddler(title)).find(".viewer").
empty().text(cmd.locale.refreshing);
var dirtyStatus = store.isDirty();
story.loadMissingTiddler(title, {
"server.workspace": tiddler.fields["server.recipe"] ? "recipes/" + tiddler.fields["server.recipe"] :
tiddler.fields["server.workspace"] || "bags/"+tiddler.fields["server.bag"],
"server.host": tiddler.fields["server.host"],
"server.type": tiddler.fields["server.type"]
}, function() {
store.setDirty(dirtyStatus);
});
}
};
})(jQuery);
//}}}
!URL
http://blog.ianbicking.org/best-of-the-web-app-test-frameworks.html
!Description
ian bicking asks about web app testers
!URL
http://semanticcamp.tommorris.org/
!Description
might should go to this
!URL
http://www.waterscape.com/things-to-do/cycling/permit
!Description
Want new Air, but can't stick UK price.
There's corporate malfeasance happening in the BT St James exchange: unhealthily high levels of heat in the osmo-office.
Those scones went down like a brick. Many bricks.
!URL
http://www.ibm.com/developerworks/rational/library/aug07/ambler_kroll/index.html
!Description
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
<!--{{{-->
<div macro='slideRevision'></div>
<div class='heading'>
<span class="titleBar">
<div class='title' macro='view title text'></div>
</span>
<span class='modifierIcon'
macro='view modifier SiteIcon label:no height:48 width:48 preserveAspectRatio:yes'>
</span>
<div class='toolbar'
macro='toolbar [[ToolbarCommands::RevisionToolbar]] icons:yes height:48 width:48 more:popup'>
</div>
<div class='tagClear'></div>
</div>
<div class='content'>
<div class='viewer' macro='view text wikified'></div>
</div>
<div class='tagInfo'>
<div class='tidTags' macro='tags'></div>
<div class='tagging' macro='tagging'></div>
</div>
<!--}}}-->
apparently there are few sporting events of some import to some people today. so I cut the grass
KGZ1bmN0aW9uKG9iaikgeyAgICAKICAgIC8vY3JlYXRlIGFuIGlmcmFtZSBhbmQgbG9hZCB0aWRkbHl3aWtpIGludG8gaXQKICAgIG9iai5vcGVuVGlkZGx5V2lraSA9IGZ1bmN0aW9uKHVybEJhc2UsIHBhdGgsIHRpZGRsZXIsIHNpdGVUaXRsZSkgewogICAgICAgIHZhciBjc3MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7CiAgICAgICAgY3NzLnR5cGUgPSAndGV4dC9jc3MnOwogICAgICAgIGNzcy5yZWwgPSAnc3R5bGVzaGVldCc7CiAgICAgICAgY3NzLmhyZWYgPSB1cmxCYXNlICsgcGF0aCArICcvdGlkZGxlcnMvYm9va21hcmtsZXQuY3NzJzsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNzcyk7CiAgICAKICAgICAgICB2YXIgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgY29udGFpbmVyLmNsYXNzTmFtZSA9ICdUaWRkbHlXaWtpSW1wb3J0Q29udGFpbmVyJzsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7CiAgICAKICAgICAgICB2YXIgY2xvc2VCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICAgICAgY2xvc2VCdXR0b24uY2xhc3NOYW1lID0gJ1RpZGRseVdpa2lJbXBvcnRDbG9zZUJ1dHRvbic7CiAgICAgICAgY2xvc2VCdXR0b24uaHJlZiA9ICdqYXZhc2NyaXB0OjsnOwogICAgICAgIGNsb3NlQnV0dG9uLmlubmVySFRNTCA9ICdYJzsKICAgICAgICBjbG9zZUJ1dHRvbi5vbmNsaWNrID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIC8vaGlkZSwgZG9uJ3QgcmVtb3ZlCiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoY3NzKTsKICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChjb250YWluZXIpOwogICAgICAgIH07CiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNsb3NlQnV0dG9uKTsKICAgIAogICAgICAgIHZhciBjb250YWluZXJUaXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIGNvbnRhaW5lclRpdGxlLmNsYXNzTmFtZSA9ICdUaWRkbHlXaWtpQ29udGFpbmVyVGl0bGUnOwogICAgICAgIGNvbnRhaW5lclRpdGxlLmlubmVySFRNTCA9IHNpdGVUaXRsZTsKICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY29udGFpbmVyVGl0bGUpOwogICAgCiAgICAgICAgdmFyIHRpZGRsZXJMaW5rID0gKHRpZGRsZXIpID8gJyNbWycgKyB0aWRkbGVyICsgJ11dJyA6ICcnOwogICAgICAgIHZhciBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTsKICAgICAgICBpZnJhbWUuY2xhc3NOYW1lID0gJ1RpZGRseVdpa2lJbXBvcnRJRnJhbWUnOwogICAgICAgIGlmICh3aW5kb3cucG9zdE1lc3NhZ2UpIHsKICAgICAgICAgICAgaWZyYW1lTGluayA9IHVybEJhc2UgKyBwYXRoICsgJy90aWRkbGVycy53aWtpJyArIHRpZGRsZXJMaW5rOwogICAgICAgICAgICBpZnJhbWUuc3JjID0gaWZyYW1lTGluazsKICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGlmcmFtZSk7CiAgICAgICAgCiAgICAgICAgICAgIC8vd2FpdCB1bnRpbCB0aGUgc2l0ZSBoYXMgbG9hZGVkIGFuZCB0aGVuIHNlbmQgc29tZSBtZXNzYWdlcwogICAgICAgICAgICBpZnJhbWVPbkxvYWRIYW5kbGVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBzZW5kU2l0ZUluZm8oaWZyYW1lLCB1cmxCYXNlKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWZyYW1lLm9ubG9hZCA9IGlmcmFtZU9uTG9hZEhhbmRsZXI7CiAgICAgICAgICAgIAogICAgICAgICAgICAvL0lFIG9uTG9hZCBoYW5kbGVyOgogICAgICAgICAgICBjb21wbGV0ZVJlYWR5U3RhdGVDaGFuZ2VzID0gMDsKICAgICAgICAgICAgaWZyYW1lLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGlmICgrKyhjb21wbGV0ZVJlYWR5U3RhdGVDaGFuZ2VzKSA9PSAzKSB7CiAgICAgICAgICAgICAgICAgIGlGcmFtZU9uTG9hZEhhbmRsZXIoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvL25vIHBvc3RNZXNzYWdlICNwcm9iYWJseSBpZTYKICAgICAgICAgICAgdmFyIGlmcmFtZUxpbmsgPSB1cmxCYXNlICsgcGF0aCArICcvdGlkZGxlcnMud2lraT8nOwogICAgICAgICAgICB2YXIgcGFyZW50VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CiAgICAgICAgICAgIHZhciBxdWVyeVN0cmluZyA9ICdib29rbWFya2xldFBhcmVudFVSTD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHBhcmVudFVybCk7CiAgICAgICAgICAgIHF1ZXJ5U3RyaW5nICs9ICcmYm9va21hcmtsZXRQYXJlbnRUaXRsZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGRvY3VtZW50LnRpdGxlIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsKICAgICAgICAgICAgcXVlcnlTdHJpbmcgKz0gJyZib29rbWFya2xldFBhcmVudERlc2M9JyArIGVuY29kZVVSSUNvbXBvbmVudChnZXRTaXRlVGV4dCgpKTsKCiAgICAgICAgICAgIGlmcmFtZUxpbmsgKz0gcXVlcnlTdHJpbmcgKyB0aWRkbGVyTGluazsKICAgICAgICAgICAgaWZyYW1lLnNyYyA9IGlmcmFtZUxpbms7CiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChpZnJhbWUpOwogICAgICAgIH0KICAgIH07CiAgICAKICAgIGZ1bmN0aW9uIHNlbmRTaXRlSW5mbyhpZnJhbWUsIHRhcmdldExpbmspIHsKICAgICAgICB2YXIgc2l0ZVVSTCA9ICd1cmw6JyArIHdpbmRvdy5sb2NhdGlvbi5ocmVmOwogICAgICAgIHNlbmRNZXNzYWdlKHNpdGVVUkwsIHRhcmdldExpbmssIGlmcmFtZS5jb250ZW50V2luZG93KTsKCiAgICAgICAgdmFyIHNpdGVUaXRsZSA9ICd0aXRsZTonICsgKGRvY3VtZW50LnRpdGxlIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsKICAgICAgICBzZW5kTWVzc2FnZShzaXRlVGl0bGUsIHRhcmdldExpbmssIGlmcmFtZS5jb250ZW50V2luZG93KTsKCiAgICAgICAgc2l0ZURlc2MgPSAnZGVzYzonICsgZ2V0U2l0ZVRleHQoKTsKICAgICAgICBzZW5kTWVzc2FnZShzaXRlRGVzYywgdGFyZ2V0TGluaywgaWZyYW1lLmNvbnRlbnRXaW5kb3cpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldFNpdGVUZXh0KCkgewogICAgICAgIHZhciB0ZXh0ID0gJyc7CiAgICAgICAgaWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24pIHsKICAgICAgICAgICAgdGV4dCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKS50b1N0cmluZygpOwogICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKSB7CiAgICAgICAgICAgIHRleHQgPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTsKICAgICAgICB9IGVsc2UgaWYgKGRvY3VtZW50LnNlbGVjdGlvbikgewogICAgICAgICAgICB0ZXh0ID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkudGV4dDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0ZXh0ID0gJyc7CiAgICAgICAgfQoKICAgICAgICBpZiAoIXRleHQpIHsKICAgICAgICAgICAgdmFyIG1ldGFUYWdzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ21ldGEnKTsKICAgICAgICAgICAgdmFyIHNpdGVEZXNjcmlwdGlvbiA9ICcnOwogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGkgPCBtZXRhVGFncy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIHRhZyA9IG1ldGFUYWdzW2ldOwogICAgICAgICAgICAgICAgaWYgKCh0YWcuY2xhc3NOYW1lKSAmJiAodGFnLmNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpID0gJ2Rlc2NyaXB0aW9uJykpIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGFnLmlubmVyVGV4dDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCF0ZXh0KSB7CiAgICAgICAgICAgIHRleHQgPSBkb2N1bWVudC50aXRsZSB8fCB3aW5kb3cubG9jYXRpb24uaHJlZjsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0ZXh0OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbmRNZXNzYWdlKG1lc3NhZ2UsIHRhcmdldCwgaFduZCkgewogICAgICAgIGhXbmQucG9zdE1lc3NhZ2UobWVzc2FnZSwgdGFyZ2V0KTsKICAgIH07Cn0pKHdpbmRvdyk7Cg==
/***
|''Name''|ToggleTiddlerPrivacyPlugin|
|''Version''|0.7.0|
|''Status''|@@beta@@|
|''Description''|Allows you to set the privacy of new tiddlers and external tiddlers within an EditTemplate, and allows you to set a default privacy setting|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/ToggleTiddlerPrivacyPlugin.js|
!Notes
When used in conjunction with TiddlySpaceTiddlerIconsPlugin changing the privacy setting will also interact with any privacy icons.
Currently use of
{{{<<setPrivacy defaultValue:public>>}}} is in conflict with {{{<<newTiddler fields:"server.workspace:x_private">>}}}
There is an option, found in the tweak tab of the backstage, called txtPrivacyMode. Set this to either ''public'' or ''private'' depending on your security preference. If you choose not to set it then it will default to ''public''.
!Params
defaultValue:[private|public]
Allows you to set the default privacy value (Default is private)
!Code
***/
//{{{
(function($) {
var tiddlyspace = config.extensions.tiddlyspace;
var macro = config.macros.setPrivacy = {
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
if(readOnly) {
return;
}
var el = $(story.findContainingTiddler(place));
var args = paramString.parseParams("name", null, true, false, true)[0];
var container = $("<div />").addClass("privacySettings").appendTo(place)[0];
var currentSpace = tiddlyspace.currentSpace.name;
var currentBag = tiddler ? tiddler.fields["server.bag"] : false;
var isNewTiddler = el.hasClass("missing") || !currentBag; // XXX: is this reliable?
var status = tiddlyspace.getTiddlerStatusType(tiddler);
var customFields = el.attr("tiddlyfields");
customFields = customFields ? customFields.decodeHashMap() : {};
if(isNewTiddler || !["public", "private", "unsyncedPrivate", "unsyncedPublic"].contains(status)) {
var defaultValue = "public";
if(args.defaultValue) {
defaultValue = args.defaultValue[0].toLowerCase();
} else {
defaultValue = config.options.chkPrivateMode ? "private" : "public";
}
defaultValue = defaultValue ?
"%0_%1".format(currentSpace, defaultValue) : customFields["server.bag"];
var options = config.macros.tiddlerOrigin ?
config.macros.tiddlerOrigin.getOptions(paramString) : {};
this.createRoundel(container, tiddler, currentSpace, defaultValue, options);
}
},
updateEditFields: function(tiddlerEl, bag) {
var saveBagField = $('[edit="server.bag"]', tiddlerEl);
var saveWorkspaceField = $('[edit="server.workspace"]', tiddlerEl);
var input = $("<input />").attr("type", "hidden");
if(saveBagField.length === 0) {
input.clone().attr("edit", "server.bag").val(bag).appendTo(tiddlerEl);
} else {
saveBagField.val(bag);
}
$(tiddlerEl).attr("tiddlyFields", ""); // reset to prevent side effects
var workspace = "bags/" + bag;
if(saveWorkspaceField.length === 0) {
input.clone().attr("edit", "server.workspace").val(workspace).appendTo(tiddlerEl);
} else {
saveWorkspaceField.val(workspace);
}
},
setBag: function(tiddlerEl, newBag, options) {
var title = $(tiddlerEl).attr("tiddler");
var tiddler = store.getTiddler(title);
var originButton = $(".originButton", tiddlerEl)[0];
var refreshIcon = function(type) {
var originMacro = config.macros.tiddlerOrigin;
if(originButton && originMacro) {
options.noclick = true;
originMacro.showPrivacyRoundel(tiddler, type, originButton, options);
}
};
macro.updateEditFields(tiddlerEl, newBag);
var newWorkspace = "bags/" + newBag;
if(tiddler) {
tiddler.fields["server.bag"] = newBag;
tiddler.fields["server.workspace"] = newWorkspace; // for external tiddlers
}
var rPrivate = $("input[type=radio].isPrivate", tiddlerEl);
var rPublic = $("input[type=radio].isPublic", tiddlerEl);
if(newBag.indexOf("_public") > -1) {
rPrivate.attr("checked", false);
rPublic.attr("checked", true);
status = "public";
} else {
rPublic.attr("checked", false); // explicitly do this for ie
rPrivate.attr("checked", true);
status = "private";
}
refreshIcon(status);
},
createRoundel: function(container, tiddler, currentSpace, defaultValue, options) {
var privateBag = "%0_private".format(currentSpace);
var publicBag = "%0_public".format(currentSpace);
var rbtn = $("<input />").attr("type", "radio").attr("name", tiddler.title);
var rPrivate = rbtn.clone().val("private").addClass("isPrivate").appendTo(container);
$("<label />").text("private").appendTo(container); // TODO: i18n
var rPublic = rbtn.clone().val("public").addClass("isPublic").appendTo(container);
$("<label />").text("public").appendTo(container); // TODO: i18n
var el = story.findContainingTiddler(container);
$("[type=radio]", container).click(function(ev) {
var btn = $(ev.target);
tiddler.fields["server.page.revision"] = "false";
if(btn.hasClass("isPrivate")) { // private button clicked.
$(el).addClass("isPrivate").removeClass("isPublic");
macro.setBag(el, privateBag, options);
} else {
$(el).addClass("isPublic").removeClass("isPrivate");
macro.setBag(el, publicBag, options);
}
});
window.setTimeout(function() {
macro.setBag(el, defaultValue, options);
}, 100);
// annoyingly this is needed as customFields are added to end of EditTemplate so are not present yet
// and don't seem to respect any existing customFields.
}
};
})(jQuery);
//}}}
!URL
http://www.stoweboyd.com/message/2008/05/how-i-roll.html
!Description
I need to work on my own personal How I Roll
!URL
http://www.movable-type.co.uk/scripts/latlong.html#cosine-law
!Description
Calculate distance and bearing between two Latitude/Longitude points using Haversine formula in JavaScript
this cold will not go away
!URL
http://www.openmoko.com/about-index.html
!Description
clear concise powerful vision statement
<html>
<head>
<title>Applications</title>
<style type="text/css">
td {
text-align: center;
border: solid 1px #CCC;
padding: 8px;
}
#apps img {
width: 48px;
height: 48px;
}
td {
width: 50%
}
</style>
<script type='text/javascript' src='/bags/common/tiddlers/backstage.js'></script>
<link href="/bags/common/tiddlers/profile.css" type='text/css' rel='stylesheet' >
<script type='text/javascript' src='http://tiddlyspace.com/bags/ts_public/tiddlers/jquery.min.js'></script>
<script type="text/javascript">
$(document).ready(function() {
$.ajax({
dataType: "json",
url: "/tiddlers?select=type:text/html",
success: function(tids) {
tids = tids.sort(function(a, b) {
return a.title.toLowerCase() < b.title.toLowerCase() ? -1 : 1;
});
var lastCol = 2, row;
for(var i = 0; i < tids.length; i++) {
var tid = tids[i];
if(tid && tid.tags.indexOf("app") > -1) {
if(lastCol == 2) {
row = $("<tr />").appendTo("#apps")[0];
lastCol = 0;
}
var title = tids[i].title;
var bag = tids[i].bag;
var space = bag.split("_")[0];
var item = $("<td />").appendTo(row)[0];
$('<img alt="space siteicon" />').attr("src", "http://" + space + ".tiddlyspace.com/SiteIcon").appendTo(item);
var heading = $("<h2 />").appendTo(item)[0];
$("<a />").attr("href", "/" + title).text(title).appendTo(heading);
var summary = tids[i].fields.summary;
$("<div />").text(summary || "No summary").appendTo(item);
lastCol += 1;
}
}
}
})
});
</script>
</head>
<body>
<div id="container">
<div id="header">
<h1>TiddlySpace Applications</h1>
</div>
<div class="main section">
<p>HTML tiddlers tagged app.</p>
<table id="apps"></table>
</div>
</div>
</body>
</html>
/***
|''Name''|TiddlyWebAdaptor|
|''Description''|adaptor for interacting with TiddlyWeb|
|''Author:''|FND|
|''Contributors''|Chris Dent, Martin Budden|
|''Version''|1.4.10|
|''Status''|stable|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/adaptors/TiddlyWebAdaptor.js|
|''CodeRepository''|http://svn.tiddlywiki.org/Trunk/association/|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5|
|''Keywords''|serverSide TiddlyWeb|
!Notes
This plugin includes [[jQuery JSON|http://code.google.com/p/jquery-json/]].
!To Do
* createWorkspace
* document custom/optional context attributes (e.g. filters, query, revision) and tiddler fields (e.g. server.title, origin)
!Code
***/
//{{{
(function($) {
var adaptor = config.adaptors.tiddlyweb = function() {};
adaptor.prototype = new AdaptorBase();
adaptor.serverType = "tiddlyweb";
adaptor.serverLabel = "TiddlyWeb";
adaptor.mimeType = "application/json";
adaptor.parsingErrorMessage = "Error parsing result from server";
adaptor.noBagErrorMessage = "no bag specified for tiddler";
adaptor.locationIDErrorMessage = "no bag or recipe specified for tiddler"; // TODO: rename
// retrieve current status (requires TiddlyWeb status plugin)
adaptor.prototype.getStatus = function(context, userParams, callback) {
context = this.setContext(context, userParams, callback);
var uriTemplate = "%0/status";
var uri = uriTemplate.format([context.host]);
var req = httpReq("GET", uri, adaptor.getStatusCallback, context,
null, null, null, null, null, true);
return typeof req == "string" ? req : true;
};
adaptor.getStatusCallback = function(status, context, responseText, uri, xhr) {
context.status = responseText ? status : false;
try {
context.statusText = xhr.statusText;
} catch(exc) { // offline (Firefox)
context.status = false;
context.statusText = null;
}
context.httpStatus = xhr.status;
if(context.status) {
context.serverStatus = $.evalJSON(responseText); // XXX: error handling!?
}
if(context.callback) {
context.callback(context, context.userParams);
}
};
// retrieve a list of workspaces
adaptor.prototype.getWorkspaceList = function(context, userParams, callback) {
context = this.setContext(context, userParams, callback);
context.workspaces = [];
var uriTemplate = "%0/recipes"; // XXX: bags?
var uri = uriTemplate.format([context.host]);
var req = httpReq("GET", uri, adaptor.getWorkspaceListCallback,
context, { accept: adaptor.mimeType }, null, null, null, null, true);
return typeof req == "string" ? req : true;
};
adaptor.getWorkspaceListCallback = function(status, context, responseText, uri, xhr) {
context.status = status;
context.statusText = xhr.statusText;
context.httpStatus = xhr.status;
if(status) {
try {
var workspaces = $.evalJSON(responseText);
} catch(ex) {
context.status = false; // XXX: correct?
context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
if(context.callback) {
context.callback(context, context.userParams);
}
return;
}
context.workspaces = workspaces.map(function(itm) { return { title: itm }; });
}
if(context.callback) {
context.callback(context, context.userParams);
}
};
// retrieve a list of tiddlers
adaptor.prototype.getTiddlerList = function(context, userParams, callback) {
context = this.setContext(context, userParams, callback);
var uriTemplate = "%0/%1/%2/tiddlers%3";
var params = context.filters ? "?" + context.filters : "";
if(context.format) {
params = context.format + params;
}
var workspace = adaptor.resolveWorkspace(context.workspace);
var uri = uriTemplate.format([context.host, workspace.type + "s",
adaptor.normalizeTitle(workspace.name), params]);
var req = httpReq("GET", uri, adaptor.getTiddlerListCallback,
context, merge({ accept: adaptor.mimeType }, context.headers), null, null, null, null, true);
return typeof req == "string" ? req : true;
};
adaptor.getTiddlerListCallback = function(status, context, responseText, uri, xhr) {
context.status = status;
context.statusText = xhr.statusText;
context.httpStatus = xhr.status;
if(status) {
context.tiddlers = [];
try {
var tiddlers = $.evalJSON(responseText); //# NB: not actual tiddler instances
} catch(ex) {
context.status = false; // XXX: correct?
context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
if(context.callback) {
context.callback(context, context.userParams);
}
return;
}
for(var i = 0; i < tiddlers.length; i++) {
var tiddler = adaptor.toTiddler(tiddlers[i], context.host);
context.tiddlers.push(tiddler);
}
}
if(context.callback) {
context.callback(context, context.userParams);
}
};
// perform global search
adaptor.prototype.getSearchResults = function(context, userParams, callback) {
context = this.setContext(context, userParams, callback);
var uriTemplate = "%0/search?q=%1%2";
var filterString = context.filters ? ";" + context.filters : "";
var uri = uriTemplate.format([context.host, context.query, filterString]); // XXX: parameters need escaping?
var req = httpReq("GET", uri, adaptor.getSearchResultsCallback,
context, { accept: adaptor.mimeType }, null, null, null, null, true);
return typeof req == "string" ? req : true;
};
adaptor.getSearchResultsCallback = function(status, context, responseText, uri, xhr) {
adaptor.getTiddlerListCallback(status, context, responseText, uri, xhr); // XXX: use apply?
};
// retrieve a particular tiddler's revisions
adaptor.prototype.getTiddlerRevisionList = function(title, limit, context, userParams, callback) {
context = this.setContext(context, userParams, callback);
var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions";
var workspace = adaptor.resolveWorkspace(context.workspace);
var uri = uriTemplate.format([context.host, workspace.type + "s",
adaptor.normalizeTitle(workspace.name), adaptor.normalizeTitle(title)]);
var req = httpReq("GET", uri, adaptor.getTiddlerRevisionListCallback,
context, merge({ accept: adaptor.mimeType }, context.headers), null, null, null, null, true);
return typeof req == "string" ? req : true;
};
adaptor.getTiddlerRevisionListCallback = function(status, context, responseText, uri, xhr) {
context.status = status;
context.statusText = xhr.statusText;
context.httpStatus = xhr.status;
if(status) {
context.revisions = [];
try {
var tiddlers = $.evalJSON(responseText); //# NB: not actual tiddler instances
} catch(ex) {
context.status = false; // XXX: correct?
context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
if(context.callback) {
context.callback(context, context.userParams);
}
return;
}
for(var i = 0; i < tiddlers.length; i++) {
var tiddler = adaptor.toTiddler(tiddlers[i], context.host);
context.revisions.push(tiddler);
}
var sortField = "server.page.revision";
context.revisions.sort(function(a, b) {
return a.fields[sortField] < b.fields[sortField] ? 1 :
(a.fields[sortField] == b.fields[sortField] ? 0 : -1);
});
}
if(context.callback) {
context.callback(context, context.userParams);
}
};
// retrieve an individual tiddler revision -- XXX: breaks with standard arguments list -- XXX: convenience function; simply use getTiddler?
adaptor.prototype.getTiddlerRevision = function(title, revision, context, userParams, callback) {
context = this.setContext(context, userParams, callback);
context.revision = revision;
return this.getTiddler(title, context, userParams, callback);
};
// retrieve an individual tiddler
//# context is an object with members host and workspace
//# callback is passed the new context and userParams
adaptor.prototype.getTiddler = function(title, context, userParams, callback) {
context = this.setContext(context, userParams, callback);
context.title = title;
if(context.revision) {
var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions/%4";
} else {
uriTemplate = "%0/%1/%2/tiddlers/%3";
}
if(!context.tiddler) {
context.tiddler = new Tiddler(title);
}
context.tiddler.fields["server.type"] = adaptor.serverType;
context.tiddler.fields["server.host"] = AdaptorBase.minHostName(context.host);
context.tiddler.fields["server.workspace"] = context.workspace;
var workspace = adaptor.resolveWorkspace(context.workspace);
var uri = uriTemplate.format([context.host, workspace.type + "s",
adaptor.normalizeTitle(workspace.name), adaptor.normalizeTitle(title),
context.revision]);
var req = httpReq("GET", uri, adaptor.getTiddlerCallback, context,
merge({ accept: adaptor.mimeType }, context.headers), null, null, null, null, true);
return typeof req == "string" ? req : true;
};
adaptor.getTiddlerCallback = function(status, context, responseText, uri, xhr) {
context.status = status;
context.statusText = xhr.statusText;
context.httpStatus = xhr.status;
if(status) {
try {
var tid = $.evalJSON(responseText);
} catch(ex) {
context.status = false;
context.statusText = exceptionText(ex, adaptor.parsingErrorMessage);
if(context.callback) {
context.callback(context, context.userParams);
}
return;
}
var tiddler = adaptor.toTiddler(tid, context.host);
tiddler.title = context.tiddler.title;
tiddler.fields["server.etag"] = xhr.getResponseHeader("Etag");
// normally we'd assign context.tiddler = tiddler here - but we can't do
// that because of IE, which triggers getTiddler in putTiddlerCallback,
// and since ServerSideSavingPlugin foolishly relies on persistent
// object references, we need to merge the data into the existing object
$.extend(context.tiddler, tiddler);
}
if(context.callback) {
context.callback(context, context.userParams);
}
};
// retrieve tiddler chronicle (all revisions)
adaptor.prototype.getTiddlerChronicle = function(title, context, userParams, callback) {
context = this.setContext(context, userParams, callback);
context.title = title;
var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions?fat=1";
var workspace = adaptor.resolveWorkspace(context.workspace);
var uri = uriTemplate.format([context.host, workspace.type + "s",
adaptor.normalizeTitle(workspace.name), adaptor.normalizeTitle(title)]);
var req = httpReq("GET", uri, adaptor.getTiddlerChronicleCallback,
context, { accept: adaptor.mimeType }, null, null, null, null, true);
return typeof req == "string" ? req : true;
};
adaptor.getTiddlerChronicleCallback = function(status, context, responseText, uri, xhr) {
context.status = status;
context.statusText = xhr.statusText;
context.httpStatus = xhr.status;
if(status) {
context.responseText = responseText;
}
if(context.callback) {
context.callback(context, context.userParams);
}
};
// store an individual tiddler
adaptor.prototype.putTiddler = function(tiddler, context, userParams, callback) {
context = this.setContext(context, userParams, callback);
context.title = tiddler.title;
context.tiddler = tiddler;
context.host = context.host || this.fullHostName(tiddler.fields["server.host"]);
var uriTemplate = "%0/%1/%2/tiddlers/%3";
try {
context.workspace = context.workspace || tiddler.fields["server.workspace"];
var workspace = adaptor.resolveWorkspace(context.workspace);
} catch(ex) {
return adaptor.locationIDErrorMessage;
}
var uri = uriTemplate.format([context.host, workspace.type + "s",
adaptor.normalizeTitle(workspace.name),
adaptor.normalizeTitle(tiddler.title)]);
var etag = adaptor.generateETag(workspace, tiddler);
var headers = etag ? { "If-Match": etag } : null;
var payload = {
type: tiddler.fields["server.content-type"] || null,
text: tiddler.text,
tags: tiddler.tags,
fields: $.extend({}, tiddler.fields)
};
delete payload.fields.changecount;
$.each(payload.fields, function(key, value) {
if(key.indexOf("server.") == 0) {
delete payload.fields[key];
}
});
payload = $.toJSON(payload);
var req = httpReq("PUT", uri, adaptor.putTiddlerCallback,
context, headers, payload, adaptor.mimeType, null, null, true);
return typeof req == "string" ? req : true;
};
adaptor.putTiddlerCallback = function(status, context, responseText, uri, xhr) {
context.status = [204, 1223].contains(xhr.status);
context.statusText = xhr.statusText;
context.httpStatus = xhr.status;
if(context.status) {
var loc = xhr.getResponseHeader("Location");
var etag = xhr.getResponseHeader("Etag");
if(loc && etag) {
var bag = loc.split("/bags/").pop().split("/")[0];
context.tiddler.fields["server.bag"] = bag;
context.tiddler.fields["server.workspace"] = "bags/" + bag;
var rev = etag.split("/").pop().split(/;|:/)[0];
context.tiddler.fields["server.page.revision"] = rev;
context.tiddler.fields["server.etag"] = etag;
if(context.callback) {
context.callback(context, context.userParams);
}
} else { // IE
context.adaptor.getTiddler(context.tiddler.title, context,
context.userParams, context.callback);
}
} else if(context.callback) {
context.callback(context, context.userParams);
}
};
// store a tiddler chronicle
adaptor.prototype.putTiddlerChronicle = function(revisions, context, userParams, callback) {
context = this.setContext(context, userParams, callback);
context.title = revisions[0].title;
var headers = null;
var uriTemplate = "%0/%1/%2/tiddlers/%3/revisions";
var host = context.host || this.fullHostName(tiddler.fields["server.host"]);
var workspace = adaptor.resolveWorkspace(context.workspace);
var uri = uriTemplate.format([host, workspace.type + "s",
adaptor.normalizeTitle(workspace.name),
adaptor.normalizeTitle(context.title)]);
if(workspace.type == "bag") { // generate ETag
var etag = [adaptor.normalizeTitle(workspace.name),
adaptor.normalizeTitle(context.title), 0].join("/"); //# zero-revision prevents overwriting existing contents
headers = { "If-Match": '"' + etag + '"' };
}
var payload = $.toJSON(revisions);
var req = httpReq("POST", uri, adaptor.putTiddlerChronicleCallback,
context, headers, payload, adaptor.mimeType, null, null, true);
return typeof req == "string" ? req : true;
};
adaptor.putTiddlerChronicleCallback = function(status, context, responseText, uri, xhr) {
context.status = [204, 1223].contains(xhr.status);
context.statusText = xhr.statusText;
context.httpStatus = xhr.status;
if(context.callback) {
context.callback(context, context.userParams);
}
};
// store a collection of tiddlers (import TiddlyWiki HTML store)
adaptor.prototype.putTiddlerStore = function(store, context, userParams, callback) {
context = this.setContext(context, userParams, callback);
var uriTemplate = "%0/%1/%2/tiddlers";
var host = context.host;
var workspace = adaptor.resolveWorkspace(context.workspace);
var uri = uriTemplate.format([host, workspace.type + "s",
adaptor.normalizeTitle(workspace.name)]);
var req = httpReq("POST", uri, adaptor.putTiddlerStoreCallback,
context, null, store, "text/x-tiddlywiki", null, null, true);
return typeof req == "string" ? req : true;
};
adaptor.putTiddlerStoreCallback = function(status, context, responseText, uri, xhr) {
context.status = [204, 1223].contains(xhr.status);
context.statusText = xhr.statusText;
context.httpStatus = xhr.status;
if(context.callback) {
context.callback(context, context.userParams);
}
};
// rename an individual tiddler or move it to a different workspace -- TODO: make {from|to}.title optional
//# from and to are objects with members title and workspace (bag; optional),
//# representing source and target tiddler, respectively
adaptor.prototype.moveTiddler = function(from, to, context, userParams, callback) { // XXX: rename parameters (old/new)?
var self = this;
var newTiddler = store.getTiddler(from.title) || store.getTiddler(to.title); //# local rename might already have occurred
var oldTiddler = $.extend(true, {}, newTiddler); //# required for eventual deletion
oldTiddler.title = from.title; //# required for original tiddler's ETag
var _getTiddlerChronicle = function(title, context, userParams, callback) {
return self.getTiddlerChronicle(title, context, userParams, callback);
};
var _putTiddlerChronicle = function(context, userParams) {
if(!context.status) {
return callback(context, userParams);
}
var revisions = $.evalJSON(context.responseText); // XXX: error handling?
// change current title while retaining previous location
for(var i = 0; i < revisions.length; i++) {
delete revisions[i].revision;
if(!revisions[i].fields.origin) { // NB: origin = "<workspace>/<title>"
revisions[i].fields.origin = ["bags", revisions[i].bag, revisions[i].title].join("/");
}
revisions[i].title = to.title;
}
// add new revision
var rev = $.extend({}, revisions[0]);
$.each(newTiddler, function(i, item) {
if(!$.isFunction(item)) {
rev[i] = item;
}
});
rev.title = to.title;
rev.created = rev.created.convertToYYYYMMDDHHMM();
rev.modified = new Date().convertToYYYYMMDDHHMM();
delete rev.fields.changecount;
revisions.unshift(rev);
if(to.workspace) {
context.workspace = to.workspace;
} else if(context.workspace.substring(0, 4) != "bags") { // NB: target workspace must be a bag
context.workspace = "bags/" + rev.bag;
}
var subCallback = function(context, userParams) {
if(!context.status) {
return callback(context, userParams);
}
context.adaptor.getTiddler(newTiddler.title, context, userParams, _deleteTiddler);
};
return self.putTiddlerChronicle(revisions, context, context.userParams, subCallback);
};
var _deleteTiddler = function(context, userParams) {
if(!context.status) {
return callback(context, userParams);
}
$.extend(true, newTiddler, context.tiddler);
context.callback = null;
return self.deleteTiddler(oldTiddler, context, context.userParams, callback);
};
callback = callback || function() {};
context = this.setContext(context, userParams);
context.host = context.host || oldTiddler.fields["server.host"];
context.workspace = from.workspace || oldTiddler.fields["server.workspace"];
return _getTiddlerChronicle(from.title, context, userParams, _putTiddlerChronicle);
};
// delete an individual tiddler
adaptor.prototype.deleteTiddler = function(tiddler, context, userParams, callback) {
context = this.setContext(context, userParams, callback);
context.title = tiddler.title; // XXX: not required!?
var uriTemplate = "%0/bags/%1/tiddlers/%2";
var host = context.host || this.fullHostName(tiddler.fields["server.host"]);
var bag = tiddler.fields["server.bag"];
if(!bag) {
return adaptor.noBagErrorMessage;
}
var uri = uriTemplate.format([host, adaptor.normalizeTitle(bag),
adaptor.normalizeTitle(tiddler.title)]);
var etag = adaptor.generateETag({ type: "bag", name: bag }, tiddler);
var headers = etag ? { "If-Match": etag } : null;
var req = httpReq("DELETE", uri, adaptor.deleteTiddlerCallback, context, headers,
null, null, null, null, true);
return typeof req == "string" ? req : true;
};
adaptor.deleteTiddlerCallback = function(status, context, responseText, uri, xhr) {
context.status = [204, 1223].contains(xhr.status);
context.statusText = xhr.statusText;
context.httpStatus = xhr.status;
if(context.callback) {
context.callback(context, context.userParams);
}
};
// compare two revisions of a tiddler (requires TiddlyWeb differ plugin)
//# if context.rev1 is not specified, the latest revision will be used for comparison
//# if context.rev2 is not specified, the local revision will be sent for comparison
//# context.format is a string as determined by the TiddlyWeb differ plugin
adaptor.prototype.getTiddlerDiff = function(title, context, userParams, callback) {
context = this.setContext(context, userParams, callback);
context.title = title;
var tiddler = store.getTiddler(title);
try {
var workspace = adaptor.resolveWorkspace(tiddler.fields["server.workspace"]);
} catch(ex) {
return adaptor.locationIDErrorMessage;
}
var tiddlerRef = [workspace.type + "s", workspace.name, tiddler.title].join("/");
var rev1 = context.rev1 ? [tiddlerRef, context.rev1].join("/") : tiddlerRef;
var rev2 = context.rev2 ? [tiddlerRef, context.rev2].join("/") : null;
var uriTemplate = "%0/diff?rev1=%1";
if(rev2) {
uriTemplate += "&rev2=%2";
}
if(context.format) {
uriTemplate += "&format=%3";
}
var host = context.host || this.fullHostName(tiddler.fields["server.host"]);
var uri = uriTemplate.format([host, adaptor.normalizeTitle(rev1),
adaptor.normalizeTitle(rev2), context.format]);
if(rev2) {
var req = httpReq("GET", uri, adaptor.getTiddlerDiffCallback, context, null,
null, null, null, null, true);
} else {
var payload = {
title: tiddler.title,
text: tiddler.text,
modifier: tiddler.modifier,
tags: tiddler.tags,
fields: $.extend({}, tiddler.fields)
}; // XXX: missing attributes!?
payload = $.toJSON(payload);
req = httpReq("POST", uri, adaptor.getTiddlerDiffCallback, context,
null, payload, adaptor.mimeType, null, null, true);
}
return typeof req == "string" ? req : true;
};
adaptor.getTiddlerDiffCallback = function(status, context, responseText, uri, xhr) {
context.status = status;
context.statusText = xhr.statusText;
context.httpStatus = xhr.status;
context.uri = uri;
if(status) {
context.diff = responseText;
}
if(context.callback) {
context.callback(context, context.userParams);
}
};
// generate tiddler information
adaptor.prototype.generateTiddlerInfo = function(tiddler) {
var info = {};
var uriTemplate = "%0/%1/%2/tiddlers/%3";
var host = this.host || tiddler.fields["server.host"]; // XXX: this.host obsolete?
host = this.fullHostName(host);
var workspace = adaptor.resolveWorkspace(tiddler.fields["server.workspace"]);
info.uri = uriTemplate.format([host, workspace.type + "s",
adaptor.normalizeTitle(workspace.name),
adaptor.normalizeTitle(tiddler.title)]);
return info;
};
// create Tiddler instance from TiddlyWeb tiddler JSON
adaptor.toTiddler = function(json, host) {
var created = Date.convertFromYYYYMMDDHHMM(json.created);
var modified = Date.convertFromYYYYMMDDHHMM(json.modified);
var fields = json.fields;
fields["server.type"] = adaptor.serverType;
fields["server.host"] = AdaptorBase.minHostName(host);
fields["server.bag"] = json.bag;
fields["server.title"] = json.title;
if(json.recipe) {
fields["server.recipe"] = json.recipe;
}
if(json.type && json.type != "None") {
fields["server.content-type"] = json.type;
}
fields["server.permissions"] = json.permissions.join(", ");
fields["server.page.revision"] = json.revision;
fields["server.workspace"] = "bags/" + json.bag;
var tiddler = new Tiddler(json.title);
tiddler.assign(tiddler.title, json.text, json.modifier, modified, json.tags,
created, json.fields, json.creator);
return tiddler;
};
adaptor.resolveWorkspace = function(workspace) {
var components = workspace.split("/");
return {
type: components[0] == "bags" ? "bag" : "recipe",
name: components[1] || components[0]
};
};
adaptor.generateETag = function(workspace, tiddler) {
var revision = tiddler.fields["server.page.revision"];
var etag = revision == "false" ? null : tiddler.fields["server.etag"];
if(!etag && workspace.type == "bag") {
if(typeof revision == "undefined") {
revision = "0";
} else if(revision == "false") {
return null;
}
etag = [adaptor.normalizeTitle(workspace.name),
adaptor.normalizeTitle(tiddler.title), revision].join("/");
etag = '"' + etag + '"';
}
return etag;
};
adaptor.normalizeTitle = function(title) {
return encodeURIComponent(title);
};
})(jQuery);
/*
* jQuery JSON Plugin
* version: 1.3
* source: http://code.google.com/p/jquery-json/
* license: MIT (http://www.opensource.org/licenses/mit-license.php)
*/
(function($){function toIntegersAtLease(n)
{return n<10?'0'+n:n;}
Date.prototype.toJSON=function(date)
{return this.getUTCFullYear()+'-'+
toIntegersAtLease(this.getUTCMonth())+'-'+
toIntegersAtLease(this.getUTCDate());};var escapeable=/["\\\x00-\x1f\x7f-\x9f]/g;var meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};$.quoteString=function(string)
{if(escapeable.test(string))
{return'"'+string.replace(escapeable,function(a)
{var c=meta[a];if(typeof c==='string'){return c;}
c=a.charCodeAt();return'\\u00'+Math.floor(c/16).toString(16)+(c%16).toString(16);})+'"';}
return'"'+string+'"';};$.toJSON=function(o,compact)
{var type=typeof(o);if(type=="undefined")
return"undefined";else if(type=="number"||type=="boolean")
return o+"";else if(o===null)
return"null";if(type=="string")
{return $.quoteString(o);}
if(type=="object"&&typeof o.toJSON=="function")
return o.toJSON(compact);if(type!="function"&&typeof(o.length)=="number")
{var ret=[];for(var i=0;i<o.length;i++){ret.push($.toJSON(o[i],compact));}
if(compact)
return"["+ret.join(",")+"]";else
return"["+ret.join(", ")+"]";}
if(type=="function"){throw new TypeError("Unable to convert object of type 'function' to json.");}
var ret=[];for(var k in o){var name;type=typeof(k);if(type=="number")
name='"'+k+'"';else if(type=="string")
name=$.quoteString(k);else
continue;var val=$.toJSON(o[k],compact);if(typeof(val)!="string"){continue;}
if(compact)
ret.push(name+":"+val);else
ret.push(name+": "+val);}
return"{"+ret.join(", ")+"}";};$.compactJSON=function(o)
{return $.toJSON(o,true);};$.evalJSON=function(src)
{return eval("("+src+")");};$.secureEvalJSON=function(src)
{var filtered=src;filtered=filtered.replace(/\\["\\\/bfnrtu]/g,'@');filtered=filtered.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']');filtered=filtered.replace(/(?:^|:|,)(?:\s*\[)+/g,'');if(/^[\],:{}\s]*$/.test(filtered))
return eval("("+src+")");else
throw new SyntaxError("Error parsing JSON, source is not valid.");};})(jQuery);
//}}}
R0lGODlhMAAwAPf/AAAAAAAzLQC7nQCpkxoZGQDLngBMQQALCQDkpLXLyQDcrAAhHQD+/QCNcQB7bABQRAHKohDIqQAaFgF0Y4eGhFrdzADHrImZlgDFpADqtABVSqe6tgCLbQD92cfS0gD90ADsqQD93gDspACMegD9zQD91ADjrAD9yQD9uQBqVACqgwD9wQDksQD9vgDZszrp5HHDswAVEgDQngBlUgC6lQDyugD9xQAlIACjfQCadgCzjQD95cTDwgCDdpPPzJzQzwBJPgD9sKrKxU3hzJanowBZSAD+8QD9tZWTkgC1mQHvwQBuWABcUmRkYwCRgK2sqwD+7VRWVQDMqgDAlQA7MgA9NQAtJ9LS0gB6YgD+9gDTrQD96AClggDhugCZegDToABCOACAaQCjjwCtiwCUegC4jQD2qgBNPry8uwC/oQAGBQARDgDGnwD2swDsuHG3qgB1XQBkWQCFaADzzgBiUQCfgRj28mzUxAAfGgApJADVoQD3rQD94QC2kQDdoQCsjs3NzACRdAB+ZwBhTQA2MAC2lgCYhQCQcQB2aaWko2qonABuYQYGBgAIBwDKlgD7rgA9MwCpiQBqWAADAgA/NgAuKgBwWwBFOrKysQCvlQCpjAD6sSgoJzk5NwCVdgCbiQCykwCihAC/mQDZpQCHbQBWRQDBjgBdSwCafQB6ZQDCngDZn4fT0QBhVgCkhgCVcgABAQBxXsjPzg4ODgABAADWpQCCawDdpwAnIwCeegCgfQACAQDTpgBbSgDxqcrJyainpgBFPQICAgCFZwCGdwB4YFBOTgBAOQD7wc/Q0AB/cABoXczQzwDYogBmVTEwLzpCP3vUzgA6LgItJBUuKsDMysfGxpGQjjaUhCLWuVFRT4LTyQD3yQD71gD3vSavka+urSM4MnFwbwD6xD3o2IKWkaWopn59e6qpqIegm7S+vBqwnUbi4gAwJgCUbwz570FAQLrCv8C/vxaGcgBIOx7YsQB8ZF/c2QCvh4jMvQDImgBYTgmCagDvriqSf9TU1CH5BAEAAP8ALAAAAAAwADAAAAj/AP8JHEiwoMGDCBMqXPivmroNRNKVK3fBHJpkDDMmZLZBEbZ5EyTRKUVP2rRwUc6h0ciy4Zt1A8R8ckLMQSxnvc5QaiehESNjwK60TJgMRgQLaZJkkknTwSJnRQxAaofnAAAAnZ4MNSikngIXUjAkjWloRA9Ei1qRpDJNglUAwsQB2iownxI3JhTwKqCKBqgBM0com7CMyYNLAW5IUHMVACdwQ5NV+MCtRgYTo2Tom1JmTKhPI2qm1QAEkhU8a3Y1npWI5ZUhJUhQVpJBQS0Zqsrg41LHyQgHhA0jxtWzMQBGrTPe6UCiQ4huc5R0UaB5ig4VuryYRduKtGnUqhsL/wPGcFuIDx9KfCDBTXoXLRA448ORI5DoOPsMUEocg3FjWARYo1ACIZRQQgfqnTDOXV2AxQYN+KiQgzscKINIYYcRkodbxgFAizZCHXQFOVtssUMIHXxwwgo1uMECWBCIcp0ur3AQBlpMkEbFaWtM0iEAFCDkAwNEnojgit64qAB8ovQxnxeH2JLKIvjpF8ACMTTyY4AGyWIHkUbEdsIJJNjgTQ0s2CZFX2NwUR8pqcQSBxMGHJMYhz8GWdCQDBhRIAkr2mADMpbZVgAGNOjARS6BcCBILJIYFoyGboVnHAFzEcQOA1DwgSCgNrTQAqGXZcaGAKBEokujYYSUYzA7ov/mo3Gw0IIEQdUQCcUO6pW5QgsooGCZCc1oJgoomtThiY0TLJEjEFVUssAa/nWoDUGs9LmFp+uFCiwKbWTAQmb6NPlHKF5wYEsxS9ChgX6V3NDfjwAQ8ItAV9zDqZHdrhAsuP2M+4UjU/ThmRcNyIGFJXREtZ+8WtKLjkAevJCFiSEUqKK/KBzRRsAKDFzwwYco3G5UdioW8Y/nzJWAHUZgjOB6HAfRBghpDmyKwa6gUvLCM6AcAHFv/diEPP/8kEXMRvZqQ7BB7AGCCbfo3FnPP1sSdJ2EEE0LvVGspLQRUGyBotMtHBE1CAjcoocjpujGBZQKa13EGWBQesDXP8L/g0nSS5d9toqhorB221bv5kUgdc+QU94bFt3hM+SNLfjMJxQehBls+/HFZp3NnXXQeOtNLwB+J022zAlqvocICHhegCiFtEk30HfnTTS9woT9jxDvlN00qP5uDrvstHuWwyHDYLEE6fvtTq84AlYs/NmA/mq4Gcd/UUAatdPHPLvQD41nnhjlyzT2KwJrPAKrfAFBUmPQlzC7Des0dJanJ/cPK0bYAR/Yp733xY8NSfmDLnLQgHW1qxTQ4k+1LnUvgSQggANMka/cxz34yQCBSVCVJxoIhxQMgiSQkFYMZtUhYxTkBdvqgAZtoL1H+AJ2q/igAEKYC0+MIAwlHMQD/+hBBWn1iF7X2JOfMEfDtNkwds0owKlSxShiKCMWMzhFhnjEN+PMggcF8dLgMuevI+zBF7HTAwRUIYBMuMILZKiJ1k5Rusj9iBbiOAgrsqDB9hnudbGTnyqS8Ic3OqEHqXje3arAn5WtBowGucILoFACMqYtCL5gW2bmVwhVkUEwxTAhBIuIJRY25hwJSUAWdpA5YB3BhiC4RbEwgKpI1IEMDRBECbV4CUKc5gCWukonMoWQaPDRlVHrB+L40sZIoCIQpLCH3fBmPkfWC2kKuUIFjFDGTXAOMx9M4BsbMAx2nbA0RgwmAPynkGQMoQMd+xjVbkNLZNWhRrpMQS8yZKRH4+gpI+60wSYyiRleIKUQhVyeyQYRlWiVsjGMSGJLknGHu6RJC2GpJY0ctUt+FgcAAIIMXYSQjfdIwQICCB8DbeG8QZCmCr+ExVXgAUm6/EMWMIAAG5qkAvpAU5qOs9IN1iBTTlwjRDYdSALe8A3sLC6altDnA8Bwpb11AgkYSaqIOuIPfsBBJDqyAjWgIQ5wIFWrG4kHRCRygURgQh5ZbUlAAAA7
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Bookmark</title>
<link rel="stylesheet" href="http://twitter.github.com/bootstrap/1.3.0/bootstrap.min.css">
<style>
html,
body {
overflow: hidden;
background-color: transparent;
}
#container {
/* prevent a fouc if no images present */
display: none;
}
.modal-header {
border-bottom: none;
padding: 5px 0 0;
position: absolute;
width: 100%;
background-color: whiteSmoke;
-webkit-border-radius: 6px 6px 0 0;
-moz-border-radius: 6px 6px 0 0;
border-radius: 6px 6px 0 0;
}
.modal-footer {
position: absolute;
bottom: 0;
left: 0;
right: 0;
}
.modal-footer input.btn {
width: auto;
}
h1 {
margin-bottom: 9px;
margin-top: 9px;
}
body {
width: 100%;
height: 100%;
position: absolute;
}
.modal {
margin: 10px;
top: 0;
left: 0;
bottom: 0;
width: 510px;
position: absolute;
}
label em {
cursor: pointer;
}
.modal-body {
overflow: auto;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin-top: 65px;
margin-bottom: 67px;
}
.tabs {
padding-left: 5px;
margin: 0;
height: 48px;
}
.tabs > li > a {
line-height: 46px;
font-weight: bold;
font-size: 100%;
}
.tab-pane {
display: none;
}
.active {
display: block;
}
.imagePicker {
-moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
-webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
border: 1px solid #CCC;
height: 110px;
overflow: auto;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
margin-left: 0;
}
.imagePicker img {
margin: 5px;
border: 2px solid transparent;
}
.imagePicker .current {
border: 2px dotted #555;
}
.private {
font-weight: bold;
width: auto;
margin-top: 3px;
margin-left: 6px;
}
@media all and (max-width: 550px) {
.modal {
width: 95%;
}
fieldset input[type=text],
fieldset textarea {
width: 95% !important;
}
}
</style>
</head>
<body>
<div id="container">
<form action="#" class="span-one-third modal">
<div class="modal-header">
<ul class="tabs" data-tabs="tabs">
<li data-tab-name="post"><a href="#postForm">Post</a></li>
<li class="active" data-tab-name="link"><a href="#linkForm">Link</a></li>
<li data-tab-name="quote"><a href="#quoteForm">Quote</a></li>
<li data-tab-name="image"><a href="#imageForm">Image</a></li>
</ul>
</div>
<fieldset id="postForm" class="form-stacked modal-body tab-pane">
<label class='clearfix'>Title
<input type="text" class="span8" name="title">
</label>
<input type="hidden" class="span8" name="url">
<label class='clearfix'>Post
<textarea class="span8" name="text" rows="8"></textarea>
</label>
<label class='clearfix'>Tags
<input type="text" class="span8" name="tags" value="post">
</label>
</fieldset>
<fieldset id="linkForm" class="form-stacked modal-body tab-pane active">
<label class='clearfix'>Title
<input type="text" class="span8" name="title">
</label>
<label class='clearfix'>URL
<input type="text" class="span8" name="url">
</label>
<label class='clearfix'>Description
<textarea class="span8" name="text" rows="5"></textarea>
</label>
<label class='clearfix'>Tags
<input type="text" class="span8" name="tags" value="bookmark">
</label>
</fieldset>
<fieldset id="quoteForm" class="form-stacked modal-body tab-pane">
<input type="hidden" name="title">
<input type="hidden" name="url">
<label class='clearfix'>Quote
<textarea class="span8" name="quote" rows="5"></textarea>
</label>
<label class='clearfix'>Note
<textarea class="span8" name="text" rows="4"></textarea>
</label>
<label class='clearfix'>Tags
<input type="text" class="span8" name="tags" value="bookmark">
</label>
</fieldset>
<fieldset id="imageForm" class="form-stacked modal-body tab-pane">
<input type="hidden" name="title">
<input type="hidden" name="url">
<label class='clearfix'>Image
<input type="hidden" name="image">
<div class="imagePicker span8"></div>
</label>
<label class='clearfix'>Notes
<textarea class="span8" name="text" rows="4"></textarea>
</label>
<label class='clearfix'>Tags
<input type="text" class="span8" name="tags" value="bookmark image">
</label>
</fieldset>
<div class="modal-footer">
<label class='private'>
<input type="checkbox" name="private" val="private">
keep private
</label>
<input type="submit" class="btn primary large" value="Done">
<input type="button" class="btn large closeBtn" value="Cancel">
</div>
</form>
</div>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
<script type="text/javascript" src="http://twitter.github.com/bootstrap/1.4.0/bootstrap-tabs.js"></script>
<script type="text/javascript" src="http://tiddlyspace.com/bags/tiddlyspace/tiddlers/chrjs"></script>
<script type="text/javascript" src="bookmarker.js"></script>
</body>
</html>
/*{{{*/
.tiddler .originButton div {
display: inline-block;
}
.tiddler .spaceSiteIcon .siteIcon {
_display: inline; /* IE doesn't like inline-block */
}
.tiddler .originButton {
display: block;
}
.selected .tagging,
.selected .tagging:hover {
border: none;
background: none;
}
.tagging {
float: none;
background: none;
border: none;
}
.tagging li.listTitle {
margin-left: 0px;
}
.tagging li {
margin: 0 8px;
}
.tagging .tiddlyLink {
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
-o-border-radius: 3px;
border-radius: 3px;
padding: 1px 2px;
line-height: 1.2em;
}
/* for following */
#popup .siteIcon {
float: left;
height: 25px;
}
.content {
width: 100%; /* IE */
font-size: 0.9em;
}
.editorHeading {
height: 48px;
}
.heading {
left: 0;
margin-bottom: 40px;
position: relative;
top: 32px;
}
.followButton a {
display: block;
margin-top: -20px;
}
.tiddler .followPlaceHolder {
display: block;
position: absolute;
top: 16px;
right: 64px;
_right: 138px; // add width of modifierIcon
}
.tiddler .followButton {
position: relative;
height: 24px;
text-align: left;
color: #fff;
background: [[ColorPalette::PrimaryMid]];
padding: 10px 0px 0px 10px;
width: 38px;
margin: -16px -8px 24px 0;
}
/* creates the larger triangle */
.followButton:before {
content: "\00a0";
display: block; /* reduce the damage in FF3.0 */
position: relative;
bottom: -20px;
right: 0;
width: 0;
height: 0;
border-width: 0 0 20px 20px;
border-style: solid;
border-color: transparent [[ColorPalette::PrimaryMid]];
}
.toolbar svg {
height: 16px;
width: 16px;
}
.toolbar svg .glyph {
fill: #ccc;
}
.toolbar a:hover .glyph {
fill: black;
}
.toolbar a:active .glyph {
fill: [[ColorPalette::Background]];
}
.originButton,
.followPlaceHolder,
.tiddler .subtitle {
cursor: pointer;
}
.editSpaceSiteIcon .originButton {
cursor: auto;
}
.tiddler .subtitle:hover {
font-weight: bold;
background: none;
}
.originButton img,
.originButton svg {
margin-left: 0px;
}
.modifierIcon {
position: absolute;
width: 74px;
top: 0px;
right: 0px;
_right: 74px; /* in IE6 positioning works incorrectly so use -width instead */
text-align: right;
}
.modifierIcon img,
.modifierIcon svg {
margin-right: 8px;
}
.tiddler .viewer {
padding-bottom: 16px;
margin: 0 0 0 56px;
line-height: 1.4em;
}
.viewer pre {
margin-left: 0;
}
.siteIcon .label {
color: [[ColorPalette::TertiaryDark]];
}
.tiddler .spaceSiteIcon {
float: left;
margin-right: 0;
margin-top: 0;
position: relative;
display: block;
}
.tiddler .titleBar {
display: block;
margin-right: 136px;
margin-left: 56px;
}
.followButton a {
color: [[ColorPalette::Background]];
}
.tiddler {
position: relative;
padding: 0;
margin-bottom: 3em;
border-top: 3px solid [[ColorPalette::PrimaryMid]];
background: #fff;
}
.tiddler .editor {
padding: 0px 8px;
}
.tiddler .heading .title {
position: relative;
display: block;
word-wrap: break-word;
font-size: 32px;
line-height: 32px;
}
.tiddler .heading .editor.title {
font-size: 1.7em;
line-height: normal;
}
.tiddler .headingClear {
clear: both;
}
.tiddler .subtitle {
font-style: italic;
font-size: 0.9em;
color: #a6a59e;
margin-top: 0;
}
.toolbar {
position: absolute;
padding: 0;
top: 8px;
right: -8px;
}
.toolbar .moreCommand.highlight {
background: none;
}
.tiddler .toolbar .button {
border: none;
display: inline;
padding: 0px;
margin-right: 16px;
}
.tiddler .toolbar a:hover {
background: none;
}
.tiddler .tagged .listTitle {
display: none;
}
.revButton {
float: right;
}
/*! EditTemplate specific*/
.tiddler .privacySettings {
text-align: center;
}
.tiddler .privacySettings .originButton {
display: inline;
}
.editSpaceSiteIcon, .privacyEdit {
float: left;
}
.editSpaceSiteIcon svg,
.editSpaceSiteIcon img,
.editSpaceSiteIcon .roundelLabel {
float: left;
}
.tagTitle {
position: absolute;
text-align: center;
width: 48px;
top: 0px;
left: -56px;
}
.editSpaceSiteIcon .originButton img,
.editSpaceSiteIcon .originButton svg {
height: 16px;
margin-left: 24px;
margin-right: 32px;
width: 16px;
}
.tagAnnotation {
margin-top: 8px;
padding-bottom: 8px;
}
.annotationsBox {
margin-top: 8px;
}
.editorFooter {
position: relative;
padding: 0;
margin-top: 16px;
margin-left: 64px;
}
.tiddler .editorFooter .editor {
padding-left: 0px;
}
.heading .editor input {
width: 100%;
font-size: 1.5em;
}
.spaceSiteIcon .externalImage .image a:hover,
.modifierIcon .externalImage .image a:hover {
background: none;
}
div.toolbar {
visibility:hidden;
right:-16px;
}
.selected div.toolbar {
visibility: visible;
}
.followButton a:hover {
background: [[ColorPalette::PrimaryMid]];
text-decoration: underline;
}
a.image:hover {
background: transparent;
}
@media all and (max-device-width: 480px) {
div.toolbar {
visibility:visible;
}
}
@media only screen and (device-width: 768px) {
div.toolbar {
visibility:visible;
}
}
@media all and (max-width: 960px) {
.tiddler .titleBar {
margin-left: 36px;
margin-right: 80px;
}
.tiddler .heading {
margin-bottom: 48px;
}
.tiddler .heading .title {
font-size: 32px;
line-height: 32px;
}
.tiddler .modifierIcon img,
.tiddler .modifierIcon svg,
.tiddler .spaceSiteIcon .originButton img,
.originButton svg {
width: 32px;
height: 32px;
margin-left: 0px;
margin-right: 0px;
}
.tiddler .followPlaceHolder {
right: 48px;
}
.tiddler .followButton {
width: 24px;
}
.tiddler .viewer {
margin: 0px 0px 0px 36px;
padding-top: 0;
}
br {
line-height: 0.5em;
}
}
/*}}}*/
!URL
http://caterina.net/wp-archives/98
!Description
So, to hell with all that noise. It’s just a big mass of envy, chatter and FOMO. Let’s get excited and make things.
It seems that at least half the time I make something cool on the web it turns out to be an open proxy. And sometimes I think 'so?'
One of the biggest challenges in any endeavor is the entirely subjective nature of quality. What I think is quality is probably entirely unlike what you think is quality. Thus as we are all actively striving for quality we are all striving for somthing different. To get something done we must strive for something other than quality, something agreed.
!URL
http://django-openid.googlecode.com/svn/trunk/openid.html
!Description
!URL
http://twitter.com/jdickerson/status/52361772631461888
!Description
If every element of an analogy had to hold for the analogy to work there would be no analogies which would be like a world without analogies
!Notes
I could have said this.
the world works because people desire it to, everyone agrees to a mass lie
!URL
http://www.randsinrepose.com/archives/2011/07/12/bored_people_quit.html
!Description
Bored People Quit
!Notes
There are //so many// gems in here about managing technical people.
<<<
This book is derived from the classic textbook Structure and Interpretation of Computer Programs by Abelson, Abelson, and Sussman.
<<<
[[CS61A, Spring 2012 Online Textbook|http://www-inst.eecs.berkeley.edu/~cs61a/sp12/book/]]
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
<<<
The great thing about the web is linking. I don't care how ugly it looks and how pretty your app is, if I can't link in and out of your world, it's not even close to a replacement for the web. It would be as silly as saying that you don't need oceans because you have a bathtub. How nice your bathtub is. Try building a continent around it if you want to get my point.
<<<
[[Scripting News: Why apps are not the future|http://scripting.com/stories/2011/12/13/whyAppsAreNotTheFuture.html]]
I will feel like I've made a success of my time with Tiddly* when people are regularly using tiddlers outside of TiddlyWiki, and TiddlyWiki is just one of several ways of managing tiddlers
''Note that of late I've only been using the @cdent space.''
This is [[Chris Dent]]'s TiddlySpace, for social, uh, networking purposes. My terrific ennui with [[twitter|http://twitter.com/cdent]] and [[facebook|http://www.facebook.com/cdent]] is driving me away from those services. Since I'm one of the developers of TiddlySpace, perhaps I can shape it to my needs. For more technical stuff, mostly related to TiddlySpace, also see @cdent . For some old writings see @cdent-meaning. For pictures see [[flickr|http://www.flickr.com/photos/cdent/]].
| Latest Tweets ([[html|http://chris-dent.tiddlyspace.com/bags/chris-dent_public/tiddlers?select=tag:tweet;sort=-modified;limit=10]] [[feed|http://chris-dent.tiddlyspace.com/bags/chris-dent_public/tiddlers.atom?select=tag:tweet;sort=-modified;limit=10]]) | Latest Journals ([[html|http://chris-dent.tiddlyspace.com/bags/chris-dent_public/tiddlers?select=tag:journal;sort=-modified;limit=10]] [[feed|http://chris-dent.tiddlyspace.com/bags/chris-dent_public/tiddlers.atom?select=tag:journal;sort=-modified;limit=10]]) | Latest Bookmarks ([[html|http://cdent-bkm.tiddlyspace.com/bags/cdent-bkm_public/tiddlers?select=tag:bookmark;sort=-modified;limit=10]] [[feed|http://cdent-bkm.tiddlyspace.com/bags/cdent-bkm_public/tiddlers.atom?select=tag:bookmark;sort=-modified;limit=10]]) |h
|<<timeline better:true onlyTag:tweet sortBy:created maxEntries:10>>|<<timeline better:true onlyTag:journal sortBy:created maxEntries:10>>|<<timeline better:true onlyTag:bookmark sortBy:created maxEntries:10>>|
[img[http://tiddlyspace.com/bags/veminra_public/tiddlers/no-facebook.resized.png][http://www.fsf.org/facebook]]
/***
|''Name''|TiddlySpacePublishingCommands|
|''Version''|0.8.5|
|''Status''|@@beta@@|
|''Description''|toolbar commands for drafting and publishing|
|''Author''|Jon Robson|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpacePublishingCommands.js|
|''CoreVersion''|2.6.1|
|''Requires''|TiddlySpaceConfig TiddlySpaceFilters|
!Usage
Provides changeToPrivate, changeToPublic and saveDraft commands
Provides TiddlySpacePublisher macro.
{{{<<TiddlySpacePublisher type:private>>}}} make lots of private tiddlers public.
{{{<<TiddlySpacePublisher type:public>>}}} make lots of public tiddlers public.
!TODO
* add public argument?
!Code
***/
//{{{
(function($) {
var tiddlyspace = config.extensions.tiddlyspace;
var originMacro = config.macros.tiddlerOrigin;
tiddlyspace.getTiddlerStatusType = function(tiddler) {
var isShadow = store.isShadowTiddler(tiddler.title);
var exists = store.tiddlerExists(tiddler.title);
if(isShadow && !exists) {
return "shadow";
} else if(!exists) {
return "missing";
} else {
var types = ["private", "public"];
var type = "external";
for(var i = 0; i < types.length; i++) {
var t = types[i];
type = config.filterHelpers.is[t](tiddler) ? t : type;
}
if(config.filterHelpers.is.unsynced(tiddler)) {
type = type == "private" ? "unsyncedPrivate" : "unsyncedPublic";
}
return type;
}
};
var cmd = config.commands.publishTiddler = {
text: "make public",
tooltip: "Change this private tiddler into a public tiddler",
errorMsg: "Error publishing %0: %1",
isEnabled: function(tiddler) {
return !readOnly && config.filterHelpers.is["private"](tiddler);
},
handler: function(ev, src, title) {
var tiddler = store.getTiddler(title);
if(tiddler) {
var newBag = cmd.toggleBag(tiddler.fields["server.bag"]);
this.moveTiddler(tiddler, {
title: tiddler.fields["publish.name"] || tiddler.title,
fields: { "server.bag": newBag }
});
}
},
toggleBag: function(bag, to) {
var newBag;
if(typeof bag != typeof "") {
var tiddler = bag;
bag = tiddler.fields["server.bag"];
}
if(bag.indexOf("_private") > -1) { // should make use of endsWith
to = to ? to : "public";
newBag = bag.replace("_private", "_" + to);
} else {
to = to ? to : "private";
newBag = bag.replace("_public", "_" + to);
}
return newBag;
},
copyTiddler: function(title, newTitle, newBag, callback) {
var original = store.getTiddler(title);
newTitle = newTitle ? newTitle : title;
var adaptor = original.getAdaptor();
var publish = function(original, callback) {
var tiddler = $.extend(new Tiddler(newTitle), original);
tiddler.fields = $.extend({}, original.fields, {
"server.bag": newBag,
"server.workspace": "bags/%0".format(newBag),
"server.page.revision": "false"
});
delete tiddler.fields["server.title"];
tiddler.title = newTitle;
adaptor.putTiddler(tiddler, null, null, callback);
};
publish(original, callback);
},
moveTiddler: function(tiddler, newTiddler, callback) {
var info = {
copyContext: {},
deleteContext: {}
};
var _dirty = store.isDirty();
var adaptor = tiddler.getAdaptor();
var newTitle = newTiddler.title;
var oldTitle = tiddler.title;
delete tiddler.fields["server.workspace"];
var oldBag = tiddler.fields["server.bag"];
var newBag = newTiddler.fields["server.bag"];
var newWorkspace = "bags/%0".format(newBag);
cmd.copyTiddler(oldTitle, newTitle, newBag, function(ctx) {
info.copyContext = ctx;
var context = {
tiddler: tiddler,
workspace: newWorkspace
};
store.addTiddler(ctx.tiddler);
tiddler.title = oldTitle; // for cases where a rename occurs
if(ctx.status) { // only do if a success
if(oldBag != newBag) {
adaptor.deleteTiddler(tiddler, context, {}, function(ctx) {
info.deleteContext = ctx;
var el;
if(tiddler) {
tiddler.fields["server.workspace"] = newWorkspace;
tiddler.fields["server.bag"] = newBag;
}
el = el ? el : story.refreshTiddler(oldTitle, null, true);
if(oldTitle != newTitle) {
store.deleteTiddler(oldTitle);
store.notify(oldTitle, true);
}
if(el) {
story.displayTiddler(el, newTitle);
}
if(oldTitle != newTitle) {
story.closeTiddler(oldTitle);
}
if(callback) {
callback(info);
}
store.setDirty(_dirty);
});
} else {
if(callback) {
callback(info);
}
}
refreshDisplay();
}
});
}
};
var changeToPrivate = config.commands.changeToPrivate = {
text: "make private",
tooltip: "turn this public tiddler into a private tiddler",
isEnabled: function(tiddler) {
return !readOnly && config.filterHelpers.is["public"](tiddler);
},
handler: function(event, src, title) {
var tiddler = store.getTiddler(title);
var newBag = cmd.toggleBag(tiddler, "private");
var newTiddler = { title: title, fields: { "server.bag": newBag }};
cmd.moveTiddler(tiddler, newTiddler);
}
};
config.commands.changeToPublic = cmd;
/* Save as draft command */
var saveDraftCmd = config.commands.saveDraft = {
text: "save draft",
tooltip: "Save as a private draft",
isEnabled: function(tiddler) {
return changeToPrivate.isEnabled(tiddler);
},
getDraftTitle: function(title) {
var draftTitle;
var draftNum = "";
while(!draftTitle) {
var suggestedTitle = "%0 [draft%1]".format(title, draftNum);
if(store.getTiddler(suggestedTitle)) {
draftNum = !draftNum ? 2 : draftNum + 1;
} else {
draftTitle = suggestedTitle;
}
}
return draftTitle;
},
createDraftTiddler: function(title, gatheredFields) {
var tiddler = store.getTiddler(title);
var draftTitle = saveDraftCmd.getDraftTitle(title);
var draftTiddler = new Tiddler(draftTitle);
if(tiddler) {
$.extend(true, draftTiddler, tiddler);
} else {
$.extend(draftTiddler.fields, config.defaultCustomFields);
}
for(var fieldName in gatheredFields) {
if(TiddlyWiki.isStandardField(fieldName)) {
draftTiddler[fieldName] = gatheredFields[fieldName];
} else {
draftTiddler.fields[fieldName] = gatheredFields[fieldName];
}
}
var privateBag = tiddlyspace.getCurrentBag("private");
var privateWorkspace = tiddlyspace.getCurrentWorkspace("private");
draftTiddler.title = draftTitle;
draftTiddler.fields["publish.name"] = title;
draftTiddler.fields["server.workspace"] = privateWorkspace;
draftTiddler.fields["server.bag"] = privateBag;
draftTiddler.fields["server.title"] = draftTitle;
draftTiddler.fields["server.page.revision"] = "false";
delete draftTiddler.fields["server.etag"];
return draftTiddler;
},
handler: function(ev, src, title) {
var tiddler = store.getTiddler(title); // original tiddler
var tidEl = story.getTiddler(title);
var uiFields = {};
story.gatherSaveFields(tidEl, uiFields);
var tid = saveDraftCmd.createDraftTiddler(title, uiFields);
tid = store.saveTiddler(tid.title, tid.title, tid.text, tid.modifier,
new Date(), tid.tags, tid.fields);
autoSaveChanges(null, [tid]);
story.closeTiddler(title);
story.displayTiddler(src, title);
story.displayTiddler(src, tid.title);
}
};
var macro = config.macros.TiddlySpacePublisher = {
locale: {
title: "Batch Publisher",
changeStatusLabel: "Make %0",
noTiddlersText: "No tiddlers to publish",
changeStatusPrompt: "Make all the selected tiddlers %0.",
description: "Change tiddlers from %0 to %1 in this space"
},
listViewTemplate: {
columns: [
{ name: "Selected", field: "Selected", rowName: "title", type: "Selector" },
{ name: "Tiddler", field: "tiddler", title: "Tiddler", type: "Tiddler" },
{ name: "Status", field: "status", title: "Status", type: "WikiText" }
],
rowClasses: []
},
changeStatus: function(tiddlers, status, callback) { // this is what is called when you click the publish button
var publicBag;
for(var i = 0; i < tiddlers.length; i++) {
var tiddler = tiddlers[i];
var newTiddler = {
title: tiddler.title,
fields: { "server.bag": cmd.toggleBag(tiddler, status) }
};
cmd.moveTiddler(tiddler, newTiddler, callback);
}
},
getMode: function(paramString) {
var params = paramString.parseParams("anon")[0];
var status = params.type ?
(["public", "private"].contains(params.type[0]) ? params.type[0] : "private") :
"private";
var newStatus = status == "public" ? "private" : "public";
return [status, newStatus];
},
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
var wizard = new Wizard();
var locale = macro.locale;
var status = macro.getMode(paramString);
wizard.createWizard(place, locale.title);
wizard.addStep(macro.locale.description.format(status[0], status[1]),
'<input type="hidden" name="markList" />');
var markList = wizard.getElement("markList");
var listWrapper = $("<div />").addClass("batchPublisher").
attr("refresh", "macro").attr("macroName", macroName).
attr("params", paramString)[0];
markList.parentNode.insertBefore(listWrapper, markList);
$.data(listWrapper, "wizard", wizard);
macro.refresh(listWrapper);
},
getCheckedTiddlers: function(listWrapper, titlesOnly) {
var tiddlers = [];
$(".chkOptionInput[rowName]:checked", listWrapper).each(function(i, el) {
var title = $(el).attr("rowName");
if(titlesOnly) {
tiddlers.push(title);
} else {
tiddlers.push(store.getTiddler(title));
}
});
return tiddlers;
},
refresh: function(listWrapper) {
var checked = macro.getCheckedTiddlers(listWrapper, true);
var paramString = $(listWrapper).empty().attr("params");
var wizard = $.data(listWrapper, "wizard");
var locale = macro.locale;
var params = paramString.parseParams("anon")[0];
var publishCandidates = [];
var status = macro.getMode(paramString);
var pubType = status[0];
var newPubType = status[1];
var tiddlers = params.filter ? store.filterTiddlers(params.filter[0]) :
store.filterTiddlers("[is[%0]]".format(pubType));
var enabled = [];
for(var i = 0; i < tiddlers.length; i++) {
var tiddler = tiddlers[i];
var title = tiddler.title;
if(!tiddler.tags.contains("excludePublisher") && title !== "SystemSettings") {
publishCandidates.push({ title: title, tiddler: tiddler, status: pubType});
}
if(checked.contains(title)) {
enabled.push("[rowname=%0]".format(title));
}
}
if(publishCandidates.length === 0) {
createTiddlyElement(listWrapper, "em", null, null, locale.noTiddlersText);
} else {
var listView = ListView.create(listWrapper, publishCandidates, macro.listViewTemplate);
wizard.setValue("listView", listView);
var btnHandler = function(ev) {
var tiddlers = macro.getCheckedTiddlers(listWrapper);
var callback = function(status) {
$(".batchPublisher").each(function(i, el) {
macro.refresh(el);
});
};
macro.changeStatus(tiddlers, newPubType, callback);
};
wizard.setButtons([{
caption: locale.changeStatusLabel.format(newPubType),
tooltip: locale.changeStatusPrompt.format(newPubType),
onClick: btnHandler
}]);
$(enabled.join(",")).attr("checked", true); // retain what was checked before
}
}
};
})(jQuery);
//}}}
!Spaces
<<groupBy server.bag>>
!Private
<<list filter [is[private]]>>
!Public
<<list filter [is[public]]>>
!Drafts
<<list filter [is[draft]]>>
!URL
http://blog.itlater.com/first-employee-of-startup-you-are-probably-getting-screwed/
!Description
Now this might sound very reasonable and exciting, but perhaps its time for…
A bit of… math !
<<<
I find that when I look at myself that I can be any of the above, but rarely all four within the same project. For some reason when you're the same person that started the project finishing it isn't nearly as much fun. Debugging the code that you wrote for weeks on end isn't as satisfying as helping someone squash a bug in their code.
<<<
[[The Starter, the Architect, the Debugger and the Finisher > jacquesmattheij.com|http://jacquesmattheij.com/The+Starter+the+Architect+the+Debugger+and+the+Finisher]]
/***
|''Description''|Sanitisation for dynamically pulling tiddlers into your space and displaying them|
!Notes
Works both inside and outside TiddlyWiki. Uses the HTML Sanitizer provided by the Google Caja project
(see http://code.google.com/p/google-caja/wiki/JsHtmlSanitizer for more on this), which is licensed under
an Apache License (see http://www.apache.org/licenses/LICENSE-2.0).
!Code
***/
//{{{
(function($) {
var cleanURL = function(url) {
var regexp = /^(?:http|https|mailto|ftp|irc|news):\/\//;
return (regexp.test(url)) ? url : null;
};
$.sanitize = function(html) {
return html_sanitize(html, cleanURL);
};
/*
* HTML Sanitizer, provided by Google Caja
*/
/* Copyright Google Inc.
* Licensed under the Apache Licence Version 2.0
* Autogenerated at Tue May 17 17:39:24 BST 2011
* @provides html4
*/var html4={};html4.atype={NONE:0,URI:1,URI_FRAGMENT:11,SCRIPT:2,STYLE:3,ID:4,IDREF:5,IDREFS:6,GLOBAL_NAME:7,LOCAL_NAME:8,CLASSES:9,FRAME_TARGET:10},html4.ATTRIBS={"*::class":9,"*::dir":0,"*::id":4,"*::lang":0,"*::onclick":2,"*::ondblclick":2,"*::onkeydown":2,"*::onkeypress":2,"*::onkeyup":2,"*::onload":2,"*::onmousedown":2,"*::onmousemove":2,"*::onmouseout":2,"*::onmouseover":2,"*::onmouseup":2,"*::style":3,"*::title":0,"a::accesskey":0,"a::coords":0,"a::href":1,"a::hreflang":0,"a::name":7,"a::onblur":2,"a::onfocus":2,"a::rel":0,"a::rev":0,"a::shape":0,"a::tabindex":0,"a::target":10,"a::type":0,"area::accesskey":0,"area::alt":0,"area::coords":0,"area::href":1,"area::nohref":0,"area::onblur":2,"area::onfocus":2,"area::shape":0,"area::tabindex":0,"area::target":10,"bdo::dir":0,"blockquote::cite":1,"br::clear":0,"button::accesskey":0,"button::disabled":0,"button::name":8,"button::onblur":2,"button::onfocus":2,"button::tabindex":0,"button::type":0,"button::value":0,"canvas::height":0,"canvas::width":0,"caption::align":0,"col::align":0,"col::char":0,"col::charoff":0,"col::span":0,"col::valign":0,"col::width":0,"colgroup::align":0,"colgroup::char":0,"colgroup::charoff":0,"colgroup::span":0,"colgroup::valign":0,"colgroup::width":0,"del::cite":1,"del::datetime":0,"dir::compact":0,"div::align":0,"dl::compact":0,"font::color":0,"font::face":0,"font::size":0,"form::accept":0,"form::action":1,"form::autocomplete":0,"form::enctype":0,"form::method":0,"form::name":7,"form::onreset":2,"form::onsubmit":2,"form::target":10,"h1::align":0,"h2::align":0,"h3::align":0,"h4::align":0,"h5::align":0,"h6::align":0,"hr::align":0,"hr::noshade":0,"hr::size":0,"hr::width":0,"iframe::align":0,"iframe::frameborder":0,"iframe::height":0,"iframe::marginheight":0,"iframe::marginwidth":0,"iframe::width":0,"img::align":0,"img::alt":0,"img::border":0,"img::height":0,"img::hspace":0,"img::ismap":0,"img::name":7,"img::src":1,"img::usemap":11,"img::vspace":0,"img::width":0,"input::accept":0,"input::accesskey":0,"input::align":0,"input::alt":0,"input::autocomplete":0,"input::checked":0,"input::disabled":0,"input::ismap":0,"input::maxlength":0,"input::name":8,"input::onblur":2,"input::onchange":2,"input::onfocus":2,"input::onselect":2,"input::readonly":0,"input::size":0,"input::src":1,"input::tabindex":0,"input::type":0,"input::usemap":11,"input::value":0,"ins::cite":1,"ins::datetime":0,"label::accesskey":0,"label::for":5,"label::onblur":2,"label::onfocus":2,"legend::accesskey":0,"legend::align":0,"li::type":0,"li::value":0,"map::name":7,"menu::compact":0,"ol::compact":0,"ol::start":0,"ol::type":0,"optgroup::disabled":0,"optgroup::label":0,"option::disabled":0,"option::label":0,"option::selected":0,"option::value":0,"p::align":0,"pre::width":0,"q::cite":1,"select::disabled":0,"select::multiple":0,"select::name":8,"select::onblur":2,"select::onchange":2,"select::onfocus":2,"select::size":0,"select::tabindex":0,"table::align":0,"table::bgcolor":0,"table::border":0,"table::cellpadding":0,"table::cellspacing":0,"table::frame":0,"table::rules":0,"table::summary":0,"table::width":0,"tbody::align":0,"tbody::char":0,"tbody::charoff":0,"tbody::valign":0,"td::abbr":0,"td::align":0,"td::axis":0,"td::bgcolor":0,"td::char":0,"td::charoff":0,"td::colspan":0,"td::headers":6,"td::height":0,"td::nowrap":0,"td::rowspan":0,"td::scope":0,"td::valign":0,"td::width":0,"textarea::accesskey":0,"textarea::cols":0,"textarea::disabled":0,"textarea::name":8,"textarea::onblur":2,"textarea::onchange":2,"textarea::onfocus":2,"textarea::onselect":2,"textarea::readonly":0,"textarea::rows":0,"textarea::tabindex":0,"tfoot::align":0,"tfoot::char":0,"tfoot::charoff":0,"tfoot::valign":0,"th::abbr":0,"th::align":0,"th::axis":0,"th::bgcolor":0,"th::char":0,"th::charoff":0,"th::colspan":0,"th::headers":6,"th::height":0,"th::nowrap":0,"th::rowspan":0,"th::scope":0,"th::valign":0,"th::width":0,"thead::align":0,"thead::char":0,"thead::charoff":0,"thead::valign":0,"tr::align":0,"tr::bgcolor":0,"tr::char":0,"tr::charoff":0,"tr::valign":0,"ul::compact":0,"ul::type":0},html4.eflags={OPTIONAL_ENDTAG:1,EMPTY:2,CDATA:4,RCDATA:8,UNSAFE:16,FOLDABLE:32,SCRIPT:64,STYLE:128},html4.ELEMENTS={a:0,abbr:0,acronym:0,address:0,applet:16,area:2,b:0,base:18,basefont:18,bdo:0,big:0,blockquote:0,body:49,br:2,button:0,canvas:0,caption:0,center:0,cite:0,code:0,col:2,colgroup:1,dd:1,del:0,dfn:0,dir:0,div:0,dl:0,dt:1,em:0,fieldset:0,font:0,form:0,frame:18,frameset:16,h1:0,h2:0,h3:0,h4:0,h5:0,h6:0,head:49,hr:2,html:49,i:0,iframe:4,img:2,input:2,ins:0,isindex:18,kbd:0,label:0,legend:0,li:1,link:18,map:0,menu:0,meta:18,nobr:0,noframes:20,noscript:20,object:16,ol:0,optgroup:0,option:1,p:1,param:18,pre:0,q:0,s:0,samp:0,script:84,select:0,small:0,span:0,strike:0,strong:0,style:148,sub:0,sup:0,table:0,tbody:1,td:1,textarea:8,tfoot:1,th:1,thead:1,title:24,tr:1,tt:0,u:0,ul:0,"var":0},html4.ueffects={NOT_LOADED:0,SAME_DOCUMENT:1,NEW_DOCUMENT:2},html4.URIEFFECTS={"a::href":2,"area::href":2,"blockquote::cite":0,"body::background":1,"del::cite":0,"form::action":2,"img::src":1,"input::src":1,"ins::cite":0,"q::cite":0},html4.ltypes={UNSANDBOXED:2,SANDBOXED:1,DATA:0},html4.LOADERTYPES={"a::href":2,"area::href":2,"blockquote::cite":2,"body::background":1,"del::cite":2,"form::action":2,"img::src":1,"input::src":1,"ins::cite":2,"q::cite":2};var html=function(a){function x(b,c,d){var e=[];w(function(b,e){for(var f=0;f<e.length;f+=2){var g=e[f],h=e[f+1],i=null,j;if((j=b+"::"+g,a.ATTRIBS.hasOwnProperty(j))||(j="*::"+g,a.ATTRIBS.hasOwnProperty(j)))i=a.ATTRIBS[j];if(i!==null)switch(i){case a.atype.NONE:break;case a.atype.SCRIPT:case a.atype.STYLE:h=null;break;case a.atype.ID:case a.atype.IDREF:case a.atype.IDREFS:case a.atype.GLOBAL_NAME:case a.atype.LOCAL_NAME:case a.atype.CLASSES:h=d?d(h):h;break;case a.atype.URI:h=c&&c(h);break;case a.atype.URI_FRAGMENT:h&&"#"===h.charAt(0)?(h=d?d(h):h,h&&(h="#"+h)):h=null;break;default:h=null}else h=null;e[f+1]=h}return e})(b,e);return e.join("")}function w(b){var c,d;return v({startDoc:function(a){c=[],d=!1},startTag:function(e,f,g){if(!d){if(!a.ELEMENTS.hasOwnProperty(e))return;var h=a.ELEMENTS[e];if(h&a.eflags.FOLDABLE)return;if(h&a.eflags.UNSAFE){d=!(h&a.eflags.EMPTY);return}f=b(e,f);if(f){h&a.eflags.EMPTY||c.push(e),g.push("<",e);for(var i=0,j=f.length;i<j;i+=2){var k=f[i],l=f[i+1];l!==null&&l!==void 0&&g.push(" ",k,'="',r(l),'"')}g.push(">")}}},endTag:function(b,e){if(d)d=!1;else{if(!a.ELEMENTS.hasOwnProperty(b))return;var f=a.ELEMENTS[b];if(!(f&(a.eflags.UNSAFE|a.eflags.EMPTY|a.eflags.FOLDABLE))){var g;if(f&a.eflags.OPTIONAL_ENDTAG)for(g=c.length;--g>=0;){var h=c[g];if(h===b)break;if(!(a.ELEMENTS[h]&a.eflags.OPTIONAL_ENDTAG))return}else for(g=c.length;--g>=0;)if(c[g]===b)break;if(g<0)return;for(var i=c.length;--i>g;){var h=c[i];a.ELEMENTS[h]&a.eflags.OPTIONAL_ENDTAG||e.push("</",h,">")}c.length=g,e.push("</",b,">")}}},pcdata:function(a,b){d||b.push(a)},rcdata:function(a,b){d||b.push(a)},cdata:function(a,b){d||b.push(a)},endDoc:function(a){for(var b=c.length;--b>=0;)a.push("</",c[b],">");c.length=0}})}function v(c){return function(d,e){d=String(d);var f=null,g=!1,h=[],j=void 0,l=void 0,m=void 0;c.startDoc&&c.startDoc(e);while(d){var n=d.match(g?t:u);d=d.substring(n[0].length);if(g){if(n[1]){var o=b(n[1]),p;if(n[2]){var q=n[3];switch(q.charCodeAt(0)){case 34:case 39:q=q.substring(1,q.length-1)}p=k(i(q))}else p=o;h.push(o,p)}else if(n[4]){l!==void 0&&(m?c.startTag&&c.startTag(j,h,e):c.endTag&&c.endTag(j,e));if(m&&l&(a.eflags.CDATA|a.eflags.RCDATA)){f===null?f=b(d):f=f.substring(f.length-d.length);var r=f.indexOf("</"+j);r<0&&(r=d.length),l&a.eflags.CDATA?c.cdata&&c.cdata(d.substring(0,r),e):c.rcdata&&c.rcdata(s(d.substring(0,r)),e),d=d.substring(r)}j=l=m=void 0,h.length=0,g=!1}}else if(n[1])c.pcdata&&c.pcdata(n[0],e);else if(n[3])m=!n[2],g=!0,j=b(n[3]),l=a.ELEMENTS.hasOwnProperty(j)?a.ELEMENTS[j]:void 0;else if(n[4])c.pcdata&&c.pcdata(n[4],e);else if(n[5]&&c.pcdata)switch(n[5]){case"<":c.pcdata("<",e);break;case">":c.pcdata(">",e);break;default:c.pcdata("&",e)}}c.endDoc&&c.endDoc(e)}}function s(a){return a.replace(m,"&$1").replace(n,"<").replace(o,">")}function r(a){return a.replace(l,"&").replace(n,"<").replace(o,">").replace(p,""").replace(q,"=")}function k(a){return a.replace(j,g)}function i(a){return a.replace(h,"")}function g(a,b){return f(b)}function f(a){a=b(a);if(c.hasOwnProperty(a))return c[a];var f=a.match(d);if(f)return String.fromCharCode(parseInt(f[1],10));if(!!(f=a.match(e)))return String.fromCharCode(parseInt(f[1],16));return""}var b;"script"==="SCRIPT".toLowerCase()?b=function(a){return a.toLowerCase()}:b=function(a){return a.replace(/[A-Z]/g,function(a){return String.fromCharCode(a.charCodeAt(0)|32)})};var c={lt:"<",gt:">",amp:"&",nbsp:"240",quot:'"',apos:"'"},d=/^#(\d+)$/,e=/^#x([0-9A-Fa-f]+)$/,h=/\0/g,j=/&(#\d+|#x[0-9A-Fa-f]+|\w+);/g,l=/&/g,m=/&([^a-z#]|#(?:[^0-9x]|x(?:[^0-9a-f]|$)|$)|$)/gi,n=/</g,o=/>/g,p=/\"/g,q=/\=/g,t=new RegExp("^\\s*(?:(?:([a-z][a-z-]*)(\\s*=\\s*(\"[^\"]*\"|'[^']*'|(?=[a-z][a-z-]*\\s*=)|[^>\"'\\s]*))?)|(/?>)|[\\s\\S][^a-z\\s>]*)","i"),u=new RegExp("^(?:&(\\#[0-9]+|\\#[x][0-9a-f]+|\\w+);|<!--[\\s\\S]*?-->|<!\\w[^>]*>|<\\?[^>*]*>|<(/)?([a-z][a-z0-9]*)|([^<&>]+)|([<&>]))","i");return{escapeAttrib:r,makeHtmlSanitizer:w,makeSaxParser:v,normalizeRCData:s,sanitize:x,unescapeEntities:k}}(html4),html_sanitize=html.sanitize
// stop here if we're not in TiddlyWiki
// XXX: is this the correct way of checking for TiddlyWiki?
if (!window.TiddlyWiki || !window.store || !store instanceof TiddlyWiki) {
return;
}
var tiddlyspace = config.extensions.tiddlyspace;
var _subWikify = Wikifier.prototype.subWikify;
var cleanedTitle = 'This section has been cleaned of any potentially harmful code';
var replaceFunctions = {
html: function(w) {
var sanitizedHTML, spanEl;
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
sanitizedHTML = $.sanitize(lookaheadMatch[1]);
spanEl = createTiddlyElement(w.output, 'span', null, 'sanitized');
spanEl.innerHTML = sanitizedHTML;
spanEl.setAttribute('title', cleanedTitle);
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
},
customFormat: function(w) {
switch(w.matchText) {
case '@@':
var e = createTiddlyElement(w.output, 'span');
var styles = config.formatterHelpers.inlineCssHelper(w);
if (styles.length === 0) {
e.className = 'marked';
}
w.subWikifyTerm(e, /(@@)/mg);
break;
case '{{':
var lookaheadRegExp = /\{\{[\s]*([\w]+[\s\w]*)[\s]*\{(\n?)/mg;
lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = lookaheadRegExp.exec(w.source);
if(lookaheadMatch) {
w.nextMatch = lookaheadRegExp.lastIndex;
e = createTiddlyElement(w.output,lookaheadMatch[2] == "\n" ? "div" : "span",null,lookaheadMatch[1]);
w.subWikifyTerm(e,/(\}\}\})/mg);
}
break;
}
}
};
Wikifier.prototype.subWikify = function(output, terminator) {
var tid = this.tiddler,
spaceName = tiddlyspace.currentSpace.name,
tidSpace, recipeName, stripped;
try {
recipeName = tid.fields['server.recipe'] ||
tid.fields['server.workspace'];
tidSpace = tiddlyspace.resolveSpaceName(recipeName);
if (tidSpace !== spaceName) {
// external tiddler, so replace dangerous formatters
stripped = stripHTML(tid, this.formatter);
}
} catch(e) {
// do nothing. There's no tiddler, so assume it's safe (?!?!?)
}
_subWikify.apply(this, arguments);
if (stripped) {
// change back to the original function
unstripHTML(stripped, this.formatter);
}
};
// replace potentially unsafe formatters with versions that strip bad HTML/CSS
var stripHTML = function(tid, formatter) {
var popped = {}, _handler;
for (var i = 0; i < formatter.formatters.length; i++) {
var f = formatter.formatters[i];
if (replaceFunctions[f.name]) {
_handler = f.handler;
popped[f.name] = _handler;
f.handler = replaceFunctions[f.name];
}
};
return popped;
};
// put the original formatters back where they belong
var unstripHTML = function(stripped, formatter) {
for (var i = 0; i < formatter.formatters.length; i++) {
var f = formatter.formatters[i];
if (stripped[f.name]) {
f.handler = stripped[f.name];
}
};
};
})(jQuery);
//}}}
$.ajaxSetup({
beforeSend: function(xhr) {
xhr.setRequestHeader("X-ControlView", "false");
}
});
var ELEMENT_SELECTOR = "#app-desc,#social";
var cache = {};
var host = "http://tiddlyspace.com";
function renderTiddler(el, tiddler) {
var bag = tiddler.modifier + "_public";
var srcImage = host + "/bags/" + bag + "/tiddlers/SiteIcon";
var img;
if(!cache[srcImage]) {
img = new Image()
img.width = 48;
img.height = 48;
img.src = srcImage;
cache[srcImage] = img;
img = $("<img />").css("max-width", 48).css("max-height", 48).attr("src", srcImage)[0];
} else {
img = cache[srcImage];
}
$(el).empty();
$(img).attr("title", "@" + tiddler.modifier).appendTo(el);
$("<h2 />").text(tiddler.title).appendTo(el);
if(tiddler.render) {
var container = $("<div />").html(tiddler.render).appendTo(el)[0];
$("h1,h2,h3,h4,h5", container).each(function(i, header) {
var nodeName = header.nodeName;
var number = parseInt(nodeName.substr(1, nodeName.length), 10) + 2;
$("<h" + number + " />").text($(header).text()).insertBefore(header);
$(header).remove();
});
} else {
$("<div />").text(tiddler.text).appendTo(el);
}
}
function removeFriend(friend) {
var tiddler = new tiddlyweb.Tiddler("@" + friend, userbag);
var success = function() {
printMessage("User " + friend + " removed from friends");
var newFriends = [];
var friends = app.friends;
for(var i = 0; i < friends.length; i++) {
var f = friends[i];
if(f !== friend) {
newFriends.push(f);
}
}
app.friends = newFriends;
$("#friend-" + friend).hide(2000);
};
tiddler["delete"](success, function() {
var old = new tiddlyweb.Tiddler(friend, userbag);
old["delete"](success, function() {
printError("Unable to remove friend " + friend);
})
})
}
function socialStream(subscriptions) {
var socialEl = $(ELEMENT_SELECTOR);
$(socialEl).empty();
var list = $("<ul />").appendTo(socialEl);
var args = [];
$("<li />").text("Loading...").appendTo(list);
for(var i = 0; i < subscriptions.length; i++) {
args.push("modifier:" + subscriptions[i]);
}
var qs = "q=" + args.join(" OR ") + " _limit:200&select=tag:!excludeLists&select=modified:>3d";
$.ajax({
data: {
fat: "y",
render: "y"
},
url: "/search?" + qs,
dataType: "json",
success: function(tiddlers) {
$(list).empty();
for(var i = 0; i < tiddlers.length; i++) {
var item = $("<li />").appendTo(list)[0];
renderTiddler(item, tiddlers[i]);
}
}
});
}
var friends = [];
$.ajax({
url: "/status",
dataType: "json",
success: function(status) {
user = status.username;
userbag = new tiddlyweb.Bag(user + "_public", "/");
userbag.tiddlers().get(function(tiddlers) {
for(var i = 0; i < tiddlers.length; i++) {
var title = tiddlers[i].title;
if(title.indexOf("@") === 0) {
title = title.substr(1, title.length);
}
friends.push(title);
}
socialStream(friends);
}, function() {
}, "select=tag:follow");
}
})
var simpleDate = (function() {
var measures = {
second: 1,
minute: 60,
hour: 3600,
day: 86400,
week: 604800,
month: 2592000,
year: 31536000
};
var chkMultiple = function(amount, type) {
return (amount > 1) ? amount + " " + type + "s":"a " + type;
};
return function(thedate) {
var dateStr, amount,
current = new Date().getTime(),
diff = (current - thedate.getTime()) / 1000; // work with seconds
if(diff > measures.year) {
amount = Math.round(diff/measures.year);
dateStr = "about " + chkMultiple(amount, "year") + " ago";
} else if(diff > measures.month) {
amount = Math.round(diff/measures.month);
//if(typeof amount == "")
dateStr = "about " + chkMultiple(amount, "month") + " ago";
} else if(diff > measures.week) {
amount = Math.round(diff/measures.week);
dateStr = "about " + chkMultiple(amount, "week") + " ago";
} else if(diff > measures.day) {
amount = Math.round(diff/measures.day);
dateStr = "about " + chkMultiple(amount, "day") + " ago";
} else if(diff > measures.hour) {
amount = Math.round(diff/measures.hour);
dateStr = "about " + chkMultiple(amount, "hour") + " ago";
} else if(diff > measures.minute) {
amount = Math.round(diff/measures.minute);
dateStr = "about " + chkMultiple(amount, "minute") + " ago";
} else {
dateStr = "a few seconds ago";
}
return dateStr;
};
})();
function prettyDate(t) {
var date = new Date(Date.UTC(
parseInt(t.substr(0, 4), 10),
parseInt(t.substr(4, 2), 10) - 1,
parseInt(t.substr(6, 2), 10),
parseInt(t.substr(8, 2), 10),
parseInt(t.substr(10, 2), 10),
parseInt(t.substr(12, 2) || "0", 10),
parseInt(t.substr(14, 3) || "0", 10)
));
return simpleDate(date);
}
<!--{{{-->
<link rel="shortcut icon" href="/recipes/chris-dent_public/tiddlers/favicon.ico" />
<link href="/search.atom?q=modified:cdent"
rel="alternate" type="application/atom+xml" title="chris-dent's public feed" />
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<!--}}}-->
!URL
http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html
!Description
!URL
http://www.icann.org/
!Description
New gTLDs will change the way people find information on the Internet and how businesses plan and structure their online presence. Internet address names will be able to end with almost any word in any language, offering organizations around the world the opportunity to market their brand, products, community or cause in new and innovative ways.
!Notes
I reckon this is going to suck. Or maybe I'm just a grape in the path...
!URL
http://xkcd.com/915/
!Description
xkcd: Connoisseur
!Notes
As with pleasure so too with pain.
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
For the first time in my life I will be voting tomorrow. The vagrancies of residency, citizenship etc have blocked in the past.
!URL
http://www.smartusa.com/index.html
!Description
coming in jan 2008
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="506 234 68 36" width="30" height="30"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2010-09-16 14:51Z</dc:date><!-- Produced by OmniGraffle Professional 5.2.3 --></metadata><defs></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><rect width="1118" height="783"/><g><path d="M 538.68195 244.31807 C 540.43927 246.07547 540.43927 248.9247 538.68195 250.68204 C 536.92456 252.4394 534.07532 252.4394 532.318 250.68204 C 530.5606 248.9247 530.5606 246.07547 532.318 244.31807 C 534.07532 242.56075 536.92456 242.56075 538.68195 244.31807 M 511.12607 257.99356 C 511.26108 258.13019 511.39728 258.26608 511.53473 258.40121 C 527.2556 273.86606 552.74414 273.86606 568.46515 258.40121 C 568.60248 258.26617 568.73853 258.13037 568.87354 257.9938 C 568.8736 257.99374 568.8736 257.99371 568.8736 257.99362 C 568.87366 257.99371 568.87366 257.9938 568.87372 257.9939 C 570.72504 256.12051 572.35046 254.11153 573.74994 252 C 573.74994 251.99997 573.74994 251.99994 573.74994 251.99992 C 572.35046 249.8884 570.72504 247.87938 568.87372 246.00606 C 568.87366 246.00613 568.87366 246.00621 568.8736 246.00627 C 568.73865 245.86966 568.60254 245.73383 568.46515 245.5987 C 552.74414 230.13387 527.2556 230.13387 511.53473 245.5987 C 511.39728 245.73383 511.26108 245.86974 511.12613 246.00635 C 511.126 246.00624 511.126 246.00616 511.12595 246.00606 C 509.2748 247.87938 507.64954 249.88837 506.24994 251.9998 L 506.24994 251.99983 C 506.24994 251.9999 506.25 251.99992 506.25 251.99997 C 506.25 252 506.24994 252.00005 506.24994 252.00009 L 506.24994 252.00012 C 507.64954 254.11157 509.2748 256.12051 511.12595 257.9939 C 511.126 257.99377 511.126 257.99365 511.12607 257.99359 Z M 515.44916 252 C 515.8548 251.55469 516.27502 251.11778 516.71014 250.68985 C 522.16632 245.32257 529.06055 242.23206 536.17273 241.41824 C 534.6662 241.96199 533.2525 242.83762 532.04498 244.04512 C 527.65155 248.43852 527.65155 255.56163 532.04498 259.95502 C 533.2522 261.16226 534.6656 262.03778 536.17175 262.58154 C 529.05988 261.76761 522.16608 258.6771 516.71014 253.31009 C 516.2751 252.88219 515.85486 252.44528 515.44922 252 Z M 564.55054 251.99995 C 564.14502 252.44525 563.7248 252.88217 563.28973 253.31009 C 557.83368 258.67712 550.93988 261.76764 543.828 262.58157 C 545.33423 262.03781 546.74756 261.1623 547.9549 259.95502 C 552.34833 255.56163 552.34833 248.43852 547.9549 244.04512 C 546.74744 242.83765 545.33374 241.96202 543.82715 241.41824 C 550.9394 242.23206 557.83356 245.3226 563.28973 250.68985 C 563.7248 251.11775 564.14502 251.55467 564.55054 251.99995 Z M 568.8736 257.99362 C 570.7249 256.12033 572.35028 254.11139 573.74988 252.00002" fill="black" class="glyph"/></g></g></svg>
<<<
Here's the slides from my Pycon 2012 talk, "Hand Coded Applications with SQLAlchemy".
<<<
[[zzzeek : Pycon 2012 : Hand Coded Applications with SQLAlchemy|http://techspot.zzzeek.org/2012/03/12/pycon-2012-hand-coded-applications-with-sqlalchemy/]]
http://tiddlyspace.com/ crossed into >2000 spaces as it entered 2011
!URL
http://idlewords.com/2007/07/the_million_marker_map.htm
!Description
one can always rely on this fellow for cool stuff
!URL
http://blog.wearpants.org/meet-twiggy
!Description
Solves Your Problems. Pets Your Puppy.
!Notes
Improved logging for Python. Less Java, more Python.
damn royal wedding next year stealing my wedding next year thunder
!URL
http://www.geocities.com/yosemite/5860/local_beta.htm
!Description
washington climbing info
It must be 1994, I'm writing init scripts.
!URL
http://www.mnot.net/blog/2007/08/07/etags
!Description
/***
|''Name''|TiddlySpaceFollowingWizard|
|''Version''|0.7.0|
|''Description''|Provides a following wizard macro and deleteButton view type|
|''Author''|Jon Robson|
|''Requires''|TiddlySpaceConfig TiddlySpaceFollowingPlugin TiddlySpaceTiddlerIconsPlugin|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage
{{{ <<followWizard>> }}}
!StyleSheet
.followWizard ul,
.followWizard li .siteIcon,
.followWizard li {
list-style: none;
display: inline-block;
}
.followWizard li {
margin-right: 8px;
background-color: #eee;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
padding: 4px;
}
!Code
***/
//{{{
(function($) {
var tweb = config.extensions.tiddlyweb;
var tiddlyspace = config.extensions.tiddlyspace;
var currentSpace = tiddlyspace.currentSpace.name;
var shadows = config.shadowTiddlers;
shadows.FollowersTemplate = "<<view server.bag SiteIcon width:24 height:24 spaceLink:yes label:no>> <<view server.bag spaceLink>>";
shadows.FollowingTemplate = "<<view title SiteIcon width:24 height:24 spaceLink:yes label:no>> <<view title spaceLink>> <<view title deleteButton>>";
var name = "StyleSheetFollowingWizard";
shadows[name] = "/*{{{*/\n%0\n/*}}}*/".
format(store.getTiddlerText(tiddler.title + "##StyleSheet"));
store.addNotification(name, refreshStyles);
var wizard = config.macros.followWizard = {
locale: {
mission: "Which user or space would you like to follow?",
badpermissions: "Only members of the space can maintain followers.",
follow: "follow"
},
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
var locale = wizard.locale;
var container = $("<div />").addClass("followWizard").appendTo(place)[0];
if(!readOnly) {
var form = $("<form />").addClass("followForm").appendTo(container)[0];
$("<span />").text(locale.mission).appendTo(form);
var input = $("<input />").attr("name", "space").attr("type", "text").appendTo(form);
$("<input />").attr("type", "submit").val(locale.follow).appendTo(form).click(function(ev) {
wizard.addFollowing(ev, input.val());
ev.preventDefault();
});
} else {
$(container).addClass("annotation").text(locale.badpermissions);
}
},
addFollowing: function(ev, space) {
var name = tiddlyspace.resolveSpaceName(space);
if(!name) {
alert("That doesn't appear to be a valid space name. Please check and try again.");
return;
}
var title = "@" + name;
var tiddler = store.getTiddler(title);
if(tiddler) {
tiddler.tags.push("follow");
} else {
tiddler = new Tiddler(title);
tiddler.tags.push("follow");
merge(tiddler.fields, config.defaultCustomFields);
}
store.saveTiddler(tiddler);
autoSaveChanges();
}
};
config.macros.view.views.deleteButton = function(value,place,params,wikifier,paramString,tiddler) {
var tid = store.getTiddler(value)
if(tid && config.commands.deleteTiddler.isEnabled(tid)) {
var handler = function(ev) {
config.commands.deleteTiddler.handler(ev,ev.target,value);
};
createTiddlyButton(place, "X", "delete this tiddler", handler);
}
};
})(jQuery);
//}}}
london bound on a train full of children and more expensive than last year
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AP8zZgAAAGYA//8zAADMMwD/mTMAAGYzAP8zMwAAADMAzP8AAADMAADMmQAAAGYAAMwzAAAAAADuzAAA3QAAALvMAACqAAAAiMwAAHcAAABVmQAARAAAACKZAAARAADuAJkA3QAAALsAmQCqAAAAiACZAHcAAABVAJkARAAAACIAZgARAADuAABm3QAAALsAAGaqAAAAiAAAZncAAABVAABmRAAAACIAAGYRAAAA7u7uM93d3QC7u7szqqqqAIiIiDN3d3cAVVVVM0RERAAiIiIzERERAAAAADMBAQEBAQEBAQEBpXl5eXl5eXl5eXmlAQEBAQEBAQEBAQEBAQEBAQEBgHl5eXl5eXl5eXl5eXl5gAEBAQEBAQEBAQEBAQEB/Xp5eXlVT04qKioqTk9VeXl5ev0BAQEBAQEBAQEBAaV5eXlPKioqKioqKioqKioqT3l5eaUBAQEBAQEBAQGAeXlVTioqKioqKioqKioqKioqTlV5eYABAQEBAQEBgHl5VSoqKioqKioqKioqKioqKioqKlV5eYABAQEBAaV5eVUqKioqKioqKioqKioqKioqKioqKlV5eaUBAQEBeXlVKioqKioqKioqKioqKioqKioqKioqKlV5eQEBAXl5eU4qKioqKioqKjExMTExMSoqKioqKioqTnl5eQEBeXlPKioqKioqKjEyMjIyMjIyMjEqKioqKioqT3l5AXp5eSoqKioqKioxMjIxBwcHBzEyMjEqKioqKioqeXl6eXlVKioqKioqMTIxBwcHBwcHBwcxMjEqKioqKipVeXl5eU8qKioqKioyMgcHBwcHBwcHBwcyMioqKioqKk95eXl5TioqKioqMTIxBwcHBwcHBwcHBzEyMSoqKioqTnl5eXkqKioqKioxMgcHBwcHBwcHBwcHBzIxKioqKioqeXl5eSoqKioqKjEyBwcHBwcHBwcHBwcHMjEqKioqKip5eXl5KioqKioqMTIHBwcHBwcHBwcHBwcyMSoqKioqKnl5eXkqKioqKioxMgcHBwcHBwcHBwcHBzIxKioqKioqeXl5eU4qKioqKjEyMQcHBwcHBwcHBwcxMjEqKioqKk55eXl5TyoqKioqKjIyBwcHBwcHBwcHBzIyKioqKioqT3l5eXlVKioqKioqMTIxBwcHBwcHBwcxMjEqKioqKipVeXl6eXkqKioqKioqMTIyMQcHBwcxMjIxKioqKioqKnl5egF5eU8qKioqKioqMTIyMjIyMjIyMSoqKioqKipPeXkBAXl5eU4qKioqKioqKjExMTExMSoqKioqKioqTnl5eQEBAXl5VSoqKioqKioqKioqKioqKioqKioqKipVeXkBAQEB+nl5VSoqKioqKioqKioqKioqKioqKioqVXl5+gEBAQEBenl5VSoqKioqKioqKioqKioqKioqKlV5eXoBAQEBAQEBeXl5VU4qKioqKioqKioqKioqKk5VeXl5AQEBAQEBAQEBenl5eU8qKioqKioqKioqKipPeXl5egEBAQEBAQEBAQEB+nl5eXlVT04qKioqTk9VeXl5efoBAQEBAQEBAQEBAQEBAXl5eXl5eXl5eXl5eXl5eXkBAQEBAQEBAQEBAQEBAQEBAQF6eXl5eXl5eXl5eXoBAQEBAQEBAQEB/+AH//+AAf/+AAB//AAAP/gAAB/wAAAP4AAAB8AAAAPAAAADgAAAAYAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAHAAAADwAAAA+AAAAfwAAAP+AAAH/wAAD/+AAB//4AB///gB/8oAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAACAAAAAwAAAAMAAAADAAAABG1bSA61m3JXuqB4mbuhd8m9o3jqvaF4+b2hePm9o3jqu6F3ybqgeJm1m3JXbVtIDgAAAAQAAAADAAAAAwAAAAMAAAACAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAwAAAAUAAAAGAAAACI98Wye0nXWavKF4876kev++pHr/vqR6/76kev++pHr/vqR6/76kev++pHr/vqR6/76kev+8oXjztJ11mo98WycAAAAIAAAABgAAAAUAAAADAAAAAgAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAQAAAAHAAAAChwcHBKulnGJvaN5+L6kev++pHr/y7GJ/9/Fnv/s1K7/9t25//rivv/64r7/9t25/+zUrv/fxZ7/y7GJ/76kev++pHr/vaN5+K6WcYkcHBwSAAAACgAAAAcAAAAEAAAAAgAAAAEAAAAAAAAAAAAAAAEAAAADAAAABwAAAAtuYkUst552z76kev++pHr+1LuS//Latf/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD/8tq1/9S7kv++pHr+vqR6/7eeds9uYkUsAAAACwAAAAcAAAADAAAAAQAAAAAAAAABAAAAAgAAAAQAAAAIi3hbNbqgd+a+pHr/xayD/+3Vr//85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+3Vr//FrIP/vqR6/7qgd+aJdVg0AAAACAAAAAQAAAACAAAAAQAAAAEAAAACAAAABIl8WSW8oXjlvqR6/8yyiv/54Lz//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//ngvP/Msor/vqR6/7yheOWJfFklAAAABAAAAAIAAAABAAAAAAAAAAFfXz8Iu6F4zL6kev/Msor/+uK+//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//rivv/Msor/vqR6/7uheMxfXz8IAAAAAQAAAAAAAAAAAAAAAbqid4K+pHr/xayD//ngvP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//fgvP/FrIP/vqR6/7qid4IAAAABAAAAAAAAAAC3l28gvaN5+L6kev7t1a///OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+/Twv/Qq8f/u5HK/7OGzP+zhsz/u5HK/9Crx//v08L//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+3Vr/++pHr+vaN5+LeXbyAAAAAAAAAAALuheJa+pHr/1LuS//zlwP/85cD//OXA//zlwP/85cD//OXA//riwP/Pq8f/r4HM/6+Bzf+vgc3/r4HN/6+Bzf+vgc3/r4HN/6+BzP/Pq8f/+uLA//zlwP/85cD//OXA//zlwP/85cD//OXA/9S5kv++pHr/u6F4lgAAAACii3MLvKF4876kev/y2rX//OXA//zlwP/85cD//OXA//zlwP/64sD/w5vJ/6+Bzf+vg83/w5vc/9W06v/dwPD/3cDw/9W06v/Dm9z/r4PN/6+Bzf/Dm8n/+uLA//zlwP/85cD//OXA//zlwP/85cD/8tq1/76kev+8oXjzootzC72feFW+pHr/y7GJ//zlwP/85cD//OXA//zlwP/85cD//OXA/8+rx/+vgc3/tIfQ/9a16//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//Wtev/tIfQ/6+Bzf/Pq8f//OXA//zlwP/85cD//OXA//zlwP/85cD/y7GJ/76kev+9n3hVvaF4mL6kev/fxZ7//OXA//zlwP/85cD//OXA//zlwP/v08L/r4HM/6+Dzf/Wtev/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//Wtev/r4PN/6+BzP/v08L//OXA//zlwP/85cD//OXA//zlwP/fxZ7/vqR6/72heJi8oXfIvqR6/+zUrv/85cD//OXA//zlwP/85cD//OXA/9Crx/+vgc3/w5vc/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//Dm9z/r4HN/9Crx//85cD//OXA//zlwP/85cD//OXA/+zUrv++pHr/vKF3yL2jeOq+pHr/9t25//zlwP/85cD//OXA//zlwP/85cD/u5HK/6+Bzf/VtOr/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/9W06v+vgc3/u5HK//zlwP/85cD//OXA//zlwP/85cD/9t25/76kev+9o3jqvaF4+b6kev/64r7//OXA//zlwP/85cD//OXA//zlwP+zhsz/r4HN/93A8P/hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/3cDw/6+Bzf+zhsz//OXA//zlwP/85cD//OXA//zlwP/64r7/vqR6/72hePm9oXj5vqR6//rivv/85cD//OXA//zlwP/85cD//OXA/7OGzP+vgc3/3cDw/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//dwPD/r4HN/7OGzP/85cD//OXA//zlwP/85cD//OXA//rivv++pHr/vaF4+b2jeOq+pHr/9t25//zlwP/85cD//OXA//zlwP/85cD/u5HK/6+Bzf/VtOr/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/9W06v+vgc3/u5HK//zlwP/85cD//OXA//zlwP/85cD/9t25/76kev+9o3jqvKF3yL6kev/s1K7//OXA//zlwP/85cD//OXA//zlwP/Qq8f/r4HN/8Ob3P/hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/w5vc/6+Bzf/Qq8f//OXA//zlwP/85cD//OXA//zlwP/s1K7/vqR6/7yhd8i9oXiYvqR6/9/Fnv/85cD//OXA//zlwP/85cD//OXA/+/Twv+vgcz/r4PN/9a16//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//hw/P/4cPz/9a16/+vg83/r4HM/+/Twv/85cD//OXA//zlwP/85cD//OXA/9/Fnv++pHr/vaF4mL2feFW+pHr/y7GJ//zlwP/85cD//OXA//zlwP/85cD//OXA/8+rx/+vgc3/tIfQ/9a16//hw/P/4cPz/+HD8//hw/P/4cPz/+HD8//Wtev/tIfQ/6+Bzf/Pq8f//OXA//zlwP/85cD//OXA//zlwP/85cD/y7GJ/76kev+9n3hVootzC7yhePO+pHr/8tq1//zlwP/85cD//OXA//zlwP/85cD/+uLA/8Obyf+vgc3/r4PN/8Ob3P/VtOr/3cDw/93A8P/VtOr/w5vc/6+Dzf+vgc3/w5vJ//riwP/85cD//OXA//zlwP/85cD//OXA//Latf++pHr/vKF486KLcwsAAAAAu6N3l76kev/Uu5L//OXA//zlwP/85cD//OXA//zlwP/85cD/+uLA/8+rx/+vgcz/r4HN/6+Bzf+vgc3/r4HN/6+Bzf+vgc3/r4HM/8+rx//64sD//OXA//zlwP/85cD//OXA//zlwP/85cD/1LmS/76kev+7oXiWAAAAAAAAAAC3l28gvaN5+L6kev7t1a///OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+/Twv/Qq8f/u5HK/7OGzP+zhsz/u5HK/9Crx//v08L//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA/+3Vr/++pHr+vaN5+LeXbyAAAAAAAAAAAAAAAAC6oneCvqR6/8Wsg//54Lz//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/34Lz/xayD/76kev+6oneCAAAAAAAAAAAAAAAAAAAAAH9/VQa8oHjLvqR6/8yyiv/64r7//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD/+uK+/8yyiv++pHr/vKB4y39/VQYAAAAAAAAAAAAAAAAAAAAAAAAAALKhbh67o3nkvqR6/8yyiv/54Lz//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//ngvP/Msor/vqR6/7ujeeSyoW4eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALqbdim7o3nkvqR6/8Wsg//t1a///OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/t1a//xayD/76kev+7o3nkupt2KQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALKhbh68oHjLvqR6/76kev7Uu5L/8tq1//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/85cD//OXA//zlwP/y2rX/1LmS/76kev6+pHr/vKB4y7Khbh4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH9/VQa6oneCvaN5+L6kev++pHr/y7GJ/9/Fnv/s1K7/9t25//rivv/64r7/9t25/+zUrv/fxZ7/y7GJ/76kev++pHr/vaN5+Lqid4J/f1UGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC3l28gu6F4lryhePO+pHr/vqR6/76kev++pHr/vqR6/76kev++pHr/vqR6/76kev++pHr/vKF487uheJa3l28gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAootzC72feFW9oXiYvKF3yL2jeOq9oXj5vaF4+b2jeOq8oXfIvaF4mL2feFWii3MLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gB///gAH//gAAf/wAAD/4AAAf8AAAD+AAAAfAAAADwAAAA4AAAAGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAABwAAAA8AAAAPgAAAH8AAAD/gAAB/8AAA//gAAf/+AAf//4Af/
!URL
http://www.truth-out.org/goodbye-all-reflections-gop-operative-who-left-cult/1314907779
!Description
The Congressional directory now reads like a casebook of lunacy.
The activity feed is best for sharing opinions on something. To make best use of it create a tiddler and tag it with a username you would like to share thought with on this subject.
For instance I might create a tiddler called [[Animal I'd least like to be stuck in a cage with]]. I might say
<<<
I would least like to be stuck in a cage with a lion as it could tear me apart amongst other reasons.
<<<
I then tag it @matias to get @matias's attention to see what he think. This flags it in @matias's activity feed and tells him that I am interested in his thoughts. Of course @matias can ignore it, and if he is not using the activity feed feature he may not even know about the message. If he wants to respond all @matias then has to do is create his own tiddler [[Animal I'd least like to be stuck in a cage with]]. Matias might say
<<<
A lion would be not as bad as a great white shark... not only would you be stuck in a cage with it but you would be underwater with a likelihood of drowning to increase suffering.
<<<
It's not over yet.. now I can refine my original post with the thoughts of Matias. I might think mm, @matias has got a point there with the water, but I think a crocodile would more likely eat me then a great white shark and I fancy my chances with the great white.
I then update my tiddler to say
<<<
I would least like to be stuck in a cage with a crocodile as it could tear me apart amongst other reasons. A lion would also be scary however I'm not a good swimmer so would be less likely to be able to make an escape. A crocodile is worse than a shark as shark attacks on humans are rare, so I'd fancy my chances.
<<<
We continue replying this way revising our tiddlers till the process finishes and I have a tiddler which clearly explains the [[Animal I'd least like to be stuck in a cage with]] with very detailed reasoning.
!URL
http://worrydream.com/MagicInk/
!Description
CACHE MANIFEST
# version 0.6.4
CACHE:
/takenote
/dashboard
/bags/common/tiddlers/jquery-ui.custom.css
/bags/common/tiddlers/jquery-ui.custom.js
/notabene.css
/notabene.js
/bags/common/tiddlers/jquery-json.js
/bags/common/tiddlers/jquery.js
/bags/tiddlyspace/tiddlers/chrjs
/bags/common/tiddlers/chrjs-store.js
/touchicon_takenote.png
/bags/common/tiddlers/cancelTiddler.png
/bags/common/tiddlers/saveTiddler.png
/bags/common/tiddlers/deleteTiddler.png
/bags/common/tiddlers/HtmlBackground
/bags/common/tiddlers/icon-search.png
/bags/common/tiddlers/icon-incomplete.png
/bags/common/tiddlers/icon-recent.png
/bags/common/tiddlers/bookmark_bubble.js
NETWORK:
*
.TiddlyWikiImportContainer {
position: fixed !important;
position: absolute;
right: 0 !important;
top: 0 !important;
height: 100% !important;
width: 350px !important;
background-color: #1240AB !important;
/* border-right: 1px solid black;*/
border-left: 1px solid black !important;
padding-left: 2px !important;
padding-top: 2px !important;
*padding-top: 0px !important;
z-index: 9999999 !important;
}
.TiddlyWikiImportCloseButton {
display: block !important;
float: left !important;
color: black !important;
border: 0 !important;
text-decoration: none !important;
padding: 2px !important;
margin-bottom: 2px !important;
max-width: 12px !important;
font-family: arial, helvetica !important;
font-size: 12px !important;
}
.TiddlyWikiImportCloseButton:hover {
background: none repeat scroll 0 0 #FFCC65 !important;
border-color: #FFAA00;
color: #001144 !important;
}
.TiddlyWikiImportIFrame {
height: 95% !important;
width: 100% !important;
border: 1px solid black !important;
overflow-x: hidden;
overflow-y: auto;
}
.TiddlyWikiContainerTitle {
display: block !important;
float: left !important;
font-family: arial, helvetica !important;
font-size: 12px !important;
margin-left: 5px !important;
padding: 2px !important;
margin-bottom: 2px !important;
font-weight: bold !important;
max-width: 325px !important;
max-height: 12px !important;
overflow: hidden !important;
color: white;
}
!URL
http://boodebr.org/software/wikklytext
!Description
TiddlyWiki parsing library for python: Use tiddly syntax in your other tools.
I seem to be covered in thunderbugs. My computer too.
!URL
http://www.ftrain.com/woods-plus.html
!Description
Anyway, the new thing from the Gootch makes it really easy to sort people into the holes, which is good, because this lets you divide people into clusters and lie to each group in different ways, which makes it easier to preserve the fictions that make up our polite racist society.
sometime today http://tiddlyspace.com hits 1700 users
<<activity show:reply show:notify>>
making http://pypi.python.org/pypi/tiddlywebplugins.etagcache was a diverting challenge
Amazing, I'm shopping in London and it isn't a disgusting foul mess. Oh, I see I'm in a mall managed by a foreign company. That explains it.
rugby is at least as confusing as cricket
!URL
http://mobile.nytimes.com/article?a=817686&single=1&f=28
!Description
Something deeply insidious and corrupt is at work that has been on view in both Britain and the United States. It involves the takeover of politics by money and spin and massaged images and privileged coteries. It is the death of statesmanship.
!URL
http://joyeur.com/2011/02/05/on-brunos-concern-about-the-current-coupling-of-node-js-and-v8/
!Description
Let’s talk about community. I like open source projects that are focused on source code, and detailed, clear discussions about technological strengths and weaknesses.
!Notes
I like that too.
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="72 648 70 70"
width="30" height="30">
<g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1">
<g>
<path d="M 77.59005 669.34003 C 71.532745 681.90424 73.714462 697.4441 84.135193 707.86475
C 97.315445 721.0451 118.684715 721.0451 131.8649 707.86475
C 145.04515 694.68457 145.04515 673.31537 131.8649 660.13513
C 121.4441 649.7141 105.90419 647.53253 93.339905 653.5899 L 102.047455 662.2976
C 109.58637 660.2373 117.987976 662.16803 123.90997 668.08997
C 132.69673 676.8767 132.69673 691.12317 123.90997 699.90985
C 115.12313 708.6966 100.87699 708.6966 92.09012 699.90985
C 86.168266 693.98804 84.23744 685.58643 86.297653 678.04755 Z M 72 648 L 72 668.25 L 78.75 661.49957
L 99.00019 681.7502 L 105.750175 675.00006 L 85.50013 654.75012 L 92.249985 648 Z" fill="black"
class="glyph"/>
</g>
</g>
</svg>
In general I think of meetings as not particularly useful. People are usually insufficiently prepared to talk with any depth; unwilling to prepare an agenda or unwilling to stick to one if it is exists; or if the choice has been made to not have an agenda but to instead explore, unwilling to commit the time required to //really// explore.
As such I've reached the conclusion that meetings are generally only useful as ways of reifying and rectifying conflicting assumptions and attitudes to the issues facing a team. That is, the point of a meeting is to bring people to a state of SharedUnderstanding. Once that's acquired a meeting is redundant but until the lack of understanding is accepted as something that must be worked on a meeting is useless.
The most successful meetings I've been in have been long (on the order of days), stressful, emotional, and filled with conflict as people present and defend their perspectives on what the task is and the meaning of the language used to describe it. The outcome is of those meetings is a team that is working in concert.
If people refuse to present their conflicting perceptions, they cannot be resolved and they are left to linger. These lingering demons raise unanswerable questions, stalling work.
Note that conflict doesn't have to mean yelling at one another. It is perfectly possible to constructively contend and disagree with respect. Argument, even heated, is creative. It is a fundamental building block of synthesis.
!URL
http://addeadline.mountainhardwear.com/
!Description
make an ad for mountain hardwear, have a shopping spree
/*!
* jQuery Form Plugin
* version: 2.83 (11-JUL-2011)
* @requires jQuery v1.3.2 or later
*
* Examples and documentation at: http://malsup.com/jquery/form/
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*/
;(function($) {
/*
Usage Note:
-----------
Do not use both ajaxSubmit and ajaxForm on the same form. These
functions are intended to be exclusive. Use ajaxSubmit if you want
to bind your own submit handler to the form. For example,
$(document).ready(function() {
$('#myForm').bind('submit', function(e) {
e.preventDefault(); // <-- important
$(this).ajaxSubmit({
target: '#output'
});
});
});
Use ajaxForm when you want the plugin to manage all the event binding
for you. For example,
$(document).ready(function() {
$('#myForm').ajaxForm({
target: '#output'
});
});
When using ajaxForm, the ajaxSubmit function will be invoked for you
at the appropriate time.
*/
/**
* ajaxSubmit() provides a mechanism for immediately submitting
* an HTML form using AJAX.
*/
$.fn.ajaxSubmit = function(options) {
// fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
if (!this.length) {
log('ajaxSubmit: skipping submit process - no element selected');
return this;
}
var method, action, url, $form = this;
if (typeof options == 'function') {
options = { success: options };
}
method = this.attr('method');
action = this.attr('action');
url = (typeof action === 'string') ? $.trim(action) : '';
url = url || window.location.href || '';
if (url) {
// clean url (don't include hash vaue)
url = (url.match(/^([^#]+)/)||[])[1];
}
options = $.extend(true, {
url: url,
success: $.ajaxSettings.success,
type: method || 'GET',
iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'
}, options);
// hook for manipulating the form data before it is extracted;
// convenient for use with rich editors like tinyMCE or FCKEditor
var veto = {};
this.trigger('form-pre-serialize', [this, options, veto]);
if (veto.veto) {
log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
return this;
}
// provide opportunity to alter form data before it is serialized
if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
log('ajaxSubmit: submit aborted via beforeSerialize callback');
return this;
}
var n,v,a = this.formToArray(options.semantic);
if (options.data) {
options.extraData = options.data;
for (n in options.data) {
if(options.data[n] instanceof Array) {
for (var k in options.data[n]) {
a.push( { name: n, value: options.data[n][k] } );
}
}
else {
v = options.data[n];
v = $.isFunction(v) ? v() : v; // if value is fn, invoke it
a.push( { name: n, value: v } );
}
}
}
// give pre-submit callback an opportunity to abort the submit
if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
log('ajaxSubmit: submit aborted via beforeSubmit callback');
return this;
}
// fire vetoable 'validate' event
this.trigger('form-submit-validate', [a, this, options, veto]);
if (veto.veto) {
log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
return this;
}
var q = $.param(a);
if (options.type.toUpperCase() == 'GET') {
options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
options.data = null; // data is null for 'get'
}
else {
options.data = q; // data is the query string for 'post'
}
var callbacks = [];
if (options.resetForm) {
callbacks.push(function() { $form.resetForm(); });
}
if (options.clearForm) {
callbacks.push(function() { $form.clearForm(); });
}
// perform a load on the target only if dataType is not provided
if (!options.dataType && options.target) {
var oldSuccess = options.success || function(){};
callbacks.push(function(data) {
var fn = options.replaceTarget ? 'replaceWith' : 'html';
$(options.target)[fn](data).each(oldSuccess, arguments);
});
}
else if (options.success) {
callbacks.push(options.success);
}
options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg
var context = options.context || options; // jQuery 1.4+ supports scope context
for (var i=0, max=callbacks.length; i < max; i++) {
callbacks[i].apply(context, [data, status, xhr || $form, $form]);
}
};
// are there files to upload?
var fileInputs = $('input:file', this).length > 0;
var mp = 'multipart/form-data';
var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);
// options.iframe allows user to force iframe mode
// 06-NOV-09: now defaulting to iframe mode if file input is detected
if (options.iframe !== false && (fileInputs || options.iframe || multipart)) {
// hack to fix Safari hang (thanks to Tim Molendijk for this)
// see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
if (options.closeKeepAlive) {
$.get(options.closeKeepAlive, function() { fileUpload(a); });
}
else {
fileUpload(a);
}
}
else {
// IE7 massage (see issue 57)
if ($.browser.msie && method == 'get') {
var ieMeth = $form[0].getAttribute('method');
if (typeof ieMeth === 'string')
options.type = ieMeth;
}
$.ajax(options);
}
// fire 'notify' event
this.trigger('form-submit-notify', [this, options]);
return this;
// private function for handling file uploads (hat tip to YAHOO!)
function fileUpload(a) {
var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle;
var useProp = !!$.fn.prop;
if (a) {
// ensure that every serialized input is still enabled
for (i=0; i < a.length; i++) {
el = $(form[a[i].name]);
el[ useProp ? 'prop' : 'attr' ]('disabled', false);
}
}
if ($(':input[name=submit],:input[id=submit]', form).length) {
// if there is an input with a name or id of 'submit' then we won't be
// able to invoke the submit fn on the form (at least not x-browser)
alert('Error: Form elements must not have name or id of "submit".');
return;
}
s = $.extend(true, {}, $.ajaxSettings, options);
s.context = s.context || s;
id = 'jqFormIO' + (new Date().getTime());
if (s.iframeTarget) {
$io = $(s.iframeTarget);
n = $io.attr('name');
if (n == null)
$io.attr('name', id);
else
id = n;
}
else {
$io = $('<iframe name="' + id + '" src="'+ s.iframeSrc +'" />');
$io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
}
io = $io[0];
xhr = { // mock object
aborted: 0,
responseText: null,
responseXML: null,
status: 0,
statusText: 'n/a',
getAllResponseHeaders: function() {},
getResponseHeader: function() {},
setRequestHeader: function() {},
abort: function(status) {
var e = (status === 'timeout' ? 'timeout' : 'aborted');
log('aborting upload... ' + e);
this.aborted = 1;
$io.attr('src', s.iframeSrc); // abort op in progress
xhr.error = e;
s.error && s.error.call(s.context, xhr, e, status);
g && $.event.trigger("ajaxError", [xhr, s, e]);
s.complete && s.complete.call(s.context, xhr, e);
}
};
g = s.global;
// trigger ajax global events so that activity/block indicators work like normal
if (g && ! $.active++) {
$.event.trigger("ajaxStart");
}
if (g) {
$.event.trigger("ajaxSend", [xhr, s]);
}
if (s.beforeSend && s.beforeSend.call(s.context, xhr, s) === false) {
if (s.global) {
$.active--;
}
return;
}
if (xhr.aborted) {
return;
}
// add submitting element to data if we know it
sub = form.clk;
if (sub) {
n = sub.name;
if (n && !sub.disabled) {
s.extraData = s.extraData || {};
s.extraData[n] = sub.value;
if (sub.type == "image") {
s.extraData[n+'.x'] = form.clk_x;
s.extraData[n+'.y'] = form.clk_y;
}
}
}
var CLIENT_TIMEOUT_ABORT = 1;
var SERVER_ABORT = 2;
function getDoc(frame) {
var doc = frame.contentWindow ? frame.contentWindow.document : frame.contentDocument ? frame.contentDocument : frame.document;
return doc;
}
// take a breath so that pending repaints get some cpu time before the upload starts
function doSubmit() {
// make sure form attrs are set
var t = $form.attr('target'), a = $form.attr('action');
// update form attrs in IE friendly way
form.setAttribute('target',id);
if (!method) {
form.setAttribute('method', 'POST');
}
if (a != s.url) {
form.setAttribute('action', s.url);
}
// ie borks in some cases when setting encoding
if (! s.skipEncodingOverride && (!method || /post/i.test(method))) {
$form.attr({
encoding: 'multipart/form-data',
enctype: 'multipart/form-data'
});
}
// support timout
if (s.timeout) {
timeoutHandle = setTimeout(function() { timedOut = true; cb(CLIENT_TIMEOUT_ABORT); }, s.timeout);
}
// look for server aborts
function checkState() {
try {
var state = getDoc(io).readyState;
log('state = ' + state);
if (state.toLowerCase() == 'uninitialized')
setTimeout(checkState,50);
}
catch(e) {
log('Server abort: ' , e, ' (', e.name, ')');
cb(SERVER_ABORT);
timeoutHandle && clearTimeout(timeoutHandle);
timeoutHandle = undefined;
}
}
// add "extra" data to form if provided in options
var extraInputs = [];
try {
if (s.extraData) {
for (var n in s.extraData) {
extraInputs.push(
$('<input type="hidden" name="'+n+'" />').attr('value',s.extraData[n])
.appendTo(form)[0]);
}
}
if (!s.iframeTarget) {
// add iframe to doc and submit the form
$io.appendTo('body');
io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
}
setTimeout(checkState,15);
form.submit();
}
finally {
// reset attrs and remove "extra" input elements
form.setAttribute('action',a);
if(t) {
form.setAttribute('target', t);
} else {
$form.removeAttr('target');
}
$(extraInputs).remove();
}
}
if (s.forceSync) {
doSubmit();
}
else {
setTimeout(doSubmit, 10); // this lets dom updates render
}
var data, doc, domCheckCount = 50, callbackProcessed;
function cb(e) {
if (xhr.aborted || callbackProcessed) {
return;
}
try {
doc = getDoc(io);
}
catch(ex) {
log('cannot access response document: ', ex);
e = SERVER_ABORT;
}
if (e === CLIENT_TIMEOUT_ABORT && xhr) {
xhr.abort('timeout');
return;
}
else if (e == SERVER_ABORT && xhr) {
xhr.abort('server abort');
return;
}
if (!doc || doc.location.href == s.iframeSrc) {
// response not received yet
if (!timedOut)
return;
}
io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);
var status = 'success', errMsg;
try {
if (timedOut) {
throw 'timeout';
}
var isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
log('isXml='+isXml);
if (!isXml && window.opera && (doc.body == null || doc.body.innerHTML == '')) {
if (--domCheckCount) {
// in some browsers (Opera) the iframe DOM is not always traversable when
// the onload callback fires, so we loop a bit to accommodate
log('requeing onLoad callback, DOM not available');
setTimeout(cb, 250);
return;
}
// let this fall through because server response could be an empty document
//log('Could not access iframe DOM after mutiple tries.');
//throw 'DOMException: not available';
}
//log('response detected');
var docRoot = doc.body ? doc.body : doc.documentElement;
xhr.responseText = docRoot ? docRoot.innerHTML : null;
xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
if (isXml)
s.dataType = 'xml';
xhr.getResponseHeader = function(header){
var headers = {'content-type': s.dataType};
return headers[header];
};
// support for XHR 'status' & 'statusText' emulation :
if (docRoot) {
xhr.status = Number( docRoot.getAttribute('status') ) || xhr.status;
xhr.statusText = docRoot.getAttribute('statusText') || xhr.statusText;
}
var dt = s.dataType || '';
var scr = /(json|script|text)/.test(dt.toLowerCase());
if (scr || s.textarea) {
// see if user embedded response in textarea
var ta = doc.getElementsByTagName('textarea')[0];
if (ta) {
xhr.responseText = ta.value;
// support for XHR 'status' & 'statusText' emulation :
xhr.status = Number( ta.getAttribute('status') ) || xhr.status;
xhr.statusText = ta.getAttribute('statusText') || xhr.statusText;
}
else if (scr) {
// account for browsers injecting pre around json response
var pre = doc.getElementsByTagName('pre')[0];
var b = doc.getElementsByTagName('body')[0];
if (pre) {
xhr.responseText = pre.textContent ? pre.textContent : pre.innerHTML;
}
else if (b) {
xhr.responseText = b.innerHTML;
}
}
}
else if (s.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {
xhr.responseXML = toXml(xhr.responseText);
}
try {
data = httpData(xhr, s.dataType, s);
}
catch (e) {
status = 'parsererror';
xhr.error = errMsg = (e || status);
}
}
catch (e) {
log('error caught: ',e);
status = 'error';
xhr.error = errMsg = (e || status);
}
if (xhr.aborted) {
log('upload aborted');
status = null;
}
if (xhr.status) { // we've set xhr.status
status = (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) ? 'success' : 'error';
}
// ordering of these callbacks/triggers is odd, but that's how $.ajax does it
if (status === 'success') {
s.success && s.success.call(s.context, data, 'success', xhr);
g && $.event.trigger("ajaxSuccess", [xhr, s]);
}
else if (status) {
if (errMsg == undefined)
errMsg = xhr.statusText;
s.error && s.error.call(s.context, xhr, status, errMsg);
g && $.event.trigger("ajaxError", [xhr, s, errMsg]);
}
g && $.event.trigger("ajaxComplete", [xhr, s]);
if (g && ! --$.active) {
$.event.trigger("ajaxStop");
}
s.complete && s.complete.call(s.context, xhr, status);
callbackProcessed = true;
if (s.timeout)
clearTimeout(timeoutHandle);
// clean up
setTimeout(function() {
if (!s.iframeTarget)
var a = true;//$io.remove();
xhr.responseXML = null;
}, 100);
}
var toXml = $.parseXML || function(s, doc) { // use parseXML if available (jQuery 1.5+)
if (window.ActiveXObject) {
doc = new ActiveXObject('Microsoft.XMLDOM');
doc.async = 'false';
doc.loadXML(s);
}
else {
doc = (new DOMParser()).parseFromString(s, 'text/xml');
}
return (doc && doc.documentElement && doc.documentElement.nodeName != 'parsererror') ? doc : null;
};
var parseJSON = $.parseJSON || function(s) {
return window['eval']('(' + s + ')');
};
var httpData = function( xhr, type, s ) { // mostly lifted from jq1.4.4
var ct = xhr.getResponseHeader('content-type') || '',
xml = type === 'xml' || !type && ct.indexOf('xml') >= 0,
data = xml ? xhr.responseXML : xhr.responseText;
if (xml && data.documentElement.nodeName === 'parsererror') {
$.error && $.error('parsererror');
}
if (s && s.dataFilter) {
data = s.dataFilter(data, type);
}
if (typeof data === 'string') {
if (type === 'json' || !type && ct.indexOf('json') >= 0) {
data = parseJSON(data);
} else if (type === "script" || !type && ct.indexOf("javascript") >= 0) {
$.globalEval(data);
}
}
return data;
};
}
};
/**
* ajaxForm() provides a mechanism for fully automating form submission.
*
* The advantages of using this method instead of ajaxSubmit() are:
*
* 1: This method will include coordinates for <input type="image" /> elements (if the element
* is used to submit the form).
* 2. This method will include the submit element's name/value data (for the element that was
* used to submit the form).
* 3. This method binds the submit() method to the form for you.
*
* The options argument for ajaxForm works exactly as it does for ajaxSubmit. ajaxForm merely
* passes the options argument along after properly binding events for submit elements and
* the form itself.
*/
$.fn.ajaxForm = function(options) {
// in jQuery 1.3+ we can fix mistakes with the ready state
if (this.length === 0) {
var o = { s: this.selector, c: this.context };
if (!$.isReady && o.s) {
log('DOM not ready, queuing ajaxForm');
$(function() {
$(o.s,o.c).ajaxForm(options);
});
return this;
}
// is your DOM ready? http://docs.jquery.com/Tutorials:Introducing_$(document).ready()
log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)'));
return this;
}
return this.ajaxFormUnbind().bind('submit.form-plugin', function(e) {
if (!e.isDefaultPrevented()) { // if event has been canceled, don't proceed
e.preventDefault();
$(this).ajaxSubmit(options);
}
}).bind('click.form-plugin', function(e) {
var target = e.target;
var $el = $(target);
if (!($el.is(":submit,input:image"))) {
// is this a child element of the submit el? (ex: a span within a button)
var t = $el.closest(':submit');
if (t.length == 0) {
return;
}
target = t[0];
}
var form = this;
form.clk = target;
if (target.type == 'image') {
if (e.offsetX != undefined) {
form.clk_x = e.offsetX;
form.clk_y = e.offsetY;
} else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
var offset = $el.offset();
form.clk_x = e.pageX - offset.left;
form.clk_y = e.pageY - offset.top;
} else {
form.clk_x = e.pageX - target.offsetLeft;
form.clk_y = e.pageY - target.offsetTop;
}
}
// clear form vars
setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 100);
});
};
// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
$.fn.ajaxFormUnbind = function() {
return this.unbind('submit.form-plugin click.form-plugin');
};
/**
* formToArray() gathers form element data into an array of objects that can
* be passed to any of the following ajax functions: $.get, $.post, or load.
* Each object in the array has both a 'name' and 'value' property. An example of
* an array for a simple login form might be:
*
* [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
*
* It is this array that is passed to pre-submit callback functions provided to the
* ajaxSubmit() and ajaxForm() methods.
*/
$.fn.formToArray = function(semantic) {
var a = [];
if (this.length === 0) {
return a;
}
var form = this[0];
var els = semantic ? form.getElementsByTagName('*') : form.elements;
if (!els) {
return a;
}
var i,j,n,v,el,max,jmax;
for(i=0, max=els.length; i < max; i++) {
el = els[i];
n = el.name;
if (!n) {
continue;
}
if (semantic && form.clk && el.type == "image") {
// handle image inputs on the fly when semantic == true
if(!el.disabled && form.clk == el) {
a.push({name: n, value: $(el).val()});
a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
}
continue;
}
v = $.fieldValue(el, true);
if (v && v.constructor == Array) {
for(j=0, jmax=v.length; j < jmax; j++) {
a.push({name: n, value: v[j]});
}
}
else if (v !== null && typeof v != 'undefined') {
a.push({name: n, value: v});
}
}
if (!semantic && form.clk) {
// input type=='image' are not found in elements array! handle it here
var $input = $(form.clk), input = $input[0];
n = input.name;
if (n && !input.disabled && input.type == 'image') {
a.push({name: n, value: $input.val()});
a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
}
}
return a;
};
/**
* Serializes form data into a 'submittable' string. This method will return a string
* in the format: name1=value1&name2=value2
*/
$.fn.formSerialize = function(semantic) {
//hand off to jQuery.param for proper encoding
return $.param(this.formToArray(semantic));
};
/**
* Serializes all field elements in the jQuery object into a query string.
* This method will return a string in the format: name1=value1&name2=value2
*/
$.fn.fieldSerialize = function(successful) {
var a = [];
this.each(function() {
var n = this.name;
if (!n) {
return;
}
var v = $.fieldValue(this, successful);
if (v && v.constructor == Array) {
for (var i=0,max=v.length; i < max; i++) {
a.push({name: n, value: v[i]});
}
}
else if (v !== null && typeof v != 'undefined') {
a.push({name: this.name, value: v});
}
});
//hand off to jQuery.param for proper encoding
return $.param(a);
};
/**
* Returns the value(s) of the element in the matched set. For example, consider the following form:
*
* <form><fieldset>
* <input name="A" type="text" />
* <input name="A" type="text" />
* <input name="B" type="checkbox" value="B1" />
* <input name="B" type="checkbox" value="B2"/>
* <input name="C" type="radio" value="C1" />
* <input name="C" type="radio" value="C2" />
* </fieldset></form>
*
* var v = $(':text').fieldValue();
* // if no values are entered into the text inputs
* v == ['','']
* // if values entered into the text inputs are 'foo' and 'bar'
* v == ['foo','bar']
*
* var v = $(':checkbox').fieldValue();
* // if neither checkbox is checked
* v === undefined
* // if both checkboxes are checked
* v == ['B1', 'B2']
*
* var v = $(':radio').fieldValue();
* // if neither radio is checked
* v === undefined
* // if first radio is checked
* v == ['C1']
*
* The successful argument controls whether or not the field element must be 'successful'
* (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
* The default value of the successful argument is true. If this value is false the value(s)
* for each element is returned.
*
* Note: This method *always* returns an array. If no valid value can be determined the
* array will be empty, otherwise it will contain one or more values.
*/
$.fn.fieldValue = function(successful) {
for (var val=[], i=0, max=this.length; i < max; i++) {
var el = this[i];
var v = $.fieldValue(el, successful);
if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length)) {
continue;
}
v.constructor == Array ? $.merge(val, v) : val.push(v);
}
return val;
};
/**
* Returns the value of the field element.
*/
$.fieldValue = function(el, successful) {
var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
if (successful === undefined) {
successful = true;
}
if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
(t == 'checkbox' || t == 'radio') && !el.checked ||
(t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
tag == 'select' && el.selectedIndex == -1)) {
return null;
}
if (tag == 'select') {
var index = el.selectedIndex;
if (index < 0) {
return null;
}
var a = [], ops = el.options;
var one = (t == 'select-one');
var max = (one ? index+1 : ops.length);
for(var i=(one ? index : 0); i < max; i++) {
var op = ops[i];
if (op.selected) {
var v = op.value;
if (!v) { // extra pain for IE...
v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
}
if (one) {
return v;
}
a.push(v);
}
}
return a;
}
return $(el).val();
};
/**
* Clears the form data. Takes the following actions on the form's input fields:
* - input text fields will have their 'value' property set to the empty string
* - select elements will have their 'selectedIndex' property set to -1
* - checkbox and radio inputs will have their 'checked' property set to false
* - inputs of type submit, button, reset, and hidden will *not* be effected
* - button elements will *not* be effected
*/
$.fn.clearForm = function() {
return this.each(function() {
$('input,select,textarea', this).clearFields();
});
};
/**
* Clears the selected form elements.
*/
$.fn.clearFields = $.fn.clearInputs = function() {
var re = /^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i; // 'hidden' is not in this list
return this.each(function() {
var t = this.type, tag = this.tagName.toLowerCase();
if (re.test(t) || tag == 'textarea') {
this.value = '';
}
else if (t == 'checkbox' || t == 'radio') {
this.checked = false;
}
else if (tag == 'select') {
this.selectedIndex = -1;
}
});
};
/**
* Resets the form data. Causes all form elements to be reset to their original value.
*/
$.fn.resetForm = function() {
return this.each(function() {
// guard against an input with the name of 'reset'
// note that IE reports the reset function as an 'object'
if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType)) {
this.reset();
}
});
};
/**
* Enables or disables any matching elements.
*/
$.fn.enable = function(b) {
if (b === undefined) {
b = true;
}
return this.each(function() {
this.disabled = !b;
});
};
/**
* Checks/unchecks any matching checkboxes or radio buttons and
* selects/deselects and matching option elements.
*/
$.fn.selected = function(select) {
if (select === undefined) {
select = true;
}
return this.each(function() {
var t = this.type;
if (t == 'checkbox' || t == 'radio') {
this.checked = select;
}
else if (this.tagName.toLowerCase() == 'option') {
var $sel = $(this).parent('select');
if (select && $sel[0] && $sel[0].type == 'select-one') {
// deselect all other options
$sel.find('option').selected(false);
}
this.selected = select;
}
});
};
// helper fn for console logging
function log() {
var msg = '[jquery.form] ' + Array.prototype.join.call(arguments,'');
if (window.console && window.console.log) {
window.console.log(msg);
}
else if (window.opera && window.opera.postError) {
window.opera.postError(msg);
}
};
})(jQuery);
!URL
http://code.google.com/apis/maps/articles/phpsqlsearch.html
!Description
Creating a Store Locator with PHP, MySQL & Google Maps - Google Maps API Family - Google Code
the cafe in weavers walk is giving me the evil eye for staying too long
<<<
The simple pipeline given above will suffice to get answers right now, not next week or next month. It could well be enough to finish the job. But even for a production project, say for the Library of Congress, it would make a handsome down payment, useful for testing the value of the answers and for smoking out follow-on questions.
<<<
[[More shell, less egg - All this|http://www.leancrew.com/all-this/2011/12/more-shell-less-egg/]]
!URL
http://code.google.com/p/grassyknoll/
!Description
well thought out search thing with REST interface
<html manifest="manifest_offline.appcache">
<head>
<title>Offline Viewer</title>
<script type='text/javascript' src='/bags/common/tiddlers/backstage.js'></script>
<link href="/bags/common/tiddlers/profile.css" type='text/css' rel='stylesheet' >
<link href="/_offline.css" type='text/css' rel='stylesheet' >
</head>
<body>
<div id="container">
<h1 id="siteTitle"></h1>
<div id="mainMenu"></div>
<div id="header">
<h1>
<a href="#" id="title">Offline Tiddlers</a>
</h1>
</div>
<div id="text-html" class="main section">Select a tiddler from the right hand side of the screen. This allows you to view
your space without an internet connection. Kill your internet and try it out!</div>
</div>
<div id="sidebar">
<a class='button' href="/takenote">take note</a>
<ul></ul>
</div>
<script src="/bags/common/tiddlers/jquery.js" type="text/javascript" charset="utf-8"></script>
<script src="/twikifier.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript" src="/_offline.js"></script>
</body>
</html>
!URL
http://warpspire.com/posts/product-design/
!Description
Write down ideas like crazy
Our internal wiki is filled with ideas. Old ideas. Bad ideas. Good ideas. Half-baked ideas. The point is that we have a place to share our crazy with each other. This wiki page discussing compare view eventually became Pull Requests 2.0 — arguably the best code review tool I’ve ever used.
[...]
Argue all the time
We do not have a quiet workplace. We argue in bars, in Campfire and in email. New hires and CEOs alike. But it’s not personal — it’s about making our product better. If you’re not forced to rationalize your product choices, who’s to say you’re making good decisions?
Arguing with your co-workers isn’t a bad thing. It’s not creating a negative work environment — it’s a tool to help you make good decisions. Being an empty cheerleader and telling everyone that their idea is great is harmful and short-sighted. Argue and make good decisions.
twitter account now deactived too
from the standpoint of what the enterprise needs to do better, it is not that they need to learn how to pivot on tags, it is that they need to learn to pivot on tags //on the web//
As an international businessperson I find the restrictions placed upon the free flow of capital by banks and paypal terribly annoying. Paypal especially so as its presence as an internet thing implies it ought to allow me to route around the bullshit, but no.
A script for posting a tiddler tagged "tweet" to a space. Use it like:
{{{
tweet the text of the tweet I'm making
}}}
The script (replace the "xxxxx" as noted):
{{{
#!/bin/sh
SPACE="xxxxxxx" # the name of the space
USER=xxxxx # the username
PASS=xxxxxx # the password
SERVER=http://tiddlyspace.com
BAGURL=/bags/${SPACE}_public/tiddlers
ID=`date +%s | md5`
URL=$SERVER$BAGURL/$ID
TYPE="application/json"
TAG=tweet
DATA="{\"text\": \"$*\", \"tags\": [\"$TAG\"]}"
curl --user $USER:$PASS -H "Content-Type: $TYPE" -X PUT --data-binary "$DATA" $URL
}}}
!URL
http://epicfumble.com/post/qwiki-epitomizes-the-current-startup-bubble
!Description
Qwiki is little more than a toy, basically, as any cursory investigation reveals. But this is Silicon Valley, after all. Let's give them $8M dollars anyway, just in case.
!Notes
Somebody want to fund TiddlySpace?
I feel a bit like I'm at sea with a bunch of sadistic munchkins.
!URL
http://inhabitat.com/chicagos-willis-tower-to-become-a-vertical-solar-farm/
!Description
Chicago’s iconic Willis Tower (formally the Sears Tower) is set to become a massive solar electric plant with the installation of a pilot solar electric glass project.
!Notes
That's a rather fine idea.
!URL
http://www.mnot.net/blog/2007/06/20/proxy_caching
!Description
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>TiddlySpace Apps</title>
<link rel="stylesheet" href="http://tiddlyspace.com/bags/common/tiddlers/reset.css" />
<link rel="stylesheet" href="appspage.css" />
</head>
<body>
<div id="wrapper">
<div id="TSbar"></div>
<div id="main-content">
<div id="space-details">
<img class="siteicon" src="http://placehold.it/100x100">
<div id="title-subtitle">
<h1 class="spaceaddress">
<span>SPACENAME</span>.tiddlyspace.com
</h1>
<p class="tagline">your space's tagline... <a class="managespaces inactive" href="/ManageSpaces">manage space</a></p>
</div>
</div>
<div id="holder">
<div id="appswitcher-wrapper">
<div id="appswitcher">
<h2>Your Apps</h2>
<ul id="app-list">
<li class="write"><a href="/takenote">
<img src="http://placehold.it/50x50" alt="" class="app-img" />
WRITE
</a>
</li>
<li class="htmlserialisation">
<a href="/tiddlers.html">
<img src="http://placehold.it/50x50" alt="" class="app-img" />
BROWSE
</a>
</li>
<li class="links">
<a href="/links">
<img src="http://placehold.it/50x50" alt="" class="app-img" />
SHARE
</a>
</li>
<li class="tiddlywiki">
<a href="/tiddlers.wiki">
<img src="http://placehold.it/50x50" alt="" class="app-img" />
TIDDLYWIKI
</a>
</li>
<li class="preso">
<a class="soon" href="">
<img src="http://placehold.it/50x50" alt="" class="app-img" />
PRESO <span class="comingsoon">(coming soon...)</span>
</a>
</li>
</ul>
<div id="addapp">
<button class="inactive">Add More!</button>
</div>
</div>
<aside id="app-desc">
<ul>
<li class="writedesc"><p>write your notes on the web. Link them, tag them, share them. Your notes are available everywhere, on and offline.</p></li>
<li class="htmlserialisationdesc"><p>an easy to understand HTML representation of your content.</p></li>
<li class="linksdesc"><p>share direct links to your content. The share app provides you with quick and easy access to the key links within your TiddlySpace.</p></li>
<li class="tiddlywikidesc"><p>use TiddlyWiki to create, edit and organise your content.</p></li>
<li class="presodesc"><p>an interactive pan-able, zoom-able, shareable representation of your content. Think PowerPoint but on the web. And better.</p></li>
</ul>
</aside>
<br style="clear:both">
</div>
</div>
</div>
<div id="footer"><!-- ie doesn't support footer tag -->
<div id="footer-content">
<div class="links">
<a href="http://blog.tiddlyspace.com">blog</a>
<a href="http://featured.tiddlyspace.com">featured</a>
<a href="http://docs.tiddlyspace.com">documentation</a>
<a href="https://github.com/TiddlySpace/tiddlyspace">source</a>
</div>
<p>TiddlySpace 2011, created by <a href="http://osmosoft.com">Osmosoft</a></p>
</div>
</div>
</div>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
<script type="text/javascript" src="appspage.js"></script>
</body>
</html>
!URL
http://www.guardian.co.uk/technology/askjack/2011/jun/23/ask-jack-slow-broadband-adsl-internet
!Description
As you have discovered, in our new competitive broadband market, the buck frequently doesn't stop anywhere. Demon is your internet service provider (ISP), but it sounds as though your broadband is actually provided by BT Wholesale. However, OpenReach looks after the "local loop" part of the network from the exchange to your house. OpenReach is owned by BT Group, but BT has to be treated as just another customer, and you are not a customer as far as OpenReach is concerned.
!Notes
The above captures in a nutshell exactly the problem with most infrastructure in the UK. Those relationships are explained by a notion of "competitive broadband market" but the competition is an illusion. There is no competition on the tangible good in the exchange. For that the various BT properties have a monopoly.
A similar thing is true for rail services. Different providers have monopolies on service in particular areas.
You can't create competitive markets to replace monopolies when what is being created are mini hyper-regulated markets. What you end up with then is a highly efficient system for passing the buck.
<!--{{{-->
<div class='header'>
<div id='sidebarSearch'>
<span macro='search'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='clearFloat'></div>
</div>
<div id='menuBar'>
<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 id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<!--}}}-->
The mind rather doth wander when the sun is high in the clear blue sky and the cat is killing mice for sport.
!URL
http://whitneyhess.com/blog/2011/04/23/youre-not-a-user-experience-designer-if/
!Description
You can’t articulate your users’ goals. Maybe you kinda get the problem people are having, but unless you can communicate (in your own words) the objectives your target users are trying to accomplish both in their lives and their work, how can you craft a solution that will truly support their efforts?
/***
|Name|BookmarkletPlugin|
|Version|0.2|
|Author|Ben Gillies|
|Type|plugin|
|Description|Generate a bookmarklet that will pop up your TiddlyWiki inside a different web page|
!Usage
To generate the bookmarklet, use:
{{{
<<bookmarklet>>
}}}
to get it.
It will generate a bookmarklet for you that will let you bookmark web pages.
!Code
***/
//{{{
if(!version.extensions.BookmarkletPlugin)
{ //# ensure that the plugin is only installed once
version.extensions.BookmarkletPlugin = { installed: true }
};
config.macros.bookmarklet = {
root: {},
bookmarkletTemplate: '!URL\n{URL}\n\n!Description\n{Description}',
handler: function(place, macroName, params, wikifier, paramString, tiddler){
if (!config.defaultCustomFields)
throw 'defaultCustomFields Not Found. This plugin requires TiddlyWeb to work.';
var bookmarklet;
var siteTitle = document.title;
// if (params[0] === 'new') {
var spaceName = config.extensions.tiddlyspace.currentSpace.name;
bookmarklet = "javascript:(function(a,b)%7Ba=b.createElement('script');a.setAttribute('src','http://" + spaceName + ".tiddlyspace.com/bookmarker-loader.js');b.body.appendChild(a);a.addEventListener('load',function()%7BloadBookmarker('http://" + spaceName + ".tiddlyspace.com/bookmarker','" + spaceName + "');%7D,false);%7D(null,document))";
// } else {
/* var urlBase = config.defaultCustomFields['server.host'];
urlBase += urlBase[urlBase.length - 1] !== '/' ? '/' : '';
var path = escape(config.defaultCustomFields['server.workspace']);
path = path.replace(/^bags/, 'recipes');
var escapedSiteTitle = ',%22' + escape(siteTitle) + '%22';
var tiddler = params.length > 0 ? ',%22' + escape(params[0]) + '%22' : ',null';
bookmarklet = 'javascript:(function(){'
+ 'var%20u=%22' + urlBase + '%22;var%20p=%22' + path + '%22;'
+ 'var%20s=document.createElement(%22script%22);'
+ 's.type=%22text/javascript%22;'
+ 's.src=u+p+%22/tiddlers/bookmarklet.js%22;'
+ 'document.body.appendChild(s);'
+ 'var%20lT=setInterval(function(){'
+ 'if(window.openTiddlyWiki){'
+ 'window.openTiddlyWiki(u,p' + tiddler + escapedSiteTitle + ');'
+ 'clearTimeout(lT);'
+ '}},100);})();';
}*/
var link = jQuery('<a/>')
.attr('href', bookmarklet)
.text(siteTitle)
.appendTo(place);
},
receiveMessageHandler: function(message) {
var rootData = config.macros.bookmarklet.root;
if (/^title:/.test(message.data)) {
rootData.title = message.data.substr(6);
} else if (/^desc:/.test(message.data)) {
rootData.desc = message.data.substr(5);
} else if (/^url:/.test(message.data)) {
rootData.url = message.data.substr(4);
}
if ((rootData['desc']) && (rootData['title']) && (rootData['url'])) {
//try and find the tiddler
//If we got here via query string (aka - a lack of window.postMessage), the page won't have finished loading properly yet.
//so we have to wait for a bit until we can call story.displayTiddler properly.
if (!window.postMessage) {
oldRestart = window.restart;
window.restart = function() {
config.macros.bookmarklet.findTiddler(rootData);
oldRestart();
window.restart = oldRestart;
};
} else {
config.macros.bookmarklet.findTiddler(rootData);
}
}
},
findTiddler: function(data) {
var tiddler = store.getTiddler(data['title']);
if (tiddler) {
story.displayTiddler(document.body, tiddler.title, 2);
return;
}
var tiddlers = store.search(data['url'], null, 'excludeSearch');
if (tiddlers.length > 0) {
story.search(data['url']);
return;
}
//we haven't found it. So create a new one.
tiddler = new Tiddler(data['title']);
tiddler.tags = ['bookmark'];
tiddler.text = config.macros.bookmarklet.bookmarkletTemplate
.replace('{URL}', data['url'])
.replace('{Description}', data['desc']);
tiddler.fields = merge({}, config.defaultCustomFields);
store.addTiddler(tiddler);
story.displayTiddler(document.body, tiddler.title, 2);
}
};
;
/********************************************/
/****Bookmarklet Theme and switching code****/
/********************************************/
(function() {
if (window.self !== window.top) {
config.options.txtTheme = 'BookmarkletTheme';
var receiveMessage = config.macros.bookmarklet.receiveMessageHandler;
if (!window.postMessage) {
//the message will be coming through the query string #ie6 probably
var queryObj = {};
var data = (window.location.search.substr(0, 1) === '?') ? window.location.search.substr(1) : window.location.search;
data = data.split('&');
for (var i=0; i<data.length; i++) {
var keyValPair = data[i].split('=');
queryObj[keyValPair[0]] = decodeURIComponent(keyValPair[1]);
}
if (queryObj['bookmarkletParentURL']) {
var message = {};
message.data = 'url:' + queryObj['bookmarkletParentURL'];
receiveMessage(message);
if (queryObj['bookmarkletParentTitle']) {
message.data = 'title:' + queryObj['bookmarkletParentTitle'];
receiveMessage(message);
}
if (queryObj['bookmarkletParentDesc']) {
message.data = 'desc:' + queryObj['bookmarkletParentDesc'];
receiveMessage(message);
}
}
} else {
if (typeof window.addEventListener != 'undefined') {
window.addEventListener('message', receiveMessage, false);
} else if (type.attachEvent != 'undefined') {
window.attachEvent('onmessage', receiveMessage);
}
}
} else if (config.options.txtTheme == 'BookmarkletTheme') {
config.options.txtTheme = '';
}
})();
//}}}
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
!URL
http://cohesiveft.com/
!Description
elastic server on demand
Reading Climbing Centre
http://readingclimbingcentre.com/
!URL
http://camlistore.org/
!Description
a way to store, sync, share, model and back up content
//{{{
(function($) {
var IE6 = (navigator.userAgent.indexOf("MSIE 6")>=0) ? true : false;
if(IE6) {
alert("You're on IE6. Go Away!");
window.location = "http://ie6isolderthanyourgrandpa.com/";
}
})(jQuery);
//}}}
/***
|''Name:''|TiddlySpaceLinkPlugin|
|''Description:''|Formatter to reference other spaces from wikitext |
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com) |
|''Source:''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceLinkPlugin.js|
|''Version:''|1.4.2|
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''~CoreVersion:''|2.4|
!!Documentation
This plugin provides wikitext formatters for referencing another [[space|Space]] on the same TiddlySpace server, as in the following examples:
<<<
{{{@space}}} -- @space
{{{~@space}}} -- ~@space
{{{Tiddler@space}}} -- Tiddler@space
{{{[[Tiddler Title]]@space}}} -- [[Tiddler Title]]@space
{{{[[Link text|Tiddler Title]]@space}}} -- [[Link text|Tiddler Title]]@space
<<<
Links to tiddlers with a title begining with an "@" remain as tiddlyLinks:
<<<
{{{[[@tiddler]]}}} -- [[@tiddler]]
<<<
and these may be changed into a space link using {{{@@}}}:
<<<
{{{[[@@space]]}}} -- [[@@space]]
{{{[[Link to an another space|@@space]]}}} -- [[Link to another space|@@space]]
{{{[[@space|@@space]]}}} -- [[@space|@@space]]
<<<
TiddlySpace includes the [[TiddlySpaceLinkPlugin]] which provides WikiText markup for linking to other spaces on the same server. For example @glossary is a link to the {{{glossary}}} space and [[Small Trusted Group]]@glossary a link to an individual tiddler in the @glossary space. Prefixing the link with a tilde escapes the link, for example {{{~@space}}}.
Email addresses, for example joe.bloggs@example.com and mary@had.a.little.lamb.org should be unaffected.
!!Features
The plugin provides external links decorated so that other plugins may be included to add features such as the ability to dynamically pull externally linked tiddlers into the current TiddlyWiki.
Wikitext linking to a space on another server, for example from a tiddler in a space on tiddlyspace.com to a tiddler or a space on example.com, isn't currently supported.
!!Code
***/
//{{{
/*jslint onevar: false nomen: false plusplus: false */
/*global jQuery config createTiddlyText createExternalLink createTiddlyLink */
function createSpaceLink(place, spaceName, title, alt, isBag) {
var link, a, currentSpaceName, label;
try {
if (spaceName === config.extensions.tiddlyspace.currentSpace.name) {
title = title || spaceName;
a = createTiddlyLink(place, title, false);
jQuery(a).text(alt || title);
return a;
}
} catch (ex1) {
currentSpaceName = false;
}
a = jQuery("<a />").addClass('tiddlySpaceLink externalLink').appendTo(place)[0];
if(title) {
jQuery(a).attr('tiddler', title);
}
if(isBag) {
jQuery(a).attr('bag', spaceName);
} else {
jQuery(a).attr('tiddlyspace', spaceName);
}
config.extensions.tiddlyweb.getStatus(function(status) {
link = status.server_host.url;
if (title) {
label = alt || title;
link = link + "/" + encodeURIComponent(title);
} else {
label = alt || spaceName;
}
// assumes a http URI without user:pass@ prefix
if(!isBag) {
link = link.replace("http://", "http://" + spaceName.toLowerCase() + ".");
} else {
link += "/bags/" + spaceName + "/tiddlers.wiki";
}
jQuery(a).attr("href", link).text(label);
});
return a;
}
(function ($) {
config.textPrimitives.spaceName = "[a-zA-Z][a-zA-Z0-9-]*[a-zA-Z0-9]";
config.textPrimitives.spaceNameStrict = "[a-z][a-z0-9-]*";
config.textPrimitives.bareTiddlerLetter = config.textPrimitives.anyLetterStrict;
config.formatters.splice(0, 0, {
name: "spacenameLink",
match: config.textPrimitives.unWikiLink + "?" + config.textPrimitives.bareTiddlerLetter + "*@" + config.textPrimitives.spaceName + "\\.?.?",
lookaheadRegExp: new RegExp(config.textPrimitives.unWikiLink + "?(" + config.textPrimitives.bareTiddlerLetter + "*)@(" + config.textPrimitives.spaceName + ")", "mg"),
handler: function (w) {
if (w.matchText.substr(w.matchText.length - 2, 1) === '.' && w.matchText.substr(w.matchText.length - 1, 1).match(/[a-zA-Z]/)) {
w.outputText(w.output, w.matchStart, w.nextMatch);
return;
}
if (w.matchText.substr(0, 1) === config.textPrimitives.unWikiLink) {
w.outputText(w.output, w.matchStart + 1, w.nextMatch);
return;
}
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if (lookaheadMatch && lookaheadMatch.index === w.matchStart) {
createSpaceLink(w.output, lookaheadMatch[2], lookaheadMatch[1]);
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
},
{
name: "tiddlySpaceLink",
match: "\\[\\[[^\\|\\]]*\\|*@@" + config.textPrimitives.spaceName + "\\]",
lookaheadRegExp: new RegExp("\\[\\[(.*?)(?:\\|@@(.*?))?\\]\\]", "mg"),
handler: function (w) {
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if (lookaheadMatch && lookaheadMatch.index === w.matchStart) {
var alt = lookaheadMatch[2] ? lookaheadMatch[1] : lookaheadMatch[1].replace(/^@@/, "");
var space = lookaheadMatch[2] || alt;
createSpaceLink(w.output, space, "", alt);
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
},
{
name: "tiddlyLinkSpacenameLink",
match: "\\[\\[[^\\[]*\\]\\]@",
lookaheadRegExp: new RegExp("\\[\\[(.*?)(?:\\|(.*?))?\\]\\]@(" + config.textPrimitives.spaceName + ")", "mg"),
handler: function (w) {
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if (lookaheadMatch && lookaheadMatch.index === w.matchStart) {
var title = lookaheadMatch[2] || lookaheadMatch[1];
var alt = lookaheadMatch[1] || lookaheadMatch[2];
createSpaceLink(w.output, lookaheadMatch[3], title, alt);
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
});
// ensure space links don't appear as missing links
config.textPrimitives.brackettedLink = "\\[\\[([^\\]][^@\\]][^\\]]*)\\]\\](?=[^@])";
config.textPrimitives.titledBrackettedLink = "\\[\\[([^\\[\\]\\|]+)\\|([^\\[\\]\\|]+)\\]\\](?=[^@])";
// reevaluate derrived expressions ..
config.textPrimitives.tiddlerForcedLinkRegExp = new RegExp("(?:" + config.textPrimitives.titledBrackettedLink + ")|(?:" +
config.textPrimitives.brackettedLink + ")|(?:" +
config.textPrimitives.urlPattern + ")","mg");
config.textPrimitives.tiddlerAnyLinkRegExp = new RegExp("("+ config.textPrimitives.wikiLink + ")|(?:" +
config.textPrimitives.titledBrackettedLink + ")|(?:" +
config.textPrimitives.brackettedLink + ")|(?:" +
config.textPrimitives.urlPattern + ")","mg");
// treat space links in titledBracketedLink as external links
var missingTiddlySpaceLink = new RegExp("^@@" + config.textPrimitives.spaceName + "$", "");
var isExternalLink = config.formatterHelpers.isExternalLink;
config.formatterHelpers.isExternalLink = function(link) {
return missingTiddlySpaceLink.test(link) || isExternalLink(link);
};
}(jQuery));
//}}}
<<<
It is always possible to aglutenate multiple separate problems into a single complex interdependent solution. In most cases this is a bad idea.
<<<
[[RFC 1925 - The Twelve Networking Truths|http://tools.ietf.org/html/rfc1925]]
<<<
She said: "It was while I was at interview that I finally noticed that subjecting myself to the judgement of an institution which I fundamentally disagreed with was bizarre.
<<<
[[BBC News - Magdalen Oxford gets rejection letter from student|http://www.bbc.co.uk/news/uk-england-oxfordshire-16604050]]
!URL
http://twill.idyll.org/
!Description
test the web from python. scriptable or unitable
!URL
http://www.monbiot.com/archives/2008/02/19/an-exchange-of-souls/
!Description
"What if he had discovered that the profits to be made from burning more fossil fuels exceeded the social cost of carbon? We would then find that it makes economic sense to kill people." Don't people make that decision all the time?
!URL
https://github.com/jonashaag/bjoern
!Description
A screamingly fast, ultra-lightweight asynchronous WSGI server for CPython
!URL
http://wooki.sourceforge.net/index.htm
!Description
p2p wiki system, for distributed content that migrates and merges on multiple servers
!URL
http://www.alleyinsider.com/2008/01/hey-wikipedia-save-us-from-googlebot-give-us-an-api.html
!Description
i know just thething
!URL
http://speakerdeck.com/u/brucel/p/how-to-destroy-the-web
!Description
The future of the Web is a dangerous Babylon: people talking to each other to do business, organise revolutions, express their feelings, meet their friends, transcend their disabilities and economically empower themselves. Obviously, this must be stopped. Bruce will show you his top tips and tricks that you can employ to destroy the web.
!URL
http://www.jwz.org/blog/2011/10/eff-declares-premature-victory-in-nymwars/
!Description
My guess? I'll bet they still require you to register with your "real" name, but then they'll graciously allow you to have a linked nickname or two, meaning they're still fully prepared to roll over on you to authoritarian governments or advertisers at the drop of a hat.
Will capitalism please finally die rather than carry on with its current lie?
!URL
http://wetzler.me/dropbox-syncplicity/
!Description
In the end, it really came down to one incredibly genius idea: Dropbox limited its feature set on purpose
!Notes
TiddlySpace could take some of this advice.
!URL
http://www.innoq.com/blog/st/2011/11/google_vs_web_architecture.html
!Description
Google’s very core business was enabled by the Web’s architecture, now they’re slowly helping to ruin it.
[[In the Beginning Was the Word and Then Four Revolutions in the History of Information|http://philpapers.org/rec/BEAITB]], Anthony F. Beavers
A fifteen page exploration of four information revolutions that situates a philosophy of information in the current, digital, revolution. The four revolutions are Epigraphic, Printing, Multimedia and Digital. Writing gives temporal power to communication. Printing give access to easy storage and transportation. Multimedia adds voice and vision to writing. Digital, we're still to see what it really means: its exponential growth resists analysis.
There are a few choice quotes to pull out (emphasis mine unless otherwise noted);
> When speech takes to writing, it transcends the moment to make its mark in space. Whether this occurrence is a recipe for remember or forgetting...the event signals the spatialization of temporal information and an early form of hard storage because it off loads information from a brain into a //shared environment//.
> Using symbols to code for sound is informationally efficient...and...immediately allows anything that can be said to be written and //read//.
> ...civility is irrevocably tied to the spread of information.
> [[The adevent of the telegraph]] is significant because it decoupled the flow of information from the exigencies of transportation technology.
> [F]rom the cognitive perspective even on the level of the individual human processor writing enables discovery and invention, thereby increasing the general intelligence of human beings.
In other words: If you want to be smart, informed, informative, civil and have ideas that last, then you //must write//.
!URL
http://www.delsjourney.com/close-ups/us/misc/my_toyota_truck.htm
!Description
/***
|''Name''|ServerSideSavingPlugin|
|''Description''|server-side saving|
|''Author''|FND|
|''Version''|0.6.5|
|''Status''|stable|
|''Source''|http://svn.tiddlywiki.org/Trunk/association/plugins/ServerSideSavingPlugin.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5.3|
|''Keywords''|serverSide|
!Notes
This plugin relies on a dedicated adaptor to be present.
The specific nature of this plugin depends on the respective server.
!Revision History
!!v0.1 (2008-11-24)
* initial release
!!v0.2 (2008-12-01)
* added support for local saving
!!v0.3 (2008-12-03)
* added Save to Web macro for manual synchronization
!!v0.4 (2009-01-15)
* removed ServerConfig dependency by detecting server type from the respective tiddlers
!!v0.5 (2009-08-25)
* raised CoreVersion to 2.5.3 to take advantage of core fixes
!!v0.6 (2010-04-21)
* added notification about cross-domain restrictions to ImportTiddlers
!To Do
* conflict detection/resolution
* rename to ServerLinkPlugin?
* document deletion/renaming convention
!Code
***/
//{{{
(function($) {
readOnly = false; //# enable editing over HTTP
var plugin = config.extensions.ServerSideSavingPlugin = {};
plugin.locale = {
saved: "%0 saved successfully",
saveError: "Error saving %0: %1",
saveConflict: "Error saving %0: edit conflict",
deleted: "Removed %0",
deleteError: "Error removing %0: %1",
deleteLocalError: "Error removing %0 locally",
removedNotice: "This tiddler has been deleted.",
connectionError: "connection could not be established",
hostError: "Unable to import from this location due to cross-domain restrictions."
};
plugin.sync = function(tiddlers) {
tiddlers = tiddlers && tiddlers[0] ? tiddlers : store.getTiddlers();
$.each(tiddlers, function(i, tiddler) {
var changecount = parseInt(tiddler.fields.changecount, 10);
if(tiddler.fields.deleted === "true" && changecount === 1) {
plugin.removeTiddler(tiddler);
} else if(tiddler.isTouched() && !tiddler.doNotSave() &&
tiddler.getServerType() && tiddler.fields["server.host"]) { // XXX: server.host could be empty string
delete tiddler.fields.deleted;
plugin.saveTiddler(tiddler);
}
});
};
plugin.saveTiddler = function(tiddler) {
try {
var adaptor = this.getTiddlerServerAdaptor(tiddler);
} catch(ex) {
return false;
}
var context = {
tiddler: tiddler,
changecount: tiddler.fields.changecount,
workspace: tiddler.fields["server.workspace"]
};
var serverTitle = tiddler.fields["server.title"]; // indicates renames
if(!serverTitle) {
tiddler.fields["server.title"] = tiddler.title;
} else if(tiddler.title != serverTitle) {
return adaptor.moveTiddler({ title: serverTitle },
{ title: tiddler.title }, context, null, this.saveTiddlerCallback);
}
var req = adaptor.putTiddler(tiddler, context, {}, this.saveTiddlerCallback);
return req ? tiddler : false;
};
plugin.saveTiddlerCallback = function(context, userParams) {
var tiddler = context.tiddler;
if(context.status) {
if(tiddler.fields.changecount == context.changecount) { //# check for changes since save was triggered
tiddler.clearChangeCount();
} else if(tiddler.fields.changecount > 0) {
tiddler.fields.changecount -= context.changecount;
}
plugin.reportSuccess("saved", tiddler);
store.setDirty(false);
} else {
if(context.httpStatus == 412) {
plugin.reportFailure("saveConflict", tiddler);
} else {
plugin.reportFailure("saveError", tiddler, context);
}
}
};
plugin.removeTiddler = function(tiddler) {
try {
var adaptor = this.getTiddlerServerAdaptor(tiddler);
} catch(ex) {
return false;
}
var context = {
host: tiddler.fields["server.host"],
workspace: tiddler.fields["server.workspace"],
tiddler: tiddler
};
var req = adaptor.deleteTiddler(tiddler, context, {}, this.removeTiddlerCallback);
return req ? tiddler : false;
};
plugin.removeTiddlerCallback = function(context, userParams) {
var tiddler = context.tiddler;
if(context.status) {
if(tiddler.fields.deleted === "true") {
store.deleteTiddler(tiddler.title);
} else {
plugin.reportFailure("deleteLocalError", tiddler);
}
plugin.reportSuccess("deleted", tiddler);
store.setDirty(false);
} else {
plugin.reportFailure("deleteError", tiddler, context);
}
};
plugin.getTiddlerServerAdaptor = function(tiddler) { // XXX: rename?
var type = tiddler.fields["server.type"] || config.defaultCustomFields["server.type"];
return new config.adaptors[type]();
};
plugin.reportSuccess = function(msg, tiddler) {
displayMessage(plugin.locale[msg].format([tiddler.title]));
};
plugin.reportFailure = function(msg, tiddler, context) {
var desc = (context && context.httpStatus) ? context.statusText :
plugin.locale.connectionError;
displayMessage(plugin.locale[msg].format([tiddler.title, desc]));
};
config.macros.saveToWeb = { // XXX: hijack existing sync macro?
locale: { // TODO: merge with plugin.locale?
btnLabel: "save to web",
btnTooltip: "synchronize changes",
btnAccessKey: null
},
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
createTiddlyButton(place, this.locale.btnLabel, this.locale.btnTooltip,
plugin.sync, null, null, this.locale.btnAccessKey);
}
};
// hijack saveChanges to trigger remote saving
var _saveChanges = saveChanges;
saveChanges = function(onlyIfDirty, tiddlers) {
if(window.location.protocol == "file:") {
_saveChanges.apply(this, arguments);
} else {
plugin.sync(tiddlers);
}
};
// override removeTiddler to flag tiddler as deleted -- XXX: use hijack to preserve compatibility?
TiddlyWiki.prototype.removeTiddler = function(title) { // XXX: should override deleteTiddler instance method?
var tiddler = this.fetchTiddler(title);
if(tiddler) {
tiddler.tags = ["excludeLists", "excludeSearch", "excludeMissing"];
tiddler.text = plugin.locale.removedNotice;
tiddler.fields.deleted = "true"; // XXX: rename to removed/tiddlerRemoved?
tiddler.fields.changecount = "1";
this.notify(title, true);
this.setDirty(true);
}
};
// hijack ImportTiddlers wizard to handle cross-domain restrictions
var _onOpen = config.macros.importTiddlers.onOpen;
config.macros.importTiddlers.onOpen = function(ev) {
var btn = $(resolveTarget(ev));
var url = btn.closest(".wizard").find("input[name=txtPath]").val();
if(window.location.protocol != "file:" && url.indexOf("://") != -1) {
var host = url.split("/")[2];
var macro = config.macros.importTiddlers;
if(host != window.location.host) {
btn.text(macro.cancelLabel).attr("title", macro.cancelPrompt);
btn[0].onclick = macro.onCancel;
$('<span class="status" />').text(plugin.locale.hostError).insertAfter(btn);
return false;
}
}
return _onOpen.apply(this, arguments);
};
})(jQuery);
//}}}
i have been seduced by the bacon
/***
|''Name''|TiddlySpaceToolbar|
|''Description''|augments tiddler toolbar commands with SVG icons|
|''Author''|Osmosoft|
|''Version''|0.6.6|
|''Status''|@@beta@@|
|''Source''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceToolbar.js|
|''CodeRepository''|http://github.com/TiddlySpace/tiddlyspace|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
|''CoreVersion''|2.5.0|
|''Requires''|ImageMacroPlugin|
|''Keywords''|toolbar icons SVG|
!Description
replaces tiddler toolbar commands with SVG icons if available
!Notes
requires [[ImageMacroPlugin|http://svn.tiddlywiki.org/Trunk/contributors/JonRobson/plugins/ImageMacroPlugin/plugins/ImageMacroPlugin.tid]]
SVG icons are drawn from tiddlers titled {{{<command>.svg}}}
In readonly mode a tiddler called {{{<command>ReadOnly.svg}}} will be used if it exists.
!TODO
* rename (IconToolbarPlugin?)
* support more than one more popup menu in the toolbar.
!Code
***/
//{{{
(function($) {
if(!config.macros.image) {
throw "Missing dependency: ImageMacroPlugin";
}
var macro = config.macros.toolbar;
macro.icons = {
cloneTiddler: "editTiddler"
};
var _handler = macro.handler;
macro.handler = function(place, macroName, params, wikifier,
paramString, tiddler) {
var toolbar = $(place);
toolbar.attr({
refresh: "macro",
macroName: macroName
}).data("args", arguments);
var status = _handler.apply(this, arguments);
if(tiddler.isReadOnly()) {
toolbar.addClass("toolbarReadOnly");
} else {
toolbar.removeClass("toolbarReadOnly");
}
var parsedParams = paramString.parseParams("name")[0];
if(parsedParams.icons && parsedParams.icons == "yes") {
this.augmentCommandButtons(place);
}
if(parsedParams.more && parsedParams.more == "popup") {
// note we must override the onclick event like in createTiddlyButton
// otherwise the click event is the popup AND the slider
$(".moreCommand", place).each(function(i, el) {
el.onclick = macro.onClickMorePopUp;
});
// buttons that are after a less command should not be in more menu.
$(".lessCommand ~ .button", place).appendTo(place);
$(".lessCommand", place).remove();
}
return status;
};
macro.refresh = function(place, params) {
var args = $(place).empty().data("args");
this.handler.apply(this, args);
};
var imageMacro = config.macros.image;
macro.augmentCommandButtons = function(toolbar) {
$(".button", toolbar).each(function(i, el) {
var cmd = $(el).attr("commandname");
cmd = cmd ? cmd : "moreCommand"; // XXX: special-casing of moreCommand due to ticket #1234
var icon = store.tiddlerExists(cmd) ? cmd : macro.icons[cmd];
var text = $(el).text();
if(readOnly) {
var readOnlyAlternative = "%0ReadOnly".format([icon]);
if(store.tiddlerExists(readOnlyAlternative)) {
icon = readOnlyAlternative;
}
}
if(store.tiddlerExists(icon)) {
$(el).css({display: "inline-block"}).empty();
imageMacro.renderImage(el, icon, { alt: text });
}
});
};
// provide onClickMore to provide extra commands in a popup
macro.onClickMorePopUp = function(ev) {
ev = ev || window.event;
var sibling = this.nextSibling;
if(sibling) {
var commands = sibling.childNodes;
var popup = Popup.create(this);
$(popup).addClass("taggedTiddlerList");
for(var i = 0; i < commands.length; i++) {
var li = createTiddlyElement(popup, "li", null);
var oldCommand = commands[i];
var command = oldCommand.cloneNode(true);
command.onclick = oldCommand.onclick;
li.appendChild(command);
}
Popup.show();
}
ev.cancelBubble = true;
if(ev.stopPropagation) {
ev.stopPropagation();
}
return false;
};
})(jQuery);
//}}}
function nodeToJson(node)
{
var text;
if(node.getAttribute("tiddler")) {
text = $(node).text().unescapeLineBreaks();
}
var title = $(node).attr("title");
var creator = node.getAttribute("creator");
var modifier = node.getAttribute("modifier");
var c = node.getAttribute("created");
var m = node.getAttribute("modified");
var created = c ? Date.convertFromYYYYMMDDHHMMSS(c) : version.date;
var modified = m ? Date.convertFromYYYYMMDDHHMMSS(m) : created;
var tags = node.getAttribute("tags");
var fields = {};
var attrs = node.attributes;
for(var i = attrs.length-1; i >= 0; i--) {
var name = attrs[i].name;
if(["created", "modified", "title", "created", "tags"].indexOf(name) === -1) {
fields[name] = attrs[i].value.unescapeLineBreaks();
}
}
return { title: title, text: text, modifier: modifier,
creator: creator, tags: tags, fields: fields };
return tiddler;
};
function WizardMaker(place, wizard) {
var steps = wizard[0];
var options = wizard[1] || {};
$("<h1 />").text(options.heading || "Wizard").appendTo(place);
var wizard = this;
$('<button>restart wizard</button>').click(function(ev) {
wizard.jumpTo(0);
}).appendTo(place)[0];
this.currentStep = 0;
this.body = $('<div class="wizardBody"/>').appendTo(place)[0];
this.steps = steps;
this.values = {};
this.createStep(0);
}
WizardMaker.prototype = {
/*
OPTIONS
step: [function, options]
*/
createStep: function(stepNumber) {
$(this.body).empty();
var step = this.steps[stepNumber];
if(!step) {
throw "invalid step (" + stepNumber + ")"
}
var options = step[1] || {};
var humanStep = stepNumber + 1;
var heading = "Step " + humanStep;
if(options.heading) {
heading += ": " + options.heading;
}
$("<h2 />").text(heading).appendTo(this.body);
var container = $('<div class="wizardStep" />').appendTo(this.body)[0];
step[0](container, this);
},
next: function() {
if(this.currentStep < this.steps.length - 1) {
this.currentStep += 1;
}
this.createStep(this.currentStep);
},
jumpTo: function(step) {
this.currentStep = step;
this.createStep(step);
},
setValue: function(name, val) {
this.values[name] = val;
},
getValue: function(name) {
return this.values[name];
}
};
if (window.File && window.FileReader && window.FileList && window.Blob) {
function ImportWizard(proxy, saveFunction) {
return [
[
[function(body, wizard) {
$(body).html('Where do you want to import from? <select><option value="1">file</option><option value="2">the web</option></select><button class="button">ok</button>');
$("button", body).click(function(ev) {
var opt = $("select", body).val();
if(opt === "1") {
wizard.next();
} else {
wizard.jumpTo(2);
}
});
},
{ heading: "File or Web?" }],
[function(body, wizard) {
$(body).html('Browse for a file: <input type="file" size="50" name="txtBrowse"><br><hr><div class="wizardFooter"><div class="message"></div></div>');
function handleFileSelect(evt) {
reader = new FileReader();
reader.onerror = function(e, msg) {
alert("Error occurred")
};
reader.onabort = function(e) {
alert('File read cancelled');
};
reader.onload = function(e) {
var html = reader.result;
wizard.setValue("html", html);
wizard.jumpTo(3)
}
// Read in the image file as a binary string.
window.reader = reader;
reader.readAsBinaryString(evt.target.files[0]);
}
$("[type=file]", body)[0].addEventListener('change', handleFileSelect, false);
}, { heading: "Locate TiddlyWiki file" }],
[function(body, wizard) {
$(body).html('Enter the URL or pathname here: <div class="message"></div><input type="text" size="50" name="txtPath"><button class="button">open</button>');
$("button", body).click(function(ev) {
var url = proxy.replace("%0", $("input", body).val())
$.ajax({
type: "post",
url: url,
success: function(html) {
wizard.setValue("html", html);
wizard.jumpTo(3);
},
error: function() {
$(".message").html("There is something wrong with that url please try another.");
$("input", body).addClass("error");
}
})
})
},
{ heading: "Import from Web" }],
[function(body, wizard) {
var html = wizard.getValue("html");
var doc = $(html);
var store;
$(html).each(function(i, el) {
if(el.id === "storeArea") {
store = el;
}
});
if(store) {
var tiddlers = [];
$(store).children().each(function(i, el) {
var title = $(el).attr("title");
tiddlers.push(nodeToJson(el));
});
$("<div />").text("Choose tiddlers that you wish to import");
var table = $("<table />").appendTo(body)[0];
$("<tr />").html('<th><input type="checkbox" checked/></th><th>title</th>').
appendTo(table)
$("input", table).change(function(ev) {
var checked = $(ev.target).is(':checked');
$("input[type=checkbox]", body).attr("checked", checked);
});
for(var i = 0; i < tiddlers.length; i++) {
var title = tiddlers[i].title;
var row = $("<tr />").data("tiddler", tiddlers[i]).appendTo(table)[0];
$("<td />").html('<input type="checkbox" checked="checked"/>').appendTo(row);
$("<td />").text(title).appendTo(row);
}
$("<button>import</button>").click(function(ev) {
var tids = [];
$("input[type=checkbox]:checked").each(function(i, chk) {
var tiddler = $(chk).parents("tr").data("tiddler");
if(tiddler) {
tids.push(tiddler);
}
});
wizard.setValue("selected", tids);
wizard.jumpTo(4)
}).appendTo(body);
}
},
{ heading: "Choose tiddlers" }],
[function(body, wizard) {
var tids = wizard.getValue("selected");
$(body).text("Please wait");
// do import
var save = 0;
var complete = function() {
save += 1;
if(save === tids.length) {
wizard.jumpTo(5);
}
};
for(var i = 0; i < tids.length; i++) {
var tid = tids[i];
saveFunction(tid, complete);
}
},
{ heading: "Importing" }],
[function(body, wizard) {
$(body).html("Good news! Everything is now imported.");
},
{ heading: "Finished!" }]
],
{
heading: "Import tiddlers from another file or server"
}
];
}
var bag = window.location.hostname.split(".")[0] + "_public";
var importer = ImportWizard("/reflector?uri=%0", function(tid, callback) {
$.ajax({
type: "PUT",
contentType: "application/json",
data: JSON.stringify(tid),
url: "/bags/" + bag + "/tiddlers/" + encodeURIComponent(tid.title),
success: callback,
error: callback
});
});
var wizard = new WizardMaker($("#container")[0], importer);
} else {
$("#container").addClass("error").text("Your browser is not modern enough to support this app.");
}
!URL
http://www.bbc.co.uk/news/uk-politics-12371994
!Description
Addressing a security conference in Germany, David Cameron argued the UK needed a stronger national identity to prevent people turning to extremism.
!Notes
No. No. No and No. This is completely backwards. "National identity" is //the// source of extremism. Get rid of nations, there's nothing left.
I hate peeps, so of course this means people torment me with them. I find them hidden in drawers, under my pillow, stashed in the spice cupboard. Lurking. Waiting. Ben has decided they should come to some special events:
!My Wedding
[img[peepwed.png]]
!The Post Wedding Picnic
[img[peeppicnic.png]]
!My Honeymoon
[img[peephoneymoon.png]]
// create a function scope (this is closed in another file)
var createWikifier = function(window, jQuery, passedServerOptions) {
var serverOptions = {
'host': 'http://tiddlyspace.com',
'container': null
};
if (typeof passedServerOptions === 'undefed') {
passedServerOptions = {};
}
jQuery.extend(serverOptions, passedServerOptions);
/*** psuedo-globals required to get rolling ***/
// XXX TiddlyWiki requires a document global, rather than
// being passed that document in startup.
var document = window.document;
// XXX TiddlyWiki requires a store global, rather than it
// being passed where needed.
var store = new TiddlyWiki();
// XXX The findContainingTiddler method on story is required for
// invokeMacro to process, but we don't actually need it to really
// do anything.
var story = {
findContainingTiddler: function(e) { return e; }
};
// XXX the highlightHack variable is used by the function
// highlightify which is rather irrelevant in this context
// annoyingly it is used in Story.js and Macros.js but defined in main.js
var highlightHack = null;
// provide a stubbed alert in case something calls it
function alert(e) {
console.log(e);
}
// config.browser (used in FormatterHelpers) requires navigator
var navigator = { userAgent: "twikifier" };
//--
//-- Augmented methods for the JavaScript Array() object
//--
// Add indexOf function if browser does not support it
if(!Array.indexOf) {
Array.prototype.indexOf = function(item,from)
{
if(!from)
from = 0;
var i;
for(i=from; i<this.length; i++) {
if(this[i] === item)
return i;
}
return -1;
};}
// Find an entry in a given field of the members of an array
Array.prototype.findByField = function(field,value)
{
var t;
for(t=0; t<this.length; t++) {
if(this[t][field] === value)
return t;
}
return null;
};
// Return whether an entry exists in an array
Array.prototype.contains = function(item)
{
return this.indexOf(item) != -1;
};
// Adds, removes or toggles a particular value within an array
// value - value to add
// mode - +1 to add value, -1 to remove value, 0 to toggle it
Array.prototype.setItem = function(value,mode)
{
var p = this.indexOf(value);
if(mode == 0)
mode = (p == -1) ? +1 : -1;
if(mode == +1) {
if(p == -1)
this.push(value);
} else if(mode == -1) {
if(p != -1)
this.splice(p,1);
}
};
// Return whether one of a list of values exists in an array
Array.prototype.containsAny = function(items)
{
var i;
for(i=0; i<items.length; i++) {
if(this.indexOf(items[i]) != -1)
return true;
}
return false;
};
// Return whether all of a list of values exists in an array
Array.prototype.containsAll = function(items)
{
var i;
for(i = 0; i<items.length; i++) {
if(this.indexOf(items[i]) == -1)
return false;
}
return true;
};
// Push a new value into an array only if it is not already present in the array. If the optional unique parameter is false, it reverts to a normal push
Array.prototype.pushUnique = function(item,unique)
{
if(unique === false) {
this.push(item);
} else {
if(this.indexOf(item) == -1)
this.push(item);
}
};
Array.prototype.remove = function(item)
{
var p = this.indexOf(item);
if(p != -1)
this.splice(p,1);
};
if(!Array.prototype.map) {
Array.prototype.map = function(fn,thisObj)
{
var scope = thisObj || window;
var i,j,a = [];
for(i=0, j=this.length; i < j; ++i) {
a.push(fn.call(scope,this[i],i,this));
}
return a;
};}
//--
//-- Augmented methods for the JavaScript String() object
//--
// Get characters from the right end of a string
String.prototype.right = function(n)
{
return n < this.length ? this.slice(this.length-n) : this;
};
// Trim whitespace from both ends of a string
String.prototype.trim = function()
{
return this.replace(/^\s*|\s*$/g,"");
};
// Convert a string from a CSS style property name to a JavaScript style name ("background-color" -> "backgroundColor")
String.prototype.unDash = function()
{
var t,s = this.split("-");
if(s.length > 1) {
for(t=1; t<s.length; t++)
s[t] = s[t].substr(0,1).toUpperCase() + s[t].substr(1);
}
return s.join("");
};
// Substitute substrings from an array into a format string that includes '%1'-type specifiers
String.prototype.format = function(s)
{
var substrings = s && s.constructor == Array ? s : arguments;
var subRegExp = /(?:%(\d+))/mg;
var currPos = 0;
var match,r = [];
do {
match = subRegExp.exec(this);
if(match && match[1]) {
if(match.index > currPos)
r.push(this.substring(currPos,match.index));
r.push(substrings[parseInt(match[1],10)]);
currPos = subRegExp.lastIndex;
}
} while(match);
if(currPos < this.length)
r.push(this.substring(currPos,this.length));
return r.join("");
};
// Escape any special RegExp characters with that character preceded by a backslash
String.prototype.escapeRegExp = function()
{
var s = "\\^$*+?()=!|,{}[].";
var t,c = this;
for(t=0; t<s.length; t++)
c = c.replace(new RegExp("\\" + s.substr(t,1),"g"),"\\" + s.substr(t,1));
return c;
};
// Convert "\" to "\s", newlines to "\n" (and remove carriage returns)
String.prototype.escapeLineBreaks = function()
{
return this.replace(/\\/mg,"\\s").replace(/\n/mg,"\\n").replace(/\r/mg,"");
};
// Convert "\n" to newlines, "\b" to " ", "\s" to "\" (and remove carriage returns)
String.prototype.unescapeLineBreaks = function()
{
return this.replace(/\\n/mg,"\n").replace(/\\b/mg," ").replace(/\\s/mg,"\\").replace(/\r/mg,"");
};
// Convert & to "&", < to "<", > to ">" and " to """
String.prototype.htmlEncode = function()
{
return this.replace(/&/mg,"&").replace(/</mg,"<").replace(/>/mg,">").replace(/\"/mg,""");
};
// Convert "&" to &, "<" to <, ">" to > and """ to "
String.prototype.htmlDecode = function()
{
return this.replace(/</mg,"<").replace(/>/mg,">").replace(/"/mg,"\"").replace(/&/mg,"&");
};
// Parse a space-separated string of name:value parameters
//# where:
//# - the name or the value can be optional (in which case separate defaults are used instead)
//# - in case of ambiguity, a lone word is taken to be a value
//# - if 'cascadeDefaults' is set to true, then the defaults are modified by updated by each specified name or value
//# - name prefixes are not allowed if the 'noNames' parameter is true
//# - if both the name and value are present they must be separated by a colon
//# - the name and the value may both be quoted with single- or double-quotes, double-square brackets
//# - names or values quoted with {{double-curly braces}} are evaluated as a JavaScript expression
//# - as long as the 'allowEval' parameter is true
// The result is an array of objects:
// result[0] = object with a member for each parameter name, value of that member being an array of values
// result[1..n] = one object for each parameter, with 'name' and 'value' members
String.prototype.parseParams = function(defaultName,defaultValue,allowEval,noNames,cascadeDefaults)
{
var parseToken = function(match,p) {
var n;
if(match[p]) // Double quoted
n = match[p];
else if(match[p+1]) // Single quoted
n = match[p+1];
else if(match[p+2]) // Double-square-bracket quoted
n = match[p+2];
else if(match[p+3]) // Double-brace quoted
try {
n = match[p+3];
if(allowEval && config.evaluateMacroParameters != "none") {
if(config.evaluateMacroParameters == "restricted") {
if(window.restrictedEval) {
n = window.restrictedEval(n);
}
} else {
n = window.eval(n);
}
}
} catch(ex) {
throw "Unable to evaluate {{" + match[p+3] + "}}: " + exceptionText(ex);
}
else if(match[p+4]) // Unquoted
n = match[p+4];
else if(match[p+5]) // empty quote
n = "";
return n;
};
var r = [{}];
var dblQuote = "(?:\"((?:(?:\\\\\")|[^\"])+)\")";
var sngQuote = "(?:'((?:(?:\\\\\')|[^'])+)')";
var dblSquare = "(?:\\[\\[((?:\\s|\\S)*?)\\]\\])";
var dblBrace = "(?:\\{\\{((?:\\s|\\S)*?)\\}\\})";
var unQuoted = noNames ? "([^\"'\\s]\\S*)" : "([^\"':\\s][^\\s:]*)";
var emptyQuote = "((?:\"\")|(?:''))";
var skipSpace = "(?:\\s*)";
var token = "(?:" + dblQuote + "|" + sngQuote + "|" + dblSquare + "|" + dblBrace + "|" + unQuoted + "|" + emptyQuote + ")";
var re = noNames ? new RegExp(token,"mg") : new RegExp(skipSpace + token + skipSpace + "(?:(\\:)" + skipSpace + token + ")?","mg");
var match;
do {
match = re.exec(this);
if(match) {
var n = parseToken(match,1);
if(noNames) {
r.push({name:"",value:n});
} else {
var v = parseToken(match,8);
if(v == null && defaultName) {
v = n;
n = defaultName;
} else if(v == null && defaultValue) {
v = defaultValue;
}
r.push({name:n,value:v});
if(cascadeDefaults) {
defaultName = n;
defaultValue = v;
}
}
}
} while(match);
// Summarise parameters into first element
var t;
for(t=1; t<r.length; t++) {
if(r[0][r[t].name])
r[0][r[t].name].push(r[t].value);
else
r[0][r[t].name] = [r[t].value];
}
return r;
};
// Process a string list of macro parameters into an array. Parameters can be quoted with "", '',
// [[]], {{ }} or left unquoted (and therefore space-separated). Double-braces {{}} results in
// an *evaluated* parameter: e.g. {{config.options.txtUserName}} results in the current user's name.
String.prototype.readMacroParams = function(notAllowEval)
{
var p = this.parseParams("list",null,!notAllowEval,true);
var t,n = [];
for(t=1; t<p.length; t++)
n.push(p[t].value);
return n;
};
// Process a string list of unique tiddler names into an array. Tiddler names that have spaces in them must be [[bracketed]]
String.prototype.readBracketedList = function(unique)
{
var p = this.parseParams("list",null,false,true);
var t,n = [];
for(t=1; t<p.length; t++) {
if(p[t].value)
n.pushUnique(p[t].value,unique);
}
return n;
};
// Returns array with start and end index of chunk between given start and end marker, or undefined.
String.prototype.getChunkRange = function(start,end)
{
var s = this.indexOf(start);
if(s != -1) {
s += start.length;
var e = this.indexOf(end,s);
if(e != -1)
return [s,e];
}
};
// Replace a chunk of a string given start and end markers
String.prototype.replaceChunk = function(start,end,sub)
{
var r = this.getChunkRange(start,end);
return r ? this.substring(0,r[0]) + sub + this.substring(r[1]) : this;
};
// Returns a chunk of a string between start and end markers, or undefined
String.prototype.getChunk = function(start,end)
{
var r = this.getChunkRange(start,end);
if(r)
return this.substring(r[0],r[1]);
};
// Static method to bracket a string with double square brackets if it contains a space
String.encodeTiddlyLink = function(title)
{
return title.indexOf(" ") == -1 ? title : "[[" + title + "]]";
};
// Static method to encodeTiddlyLink for every item in an array and join them with spaces
String.encodeTiddlyLinkList = function(list)
{
if(list) {
var t,results = [];
for(t=0; t<list.length; t++)
results.push(String.encodeTiddlyLink(list[t]));
return results.join(" ");
} else {
return "";
}
};
// Convert a string as a sequence of name:"value" pairs into a hashmap
String.prototype.decodeHashMap = function()
{
var fields = this.parseParams("anon","",false);
var t,r = {};
for(t=1; t<fields.length; t++)
r[fields[t].name] = fields[t].value;
return r;
};
// Static method to encode a hashmap into a name:"value"... string
String.encodeHashMap = function(hashmap)
{
var t,r = [];
for(t in hashmap)
r.push(t + ':"' + hashmap[t] + '"');
return r.join(" ");
};
// Static method to left-pad a string with 0s to a certain width
String.zeroPad = function(n,d)
{
var s = n.toString();
if(s.length < d)
s = "000000000000000000000000000".substr(0,d-s.length) + s;
return s;
};
String.prototype.startsWith = function(prefix)
{
return !prefix || this.substring(0,prefix.length) == prefix;
};
// Returns the first value of the given named parameter.
//#
//# @param params
//# as returned by parseParams or null/undefined
//# @return [may be null/undefined]
//#
function getParam(params,name,defaultValue)
{
if(!params)
return defaultValue;
var p = params[0][name];
return p ? p[0] : defaultValue;
}
// Returns the first value of the given boolean named parameter.
//#
//# @param params
//# as returned by parseParams or null/undefined
//#
function getFlag(params,name,defaultValue)
{
return !!getParam(params,name,defaultValue);
}
//--
//-- Configuration repository
//--
// Miscellaneous options
var config = {
numRssItems: 20, // Number of items in the RSS feed
animDuration: 400, // Duration of UI animations in milliseconds
cascadeFast: 20, // Speed for cascade animations (higher == slower)
cascadeSlow: 60, // Speed for EasterEgg cascade animations
cascadeDepth: 5, // Depth of cascade animation
locale: "en" // W3C language tag
};
// Hashmap of alternative parsers for the wikifier
config.parsers = {};
// Adaptors
config.adaptors = {};
config.defaultAdaptor = null;
// Backstage tasks
config.tasks = {};
// Annotations
config.annotations = {};
// Custom fields to be automatically added to new tiddlers
config.defaultCustomFields = {};
// Messages
config.messages = {
messageClose: {},
dates: {},
tiddlerPopup: {}
};
// Options that can be set in the options panel and/or cookies
config.options = {
chkRegExpSearch: false,
chkCaseSensitiveSearch: false,
chkIncrementalSearch: true,
chkAnimate: true,
chkSaveBackups: true,
chkAutoSave: false,
chkGenerateAnRssFeed: false,
chkSaveEmptyTemplate: false,
chkOpenInNewWindow: true,
chkToggleLinks: false,
chkHttpReadOnly: true,
chkForceMinorUpdate: false,
chkConfirmDelete: true,
chkInsertTabs: false,
chkUsePreForStorage: true, // Whether to use <pre> format for storage
chkDisplayInstrumentation: false,
txtBackupFolder: "",
txtEditorFocus: "text",
txtMainTab: "tabTimeline",
txtMoreTab: "moreTabAll",
txtMaxEditRows: "30",
txtFileSystemCharSet: "UTF-8",
txtTheme: ""
};
config.optionsDesc = {};
//# config.optionSource["chkAnimate"] can be:
//# cookie: the option gets stored in a cookie, with the default value coming from SystemSettings
//# volatile: the option isn't persisted at all, and reverts to the default specified in SystemSettings when the document is reloaded
//# setting: the option is stored in the SystemSettings tiddler
//# The default is "setting"
config.optionsSource = {};
// Default tiddler templates
var DEFAULT_VIEW_TEMPLATE = 1;
var DEFAULT_EDIT_TEMPLATE = 2;
config.tiddlerTemplates = {
1: "ViewTemplate",
2: "EditTemplate"
};
// More messages (rather a legacy layout that should not really be like this)
config.views = {
wikified: {
tag: {}
},
editor: {
tagChooser: {}
}
};
// Backstage tasks
config.backstageTasks = ["save","sync","importTask","tweak","upgrade","plugins"];
// Extensions
config.extensions = {};
// Macros; each has a 'handler' member that is inserted later
config.macros = {
today: {},
version: {},
search: {sizeTextbox: 15},
tiddler: {},
tag: {},
tags: {},
tagging: {},
timeline: {},
allTags: {},
list: {
all: {},
missing: {},
orphans: {},
shadowed: {},
touched: {},
filter: {}
},
closeAll: {},
permaview: {},
saveChanges: {},
slider: {},
option: {},
options: {},
newTiddler: {},
newJournal: {},
tabs: {},
gradient: {},
message: {},
view: {defaultView: "text"},
edit: {},
tagChooser: {},
toolbar: {},
plugins: {},
refreshDisplay: {},
importTiddlers: {},
upgrade: {
source: "http://tiddlywiki-releases.tiddlyspace.com/upgrade",
backupExtension: "pre.core.upgrade"
},
sync: {},
annotations: {}
};
// Commands supported by the toolbar macro
config.commands = {
closeTiddler: {},
closeOthers: {},
editTiddler: {},
saveTiddler: {hideReadOnly: true},
cancelTiddler: {},
deleteTiddler: {hideReadOnly: true},
permalink: {},
references: {type: "popup"},
jump: {type: "popup"},
syncing: {type: "popup"},
fields: {type: "popup"}
};
// Control of macro parameter evaluation
config.evaluateMacroParameters = "all";
// Basic regular expressions
config.textPrimitives = {
upperLetter: "[A-Z\u00c0-\u00de\u0150\u0170]",
lowerLetter: "[a-z0-9_\\-\u00df-\u00ff\u0151\u0171]",
anyLetter: "[A-Za-z0-9_\\-\u00c0-\u00de\u00df-\u00ff\u0150\u0170\u0151\u0171]",
anyLetterStrict: "[A-Za-z0-9\u00c0-\u00de\u00df-\u00ff\u0150\u0170\u0151\u0171]"
};
if(!((new RegExp("[\u0150\u0170]","g")).test("\u0150"))) {
config.textPrimitives = {
upperLetter: "[A-Z\u00c0-\u00de]",
lowerLetter: "[a-z0-9_\\-\u00df-\u00ff]",
anyLetter: "[A-Za-z0-9_\\-\u00c0-\u00de\u00df-\u00ff]",
anyLetterStrict: "[A-Za-z0-9\u00c0-\u00de\u00df-\u00ff]"
};
}
config.textPrimitives.sliceSeparator = "::";
config.textPrimitives.sectionSeparator = "##";
config.textPrimitives.urlPattern = "(?:file|http|https|mailto|ftp|irc|news|data):[^\\s'\"]+(?:/|\\b)";
config.textPrimitives.unWikiLink = "~";
config.textPrimitives.wikiLink = "(?:(?:" + config.textPrimitives.upperLetter + "+" +
config.textPrimitives.lowerLetter + "+" +
config.textPrimitives.upperLetter +
config.textPrimitives.anyLetter + "*)|(?:" +
config.textPrimitives.upperLetter + "{2,}" +
config.textPrimitives.lowerLetter + "+))";
config.textPrimitives.cssLookahead = "(?:(" + config.textPrimitives.anyLetter + "+)\\(([^\\)\\|\\n]+)(?:\\):))|(?:(" + config.textPrimitives.anyLetter + "+):([^;\\|\\n]+);)";
config.textPrimitives.cssLookaheadRegExp = new RegExp(config.textPrimitives.cssLookahead,"mg");
config.textPrimitives.brackettedLink = "\\[\\[([^\\]]+)\\]\\]";
config.textPrimitives.titledBrackettedLink = "\\[\\[([^\\[\\]\\|]+)\\|([^\\[\\]\\|]+)\\]\\]";
config.textPrimitives.tiddlerForcedLinkRegExp = new RegExp("(?:" + config.textPrimitives.titledBrackettedLink + ")|(?:" +
config.textPrimitives.brackettedLink + ")|(?:" +
config.textPrimitives.urlPattern + ")","mg");
config.textPrimitives.tiddlerAnyLinkRegExp = new RegExp("("+ config.textPrimitives.wikiLink + ")|(?:" +
config.textPrimitives.titledBrackettedLink + ")|(?:" +
config.textPrimitives.brackettedLink + ")|(?:" +
config.textPrimitives.urlPattern + ")","mg");
config.glyphs = {
currBrowser: null,
browsers: [],
codes: {}
};
//--
//-- Shadow tiddlers
//--
config.shadowTiddlers = {
StyleSheet: "",
MarkupPreHead: "",
MarkupPostHead: "",
MarkupPreBody: "",
MarkupPostBody: "",
TabTimeline: '<<timeline>>',
TabAll: '<<list all>>',
TabTags: '<<allTags excludeLists>>',
TabMoreMissing: '<<list missing>>',
TabMoreOrphans: '<<list orphans>>',
TabMoreShadowed: '<<list shadowed>>',
AdvancedOptions: '<<options>>',
PluginManager: '<<plugins>>',
SystemSettings: '',
ToolbarCommands: '|~ViewToolbar|closeTiddler closeOthers +editTiddler > fields syncing permalink references jump|\n|~EditToolbar|+saveTiddler -cancelTiddler deleteTiddler|',
WindowTitle: '<<tiddler SiteTitle>> - <<tiddler SiteSubtitle>>'
};
// Browser detection... In a very few places, there's nothing else for it but to know what browser we're using.
config.userAgent = navigator.userAgent.toLowerCase();
config.browser = {
isIE: config.userAgent.indexOf("msie") != -1 && config.userAgent.indexOf("opera") == -1,
isGecko: navigator.product == "Gecko" && config.userAgent.indexOf("WebKit") == -1,
ieVersion: /MSIE (\d.\d)/i.exec(config.userAgent), // config.browser.ieVersion[1], if it exists, will be the IE version string, eg "6.0"
isSafari: config.userAgent.indexOf("applewebkit") != -1,
isBadSafari: !((new RegExp("[\u0150\u0170]","g")).test("\u0150")),
firefoxDate: /gecko\/(\d{8})/i.exec(config.userAgent), // config.browser.firefoxDate[1], if it exists, will be Firefox release date as "YYYYMMDD"
isOpera: config.userAgent.indexOf("opera") != -1,
isChrome: config.userAgent.indexOf('chrome') > -1,
isLinux: config.userAgent.indexOf("linux") != -1,
isUnix: config.userAgent.indexOf("x11") != -1,
isMac: config.userAgent.indexOf("mac") != -1,
isWindows: config.userAgent.indexOf("win") != -1
};
merge(config.glyphs,{
browsers: [
function() {return config.browser.isIE;},
function() {return true;}
],
codes: {
downTriangle: ["\u25BC","\u25BE"],
downArrow: ["\u2193","\u2193"],
bentArrowLeft: ["\u2190","\u21A9"],
bentArrowRight: ["\u2192","\u21AA"]
}
});
//--
//-- Filter a list of tiddlers
//--
//# Extensible filter functions
config.filters = {
tiddler: function(results,match) {
var title = match[1]||match[4];
var tiddler = this.fetchTiddler(title);
if(tiddler) {
results.pushUnique(tiddler);
} else if(this.isShadowTiddler(title)) {
tiddler = new Tiddler();
tiddler.set(title,this.getTiddlerText(title));
results.pushUnique(tiddler);
} else {
results.pushUnique(new Tiddler(title));
}
return results;
},
tag: function(results,match) {
var m,matched = this.getTaggedTiddlers(match[3]);
for(m=0; m<matched.length; m++) {
results.pushUnique(matched[m]);
}
return results;
},
sort: function(results,match) {
return this.sortTiddlers(results,match[3]);
},
limit: function(results,match) {
return results.slice(0,parseInt(match[3],10));
},
field: function(results,match) {
var m,matched = this.getValueTiddlers(match[2],match[3]);
for (m = 0; m < matched.length; m++) {
results.pushUnique(matched[m]);
}
return results;
}
};
// Filter a list of tiddlers
//# filter - filter expression (eg "tidlertitle [[multi word tiddler title]] [tag[systemConfig]]")
//# Returns an array of Tiddler() objects that match the filter expression
TiddlyWiki.prototype.filterTiddlers = function(filter)
{
//# text or [[tiddler title]] or [foo[bar]]
var re = /([^\s\[\]]+)|(?:\[([ \w\.\-]+)\[([^\]]+)\]\])|(?:\[\[([^\]]+)\]\])/mg;
var results = [];
if(filter) {
var match = re.exec(filter);
while(match) {
var handler = (match[1]||match[4])?'tiddler':config.filters[match[2]]?match[2]:'field';
results = config.filters[handler].call(this,results,match);
match = re.exec(filter);
}
}
return results;
};
//--
//-- Formatter helpers
//--
function Formatter(formatters)
{
var n;
this.formatters = [];
var pattern = [];
for(n=0; n<formatters.length; n++) {
pattern.push("(" + formatters[n].match + ")");
this.formatters.push(formatters[n]);
}
this.formatterRegExp = new RegExp(pattern.join("|"),"mg");
}
config.formatterHelpers = {
createElementAndWikify: function(w)
{
w.subWikifyTerm(createTiddlyElement(w.output,this.element),this.termRegExp);
},
inlineCssHelper: function(w)
{
var styles = [];
config.textPrimitives.cssLookaheadRegExp.lastIndex = w.nextMatch;
var lookaheadMatch = config.textPrimitives.cssLookaheadRegExp.exec(w.source);
while(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {
var s,v;
if(lookaheadMatch[1]) {
s = lookaheadMatch[1].unDash();
v = lookaheadMatch[2];
} else {
s = lookaheadMatch[3].unDash();
v = lookaheadMatch[4];
}
if(s=="bgcolor")
s = "backgroundColor";
if(s=="float")
s = "cssFloat";
styles.push({style: s, value: v});
w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
config.textPrimitives.cssLookaheadRegExp.lastIndex = w.nextMatch;
lookaheadMatch = config.textPrimitives.cssLookaheadRegExp.exec(w.source);
}
return styles;
},
applyCssHelper: function(e,styles)
{
var t;
for(t=0; t< styles.length; t++) {
try {
e.style[styles[t].style] = styles[t].value;
} catch (ex) {
}
}
},
enclosedTextHelper: function(w)
{
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var text = lookaheadMatch[1];
if(config.browser.isIE)
text = text.replace(/\n/g,"\r");
createTiddlyElement(w.output,this.element,null,null,text);
w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
}
},
isExternalLink: function(link)
{
if(store.tiddlerExists(link) || store.isShadowTiddler(link)) {
//# Definitely not an external link
return false;
}
var urlRegExp = new RegExp(config.textPrimitives.urlPattern,"mg");
if(urlRegExp.exec(link)) {
//# Definitely an external link
return true;
}
if(link.indexOf(".")!=-1 || link.indexOf("\\")!=-1 || link.indexOf("/")!=-1 || link.indexOf("#")!=-1) {
//# Link contains . / \ or # so is probably an external link
return true;
}
//# Otherwise assume it is not an external link
return false;
}
};
//--
//-- Standard formatters
//--
config.formatters = [
{
name: "table",
match: "^\\|(?:[^\\n]*)\\|(?:[fhck]?)$",
lookaheadRegExp: /^\|([^\n]*)\|([fhck]?)$/mg,
rowTermRegExp: /(\|(?:[fhck]?)$\n?)/mg,
cellRegExp: /(?:\|([^\n\|]*)\|)|(\|[fhck]?$\n?)/mg,
cellTermRegExp: /((?:\x20*)\|)/mg,
rowTypes: {"c":"caption", "h":"thead", "":"tbody", "f":"tfoot"},
handler: function(w)
{
var table = createTiddlyElement(w.output,"table",null,"twtable");
var prevColumns = [];
var currRowType = null;
var rowContainer;
var rowCount = 0;
var onmouseover = function() {jQuery(this).addClass("hoverRow");};
var onmouseout = function() {jQuery(this).removeClass("hoverRow");};
w.nextMatch = w.matchStart;
this.lookaheadRegExp.lastIndex = w.nextMatch;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
while(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {
var nextRowType = lookaheadMatch[2];
if(nextRowType == "k") {
table.className = lookaheadMatch[1];
w.nextMatch += lookaheadMatch[0].length+1;
} else {
if(nextRowType != currRowType) {
rowContainer = createTiddlyElement(table,this.rowTypes[nextRowType]);
currRowType = nextRowType;
}
if(currRowType == "c") {
// Caption
w.nextMatch++;
if(rowContainer != table.firstChild)
table.insertBefore(rowContainer,table.firstChild);
rowContainer.setAttribute("align",rowCount == 0?"top":"bottom");
w.subWikifyTerm(rowContainer,this.rowTermRegExp);
} else {
var theRow = createTiddlyElement(rowContainer,"tr",null,rowCount%2?"oddRow":"evenRow");
theRow.onmouseover = onmouseover;
theRow.onmouseout = onmouseout;
this.rowHandler(w,theRow,prevColumns);
rowCount++;
}
}
this.lookaheadRegExp.lastIndex = w.nextMatch;
lookaheadMatch = this.lookaheadRegExp.exec(w.source);
}
},
rowHandler: function(w,e,prevColumns)
{
var col = 0;
var colSpanCount = 1;
var prevCell = null;
this.cellRegExp.lastIndex = w.nextMatch;
var cellMatch = this.cellRegExp.exec(w.source);
while(cellMatch && cellMatch.index == w.nextMatch) {
if(cellMatch[1] == "~") {
// Rowspan
var last = prevColumns[col];
if(last) {
last.rowSpanCount++;
last.element.setAttribute("rowspan",last.rowSpanCount);
last.element.setAttribute("rowSpan",last.rowSpanCount); // Needed for IE
last.element.valign = "center";
if(colSpanCount > 1) {
last.element.setAttribute("colspan",colSpanCount);
last.element.setAttribute("colSpan",colSpanCount); // Needed for IE
colSpanCount = 1;
}
}
w.nextMatch = this.cellRegExp.lastIndex-1;
} else if(cellMatch[1] == ">") {
// Colspan
colSpanCount++;
w.nextMatch = this.cellRegExp.lastIndex-1;
} else if(cellMatch[2]) {
// End of row
if(prevCell && colSpanCount > 1) {
prevCell.setAttribute("colspan",colSpanCount);
prevCell.setAttribute("colSpan",colSpanCount); // Needed for IE
}
w.nextMatch = this.cellRegExp.lastIndex;
break;
} else {
// Cell
w.nextMatch++;
var styles = config.formatterHelpers.inlineCssHelper(w);
var spaceLeft = false;
var chr = w.source.substr(w.nextMatch,1);
while(chr == " ") {
spaceLeft = true;
w.nextMatch++;
chr = w.source.substr(w.nextMatch,1);
}
var cell;
if(chr == "!") {
cell = createTiddlyElement(e,"th");
w.nextMatch++;
} else {
cell = createTiddlyElement(e,"td");
}
prevCell = cell;
prevColumns[col] = {rowSpanCount:1,element:cell};
if(colSpanCount > 1) {
cell.setAttribute("colspan",colSpanCount);
cell.setAttribute("colSpan",colSpanCount); // Needed for IE
colSpanCount = 1;
}
config.formatterHelpers.applyCssHelper(cell,styles);
w.subWikifyTerm(cell,this.cellTermRegExp);
if(w.matchText.substr(w.matchText.length-2,1) == " ") // spaceRight
cell.align = spaceLeft ? "center" : "left";
else if(spaceLeft)
cell.align = "right";
w.nextMatch--;
}
col++;
this.cellRegExp.lastIndex = w.nextMatch;
cellMatch = this.cellRegExp.exec(w.source);
}
}
},
{
name: "heading",
match: "^!{1,6}",
termRegExp: /(\n)/mg,
handler: function(w)
{
w.subWikifyTerm(createTiddlyElement(w.output,"h" + w.matchLength),this.termRegExp);
}
},
{
name: "list",
match: "^(?:[\\*#;:]+)",
lookaheadRegExp: /^(?:(?:(\*)|(#)|(;)|(:))+)/mg,
termRegExp: /(\n)/mg,
handler: function(w)
{
var stack = [w.output];
var currLevel = 0, currType = null;
var listLevel, listType, itemType, baseType;
w.nextMatch = w.matchStart;
this.lookaheadRegExp.lastIndex = w.nextMatch;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
while(lookaheadMatch && lookaheadMatch.index == w.nextMatch) {
if(lookaheadMatch[1]) {
listType = "ul";
itemType = "li";
} else if(lookaheadMatch[2]) {
listType = "ol";
itemType = "li";
} else if(lookaheadMatch[3]) {
listType = "dl";
itemType = "dt";
} else if(lookaheadMatch[4]) {
listType = "dl";
itemType = "dd";
}
if(!baseType)
baseType = listType;
listLevel = lookaheadMatch[0].length;
w.nextMatch += lookaheadMatch[0].length;
var t;
if(listLevel > currLevel) {
for(t=currLevel; t<listLevel; t++) {
var target = (currLevel == 0) ? stack[stack.length-1] : stack[stack.length-1].lastChild;
stack.push(createTiddlyElement(target,listType));
}
} else if(listType!=baseType && listLevel==1) {
w.nextMatch -= lookaheadMatch[0].length;
return;
} else if(listLevel < currLevel) {
for(t=currLevel; t>listLevel; t--)
stack.pop();
} else if(listLevel == currLevel && listType != currType) {
stack.pop();
stack.push(createTiddlyElement(stack[stack.length-1].lastChild,listType));
}
currLevel = listLevel;
currType = listType;
var e = createTiddlyElement(stack[stack.length-1],itemType);
w.subWikifyTerm(e,this.termRegExp);
this.lookaheadRegExp.lastIndex = w.nextMatch;
lookaheadMatch = this.lookaheadRegExp.exec(w.source);
}
}
},
{
name: "quoteByBlock",
match: "^<<<\\n",
termRegExp: /(^<<<(\n|$))/mg,
element: "blockquote",
handler: config.formatterHelpers.createElementAndWikify
},
{
name: "quoteByLine",
match: "^>+",
lookaheadRegExp: /^>+/mg,
termRegExp: /(\n)/mg,
element: "blockquote",
handler: function(w)
{
var stack = [w.output];
var currLevel = 0;
var newLevel = w.matchLength;
var t,matched;
do {
if(newLevel > currLevel) {
for(t=currLevel; t<newLevel; t++)
stack.push(createTiddlyElement(stack[stack.length-1],this.element));
} else if(newLevel < currLevel) {
for(t=currLevel; t>newLevel; t--)
stack.pop();
}
currLevel = newLevel;
w.subWikifyTerm(stack[stack.length-1],this.termRegExp);
createTiddlyElement(stack[stack.length-1],"br");
this.lookaheadRegExp.lastIndex = w.nextMatch;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
matched = lookaheadMatch && lookaheadMatch.index == w.nextMatch;
if(matched) {
newLevel = lookaheadMatch[0].length;
w.nextMatch += lookaheadMatch[0].length;
}
} while(matched);
}
},
{
name: "rule",
match: "^----+$\\n?|<hr ?/?>\\n?",
handler: function(w)
{
createTiddlyElement(w.output,"hr");
}
},
{
name: "monospacedByLine",
match: "^(?:/\\*\\{\\{\\{\\*/|\\{\\{\\{|//\\{\\{\\{|<!--\\{\\{\\{-->)\\n",
element: "pre",
handler: function(w)
{
switch(w.matchText) {
case "/*{{{*/\n": // CSS
this.lookaheadRegExp = /\/\*\{\{\{\*\/\n*((?:^[^\n]*\n)+?)(\n*^\f*\/\*\}\}\}\*\/$\n?)/mg;
break;
case "{{{\n": // monospaced block
this.lookaheadRegExp = /^\{\{\{\n((?:^[^\n]*\n)+?)(^\f*\}\}\}$\n?)/mg;
break;
case "//{{{\n": // plugin
this.lookaheadRegExp = /^\/\/\{\{\{\n\n*((?:^[^\n]*\n)+?)(\n*^\f*\/\/\}\}\}$\n?)/mg;
break;
case "<!--{{{-->\n": //template
this.lookaheadRegExp = /<!--\{\{\{-->\n*((?:^[^\n]*\n)+?)(\n*^\f*<!--\}\}\}-->$\n?)/mg;
break;
default:
break;
}
config.formatterHelpers.enclosedTextHelper.call(this,w);
}
},
{
name: "wikifyComment",
match: "^(?:/\\*\\*\\*|<!---)\\n",
handler: function(w)
{
var termRegExp = (w.matchText == "/***\n") ? (/(^\*\*\*\/\n)/mg) : (/(^--->\n)/mg);
w.subWikifyTerm(w.output,termRegExp);
}
},
{
name: "macro",
match: "<<",
lookaheadRegExp: /<<([^>\s]+)(?:\s*)((?:[^>]|(?:>(?!>)))*)>>/mg,
handler: function(w)
{
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart && lookaheadMatch[1]) {
w.nextMatch = this.lookaheadRegExp.lastIndex;
invokeMacro(w.output,lookaheadMatch[1],lookaheadMatch[2],w,w.tiddler);
}
}
},
{
name: "prettyLink",
match: "\\[\\[",
lookaheadRegExp: /\[\[(.*?)(?:\|(~)?(.*?))?\]\]/mg,
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];
e = (!lookaheadMatch[2] && config.formatterHelpers.isExternalLink(link)) ?
createExternalLink(w.output,link) : createTiddlyLink(w.output,link,false,null,w.isStatic,w.tiddler);
} else {
// Simple bracketted link
e = createTiddlyLink(w.output,text,false,null,w.isStatic,w.tiddler);
}
createTiddlyText(e,text);
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
},
{
name: "wikiLink",
match: config.textPrimitives.unWikiLink+"?"+config.textPrimitives.wikiLink,
handler: function(w)
{
if(w.matchText.substr(0,1) == config.textPrimitives.unWikiLink) {
w.outputText(w.output,w.matchStart+1,w.nextMatch);
return;
}
if(w.matchStart > 0) {
var preRegExp = new RegExp(config.textPrimitives.anyLetterStrict,"mg");
preRegExp.lastIndex = w.matchStart-1;
var preMatch = preRegExp.exec(w.source);
if(preMatch.index == w.matchStart-1) {
w.outputText(w.output,w.matchStart,w.nextMatch);
return;
}
}
if(w.autoLinkWikiWords || store.isShadowTiddler(w.matchText)) {
var link = createTiddlyLink(w.output,w.matchText,false,null,w.isStatic,w.tiddler);
w.outputText(link,w.matchStart,w.nextMatch);
} else {
w.outputText(w.output,w.matchStart,w.nextMatch);
}
}
},
{
name: "urlLink",
match: config.textPrimitives.urlPattern,
handler: function(w)
{
w.outputText(createExternalLink(w.output,w.matchText),w.matchStart,w.nextMatch);
}
},
{
name: "image",
match: "\\[[<>]?[Ii][Mm][Gg]\\[",
//# [<] sequence below is to avoid lessThan-questionMark sequence so TiddlyWikis can be included in PHP files
lookaheadRegExp: /\[([<]?)(>?)[Ii][Mm][Gg]\[(?:([^\|\]]+)\|)?([^\[\]\|]+)\](?:\[([^\]]*)\])?\]/mg,
handler: function(w)
{
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
var e = w.output;
if(lookaheadMatch[5]) {
var link = lookaheadMatch[5];
e = config.formatterHelpers.isExternalLink(link) ? createExternalLink(w.output,link) : createTiddlyLink(w.output,link,false,null,w.isStatic,w.tiddler);
jQuery(e).addClass("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.setAttribute("alt",lookaheadMatch[3]);
}
img.src = lookaheadMatch[4];
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
},
{
name: "html",
match: "<[Hh][Tt][Mm][Ll]>",
lookaheadRegExp: /<[Hh][Tt][Mm][Ll]>((?:.|\n)*?)<\/[Hh][Tt][Mm][Ll]>/mg,
handler: function(w)
{
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
createTiddlyElement(w.output,"span").innerHTML = lookaheadMatch[1];
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
},
{
name: "commentByBlock",
match: "/%",
lookaheadRegExp: /\/%((?:.|\n)*?)%\//mg,
handler: function(w)
{
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
},
{
name: "characterFormat",
match: "''|//|__|\\^\\^|~~|--(?!\\s|$)|\\{\\{\\{",
handler: function(w)
{
switch(w.matchText) {
case "''":
w.subWikifyTerm(w.output.appendChild(document.createElement("strong")),/('')/mg);
break;
case "//":
w.subWikifyTerm(createTiddlyElement(w.output,"em"),/(\/\/)/mg);
break;
case "__":
w.subWikifyTerm(createTiddlyElement(w.output,"u"),/(__)/mg);
break;
case "^^":
w.subWikifyTerm(createTiddlyElement(w.output,"sup"),/(\^\^)/mg);
break;
case "~~":
w.subWikifyTerm(createTiddlyElement(w.output,"sub"),/(~~)/mg);
break;
case "--":
w.subWikifyTerm(createTiddlyElement(w.output,"strike"),/(--)/mg);
break;
case "{{{":
var lookaheadRegExp = /\{\{\{((?:.|\n)*?)\}\}\}/mg;
lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
createTiddlyElement(w.output,"code",null,null,lookaheadMatch[1]);
w.nextMatch = lookaheadRegExp.lastIndex;
}
break;
}
}
},
{
name: "customFormat",
match: "@@|\\{\\{",
handler: function(w)
{
switch(w.matchText) {
case "@@":
var e = createTiddlyElement(w.output,"span");
var styles = config.formatterHelpers.inlineCssHelper(w);
if(styles.length == 0)
e.className = "marked";
else
config.formatterHelpers.applyCssHelper(e,styles);
w.subWikifyTerm(e,/(@@)/mg);
break;
case "{{":
var lookaheadRegExp = /\{\{[\s]*([\w]+[\s\w]*)[\s]*\{(\n?)/mg;
lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = lookaheadRegExp.exec(w.source);
if(lookaheadMatch) {
w.nextMatch = lookaheadRegExp.lastIndex;
e = createTiddlyElement(w.output,lookaheadMatch[2] == "\n" ? "div" : "span",null,lookaheadMatch[1]);
w.subWikifyTerm(e,/(\}\}\})/mg);
}
break;
}
}
},
{
name: "mdash",
match: "--",
handler: function(w)
{
createTiddlyElement(w.output,"span").innerHTML = "—";
}
},
{
name: "lineBreak",
match: "\\n|<br ?/?>",
handler: function(w)
{
createTiddlyElement(w.output,"br");
}
},
{
name: "rawText",
match: "\"{3}|<nowiki>",
lookaheadRegExp: /(?:\"{3}|<nowiki>)((?:.|\n)*?)(?:\"{3}|<\/nowiki>)/mg,
handler: function(w)
{
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
createTiddlyElement(w.output,"span",null,null,lookaheadMatch[1]);
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
},
{
name: "htmlEntitiesEncoding",
match: "(?:(?:&#?[a-zA-Z0-9]{2,8};|.)(?:&#?(?:x0*(?:3[0-6][0-9a-fA-F]|1D[c-fC-F][0-9a-fA-F]|20[d-fD-F][0-9a-fA-F]|FE2[0-9a-fA-F])|0*(?:76[89]|7[7-9][0-9]|8[0-7][0-9]|761[6-9]|76[2-7][0-9]|84[0-3][0-9]|844[0-7]|6505[6-9]|6506[0-9]|6507[0-1]));)+|&#?[a-zA-Z0-9]{2,8};)",
handler: function(w)
{
createTiddlyElement(w.output,"span").innerHTML = w.matchText;
}
}
];
//--
//-- Tiddler() object
//--
function Tiddler(title)
{
this.title = title;
this.text = "";
this.creator = null;
this.modifier = null;
this.created = new Date();
this.modified = this.created;
this.links = [];
this.linksUpdated = false;
this.tags = [];
this.fields = {};
return this;
}
Tiddler.prototype.getLinks = function()
{
if(this.linksUpdated==false)
this.changed();
return this.links;
};
// Returns the fields that are inherited in string field:"value" field2:"value2" format
Tiddler.prototype.getInheritedFields = function()
{
var f = {};
var i;
for(i in this.fields) {
if(i=="server.host" || i=="server.workspace" || i=="wikiformat"|| i=="server.type") {
f[i] = this.fields[i];
}
}
return String.encodeHashMap(f);
};
// Increment the changeCount of a tiddler
Tiddler.prototype.incChangeCount = function()
{
var c = this.fields['changecount'];
c = c ? parseInt(c,10) : 0;
this.fields['changecount'] = String(c+1);
};
// Clear the changeCount of a tiddler
Tiddler.prototype.clearChangeCount = function()
{
if(this.fields['changecount']) {
delete this.fields['changecount'];
}
};
//# returns true when this tiddler has the field 'temporary', meaning it is a temporary tiddler (i.e. must not be saved).
Tiddler.prototype.doNotSave = function()
{
return this.fields['doNotSave'];
};
// Returns true if the tiddler has been updated since the tiddler was created or downloaded
Tiddler.prototype.isTouched = function()
{
var changecount = this.fields.changecount || 0;
return changecount > 0;
};
// Change the text and other attributes of a tiddler
Tiddler.prototype.set = function(title,text,modifier,modified,tags,created,fields,creator)
{
this.assign(title,text,modifier,modified,tags,created,fields,creator);
this.changed();
return this;
};
// Change the text and other attributes of a tiddler without triggered a tiddler.changed() call
Tiddler.prototype.assign = function(title,text,modifier,modified,tags,created,fields,creator)
{
if(title != undefined)
this.title = title;
if(text != undefined)
this.text = text;
if(modifier != undefined)
this.modifier = modifier;
if(modified != undefined)
this.modified = modified;
if(creator != undefined)
this.creator = creator;
if(created != undefined)
this.created = created;
if(fields != undefined)
this.fields = fields;
if(tags != undefined)
this.tags = (typeof tags == "string") ? tags.readBracketedList() : tags;
else if(this.tags == undefined)
this.tags = [];
return this;
};
// Get the tags for a tiddler as a string (space delimited, using [[brackets]] for tags containing spaces)
Tiddler.prototype.getTags = function()
{
return String.encodeTiddlyLinkList(this.tags);
};
// Test if a tiddler carries a tag
Tiddler.prototype.isTagged = function(tag)
{
return this.tags.indexOf(tag) != -1;
};
// Static method to convert "\n" to newlines, "\s" to "\"
Tiddler.unescapeLineBreaks = function(text)
{
return text ? text.unescapeLineBreaks() : "";
};
// Convert newlines to "\n", "\" to "\s"
Tiddler.prototype.escapeLineBreaks = function()
{
return this.text.escapeLineBreaks();
};
// Updates the secondary information (like links[] array) after a change to a tiddler
Tiddler.prototype.changed = function()
{
this.links = [];
var text = this.text;
// remove 'quoted' text before scanning tiddler source
text = text.replace(/\/%((?:.|\n)*?)%\//g,"").
replace(/\{{3}((?:.|\n)*?)\}{3}/g,"").
replace(/"""((?:.|\n)*?)"""/g,"").
replace(/<nowiki\>((?:.|\n)*?)<\/nowiki\>/g,"").
replace(/<html\>((?:.|\n)*?)<\/html\>/g,"").
replace(/<script((?:.|\n)*?)<\/script\>/g,"");
var t = this.autoLinkWikiWords() ? 0 : 1;
var tiddlerLinkRegExp = t==0 ? config.textPrimitives.tiddlerAnyLinkRegExp : config.textPrimitives.tiddlerForcedLinkRegExp;
tiddlerLinkRegExp.lastIndex = 0;
var formatMatch = tiddlerLinkRegExp.exec(text);
while(formatMatch) {
var lastIndex = tiddlerLinkRegExp.lastIndex;
if(t==0 && formatMatch[1] && formatMatch[1] != this.title) {
// wikiWordLink
if(formatMatch.index > 0) {
var preRegExp = new RegExp(config.textPrimitives.unWikiLink+"|"+config.textPrimitives.anyLetter,"mg");
preRegExp.lastIndex = formatMatch.index-1;
var preMatch = preRegExp.exec(text);
if(preMatch.index != formatMatch.index-1)
this.links.pushUnique(formatMatch[1]);
} else {
this.links.pushUnique(formatMatch[1]);
}
}
else if(formatMatch[2-t] && !config.formatterHelpers.isExternalLink(formatMatch[3-t])) // titledBrackettedLink
this.links.pushUnique(formatMatch[3-t]);
else if(formatMatch[4-t] && formatMatch[4-t] != this.title) // brackettedLink
this.links.pushUnique(formatMatch[4-t]);
//# Do not add link if match urlPattern (formatMatch[5-t])
tiddlerLinkRegExp.lastIndex = lastIndex;
formatMatch = tiddlerLinkRegExp.exec(text);
}
this.linksUpdated = true;
};
Tiddler.prototype.getSubtitle = function()
{
var modifier = this.modifier;
if(!modifier)
modifier = config.messages.subtitleUnknown || "";
var modified = this.modified;
if(modified)
modified = modified.toLocaleString();
else
modified = config.messages.subtitleUnknown || "";
var f = config.messages.tiddlerLinkTooltip || "%0 - %1, %2";
return f.format([this.title,modifier,modified]);
};
Tiddler.prototype.isReadOnly = function()
{
return readOnly;
};
Tiddler.prototype.autoLinkWikiWords = function()
{
return !(this.isTagged("systemConfig") || this.isTagged("excludeMissing"));
};
Tiddler.prototype.getServerType = function()
{
var serverType = null;
if(this.fields['server.type'])
serverType = this.fields['server.type'];
if(!serverType)
serverType = this.fields['wikiformat'];
if(serverType && !config.adaptors[serverType])
serverType = null;
return serverType;
};
Tiddler.prototype.getAdaptor = function()
{
var serverType = this.getServerType();
return serverType ? new config.adaptors[serverType]() : null;
};
//--
//-- TiddlyWiki instance contains TiddlerS
//--
function TiddlyWiki()
{
var tiddlers = {}; // Hashmap by name of tiddlers
this.tiddlersUpdated = false;
this.namedNotifications = []; // Array of {name:,notify:} of notification functions
this.notificationLevel = 0;
this.slices = {}; // map tiddlerName->(map sliceName->sliceValue). Lazy.
this.clear = function() {
tiddlers = {};
this.setDirty(false);
};
this.fetchTiddler = function(title) {
var t = tiddlers[title];
return t instanceof Tiddler ? t : null;
};
this.deleteTiddler = function(title) {
delete this.slices[title];
delete tiddlers[title];
};
this.addTiddler = function(tiddler) {
delete this.slices[tiddler.title];
tiddlers[tiddler.title] = tiddler;
};
this.forEachTiddler = function(callback) {
var t;
for(t in tiddlers) {
var tiddler = tiddlers[t];
if(tiddler instanceof Tiddler)
callback.call(this,t,tiddler);
}
};
}
//# Set the dirty flag
TiddlyWiki.prototype.setDirty = function(dirty)
{
this.dirty = dirty;
};
TiddlyWiki.prototype.isDirty = function()
{
return this.dirty;
};
TiddlyWiki.prototype.tiddlerExists = function(title)
{
var t = this.fetchTiddler(title);
return t != undefined;
};
TiddlyWiki.prototype.isShadowTiddler = function(title)
{
return config.shadowTiddlers[title] === undefined ? false : true;
};
TiddlyWiki.prototype.createTiddler = function(title)
{
var tiddler = this.fetchTiddler(title);
if(!tiddler) {
tiddler = new Tiddler(title);
this.addTiddler(tiddler);
this.setDirty(true);
}
return tiddler;
};
TiddlyWiki.prototype.getTiddler = function(title)
{
var t = this.fetchTiddler(title);
if(t != undefined)
return t;
else
return null;
};
TiddlyWiki.prototype.getShadowTiddlerText = function(title)
{
if(typeof config.shadowTiddlers[title] == "string")
return config.shadowTiddlers[title];
else
return "";
};
// Retrieve tiddler contents
//# Supports tiddler slices or sections, encoded in {{{title}}} argument using
//# the respective separator characters ({{{::}}} or {{{##}}}).
TiddlyWiki.prototype.getTiddlerText = function(title,defaultText)
{
if(!title)
return defaultText;
var pos = title.indexOf(config.textPrimitives.sectionSeparator);
var section = null;
if(pos != -1) {
section = title.substr(pos + config.textPrimitives.sectionSeparator.length);
title = title.substr(0,pos);
}
pos = title.indexOf(config.textPrimitives.sliceSeparator);
if(pos != -1) {
var slice = this.getTiddlerSlice(title.substr(0,pos),title.substr(pos + config.textPrimitives.sliceSeparator.length));
if(slice)
return slice;
}
var tiddler = this.fetchTiddler(title);
var text = tiddler ? tiddler.text : null;
if(!tiddler && this.isShadowTiddler(title)) {
text = this.getShadowTiddlerText(title);
}
if(text) {
if(!section)
return text;
var re = new RegExp("(^!{1,6}[ \t]*" + section.escapeRegExp() + "[ \t]*\n)","mg");
re.lastIndex = 0;
var match = re.exec(text);
if(match) {
var t = text.substr(match.index+match[1].length);
var re2 = /^!/mg;
re2.lastIndex = 0;
match = re2.exec(t); //# search for the next heading
if(match)
t = t.substr(0,match.index-1);//# don't include final \n
return t;
}
return defaultText;
}
if(defaultText != undefined)
return defaultText;
return null;
};
TiddlyWiki.prototype.getRecursiveTiddlerText = function(title,defaultText,depth)
{
var bracketRegExp = new RegExp("(?:\\[\\[([^\\]]+)\\]\\])","mg");
var text = this.getTiddlerText(title,null);
if(text == null)
return defaultText;
var textOut = [];
var match,lastPos = 0;
do {
match = bracketRegExp.exec(text);
if(match) {
textOut.push(text.substr(lastPos,match.index-lastPos));
if(match[1]) {
if(depth <= 0)
textOut.push(match[1]);
else
textOut.push(this.getRecursiveTiddlerText(match[1],"",depth-1));
}
lastPos = match.index + match[0].length;
} else {
textOut.push(text.substr(lastPos));
}
} while(match);
return textOut.join("");
};
//TiddlyWiki.prototype.slicesRE = /(?:^([\'\/]{0,2})~?([\.\w]+)\:\1[\t\x20]*([^\n]+)[\t\x20]*$)|(?:^\|([\'\/]{0,2})~?([\.\w]+)\:?\4\|[\t\x20]*([^\n]+)[\t\x20]*\|$)/gm;
TiddlyWiki.prototype.slicesRE = /(?:^([\'\/]{0,2})~?([\.\w]+)\:\1[\t\x20]*([^\n]*)[\t\x20]*$)|(?:^\|([\'\/]{0,2})~?([\.\w]+)\:?\4\|[\t\x20]*([^\|\n]*)[\t\x20]*\|$)/gm;
// @internal
TiddlyWiki.prototype.calcAllSlices = function(title)
{
var slices = {};
var text = this.getTiddlerText(title,"");
this.slicesRE.lastIndex = 0;
var m = this.slicesRE.exec(text);
while(m) {
if(m[2])
slices[m[2]] = m[3];
else
slices[m[5]] = m[6];
m = this.slicesRE.exec(text);
}
return slices;
};
// Returns the slice of text of the given name
//#
//# A text slice is a substring in the tiddler's text that is defined
//# either like this
//# aName: textSlice
//# or
//# |aName:| textSlice |
//# or
//# |aName| textSlice |
//#
//# In the text the name (or name:) may be decorated with '' or //
//# ie this would also a valid text slice:
//#
//# |''aName:''| textSlice |
//#
//# @param name should only contain "word characters" (i.e. "a-ZA-Z_0-9")
//# @return [may be undefined] the (trimmed) text of the specified slice.
TiddlyWiki.prototype.getTiddlerSlice = function(title,sliceName)
{
var slices = this.slices[title];
if(!slices) {
slices = this.calcAllSlices(title);
this.slices[title] = slices;
}
return slices[sliceName];
};
// Build an hashmap of the specified named slices of a tiddler
TiddlyWiki.prototype.getTiddlerSlices = function(title,sliceNames)
{
var t,r = {};
for(t=0; t<sliceNames.length; t++) {
var slice = this.getTiddlerSlice(title,sliceNames[t]);
if(slice)
r[sliceNames[t]] = slice;
}
return r;
};
TiddlyWiki.prototype.suspendNotifications = function()
{
this.notificationLevel--;
};
TiddlyWiki.prototype.resumeNotifications = function()
{
this.notificationLevel++;
};
// Invoke the notification handlers for a particular tiddler
TiddlyWiki.prototype.notify = function(title,doBlanket)
{
if(!this.notificationLevel) {
var t;
for(t=0; t<this.namedNotifications.length; t++) {
var n = this.namedNotifications[t];
if((n.name == null && doBlanket) || (n.name == title))
n.notify(title);
}
}
};
// Invoke the notification handlers for all tiddlers
TiddlyWiki.prototype.notifyAll = function()
{
if(!this.notificationLevel) {
var t;
for(t=0; t<this.namedNotifications.length; t++) {
var n = this.namedNotifications[t];
if(n.name)
n.notify(n.name);
}
}
};
// Add a notification handler to a tiddler
TiddlyWiki.prototype.addNotification = function(title,fn)
{
var i;
for(i=0; i<this.namedNotifications.length; i++) {
if((this.namedNotifications[i].name == title) && (this.namedNotifications[i].notify == fn))
return this;
}
this.namedNotifications.push({name: title, notify: fn});
return this;
};
TiddlyWiki.prototype.removeTiddler = function(title)
{
var tiddler = this.fetchTiddler(title);
if(tiddler) {
this.deleteTiddler(title);
this.notify(title,true);
this.setDirty(true);
}
};
// Reset the sync status of a freshly synced tiddler
TiddlyWiki.prototype.resetTiddler = function(title)
{
var tiddler = this.fetchTiddler(title);
if(tiddler) {
tiddler.clearChangeCount();
this.notify(title,true);
this.setDirty(true);
}
};
TiddlyWiki.prototype.setTiddlerTag = function(title,status,tag)
{
var tiddler = this.fetchTiddler(title);
if(tiddler) {
var t = tiddler.tags.indexOf(tag);
if(t != -1)
tiddler.tags.splice(t,1);
if(status)
tiddler.tags.push(tag);
tiddler.changed();
tiddler.incChangeCount();
this.notify(title,true);
this.setDirty(true);
}
};
TiddlyWiki.prototype.addTiddlerFields = function(title,fields)
{
var tiddler = this.fetchTiddler(title);
if(!tiddler)
return;
merge(tiddler.fields,fields);
tiddler.changed();
tiddler.incChangeCount();
this.notify(title,true);
this.setDirty(true);
};
// Store tiddler in TiddlyWiki instance
//#
//# optionally accepts a Tiddler instance as first argument, rendering
//# subsequent arguments obsolete
//#
//# existing tiddlers can be renamed using the newTitle argument
//#
//# created and modified arguments are Date objects,
//# tags argument is an array of strings
//#
//# fields should retain existing tiddler's extended fields and use
//# config.defaultCustomFields as fallback
//#
//# NB: Does not trigger autoSaveChanges.
TiddlyWiki.prototype.saveTiddler = function(title,newTitle,newBody,modifier,modified,tags,fields,clearChangeCount,created,creator)
{
var tiddler;
if(title instanceof Tiddler) {
tiddler = title;
title = tiddler.title;
newTitle = title;
} else {
tiddler = this.fetchTiddler(title);
if(tiddler) {
created = created || tiddler.created; // Preserve created date
creator = creator || tiddler.creator;
this.deleteTiddler(title);
} else {
created = created || modified;
tiddler = new Tiddler();
}
fields = merge({},fields);
tiddler.set(newTitle,newBody,modifier,modified,tags,created,fields,creator);
}
this.addTiddler(tiddler);
if(clearChangeCount)
tiddler.clearChangeCount();
else
tiddler.incChangeCount();
if(title != newTitle)
this.notify(title,true);
this.notify(newTitle,true);
if(window.location.protocol == "file:")
this.setDirty(true);
return tiddler;
};
TiddlyWiki.prototype.incChangeCount = function(title)
{
var tiddler = this.fetchTiddler(title);
if(tiddler)
tiddler.incChangeCount();
};
TiddlyWiki.prototype.getLoader = function()
{
if(!this.loader)
this.loader = new TW21Loader();
return this.loader;
};
TiddlyWiki.prototype.getSaver = function()
{
if(!this.saver)
this.saver = new TW21Saver();
return this.saver;
};
// Return all tiddlers formatted as an HTML string
TiddlyWiki.prototype.allTiddlersAsHtml = function()
{
return this.getSaver().externalize(store);
};
// Load contents of a TiddlyWiki from an HTML DIV
TiddlyWiki.prototype.loadFromDiv = function(src,idPrefix,noUpdate)
{
this.idPrefix = idPrefix;
var storeElem = (typeof src == "string") ? document.getElementById(src) : src;
if(!storeElem)
return;
var tiddlers = this.getLoader().loadTiddlers(this,storeElem.childNodes);
this.setDirty(false);
if(!noUpdate) {
var i;
for(i = 0;i<tiddlers.length; i++)
tiddlers[i].changed();
}
jQuery(document).trigger("loadTiddlers");
};
// Load contents of a TiddlyWiki from a string
// Returns null if there's an error
TiddlyWiki.prototype.importTiddlyWiki = function(text)
{
var posDiv = locateStoreArea(text);
if(!posDiv)
return null;
var content = "<" + "html><" + "body>" + text.substring(posDiv[0],posDiv[1] + endSaveArea.length) + "<" + "/body><" + "/html>";
// Create the iframe
var iframe = document.createElement("iframe");
iframe.style.display = "none";
document.body.appendChild(iframe);
var doc = iframe.document;
if(iframe.contentDocument)
doc = iframe.contentDocument; // For NS6
else if(iframe.contentWindow)
doc = iframe.contentWindow.document; // For IE5.5 and IE6
// Put the content in the iframe
doc.open();
doc.writeln(content);
doc.close();
// Load the content into a TiddlyWiki() object
var storeArea = doc.getElementById("storeArea");
this.loadFromDiv(storeArea,"store");
// Get rid of the iframe
iframe.parentNode.removeChild(iframe);
return this;
};
TiddlyWiki.prototype.updateTiddlers = function()
{
this.tiddlersUpdated = true;
this.forEachTiddler(function(title,tiddler) {
tiddler.changed();
});
};
// Return an array of tiddlers matching a search regular expression
TiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag,match)
{
var candidates = this.reverseLookup("tags",excludeTag,!!match);
var t,results = [];
for(t=0; t<candidates.length; t++) {
if((candidates[t].title.search(searchRegExp) != -1) || (candidates[t].text.search(searchRegExp) != -1))
results.push(candidates[t]);
}
if(!sortField)
sortField = "title";
results.sort(function(a,b) {return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);});
return results;
};
// Returns a list of all tags in use
// excludeTag - if present, excludes tags that are themselves tagged with excludeTag
// Returns an array of arrays where [tag][0] is the name of the tag and [tag][1] is the number of occurances
TiddlyWiki.prototype.getTags = function(excludeTag)
{
var results = [];
this.forEachTiddler(function(title,tiddler) {
var g,c;
for(g=0; g<tiddler.tags.length; g++) {
var tag = tiddler.tags[g];
var n = true;
for(c=0; c<results.length; c++) {
if(results[c][0] == tag) {
n = false;
results[c][1]++;
}
}
if(n && excludeTag) {
var t = this.fetchTiddler(tag);
if(t && t.isTagged(excludeTag))
n = false;
}
if(n)
results.push([tag,1]);
}
});
results.sort(function(a,b) {return a[0].toLowerCase() < b[0].toLowerCase() ? -1 : (a[0].toLowerCase() == b[0].toLowerCase() ? 0 : +1);});
return results;
};
// Return an array of the tiddlers that are tagged with a given tag
TiddlyWiki.prototype.getTaggedTiddlers = function(tag,sortField)
{
return this.reverseLookup("tags",tag,true,sortField);
};
TiddlyWiki.prototype.getValueTiddlers = function(field,value,sortField)
{
return this.reverseLookup(field,value,true,sortField);
};
// Return an array of the tiddlers that link to a given tiddler
TiddlyWiki.prototype.getReferringTiddlers = function(title,unusedParameter,sortField)
{
if(!this.tiddlersUpdated)
this.updateTiddlers();
return this.reverseLookup("links",title,true,sortField);
};
// Return an array of the tiddlers that do or do not have a specified entry in the specified storage array (ie, "links" or "tags")
// lookupMatch == true to match tiddlers, false to exclude tiddlers
TiddlyWiki.prototype.reverseLookup = function(lookupField,lookupValue,lookupMatch,sortField)
{
var results = [];
this.forEachTiddler(function(title,tiddler) {
var f = !lookupMatch;
var values;
if(["links", "tags"].contains(lookupField)) {
values = tiddler[lookupField];
} else {
var accessor = TiddlyWiki.standardFieldAccess[lookupField];
if(accessor) {
values = [ accessor.get(tiddler) ];
} else {
values = tiddler.fields[lookupField] ? [tiddler.fields[lookupField]] : [];
}
}
var lookup;
for(lookup=0; lookup<values.length; lookup++) {
if(values[lookup] == lookupValue)
f = lookupMatch;
}
if(f)
results.push(tiddler);
});
if(!sortField)
sortField = "title";
return this.sortTiddlers(results,sortField);
};
// Return the tiddlers as a sorted array
TiddlyWiki.prototype.getTiddlers = function(field,excludeTag)
{
var results = [];
this.forEachTiddler(function(title,tiddler) {
if(excludeTag == undefined || !tiddler.isTagged(excludeTag))
results.push(tiddler);
});
if(field)
results.sort(function(a,b) {return a[field] < b[field] ? -1 : (a[field] == b[field] ? 0 : +1);});
return results;
};
// Return array of names of tiddlers that are referred to but not defined
TiddlyWiki.prototype.getMissingLinks = function()
{
if(!this.tiddlersUpdated)
this.updateTiddlers();
var results = [];
this.forEachTiddler(function (title,tiddler) {
if(tiddler.isTagged("excludeMissing") || tiddler.isTagged("systemConfig"))
return;
var n;
for(n=0; n<tiddler.links.length;n++) {
var link = tiddler.links[n];
if(this.getTiddlerText(link,null) == null && !this.isShadowTiddler(link) && !config.macros[link])
results.pushUnique(link);
}
});
results.sort();
return results;
};
// Return an array of names of tiddlers that are defined but not referred to
TiddlyWiki.prototype.getOrphans = function()
{
var results = [];
this.forEachTiddler(function (title,tiddler) {
if(this.getReferringTiddlers(title).length == 0 && !tiddler.isTagged("excludeLists"))
results.push(title);
});
results.sort();
return results;
};
// Return an array of names of all the shadow tiddlers
TiddlyWiki.prototype.getShadowed = function()
{
var t,results = [];
for(t in config.shadowTiddlers) {
if(this.isShadowTiddler(t))
results.push(t);
}
results.sort();
return results;
};
// Return an array of tiddlers that have been touched since they were downloaded or created
TiddlyWiki.prototype.getTouched = function()
{
var results = [];
this.forEachTiddler(function(title,tiddler) {
if(tiddler.isTouched())
results.push(tiddler);
});
results.sort();
return results;
};
// Resolves a Tiddler reference or tiddler title into a Tiddler object, or null if it doesn't exist
TiddlyWiki.prototype.resolveTiddler = function(tiddler)
{
var t = (typeof tiddler == "string") ? this.getTiddler(tiddler) : tiddler;
return t instanceof Tiddler ? t : null;
};
// Sort a list of tiddlers
//# tiddlers - array of Tiddler() objects to be sorted
//# field - name of field (or extended field) to sort by;
//# precede with "+" for ascending sort (the default)
//# or "-" for descending sort
TiddlyWiki.prototype.sortTiddlers = function(tiddlers,field)
{
var asc = +1;
switch(field.substr(0,1)) {
case "-":
asc = -1;
field = field.substr(1);
break;
case "+":
field = field.substr(1);
break;
}
if(TiddlyWiki.standardFieldAccess[field]) {
if(field=="title") {
tiddlers.sort(function(a,b) {return a[field].toLowerCase() < b[field].toLowerCase() ? -asc : (a[field].toLowerCase() == b[field].toLowerCase() ? 0 : asc);});
} else {
tiddlers.sort(function(a,b) {return a[field] < b[field] ? -asc : (a[field] == b[field] ? 0 : asc);});
}
} else {
tiddlers.sort(function(a,b) {return a.fields[field] < b.fields[field] ? -asc : (a.fields[field] == b.fields[field] ? 0 : +asc);});
}
return tiddlers;
};
//--
//-- TiddlyWiki-specific utility functions
//--
// Returns TiddlyWiki version string
function formatVersion(v)
{
v = v || version;
return v.major + "." + v.minor + "." + v.revision +
(v.alpha ? " (alpha " + v.alpha + ")" : "") +
(v.beta ? " (beta " + v.beta + ")" : "");
}
//# Compares two TiddlyWiki version objects
//# Returns +1 if v2 is later than v1
//# 0 if v2 is the same as v1
//# -1 if v2 is earlier than v1
//# version without a beta number is later than a version with a beta number
function compareVersions(v1,v2)
{
var x1,x2,i,a = ["major","minor","revision"];
for(i = 0; i<a.length; i++) {
x1 = v1[a[i]] || 0;
x2 = v2[a[i]] || 0;
if(x1<x2)
return 1;
if(x1>x2)
return -1;
}
x1 = v1.beta || 9999;
x2 = v2.beta || 9999;
if(x1<x2)
return 1;
return x1 > x2 ? -1 : 0;
}
function merge(dst,src,preserveExisting)
{
var i;
for(i in src) {
if(!preserveExisting || dst[i] === undefined)
dst[i] = src[i];
}
return dst;
}
// Resolve the target object of an event
function resolveTarget(e)
{
var obj;
if(e.target)
obj = e.target;
else if(e.srcElement)
obj = e.srcElement;
if(obj.nodeType == 3) // defeat Safari bug
obj = obj.parentNode;
return obj;
}
// Returns a string containing the description of an exception, optionally prepended by a message
function exceptionText(e,message)
{
var s = e.description || e.toString();
return message ? "%0:\n%1".format([message,s]) : s;
}
// Displays an alert of an exception description with optional message
function showException(e,message)
{
alert(exceptionText(e,message));
}
function alertAndThrow(m)
{
alert(m);
throw(m);
}
function glyph(name)
{
var g = config.glyphs;
var b = g.currBrowser;
if(b == null) {
b = 0;
while(b < g.browsers.length-1 && !g.browsers[b]())
b++;
g.currBrowser = b;
}
if(!g.codes[name])
return "";
return g.codes[name][b];
}
function createTiddlyText(parent,text)
{
return parent.appendChild(document.createTextNode(text));
}
function createTiddlyCheckbox(parent,caption,checked,onChange)
{
var cb = document.createElement("input");
cb.setAttribute("type","checkbox");
cb.onclick = onChange;
parent.appendChild(cb);
cb.checked = checked;
cb.className = "chkOptionInput";
if(caption)
wikify(caption,parent);
return cb;
}
function createTiddlyElement(parent,element,id,className,text,attribs)
{
var n,e = document.createElement(element);
if(className != null)
e.className = className;
if(id != null)
e.setAttribute("id",id);
if(text != null)
e.appendChild(document.createTextNode(text));
if(attribs) {
for(n in attribs) {
e.setAttribute(n,attribs[n]);
}
}
if(parent != null)
parent.appendChild(e);
return e;
}
function createTiddlyButton(parent,text,tooltip,action,className,id,accessKey,attribs)
{
var i,btn = document.createElement("a");
btn.setAttribute("href","javascript:;");
if(action) {
btn.onclick = action;
}
if(tooltip)
btn.setAttribute("title",tooltip);
if(text)
btn.appendChild(document.createTextNode(text));
btn.className = className || "button";
if(id)
btn.id = id;
if(attribs) {
for(i in attribs) {
btn.setAttribute(i,attribs[i]);
}
}
if(parent)
parent.appendChild(btn);
if(accessKey)
btn.setAttribute("accessKey",accessKey);
return btn;
}
//# Create a link to an external resource
//# place - element where the link should be created
//# url - link target
//# label - link text (optional)
function createExternalLink(place,url,label)
{
var link = document.createElement("a");
link.className = "externalLink";
link.href = url;
var f = config.messages.externalLinkTooltip;
link.title = f ? f.format([url]) : url;
if(config.options.chkOpenInNewWindow)
link.target = "_blank";
place.appendChild(link);
if(label)
createTiddlyText(link, label);
return link;
}
function getTiddlyLinkInfo(title,currClasses)
{
var classes = currClasses ? currClasses.split(" ") : [];
classes.pushUnique("tiddlyLink");
var tiddler = store.fetchTiddler(title);
var subTitle;
if(tiddler) {
subTitle = tiddler.getSubtitle();
classes.pushUnique("tiddlyLinkExisting");
classes.remove("tiddlyLinkNonExisting");
classes.remove("shadow");
} else {
var f;
classes.remove("tiddlyLinkExisting");
classes.pushUnique("tiddlyLinkNonExisting");
if(store.isShadowTiddler(title)) {
f = config.messages.shadowedTiddlerToolTip;
classes.pushUnique("shadow");
} else {
f = config.messages.undefinedTiddlerToolTip;
classes.remove("shadow");
}
subTitle = f ? f.format([title]) : "";
}
if(typeof config.annotations[title]=="string")
subTitle = config.annotations[title];
return {classes: classes.join(" "),subTitle: subTitle};
}
// Event handler for clicking on a tiddly link
function onClickTiddlerLink(ev)
{
var e = ev || window.event;
var target = resolveTarget(e);
var link = target;
var title = null;
var fields = null;
var noToggle = null;
do {
title = link.getAttribute("tiddlyLink");
fields = link.getAttribute("tiddlyFields");
noToggle = link.getAttribute("noToggle");
link = link.parentNode;
} while(title == null && link != null);
if(!store.isShadowTiddler(title)) {
var f = fields ? fields.decodeHashMap() : {};
fields = String.encodeHashMap(merge(f,config.defaultCustomFields,true));
}
if(title) {
var toggling = e.metaKey || e.ctrlKey;
if(config.options.chkToggleLinks)
toggling = !toggling;
if(noToggle)
toggling = false;
if(store.getTiddler(title))
fields = null;
story.displayTiddler(target,title,null,true,null,fields,toggling);
}
clearMessage();
return false;
}
//# Create a link to a particular tiddler
//# place - element where the link should be created
//# title - title of target tiddler
//# includeText - flag for whether to include the title as the text of the link
//# className - custom CSS class for the link
//# linkedFromTiddler - tiddler from which to inherit extended fields
//# noToggle - flag to force the link to open the target, even if chkToggleLinks is on
function createTiddlyLink(place,title,includeText,className,isStatic,linkedFromTiddler,noToggle)
{
var title = jQuery.trim(title);
var text = includeText ? title : null;
var i = getTiddlyLinkInfo(title,className);
var btn = isStatic ? createExternalLink(place,store.getTiddlerText("SiteUrl",null) + "#" + title) : createTiddlyButton(place,text,i.subTitle,onClickTiddlerLink,i.classes);
if(isStatic)
btn.className += ' ' + className;
btn.setAttribute("refresh","link");
btn.setAttribute("tiddlyLink",title);
if(noToggle)
btn.setAttribute("noToggle","true");
if(linkedFromTiddler) {
var fields = linkedFromTiddler.getInheritedFields();
if(fields)
btn.setAttribute("tiddlyFields",fields);
}
return btn;
}
function refreshTiddlyLink(e,title)
{
var i = getTiddlyLinkInfo(title,e.className);
e.className = i.classes;
e.title = i.subTitle;
}
function createTiddlyDropDown(place,onchange,options,defaultValue)
{
var sel = createTiddlyElement(place,"select");
sel.onchange = onchange;
var t;
for(t=0; t<options.length; t++) {
var e = createTiddlyElement(sel,"option",null,null,options[t].caption);
e.value = options[t].name;
if(options[t].name == defaultValue)
e.selected = true;
}
return sel;
}
// Returns true if path is a valid field name (path),
// i.e. a sequence of identifiers, separated by "."
TiddlyWiki.isValidFieldName = function(name)
{
var match = /[a-zA-Z_]\w*(\.[a-zA-Z_]\w*)*/.exec(name);
return match && (match[0] == name);
};
// Throws an exception when name is not a valid field name.
TiddlyWiki.checkFieldName = function(name)
{
if(!TiddlyWiki.isValidFieldName(name))
throw config.messages.invalidFieldName.format([name]);
};
function StringFieldAccess(n,readOnly)
{
this.set = readOnly ?
function(t,v) {if(v != t[n]) throw config.messages.fieldCannotBeChanged.format([n]);} :
function(t,v) {if(v != t[n]) {t[n] = v; return true;}};
this.get = function(t) {return t[n];};
}
function DateFieldAccess(n)
{
this.set = function(t,v) {
var d = v instanceof Date ? v : Date.convertFromYYYYMMDDHHMM(v);
if(d != t[n]) {
t[n] = d; return true;
}
};
this.get = function(t) {return t[n].convertToYYYYMMDDHHMM();};
}
function LinksFieldAccess(n)
{
this.set = function(t,v) {
var s = (typeof v == "string") ? v.readBracketedList() : v;
if(s.toString() != t[n].toString()) {
t[n] = s; return true;
}
};
this.get = function(t) {return String.encodeTiddlyLinkList(t[n]);};
}
TiddlyWiki.standardFieldAccess = {
// The set functions return true when setting the data has changed the value.
"title": new StringFieldAccess("title",true),
// Handle the "tiddler" field name as the title
"tiddler": new StringFieldAccess("title",true),
"text": new StringFieldAccess("text"),
"modifier": new StringFieldAccess("modifier"),
"modified": new DateFieldAccess("modified"),
"creator": new StringFieldAccess("creator"),
"created": new DateFieldAccess("created"),
"tags": new LinksFieldAccess("tags")
};
TiddlyWiki.isStandardField = function(name)
{
return TiddlyWiki.standardFieldAccess[name] != undefined;
};
// Sets the value of the given field of the tiddler to the value.
// Setting an ExtendedField's value to null or undefined removes the field.
// Setting a namespace to undefined removes all fields of that namespace.
// The fieldName is case-insensitive.
// All values will be converted to a string value.
TiddlyWiki.prototype.setValue = function(tiddler,fieldName,value)
{
TiddlyWiki.checkFieldName(fieldName);
var t = this.resolveTiddler(tiddler);
if(!t)
return;
fieldName = fieldName.toLowerCase();
var isRemove = (value === undefined) || (value === null);
var accessor = TiddlyWiki.standardFieldAccess[fieldName];
if(accessor) {
if(isRemove)
// don't remove StandardFields
return;
var h = TiddlyWiki.standardFieldAccess[fieldName];
if(!h.set(t,value))
return;
} else {
var oldValue = t.fields[fieldName];
if(isRemove) {
if(oldValue !== undefined) {
// deletes a single field
delete t.fields[fieldName];
} else {
// no concrete value is defined for the fieldName
// so we guess this is a namespace path.
// delete all fields in a namespace
var re = new RegExp("^"+fieldName+"\\.");
var dirty = false;
var n;
for(n in t.fields) {
if(n.match(re)) {
delete t.fields[n];
dirty = true;
}
}
if(!dirty)
return;
}
} else {
// the "normal" set case. value is defined (not null/undefined)
// For convenience provide a nicer conversion Date->String
value = value instanceof Date ? value.convertToYYYYMMDDHHMMSSMMM() : String(value);
if(oldValue == value)
return;
t.fields[fieldName] = value;
}
}
// When we are here the tiddler/store really was changed.
this.notify(t.title,true);
if(!fieldName.match(/^temp\./))
this.setDirty(true);
};
// Returns the value of the given field of the tiddler.
// The fieldName is case-insensitive.
// Will only return String values (or undefined).
TiddlyWiki.prototype.getValue = function(tiddler,fieldName)
{
var t = this.resolveTiddler(tiddler);
if(!t)
return undefined;
if(fieldName.indexOf(config.textPrimitives.sectionSeparator) === 0 || fieldName.indexOf(config.textPrimitives.sliceSeparator) === 0) {
var sliceType = fieldName.substr(0, 2);
var sliceName = fieldName.substring(2);
return store.getTiddlerText("%0%1%2".format(t.title,sliceType,sliceName));
} else {
fieldName = fieldName.toLowerCase();
var accessor = TiddlyWiki.standardFieldAccess[fieldName];
if(accessor) {
return accessor.get(t);
}
}
return t.fields[fieldName];
};
// Calls the callback function for every field in the tiddler.
// When callback function returns a non-false value the iteration stops
// and that value is returned.
// The order of the fields is not defined.
// @param callback a function(tiddler,fieldName,value).
TiddlyWiki.prototype.forEachField = function(tiddler,callback,onlyExtendedFields)
{
var t = this.resolveTiddler(tiddler);
if(!t)
return undefined;
var n,result;
for(n in t.fields) {
result = callback(t,n,t.fields[n]);
if(result)
return result;
}
if(onlyExtendedFields)
return undefined;
for(n in TiddlyWiki.standardFieldAccess) {
if(n != "tiddler") {
// even though the "title" field can also be referenced through the name "tiddler"
// we only visit this field once.
result = callback(t,n,TiddlyWiki.standardFieldAccess[n].get(t));
if(result)
return result;
}
}
return undefined;
};
//--
//-- Wikifier
//--
function getParser(tiddler,format)
{
if(tiddler) {
if(!format)
format = tiddler.fields["wikiformat"];
var i;
if(format) {
//# format field takes precedence over format tag
for(i in config.parsers) {
if(format == config.parsers[i].format)
return config.parsers[i];
}
} else {
for(i in config.parsers) {
if(tiddler.isTagged(config.parsers[i].formatTag))
return config.parsers[i];
}
}
}
return formatter;
}
//# Construct a wikifier object
//# source - source string that's going to be wikified
//# formatter - Formatter() object containing the list of formatters to be used
//# highlightRegExp - regular expression of the text string to highlight
//# tiddler - reference to the tiddler that's taken to be the container for this wikification
function Wikifier(source,formatter,highlightRegExp,tiddler)
{
this.source = source;
this.output = null;
this.formatter = formatter;
this.nextMatch = 0;
this.autoLinkWikiWords = tiddler && tiddler.autoLinkWikiWords() == false ? false : true;
this.highlightRegExp = highlightRegExp;
this.highlightMatch = null;
this.isStatic = false;
if(highlightRegExp) {
highlightRegExp.lastIndex = 0;
this.highlightMatch = highlightRegExp.exec(source);
}
this.tiddler = tiddler;
}
Wikifier.prototype.wikifyPlain = function()
{
var e = createTiddlyElement(document.body,"div");
e.style.display = "none";
this.subWikify(e);
var text = jQuery(e).text();
jQuery(e).remove();
return text;
};
Wikifier.prototype.subWikify = function(output,terminator)
{
//# Handle the terminated and unterminated cases separately, this speeds up wikifikation by about 30%
try {
if(terminator)
this.subWikifyTerm(output,new RegExp("(" + terminator + ")","mg"));
else
this.subWikifyUnterm(output);
} catch(ex) {
showException(ex);
}
};
Wikifier.prototype.subWikifyUnterm = function(output)
{
//# subWikify can be indirectly recursive, so we need to save the old output pointer
var oldOutput = this.output;
this.output = output;
//# Get the first match
this.formatter.formatterRegExp.lastIndex = this.nextMatch;
var formatterMatch = this.formatter.formatterRegExp.exec(this.source);
while(formatterMatch) {
// Output any text before the match
if(formatterMatch.index > this.nextMatch)
this.outputText(this.output,this.nextMatch,formatterMatch.index);
// Set the match parameters for the handler
this.matchStart = formatterMatch.index;
this.matchLength = formatterMatch[0].length;
this.matchText = formatterMatch[0];
this.nextMatch = this.formatter.formatterRegExp.lastIndex;
//# Figure out which formatter matched and call its handler
var t;
for(t=1; t<formatterMatch.length; t++) {
if(formatterMatch[t]) {
this.formatter.formatters[t-1].handler(this);
this.formatter.formatterRegExp.lastIndex = this.nextMatch;
break;
}
}
//# Get the next match
formatterMatch = this.formatter.formatterRegExp.exec(this.source);
}
//# Output any text after the last match
if(this.nextMatch < this.source.length) {
this.outputText(this.output,this.nextMatch,this.source.length);
this.nextMatch = this.source.length;
}
//# Restore the output pointer
this.output = oldOutput;
};
Wikifier.prototype.subWikifyTerm = function(output,terminatorRegExp)
{
//# subWikify can be indirectly recursive, so we need to save the old output pointer
var oldOutput = this.output;
this.output = output;
//# Get the first matches for the formatter and terminator RegExps
terminatorRegExp.lastIndex = this.nextMatch;
var terminatorMatch = terminatorRegExp.exec(this.source);
this.formatter.formatterRegExp.lastIndex = this.nextMatch;
var formatterMatch = this.formatter.formatterRegExp.exec(terminatorMatch ? this.source.substr(0,terminatorMatch.index) : this.source);
while(terminatorMatch || formatterMatch) {
//# Check for a terminator match before the next formatter match
if(terminatorMatch && (!formatterMatch || terminatorMatch.index <= formatterMatch.index)) {
//# Output any text before the match
if(terminatorMatch.index > this.nextMatch)
this.outputText(this.output,this.nextMatch,terminatorMatch.index);
//# Set the match parameters
this.matchText = terminatorMatch[1];
this.matchLength = terminatorMatch[1].length;
this.matchStart = terminatorMatch.index;
this.nextMatch = this.matchStart + this.matchLength;
//# Restore the output pointer
this.output = oldOutput;
return;
}
//# It must be a formatter match; output any text before the match
if(formatterMatch.index > this.nextMatch)
this.outputText(this.output,this.nextMatch,formatterMatch.index);
//# Set the match parameters
this.matchStart = formatterMatch.index;
this.matchLength = formatterMatch[0].length;
this.matchText = formatterMatch[0];
this.nextMatch = this.formatter.formatterRegExp.lastIndex;
//# Figure out which formatter matched and call its handler
var t;
for(t=1; t<formatterMatch.length; t++) {
if(formatterMatch[t]) {
this.formatter.formatters[t-1].handler(this);
this.formatter.formatterRegExp.lastIndex = this.nextMatch;
break;
}
}
//# Get the next match
terminatorRegExp.lastIndex = this.nextMatch;
terminatorMatch = terminatorRegExp.exec(this.source);
formatterMatch = this.formatter.formatterRegExp.exec(terminatorMatch ? this.source.substr(0,terminatorMatch.index) : this.source);
}
//# Output any text after the last match
if(this.nextMatch < this.source.length) {
this.outputText(this.output,this.nextMatch,this.source.length);
this.nextMatch = this.source.length;
}
//# Restore the output pointer
this.output = oldOutput;
};
Wikifier.prototype.outputText = function(place,startPos,endPos)
{
//# Check for highlights
while(this.highlightMatch && (this.highlightRegExp.lastIndex > startPos) && (this.highlightMatch.index < endPos) && (startPos < endPos)) {
//# Deal with any plain text before the highlight
if(this.highlightMatch.index > startPos) {
createTiddlyText(place,this.source.substring(startPos,this.highlightMatch.index));
startPos = this.highlightMatch.index;
}
//# Deal with the highlight
var highlightEnd = Math.min(this.highlightRegExp.lastIndex,endPos);
createTiddlyElement(place,"span",null,"highlight",this.source.substring(startPos,highlightEnd));
startPos = highlightEnd;
//# Nudge along to the next highlight if we're done with this one
if(startPos >= this.highlightRegExp.lastIndex)
this.highlightMatch = this.highlightRegExp.exec(this.source);
}
//# Do the unhighlighted text left over
if(startPos < endPos) {
createTiddlyText(place,this.source.substring(startPos,endPos));
}
};
function wikify(source,output,highlightRegExp,tiddler)
{
if(source) {
var wikifier = new Wikifier(source,getParser(tiddler),highlightRegExp,tiddler);
var t0 = new Date();
wikifier.subWikify(output);
if(tiddler && config.options.chkDisplayInstrumentation)
displayMessage("wikify:" +tiddler.title+ " in " + (new Date()-t0) + " ms");
}
}
function wikifyStatic(source,highlightRegExp,tiddler,format)
{
var e = createTiddlyElement(document.body,"pre");
e.style.display = "none";
var html = "";
if(source && source != "") {
if(!tiddler)
tiddler = new Tiddler("temp");
var wikifier = new Wikifier(source,getParser(tiddler,format),highlightRegExp,tiddler);
wikifier.isStatic = true;
wikifier.subWikify(e);
html = e.innerHTML;
jQuery(e).remove();
}
return html;
}
//# Wikify a string to plain text
//# text - text to wikify
//# limit - maximum number of characters to generate
//# tiddler - optional reference to the tiddler containing this text
function wikifyPlainText(text,limit,tiddler)
{
if(limit > 0)
text = text.substr(0,limit);
var wikifier = new Wikifier(text,formatter,null,tiddler);
return wikifier.wikifyPlain();
}
//# Highlight plain text into an element
function highlightify(source,output,highlightRegExp,tiddler)
{
if(source) {
var wikifier = new Wikifier(source,formatter,highlightRegExp,tiddler);
wikifier.outputText(output,0,source.length);
}
}
//--
//-- Macro definitions
//--
function invokeMacro(place,macro,params,wikifier,tiddler)
{
try {
var m = config.macros[macro];
if(m && m.handler) {
var tiddlerElem = story.findContainingTiddler(place);
//# Provide context for evaluated macro parameters (eg <<myMacro {{tiddler.title}}>>)
window.tiddler = tiddlerElem ? store.getTiddler(tiddlerElem.getAttribute("tiddler")) : null;
window.place = place;
var allowEval = true;
if(config.evaluateMacroParameters=="system") {
if(!tiddler || tiddler.tags.indexOf("systemAllowEval") == -1) {
allowEval = false;
}
}
m.handler(place,macro,m.noPreParse?null:params.readMacroParams(!allowEval),wikifier,params,tiddler);
} else {
createTiddlyError(place,config.messages.macroError.format([macro]),config.messages.macroErrorDetails.format([macro,config.messages.missingMacro]));
}
} catch(ex) {
createTiddlyError(place,config.messages.macroError.format([macro]),config.messages.macroErrorDetails.format([macro,ex.toString()]));
}
}
config.macros.version.handler = function(place)
{
jQuery("<span/>").text(formatVersion()).appendTo(place);
};
config.macros.today.handler = function(place,macroName,params)
{
var now = new Date();
var text = params[0] ? now.formatString(params[0].trim()) : now.toLocaleString();
jQuery("<span/>").text(text).appendTo(place);
};
config.macros.list.template = "<<view title link>>";
config.macros.list.handler = function(place,macroName,params,wikifier,paramString)
{
var list = document.createElement("ul");
jQuery(list).attr({ refresh: "macro", macroName: macroName }).data("params", paramString);
place.appendChild(list);
this.refresh(list);
};
config.macros.list.refresh = function(list) {
var paramString = jQuery(list).data("params");
var params = paramString.readMacroParams();
var args = paramString.parseParams("anon", null, null)[0];
var type = args.anon ? args.anon[0] : "all";
jQuery(list).empty().addClass("list list-" + type);
var template = args.template ? store.getTiddlerText(args.template[0]) : false;
if(!template) {
template = config.macros.list.template;
}
if(this[type].prompt)
createTiddlyElement(list,"li",null,"listTitle",this[type].prompt);
var results;
if(this[type].handler)
results = this[type].handler(params);
var t;
for(t = 0; t < results.length; t++) {
var li = document.createElement("li");
list.appendChild(li);
var tiddler = results[t];
if(typeof(tiddler) == 'string') { // deal with missing etc..
tiddler = store.getTiddler(tiddler) || new Tiddler(tiddler);
}
wikify(template, li, null, tiddler);
}
if(results.length === 0 && args.emptyMessage) {
jQuery(list).addClass("emptyList");
jQuery("<li />").text(args.emptyMessage[0]).appendTo(list);
}
};
config.macros.list.all.handler = function(params)
{
return store.reverseLookup("tags","excludeLists",false,"title");
};
config.macros.list.missing.handler = function(params)
{
return store.getMissingLinks();
};
config.macros.list.orphans.handler = function(params)
{
return store.getOrphans();
};
config.macros.list.shadowed.handler = function(params)
{
return store.getShadowed();
};
config.macros.list.touched.handler = function(params)
{
return store.getTouched();
};
config.macros.list.filter.handler = function(params)
{
var filter = params[1];
var results = [];
if(filter) {
var tiddlers = store.filterTiddlers(filter);
var t;
for(t=0; t<tiddlers.length; t++)
results.push(tiddlers[t].title);
}
return results;
};
config.macros.allTags.handler = function(place,macroName,params)
{
var tags = store.getTags(params[0]);
var ul = createTiddlyElement(place,"ul");
if(tags.length == 0)
createTiddlyElement(ul,"li",null,"listTitle",this.noTags);
var t;
for(t=0; t<tags.length; t++) {
var title = tags[t][0];
var info = getTiddlyLinkInfo(title);
var li = createTiddlyElement(ul,"li");
var btn = createTiddlyButton(li,title + " (" + tags[t][1] + ")",this.tooltip.format([title]),onClickTag,info.classes);
btn.setAttribute("tag",title);
btn.setAttribute("refresh","link");
btn.setAttribute("tiddlyLink",title);
if(params[1]) {
btn.setAttribute("sortby",params[1]);
}
}
};
var macro = config.macros.timeline;
merge(macro, {
handler: function(place,macroName,params, wikifier, paramString, tiddler) {
var container = jQuery("<div />").attr("params", paramString).
attr("macroName", macroName).appendTo(place)[0];
macro.refresh(container);
},
refresh: function(container) {
jQuery(container).attr("refresh", "macro").empty();
var paramString = jQuery(container).attr("params");
var args = paramString.parseParams("anon", null, null)[0];
var params = args.anon || [];
var field = params[0] || "modified";
var dateFormat = params[2] || this.dateFormat;
var groupTemplate = macro.groupTemplate.format(field, dateFormat);
groupTemplate = args.groupTemplate ? store.getTiddlerText(args.groupTemplate[0]) || groupTemplate :
groupTemplate;
var itemTemplate = macro.itemTemplate;
itemTemplate = args.template ? store.getTiddlerText(args.template[0]) || itemTemplate :
itemTemplate;
var tiddlers = args.filter ? store.sortTiddlers(store.filterTiddlers(args.filter[0]), field) :
store.reverseLookup("tags", "excludeLists", false, field);
var lastGroup = "", ul;
var last = params[1] ? tiddlers.length-Math.min(tiddlers.length,parseInt(params[1],10)) : 0;
var t;
for(t=tiddlers.length-1; t>=last; t--) {
var tiddler = tiddlers[t];
var theGroup = wikifyPlainText(groupTemplate,0,tiddler);
if(typeof(ul) == "undefined" || theGroup != lastGroup) {
ul = document.createElement("ul");
jQuery(ul).addClass("timeline");
container.appendChild(ul);
createTiddlyElement(ul,"li",null,"listTitle",theGroup);
lastGroup = theGroup;
}
var item = createTiddlyElement(ul,"li",null,"listLink");
wikify(itemTemplate,item,null,tiddler);
}
},
groupTemplate: "<<view %0 date '%1'>>",
itemTemplate: "<<view title link>>"
});
config.macros.tiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
var allowEval = true;
var stack = config.macros.tiddler.tiddlerStack;
if(stack.length > 0 && config.evaluateMacroParameters == "system") {
// included tiddler and "system" evaluation required, so check tiddler tagged appropriately
var title = stack[stack.length-1];
var pos = title.indexOf(config.textPrimitives.sectionSeparator);
if(pos != -1) {
title = title.substr(0,pos); // get the base tiddler title
}
var t = store.getTiddler(title);
if(!t || t.tags.indexOf("systemAllowEval") == -1) {
allowEval = false;
}
}
params = paramString.parseParams("name",null,allowEval,false,true);
var names = params[0]["name"];
var tiddlerName = names[0];
var className = names[1] || null;
var args = params[0]["with"];
var wrapper = createTiddlyElement(place,"span",null,className,null,{
refresh: "content", tiddler: tiddlerName
});
if(args!==undefined)
wrapper.setAttribute("args","[["+args.join("]] [[")+"]]");
this.transclude(wrapper,tiddlerName,args);
};
config.macros.tiddler.transclude = function(wrapper,tiddlerName,args)
{
var text = store.getTiddlerText(tiddlerName);
if(!text)
return;
var stack = config.macros.tiddler.tiddlerStack;
if(stack.indexOf(tiddlerName) !== -1)
return;
stack.push(tiddlerName);
try {
if(typeof args == "string")
args = args.readBracketedList();
var n = args ? Math.min(args.length,9) : 0;
var i;
for(i=0; i<n; i++) {
var placeholderRE = new RegExp("\\$" + (i + 1),"mg");
text = text.replace(placeholderRE,args[i]);
}
config.macros.tiddler.renderText(wrapper,text,tiddlerName);
} finally {
stack.pop();
}
};
config.macros.tiddler.renderText = function(place,text,tiddlerName)
{
wikify(text,place,null,store.getTiddler(tiddlerName));
};
config.macros.tiddler.tiddlerStack = [];
//# params[0] - tag
//# params[1] - title (optional)
//# params[2] - tooltip (optional)
//# params[3] - sortby (optional)
config.macros.tag.handler = function(place,macroName,params)
{
var btn = createTagButton(place,params[0],null,params[1],params[2]);
if(params[3]) {
btn.setAttribute('sortby',params[3]);
}
};
config.macros.tags.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
params = paramString.parseParams("anon",null,true,false,false);
var ul = createTiddlyElement(place,"ul");
var title = getParam(params,"anon","");
if(title && store.tiddlerExists(title))
tiddler = store.getTiddler(title);
var sep = getParam(params,"sep"," ");
var lingo = config.views.wikified.tag;
var label = null;
var t;
for(t=0; t<tiddler.tags.length; t++) {
var tag = store.getTiddler(tiddler.tags[t]);
if(!tag || !tag.tags.contains("excludeLists")) {
if(!label)
label = createTiddlyElement(ul,"li",null,"listTitle",lingo.labelTags.format([tiddler.title]));
createTagButton(createTiddlyElement(ul,"li"),tiddler.tags[t],tiddler.title);
if(t<tiddler.tags.length-1)
createTiddlyText(ul,sep);
}
}
if(!label)
createTiddlyElement(ul,"li",null,"listTitle",lingo.labelNoTags.format([tiddler.title]));
};
config.macros.tagging.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
params = paramString.parseParams("anon",null,true,false,false);
var ul = createTiddlyElement(place,"ul");
var title = getParam(params,"anon","");
if(title == "" && tiddler instanceof Tiddler)
title = tiddler.title;
var sep = getParam(params,"sep"," ");
ul.setAttribute("title",this.tooltip.format([title]));
var sortby = getParam(params,"sortBy",false);
var tagged = store.getTaggedTiddlers(title,sortby);
var prompt = tagged.length == 0 ? this.labelNotTag : this.label;
createTiddlyElement(ul,"li",null,"listTitle",prompt.format([title,tagged.length]));
var t;
for(t=0; t<tagged.length; t++) {
createTiddlyLink(createTiddlyElement(ul,"li"),tagged[t].title,true);
if(t<tagged.length-1)
createTiddlyText(ul,sep);
}
};
config.macros.closeAll.handler = function(place)
{
createTiddlyButton(place,this.label,this.prompt,this.onClick);
};
config.macros.closeAll.onClick = function(e)
{
story.closeAllTiddlers();
return false;
};
config.macros.permaview.handler = function(place)
{
createTiddlyButton(place,this.label,this.prompt,this.onClick);
};
config.macros.permaview.onClick = function(e)
{
story.permaView();
return false;
};
config.macros.saveChanges.handler = function(place,macroName,params)
{
if(!readOnly)
createTiddlyButton(place,params[0] || this.label,params[1] || this.prompt,this.onClick,null,null,this.accessKey);
};
config.macros.saveChanges.onClick = function(e)
{
saveChanges();
return false;
};
config.macros.slider.onClickSlider = function(ev)
{
var n = this.nextSibling;
var cookie = n.getAttribute("cookie");
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";
config.options[cookie] = !isOpen;
saveOption(cookie);
return false;
};
config.macros.slider.createSlider = function(place,cookie,title,tooltip)
{
var c = cookie || "";
createTiddlyButton(place,title,tooltip,this.onClickSlider);
var panel = createTiddlyElement(null,"div",null,"sliderPanel");
panel.setAttribute("cookie",c);
panel.style.display = config.options[c] ? "block" : "none";
place.appendChild(panel);
return panel;
};
config.macros.slider.handler = function(place,macroName,params)
{
var panel = this.createSlider(place,params[0],params[2],params[3]);
var text = store.getTiddlerText(params[1]);
panel.setAttribute("refresh","content");
panel.setAttribute("tiddler",params[1]);
if(text)
wikify(text,panel,null,store.getTiddler(params[1]));
};
// <<gradient [[tiddler name]] vert|horiz rgb rgb rgb rgb... >>
config.macros.gradient.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
var panel = wikifier ? createTiddlyElement(place,"div",null,"gradient") : place;
panel.style.position = "relative";
panel.style.overflow = "hidden";
panel.style.zIndex = "0";
if(wikifier) {
var styles = config.formatterHelpers.inlineCssHelper(wikifier);
config.formatterHelpers.applyCssHelper(panel,styles);
}
params = paramString.parseParams("color");
var locolors = [], hicolors = [];
var t;
for(t=2; t<params.length; t++) {
var c = params[t].value;
if(params[t].name == "snap") {
hicolors[hicolors.length-1] = c;
} else {
locolors.push(c);
hicolors.push(c);
}
}
drawGradient(panel,params[1].value != "vert",locolors,hicolors);
if(wikifier)
wikifier.subWikify(panel,">>");
if(document.all) {
panel.style.height = "100%";
panel.style.width = "100%";
}
};
config.macros.message.handler = function(place,macroName,params)
{
if(params[0]) {
var names = params[0].split(".");
var lookupMessage = function(root,nameIndex) {
if(root[names[nameIndex]]) {
if(nameIndex < names.length-1)
return (lookupMessage(root[names[nameIndex]],nameIndex+1));
else
return root[names[nameIndex]];
} else
return null;
};
var m = lookupMessage(config,0);
if(m == null)
m = lookupMessage(window,0);
createTiddlyText(place,m.toString().format(params.splice(1)));
}
};
config.macros.view.depth = 0;
config.macros.view.values = [];
config.macros.view.views = {
text: function(value,place,params,wikifier,paramString,tiddler) {
highlightify(value,place,highlightHack,tiddler);
},
link: function(value,place,params,wikifier,paramString,tiddler) {
createTiddlyLink(place,value,true);
},
wikified: function(value,place,params,wikifier,paramString,tiddler) {
if(config.macros.view.depth>50)
return;
if(config.macros.view.depth>0) {
if (value==config.macros.view.values[config.macros.view.depth-1]) {
return;
}
}
config.macros.view.values[config.macros.view.depth] = value;
config.macros.view.depth++;
if(params[2])
value=params[2].unescapeLineBreaks().format([value]);
wikify(value,place,highlightHack,tiddler);
config.macros.view.depth--;
config.macros.view.values[config.macros.view.depth] = null;
},
date: function(value,place,params,wikifier,paramString,tiddler) {
value = Date.convertFromYYYYMMDDHHMM(value);
createTiddlyText(place,value.formatString(params[2] || config.views.wikified.dateFormat));
}
};
config.macros.view.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
if((tiddler instanceof Tiddler) && params[0]) {
var value = store.getValue(tiddler,params[0]);
if(value) {
var type = params[1] || config.macros.view.defaultView;
var handler = config.macros.view.views[type];
if(handler)
handler(value,place,params,wikifier,paramString,tiddler);
}
}
};
config.macros.edit.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
var field = params[0];
var rows = params[1] || 0;
var defVal = params[2] || '';
if((tiddler instanceof Tiddler) && field) {
story.setDirty(tiddler.title,true);
var e,v;
if(field != "text" && !rows) {
e = createTiddlyElement(null,"input",null,null,null,{
type: "text", edit: field, size: "40", autocomplete: "off"
});
e.value = store.getValue(tiddler,field) || defVal;
place.appendChild(e);
} else {
var wrapper1 = createTiddlyElement(null,"fieldset",null,"fieldsetFix");
var wrapper2 = createTiddlyElement(wrapper1,"div");
e = createTiddlyElement(wrapper2,"textarea");
e.value = v = store.getValue(tiddler,field) || defVal;
rows = rows || 10;
var lines = v.match(/\n/mg);
var maxLines = Math.max(parseInt(config.options.txtMaxEditRows,10),5);
if(lines != null && lines.length > rows)
rows = lines.length + 5;
rows = Math.min(rows,maxLines);
e.setAttribute("rows",rows);
e.setAttribute("edit",field);
place.appendChild(wrapper1);
}
if(tiddler.isReadOnly()) {
e.setAttribute("readOnly","readOnly");
jQuery(e).addClass("readOnly");
}
return e;
}
};
config.macros.tagChooser.onClick = function(ev)
{
var e = ev || window.event;
var lingo = config.views.editor.tagChooser;
var popup = Popup.create(this);
var tags = store.getTags(this.getAttribute("tags"));
if(tags.length == 0)
jQuery("<li/>").text(lingo.popupNone).appendTo(popup);
var t;
for(t=0; t<tags.length; t++) {
var tag = createTiddlyButton(createTiddlyElement(popup,"li"),tags[t][0],lingo.tagTooltip.format([tags[t][0]]),config.macros.tagChooser.onTagClick);
tag.setAttribute("tag",tags[t][0]);
tag.setAttribute("tiddler",this.getAttribute("tiddler"));
}
Popup.show();
e.cancelBubble = true;
if(e.stopPropagation) e.stopPropagation();
return false;
};
config.macros.tagChooser.onTagClick = function(ev)
{
var e = ev || window.event;
if(e.metaKey || e.ctrlKey) stopEvent(e); //# keep popup open on CTRL-click
var tag = this.getAttribute("tag");
var title = this.getAttribute("tiddler");
if(!readOnly)
story.setTiddlerTag(title,tag,0);
return false;
};
config.macros.tagChooser.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
if(tiddler instanceof Tiddler) {
var lingo = config.views.editor.tagChooser;
var btn = createTiddlyButton(place,lingo.text,lingo.tooltip,this.onClick);
btn.setAttribute("tiddler",tiddler.title);
btn.setAttribute("tags",params[0]);
}
};
config.macros.refreshDisplay.handler = function(place)
{
createTiddlyButton(place,this.label,this.prompt,this.onClick);
};
config.macros.refreshDisplay.onClick = function(e)
{
refreshAll();
return false;
};
config.macros.annotations.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
var title = tiddler ? tiddler.title : null;
var a = title ? config.annotations[title] : null;
if(!tiddler || !title || !a)
return;
var text = a.format([title]);
wikify(text,createTiddlyElement(place,"div",null,"annotation"),null,tiddler);
};
//--
//-- Augmented methods for the JavaScript Date() object
//--
// Substitute date components into a string
Date.prototype.formatString = function(template)
{
var t = template.replace(/0hh12/g,String.zeroPad(this.getHours12(),2));
t = t.replace(/hh12/g,this.getHours12());
t = t.replace(/0hh/g,String.zeroPad(this.getHours(),2));
t = t.replace(/hh/g,this.getHours());
t = t.replace(/mmm/g,config.messages.dates.shortMonths[this.getMonth()]);
t = t.replace(/0mm/g,String.zeroPad(this.getMinutes(),2));
t = t.replace(/mm/g,this.getMinutes());
t = t.replace(/0ss/g,String.zeroPad(this.getSeconds(),2));
t = t.replace(/ss/g,this.getSeconds());
t = t.replace(/[ap]m/g,this.getAmPm().toLowerCase());
t = t.replace(/[AP]M/g,this.getAmPm().toUpperCase());
t = t.replace(/wYYYY/g,this.getYearForWeekNo());
t = t.replace(/wYY/g,String.zeroPad(this.getYearForWeekNo()-2000,2));
t = t.replace(/YYYY/g,this.getFullYear());
t = t.replace(/YY/g,String.zeroPad(this.getFullYear()-2000,2));
t = t.replace(/MMM/g,config.messages.dates.months[this.getMonth()]);
t = t.replace(/0MM/g,String.zeroPad(this.getMonth()+1,2));
t = t.replace(/MM/g,this.getMonth()+1);
t = t.replace(/0WW/g,String.zeroPad(this.getWeek(),2));
t = t.replace(/WW/g,this.getWeek());
t = t.replace(/DDD/g,config.messages.dates.days[this.getDay()]);
t = t.replace(/ddd/g,config.messages.dates.shortDays[this.getDay()]);
t = t.replace(/0DD/g,String.zeroPad(this.getDate(),2));
t = t.replace(/DDth/g,this.getDate()+this.daySuffix());
t = t.replace(/DD/g,this.getDate());
var tz = this.getTimezoneOffset();
var atz = Math.abs(tz);
t = t.replace(/TZD/g,(tz < 0 ? '+' : '-') + String.zeroPad(Math.floor(atz / 60),2) + ':' + String.zeroPad(atz % 60,2));
t = t.replace(/\\/g,"");
return t;
};
Date.prototype.getWeek = function()
{
var dt = new Date(this.getTime());
var d = dt.getDay();
if(d==0) d=7;// JavaScript Sun=0, ISO Sun=7
dt.setTime(dt.getTime()+(4-d)*86400000);// shift day to Thurs of same week to calculate weekNo
var n = Math.floor((dt.getTime()-new Date(dt.getFullYear(),0,1)+3600000)/86400000);
return Math.floor(n/7)+1;
};
Date.prototype.getYearForWeekNo = function()
{
var dt = new Date(this.getTime());
var d = dt.getDay();
if(d==0) d=7;// JavaScript Sun=0, ISO Sun=7
dt.setTime(dt.getTime()+(4-d)*86400000);// shift day to Thurs of same week
return dt.getFullYear();
};
Date.prototype.getHours12 = function()
{
var h = this.getHours();
return h > 12 ? h-12 : ( h > 0 ? h : 12 );
};
Date.prototype.getAmPm = function()
{
return this.getHours() >= 12 ? config.messages.dates.pm : config.messages.dates.am;
};
Date.prototype.daySuffix = function()
{
return config.messages.dates.daySuffixes[this.getDate()-1];
};
// Convert a date to local YYYYMMDDHHMM string format
Date.prototype.convertToLocalYYYYMMDDHHMM = function()
{
return this.getFullYear() + String.zeroPad(this.getMonth()+1,2) + String.zeroPad(this.getDate(),2) + String.zeroPad(this.getHours(),2) + String.zeroPad(this.getMinutes(),2);
};
// Convert a date to UTC YYYYMMDDHHMM string format
Date.prototype.convertToYYYYMMDDHHMM = function()
{
return this.getUTCFullYear() + String.zeroPad(this.getUTCMonth()+1,2) + String.zeroPad(this.getUTCDate(),2) + String.zeroPad(this.getUTCHours(),2) + String.zeroPad(this.getUTCMinutes(),2);
};
// Convert a date to UTC YYYYMMDD.HHMMSSMMM string format
Date.prototype.convertToYYYYMMDDHHMMSSMMM = function()
{
return this.getUTCFullYear() + String.zeroPad(this.getUTCMonth()+1,2) + String.zeroPad(this.getUTCDate(),2) + "." + String.zeroPad(this.getUTCHours(),2) + String.zeroPad(this.getUTCMinutes(),2) + String.zeroPad(this.getUTCSeconds(),2) + String.zeroPad(this.getUTCMilliseconds(),3) +"0";
};
// Static method to create a date from a UTC YYYYMMDDHHMM format string
Date.convertFromYYYYMMDDHHMM = function(d)
{
d = d?d.replace(/[^0-9]/g, ""):"";
return Date.convertFromYYYYMMDDHHMMSSMMM(d.substr(0,12));
};
// Static method to create a date from a UTC YYYYMMDDHHMMSS format string
Date.convertFromYYYYMMDDHHMMSS = function(d)
{
d = d?d.replace(/[^0-9]/g, ""):"";
return Date.convertFromYYYYMMDDHHMMSSMMM(d.substr(0,14));
};
// Static method to create a date from a UTC YYYYMMDDHHMMSSMMM format string
Date.convertFromYYYYMMDDHHMMSSMMM = function(d)
{
d = d ? d.replace(/[^0-9]/g, "") : "";
return new Date(Date.UTC(parseInt(d.substr(0,4),10),
parseInt(d.substr(4,2),10)-1,
parseInt(d.substr(6,2),10),
parseInt(d.substr(8,2)||"00",10),
parseInt(d.substr(10,2)||"00",10),
parseInt(d.substr(12,2)||"00",10),
parseInt(d.substr(14,3)||"000",10)));
};
//--
//-- Translateable strings
//--
// Strings in "double quotes" should be translated; strings in 'single quotes' should be left alone
merge(config.options,{
txtUserName: "YourName"});
merge(config.tasks,{
save: {text: "save", tooltip: "Save your changes to this TiddlyWiki"},
sync: {text: "sync", tooltip: "Synchronise changes with other TiddlyWiki files and servers", content: '<<sync>>'},
importTask: {text: "import", tooltip: "Import tiddlers and plugins from other TiddlyWiki files and servers", content: '<<importTiddlers>>'},
tweak: {text: "tweak", tooltip: "Tweak the appearance and behaviour of TiddlyWiki", content: '<<options>>'},
upgrade: {text: "upgrade", tooltip: "Upgrade TiddlyWiki core code", content: '<<upgrade>>'},
plugins: {text: "plugins", tooltip: "Manage installed plugins", content: '<<plugins>>'}
});
// Options that can be set in the options panel and/or cookies
merge(config.optionsDesc,{
txtUserName: "Username for signing your edits",
chkRegExpSearch: "Enable regular expressions for searches",
chkCaseSensitiveSearch: "Case-sensitive searching",
chkIncrementalSearch: "Incremental key-by-key searching",
chkAnimate: "Enable animations",
chkSaveBackups: "Keep backup file when saving changes",
chkAutoSave: "Automatically save changes",
chkGenerateAnRssFeed: "Generate an RSS feed when saving changes",
chkSaveEmptyTemplate: "Generate an empty template when saving changes",
chkOpenInNewWindow: "Open external links in a new window",
chkToggleLinks: "Clicking on links to open tiddlers causes them to close",
chkHttpReadOnly: "Hide editing features when viewed over HTTP",
chkForceMinorUpdate: "Don't update modifier username and date when editing tiddlers",
chkConfirmDelete: "Require confirmation before deleting tiddlers",
chkInsertTabs: "Use the tab key to insert tab characters instead of moving between fields",
txtBackupFolder: "Name of folder to use for backups",
txtMaxEditRows: "Maximum number of rows in edit boxes",
txtTheme: "Name of the theme to use",
txtFileSystemCharSet: "Default character set for saving changes (Firefox/Mozilla only)"});
merge(config.messages,{
customConfigError: "Problems were encountered loading plugins. See PluginManager for details",
pluginError: "Error: %0",
pluginDisabled: "Not executed because disabled via 'systemConfigDisable' tag",
pluginForced: "Executed because forced via 'systemConfigForce' tag",
pluginVersionError: "Not executed because this plugin needs a newer version of TiddlyWiki",
nothingSelected: "Nothing is selected. You must select one or more items first",
savedSnapshotError: "It appears that this TiddlyWiki has been incorrectly saved. Please see http://www.tiddlywiki.com/#Download for details",
subtitleUnknown: "(unknown)",
undefinedTiddlerToolTip: "The tiddler '%0' doesn't yet exist",
shadowedTiddlerToolTip: "The tiddler '%0' doesn't yet exist, but has a pre-defined shadow value",
tiddlerLinkTooltip: "%0 - %1, %2",
externalLinkTooltip: "External link to %0",
noTags: "There are no tagged tiddlers",
notFileUrlError: "You need to save this TiddlyWiki to a file before you can save changes",
cantSaveError: "It's not possible to save changes. Possible reasons include:\n- your browser doesn't support saving (Firefox, Internet Explorer, Safari and Opera all work if properly configured)\n- the pathname to your TiddlyWiki file contains illegal characters\n- the TiddlyWiki HTML file has been moved or renamed",
invalidFileError: "The original file '%0' does not appear to be a valid TiddlyWiki",
backupSaved: "Backup saved",
backupFailed: "Failed to save backup file",
rssSaved: "RSS feed saved",
rssFailed: "Failed to save RSS feed file",
emptySaved: "Empty template saved",
emptyFailed: "Failed to save empty template file",
mainSaved: "Main TiddlyWiki file saved",
mainFailed: "Failed to save main TiddlyWiki file. Your changes have not been saved",
macroError: "Error in macro <<%0>>",
macroErrorDetails: "Error while executing macro <<%0>>:\n%1",
missingMacro: "No such macro",
overwriteWarning: "A tiddler named '%0' already exists. Choose OK to overwrite it",
unsavedChangesWarning: "WARNING! There are unsaved changes in TiddlyWiki\n\nChoose OK to save\nChoose CANCEL to discard",
confirmExit: "--------------------------------\n\nThere are unsaved changes in TiddlyWiki. If you continue you will lose those changes\n\n--------------------------------",
saveInstructions: "SaveChanges",
unsupportedTWFormat: "Unsupported TiddlyWiki format '%0'",
tiddlerSaveError: "Error when saving tiddler '%0'",
tiddlerLoadError: "Error when loading tiddler '%0'",
wrongSaveFormat: "Cannot save with storage format '%0'. Using standard format for save.",
invalidFieldName: "Invalid field name %0",
fieldCannotBeChanged: "Field '%0' cannot be changed",
loadingMissingTiddler: "Attempting to retrieve the tiddler '%0' from the '%1' server at:\n\n'%2' in the workspace '%3'",
upgradeDone: "The upgrade to version %0 is now complete\n\nClick 'OK' to reload the newly upgraded TiddlyWiki",
invalidCookie: "Invalid cookie '%0'"});
merge(config.messages.messageClose,{
text: "close",
tooltip: "close this message area"});
config.messages.backstage = {
open: {text: "backstage", tooltip: "Open the backstage area to perform authoring and editing tasks"},
close: {text: "close", tooltip: "Close the backstage area"},
prompt: "backstage: ",
decal: {
edit: {text: "edit", tooltip: "Edit the tiddler '%0'"}
}
};
config.messages.listView = {
tiddlerTooltip: "Click for the full text of this tiddler",
previewUnavailable: "(preview not available)"
};
config.messages.dates.months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November","December"];
config.messages.dates.days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
config.messages.dates.shortMonths = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
config.messages.dates.shortDays = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
// suffixes for dates, eg "1st","2nd","3rd"..."30th","31st"
config.messages.dates.daySuffixes = ["st","nd","rd","th","th","th","th","th","th","th",
"th","th","th","th","th","th","th","th","th","th",
"st","nd","rd","th","th","th","th","th","th","th",
"st"];
config.messages.dates.am = "am";
config.messages.dates.pm = "pm";
merge(config.messages.tiddlerPopup,{
});
merge(config.views.wikified.tag,{
labelNoTags: "no tags",
labelTags: "tags: ",
openTag: "Open tag '%0'",
tooltip: "Show tiddlers tagged with '%0'",
openAllText: "Open all",
openAllTooltip: "Open all of these tiddlers",
popupNone: "No other tiddlers tagged with '%0'"});
merge(config.views.wikified,{
defaultText: "The tiddler '%0' doesn't yet exist. Double-click to create it",
defaultModifier: "(missing)",
shadowModifier: "(built-in shadow tiddler)",
dateFormat: "DD MMM YYYY",
createdPrompt: "created"});
merge(config.views.editor,{
tagPrompt: "Type tags separated with spaces, [[use double square brackets]] if necessary, or add existing",
defaultText: "Type the text for '%0'"});
merge(config.views.editor.tagChooser,{
text: "tags",
tooltip: "Choose existing tags to add to this tiddler",
popupNone: "There are no tags defined",
tagTooltip: "Add the tag '%0'"});
merge(config.messages,{
sizeTemplates:
[
{unit: 1024*1024*1024, template: "%0\u00a0GB"},
{unit: 1024*1024, template: "%0\u00a0MB"},
{unit: 1024, template: "%0\u00a0KB"},
{unit: 1, template: "%0\u00a0B"}
]});
merge(config.macros.search,{
label: "search",
prompt: "Search this TiddlyWiki",
placeholder: "",
accessKey: "F",
successMsg: "%0 tiddlers found matching %1",
failureMsg: "No tiddlers found matching %0"});
merge(config.macros.tagging,{
label: "tagging: ",
labelNotTag: "not tagging",
tooltip: "List of tiddlers tagged with '%0'"});
merge(config.macros.timeline,{
dateFormat: "DD MMM YYYY"});
merge(config.macros.allTags,{
tooltip: "Show tiddlers tagged with '%0'",
noTags: "There are no tagged tiddlers"});
config.macros.list.all.prompt = "All tiddlers in alphabetical order";
config.macros.list.missing.prompt = "Tiddlers that have links to them but are not defined";
config.macros.list.orphans.prompt = "Tiddlers that are not linked to from any other tiddlers";
config.macros.list.shadowed.prompt = "Tiddlers shadowed with default contents";
config.macros.list.touched.prompt = "Tiddlers that have been modified locally";
merge(config.macros.closeAll,{
label: "close all",
prompt: "Close all displayed tiddlers (except any that are being edited)"});
merge(config.macros.permaview,{
label: "permaview",
prompt: "Link to an URL that retrieves all the currently displayed tiddlers"});
merge(config.macros.saveChanges,{
label: "save changes",
prompt: "Save all tiddlers to create a new TiddlyWiki",
accessKey: "S"});
merge(config.macros.newTiddler,{
label: "new tiddler",
prompt: "Create a new tiddler",
title: "New Tiddler",
accessKey: "N"});
merge(config.macros.newJournal,{
label: "new journal",
prompt: "Create a new tiddler from the current date and time",
accessKey: "J"});
merge(config.macros.options,{
wizardTitle: "Tweak advanced options",
step1Title: "These options are saved in cookies in your browser",
step1Html: "<input type='hidden' name='markList'></input><br><input type='checkbox' checked='false' name='chkUnknown'>Show unknown options</input>",
unknownDescription: "//(unknown)//",
listViewTemplate: {
columns: [
{name: 'Option', field: 'option', title: "Option", type: 'String'},
{name: 'Description', field: 'description', title: "Description", type: 'WikiText'},
{name: 'Name', field: 'name', title: "Name", type: 'String'}
],
rowClasses: [
{className: 'lowlight', field: 'lowlight'}
]}
});
merge(config.macros.plugins,{
wizardTitle: "Manage plugins",
step1Title: "Currently loaded plugins",
step1Html: "<input type='hidden' name='markList'></input>", // DO NOT TRANSLATE
skippedText: "(This plugin has not been executed because it was added since startup)",
noPluginText: "There are no plugins installed",
confirmDeleteText: "Are you sure you want to delete these plugins:\n\n%0",
removeLabel: "remove systemConfig tag",
removePrompt: "Remove systemConfig tag",
deleteLabel: "delete",
deletePrompt: "Delete these tiddlers forever",
listViewTemplate: {
columns: [
{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
{name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
{name: 'Description', field: 'Description', title: "Description", type: 'String'},
{name: 'Version', field: 'Version', title: "Version", type: 'String'},
{name: 'Size', field: 'size', tiddlerLink: 'size', title: "Size", type: 'Size'},
{name: 'Forced', field: 'forced', title: "Forced", tag: 'systemConfigForce', type: 'TagCheckbox'},
{name: 'Disabled', field: 'disabled', title: "Disabled", tag: 'systemConfigDisable', type: 'TagCheckbox'},
{name: 'Executed', field: 'executed', title: "Loaded", type: 'Boolean', trueText: "Yes", falseText: "No"},
{name: 'Startup Time', field: 'startupTime', title: "Startup Time", type: 'String'},
{name: 'Error', field: 'error', title: "Status", type: 'Boolean', trueText: "Error", falseText: "OK"},
{name: 'Log', field: 'log', title: "Log", type: 'StringList'}
],
rowClasses: [
{className: 'error', field: 'error'},
{className: 'warning', field: 'warning'}
]},
listViewTemplateReadOnly: {
columns: [
{name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
{name: 'Description', field: 'Description', title: "Description", type: 'String'},
{name: 'Version', field: 'Version', title: "Version", type: 'String'},
{name: 'Size', field: 'size', tiddlerLink: 'size', title: "Size", type: 'Size'},
{name: 'Executed', field: 'executed', title: "Loaded", type: 'Boolean', trueText: "Yes", falseText: "No"},
{name: 'Startup Time', field: 'startupTime', title: "Startup Time", type: 'String'},
{name: 'Error', field: 'error', title: "Status", type: 'Boolean', trueText: "Error", falseText: "OK"},
{name: 'Log', field: 'log', title: "Log", type: 'StringList'}
],
rowClasses: [
{className: 'error', field: 'error'},
{className: 'warning', field: 'warning'}
]}
});
merge(config.macros.toolbar,{
moreLabel: "more",
morePrompt: "Show additional commands",
lessLabel: "less",
lessPrompt: "Hide additional commands",
separator: "|"
});
merge(config.macros.refreshDisplay,{
label: "refresh",
prompt: "Redraw the entire TiddlyWiki display"
});
merge(config.macros.importTiddlers,{
readOnlyWarning: "You cannot import into a read-only TiddlyWiki file. Try opening it from a file:// URL",
wizardTitle: "Import tiddlers from another file or server",
step1Title: "Step 1: Locate the server or TiddlyWiki file",
step1Html: "Specify the type of the server: <select name='selTypes'><option value=''>Choose...</option></select><br>Enter the URL or pathname here: <input type='text' size=50 name='txtPath'><br>...or browse for a file: <input type='file' size=50 name='txtBrowse'><br><hr>...or select a pre-defined feed: <select name='selFeeds'><option value=''>Choose...</option></select>",
openLabel: "open",
openPrompt: "Open the connection to this file or server",
statusOpenHost: "Opening the host",
statusGetWorkspaceList: "Getting the list of available workspaces",
step2Title: "Step 2: Choose the workspace",
step2Html: "Enter a workspace name: <input type='text' size=50 name='txtWorkspace'><br>...or select a workspace: <select name='selWorkspace'><option value=''>Choose...</option></select>",
cancelLabel: "cancel",
cancelPrompt: "Cancel this import",
statusOpenWorkspace: "Opening the workspace",
statusGetTiddlerList: "Getting the list of available tiddlers",
errorGettingTiddlerList: "Error getting list of tiddlers, click Cancel to try again",
errorGettingTiddlerListHttp404: "Error retrieving tiddlers from url, please ensure the url exists. Click Cancel to try again.",
errorGettingTiddlerListHttp: "Error retrieving tiddlers from url, please ensure this url exists and is <a href='http://enable-cors.org/'>CORS</a> enabled",
errorGettingTiddlerListFile: "Error retrieving tiddlers from local file, please make sure the file is in the same directory as your TiddlyWiki. Click Cancel to try again.",
step3Title: "Step 3: Choose the tiddlers to import",
step3Html: "<input type='hidden' name='markList'></input><br><input type='checkbox' checked='true' name='chkSync'>Keep these tiddlers linked to this server so that you can synchronise subsequent changes</input><br><input type='checkbox' name='chkSave'>Save the details of this server in a 'systemServer' tiddler called:</input> <input type='text' size=25 name='txtSaveTiddler'>",
importLabel: "import",
importPrompt: "Import these tiddlers",
confirmOverwriteText: "Are you sure you want to overwrite these tiddlers:\n\n%0",
step4Title: "Step 4: Importing %0 tiddler(s)",
step4Html: "<input type='hidden' name='markReport'></input>", // DO NOT TRANSLATE
doneLabel: "done",
donePrompt: "Close this wizard",
statusDoingImport: "Importing tiddlers",
statusDoneImport: "All tiddlers imported",
systemServerNamePattern: "%2 on %1",
systemServerNamePatternNoWorkspace: "%1",
confirmOverwriteSaveTiddler: "The tiddler '%0' already exists. Click 'OK' to overwrite it with the details of this server, or 'Cancel' to leave it unchanged",
serverSaveTemplate: "|''Type:''|%0|\n|''URL:''|%1|\n|''Workspace:''|%2|\n\nThis tiddler was automatically created to record the details of this server",
serverSaveModifier: "(System)",
listViewTemplate: {
columns: [
{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
{name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
{name: 'Size', field: 'size', tiddlerLink: 'size', title: "Size", type: 'Size'},
{name: 'Tags', field: 'tags', title: "Tags", type: 'Tags'}
],
rowClasses: [
]}
});
merge(config.macros.upgrade,{
wizardTitle: "Upgrade TiddlyWiki core code",
step1Title: "Update or repair this TiddlyWiki to the latest release",
step1Html: "You are about to upgrade to the latest release of the TiddlyWiki core code (from <a href='%0' class='externalLink' target='_blank'>%1</a>). Your content will be preserved across the upgrade.<br><br>Note that core upgrades have been known to interfere with older plugins. If you run into problems with the upgraded file, see <a href='http://www.tiddlywiki.org/wiki/CoreUpgrades' class='externalLink' target='_blank'>http://www.tiddlywiki.org/wiki/CoreUpgrades</a>",
errorCantUpgrade: "Unable to upgrade this TiddlyWiki. You can only perform upgrades on TiddlyWiki files stored locally",
errorNotSaved: "You must save changes before you can perform an upgrade",
step2Title: "Confirm the upgrade details",
step2Html_downgrade: "You are about to downgrade to TiddlyWiki version %0 from %1.<br><br>Downgrading to an earlier version of the core code is not recommended",
step2Html_restore: "This TiddlyWiki appears to be already using the latest version of the core code (%0).<br><br>You can continue to upgrade anyway to ensure that the core code hasn't been corrupted or damaged",
step2Html_upgrade: "You are about to upgrade to TiddlyWiki version %0 from %1",
upgradeLabel: "upgrade",
upgradePrompt: "Prepare for the upgrade process",
statusPreparingBackup: "Preparing backup",
statusSavingBackup: "Saving backup file",
errorSavingBackup: "There was a problem saving the backup file",
statusLoadingCore: "Loading core code",
errorLoadingCore: "Error loading the core code",
errorCoreFormat: "Error with the new core code",
statusSavingCore: "Saving the new core code",
statusReloadingCore: "Reloading the new core code",
startLabel: "start",
startPrompt: "Start the upgrade process",
cancelLabel: "cancel",
cancelPrompt: "Cancel the upgrade process",
step3Title: "Upgrade cancelled",
step3Html: "You have cancelled the upgrade process"
});
merge(config.macros.sync,{
listViewTemplate: {
columns: [
{name: 'Selected', field: 'selected', rowName: 'title', type: 'Selector'},
{name: 'Tiddler', field: 'tiddler', title: "Tiddler", type: 'Tiddler'},
{name: 'Server Type', field: 'serverType', title: "Server type", type: 'String'},
{name: 'Server Host', field: 'serverHost', title: "Server host", type: 'String'},
{name: 'Server Workspace', field: 'serverWorkspace', title: "Server workspace", type: 'String'},
{name: 'Status', field: 'status', title: "Synchronisation status", type: 'String'},
{name: 'Server URL', field: 'serverUrl', title: "Server URL", text: "View", type: 'Link'}
],
rowClasses: [
],
buttons: [
{caption: "Sync these tiddlers", name: 'sync'}
]},
wizardTitle: "Synchronize with external servers and files",
step1Title: "Choose the tiddlers you want to synchronize",
step1Html: "<input type='hidden' name='markList'></input>", // DO NOT TRANSLATE
syncLabel: "sync",
syncPrompt: "Sync these tiddlers",
hasChanged: "Changed while unplugged",
hasNotChanged: "Unchanged while unplugged",
syncStatusList: {
none: {text: "...", display:'none', className:'notChanged'},
changedServer: {text: "Changed on server", display:null, className:'changedServer'},
changedLocally: {text: "Changed while unplugged", display:null, className:'changedLocally'},
changedBoth: {text: "Changed while unplugged and on server", display:null, className:'changedBoth'},
notFound: {text: "Not found on server", display:null, className:'notFound'},
putToServer: {text: "Saved update on server", display:null, className:'putToServer'},
gotFromServer: {text: "Retrieved update from server", display:null, className:'gotFromServer'}
}
});
merge(config.macros.annotations,{
});
merge(config.commands.closeTiddler,{
text: "close",
tooltip: "Close this tiddler"});
merge(config.commands.closeOthers,{
text: "close others",
tooltip: "Close all other tiddlers"});
merge(config.commands.editTiddler,{
text: "edit",
tooltip: "Edit this tiddler",
readOnlyText: "view",
readOnlyTooltip: "View the source of this tiddler"});
merge(config.commands.saveTiddler,{
text: "done",
tooltip: "Save changes to this tiddler"});
merge(config.commands.cancelTiddler,{
text: "cancel",
tooltip: "Undo changes to this tiddler",
warning: "Are you sure you want to abandon your changes to '%0'?",
readOnlyText: "done",
readOnlyTooltip: "View this tiddler normally"});
merge(config.commands.deleteTiddler,{
text: "delete",
tooltip: "Delete this tiddler",
warning: "Are you sure you want to delete '%0'?"});
merge(config.commands.permalink,{
text: "permalink",
tooltip: "Permalink for this tiddler"});
merge(config.commands.references,{
text: "references",
tooltip: "Show tiddlers that link to this one",
popupNone: "No references"});
merge(config.commands.jump,{
text: "jump",
tooltip: "Jump to another open tiddler"});
merge(config.commands.syncing,{
text: "syncing",
tooltip: "Control synchronisation of this tiddler with a server or external file",
currentlySyncing: "<div>Currently syncing via <span class='popupHighlight'>'%0'</span> to:</"+"div><div>host: <span class='popupHighlight'>%1</span></"+"div><div>workspace: <span class='popupHighlight'>%2</span></"+"div>", // Note escaping of closing <div> tag
notCurrentlySyncing: "Not currently syncing",
captionUnSync: "Stop synchronising this tiddler",
chooseServer: "Synchronise this tiddler with another server:",
currServerMarker: "\u25cf ",
notCurrServerMarker: " "});
merge(config.commands.fields,{
text: "fields",
tooltip: "Show the extended fields of this tiddler",
emptyText: "There are no extended fields for this tiddler",
listViewTemplate: {
columns: [
{name: 'Field', field: 'field', title: "Field", type: 'String'},
{name: 'Value', field: 'value', title: "Value", type: 'String'}
],
rowClasses: [
],
buttons: [
]}});
merge(config.shadowTiddlers,{
DefaultTiddlers: "[[GettingStarted]]",
MainMenu: "[[GettingStarted]]",
SiteTitle: "My TiddlyWiki",
SiteSubtitle: "a reusable non-linear personal web notebook",
SiteUrl: "",
SideBarOptions: '<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "options \u00bb" "Change TiddlyWiki advanced options">>',
SideBarTabs: '<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>',
TabMore: '<<tabs txtMoreTab "Missing" "Missing tiddlers" TabMoreMissing "Orphans" "Orphaned tiddlers" TabMoreOrphans "Shadowed" "Shadowed tiddlers" TabMoreShadowed>>'
});
merge(config.annotations,{
AdvancedOptions: "This shadow tiddler provides access to several advanced options",
ColorPalette: "These values in this shadow tiddler determine the colour scheme of the ~TiddlyWiki user interface",
DefaultTiddlers: "The tiddlers listed in this shadow tiddler will be automatically displayed when ~TiddlyWiki starts up",
EditTemplate: "The HTML template in this shadow tiddler determines how tiddlers look while they are being edited",
GettingStarted: "This shadow tiddler provides basic usage instructions",
ImportTiddlers: "This shadow tiddler provides access to importing tiddlers",
MainMenu: "This shadow tiddler is used as the contents of the main menu in the left-hand column of the screen",
MarkupPreHead: "This tiddler is inserted at the top of the <head> section of the TiddlyWiki HTML file",
MarkupPostHead: "This tiddler is inserted at the bottom of the <head> section of the TiddlyWiki HTML file",
MarkupPreBody: "This tiddler is inserted at the top of the <body> section of the TiddlyWiki HTML file",
MarkupPostBody: "This tiddler is inserted at the end of the <body> section of the TiddlyWiki HTML file immediately after the script block",
OptionsPanel: "This shadow tiddler is used as the contents of the options panel slider in the right-hand sidebar",
PageTemplate: "The HTML template in this shadow tiddler determines the overall ~TiddlyWiki layout",
PluginManager: "This shadow tiddler provides access to the plugin manager",
SideBarOptions: "This shadow tiddler is used as the contents of the option panel in the right-hand sidebar",
SideBarTabs: "This shadow tiddler is used as the contents of the tabs panel in the right-hand sidebar",
SiteSubtitle: "This shadow tiddler is used as the second part of the page title",
SiteTitle: "This shadow tiddler is used as the first part of the page title",
SiteUrl: "This shadow tiddler should be set to the full target URL for publication",
StyleSheetColors: "This shadow tiddler contains CSS definitions related to the color of page elements. ''DO NOT EDIT THIS TIDDLER'', instead make your changes in the StyleSheet shadow tiddler",
StyleSheet: "This tiddler can contain custom CSS definitions",
StyleSheetLayout: "This shadow tiddler contains CSS definitions related to the layout of page elements. ''DO NOT EDIT THIS TIDDLER'', instead make your changes in the StyleSheet shadow tiddler",
StyleSheetLocale: "This shadow tiddler contains CSS definitions related to the translation locale",
StyleSheetPrint: "This shadow tiddler contains CSS definitions for printing",
SystemSettings: "This tiddler is used to store configuration options for this TiddlyWiki document",
TabAll: "This shadow tiddler contains the contents of the 'All' tab in the right-hand sidebar",
TabMore: "This shadow tiddler contains the contents of the 'More' tab in the right-hand sidebar",
TabMoreMissing: "This shadow tiddler contains the contents of the 'Missing' tab in the right-hand sidebar",
TabMoreOrphans: "This shadow tiddler contains the contents of the 'Orphans' tab in the right-hand sidebar",
TabMoreShadowed: "This shadow tiddler contains the contents of the 'Shadowed' tab in the right-hand sidebar",
TabTags: "This shadow tiddler contains the contents of the 'Tags' tab in the right-hand sidebar",
TabTimeline: "This shadow tiddler contains the contents of the 'Timeline' tab in the right-hand sidebar",
ToolbarCommands: "This shadow tiddler determines which commands are shown in tiddler toolbars",
ViewTemplate: "The HTML template in this shadow tiddler determines how tiddlers look"
});
/***
|''Name:''|TiddlySpaceLinkPlugin|
|''Description:''|Formatter to reference other spaces from wikitext |
|''Author:''|PaulDowney (psd (at) osmosoft (dot) com) |
|''Source:''|http://github.com/TiddlySpace/tiddlyspace/raw/master/src/plugins/TiddlySpaceLinkPlugin.js|
|''Version:''|1.3.1|
|''License:''|[[BSD License|http://www.opensource.org/licenses/bsd-license.php]] |
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''~CoreVersion:''|2.4|
!!Documentation
This plugin provides wikitext formatters for referencing another [[space|Space]] on the same TiddlySpace server, as in the following examples:
<<<
{{{@space}}} -- @space
{{{~@space}}} -- ~@space
{{{Tiddler@space}}} -- Tiddler@space
{{{[[Tiddler Title]]@space}}} -- [[Tiddler Title]]@space
{{{[[Link text|Tiddler Title]]@space}}} -- [[Link text|Tiddler Title]]@space
<<<
Links to tiddlers with a title begining with an "@" remain as tiddlyLinks:
<<<
{{{[[@tiddler]]}}} -- [[@tiddler]]
<<<
and these may be changed into a space link using {{{@@}}}:
<<<
{{{[[@@space]]}}} -- [[@@space]]
{{{[[Link to an another space|@@space]]}}} -- [[Link to another space|@@space]]
{{{[[@space|@@space]]}}} -- [[@space|@@space]]
<<<
TiddlySpace includes the [[TiddlySpaceLinkPlugin]] which provides WikiText markup for linking to other spaces on the same server. For example @glossary is a link to the {{{glossary}}} space and [[Small Trusted Group]]@glossary a link to an individual tiddler in the @glossary space. Prefixing the link with a tilde escapes the link, for example {{{~@space}}}.
Email addresses, for example joe.bloggs@example.com and mary@had.a.little.lamb.org should be unaffected.
!!Features
The plugin provides external links decorated so that other plugins may be included to add features such as the ability to dynamically pull externally linked tiddlers into the current TiddlyWiki.
Wikitext linking to a space on another server, for example from a tiddler in a space on tiddlyspace.com to a tiddler or a space on example.com, isn't currently supported.
!!Code
***/
//{{{
/*jslint onevar: false nomen: false plusplus: false */
/*global jQuery config createTiddlyText createExternalLink createTiddlyLink */
function createSpaceLink(place, spaceName, title, alt, isBag) {
var link, a, currentSpaceName;
try {
// seems safe to expect this to have been initialised within TiddlySpace
link = config.extensions.tiddlyweb.status.server_host.url;
} catch (ex) {
link = "http://tiddlyspace.com";
}
try {
if (spaceName === config.extensions.tiddlyspace.currentSpace.name) {
title = title || spaceName;
a = createTiddlyLink(place, title, false);
jQuery(a).text(alt || title);
return a;
}
} catch (ex1) {
currentSpaceName = false;
}
// assumes a http URI without user:pass@ prefix
if(!isBag) {
link = link.replace("http://", "http://" + spaceName.toLowerCase() + ".");
} else {
link += "/bags/" + spaceName + "/tiddlers.wiki";
}
if (title) {
a = createExternalLink(place, link + "#" + encodeURIComponent(String.encodeTiddlyLink(title)), alt || title);
} else {
a = createExternalLink(place, link, alt || spaceName);
}
jQuery(a).addClass('tiddlySpaceLink').attr('tiddler', title);
if(isBag) {
jQuery(a).attr('bag', spaceName);
} else {
jQuery(a).attr('tiddlyspace', spaceName);
}
return a;
}
(function ($) {
config.textPrimitives.spaceName = "[a-zA-Z][a-zA-Z0-9-]*[a-zA-Z0-9]";
config.textPrimitives.spaceNameStrict = "[a-z][a-z0-9-]*";
config.textPrimitives.bareTiddlerLetter = config.textPrimitives.anyLetterStrict;
config.formatters.splice(0, 0, {
name: "spacenameLink",
match: config.textPrimitives.unWikiLink + "?" + config.textPrimitives.bareTiddlerLetter + "*@" + config.textPrimitives.spaceName + "\\.?.?",
lookaheadRegExp: new RegExp(config.textPrimitives.unWikiLink + "?(" + config.textPrimitives.bareTiddlerLetter + "*)@(" + config.textPrimitives.spaceName + ")", "mg"),
handler: function (w) {
if (w.matchText.substr(w.matchText.length - 2, 1) === '.' && w.matchText.substr(w.matchText.length - 1, 1).match(/[a-zA-Z]/)) {
w.outputText(w.output, w.matchStart, w.nextMatch);
return;
}
if (w.matchText.substr(0, 1) === config.textPrimitives.unWikiLink) {
w.outputText(w.output, w.matchStart + 1, w.nextMatch);
return;
}
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if (lookaheadMatch && lookaheadMatch.index === w.matchStart) {
createSpaceLink(w.output, lookaheadMatch[2], lookaheadMatch[1]);
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
},
{
name: "tiddlySpaceLink",
match: "\\[\\[[^\\|\\]]*\\|*@@" + config.textPrimitives.spaceName + "\\]",
lookaheadRegExp: new RegExp("\\[\\[(.*?)(?:\\|@@(.*?))?\\]\\]", "mg"),
handler: function (w) {
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if (lookaheadMatch && lookaheadMatch.index === w.matchStart) {
var alt = lookaheadMatch[2] ? lookaheadMatch[1] : lookaheadMatch[1].replace(/^@@/, "");
var space = lookaheadMatch[2] || alt;
createSpaceLink(w.output, space, "", alt);
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
},
{
name: "tiddlyLinkSpacenameLink",
match: "\\[\\[[^\\[]*\\]\\]@",
lookaheadRegExp: new RegExp("\\[\\[(.*?)(?:\\|(.*?))?\\]\\]@(" + config.textPrimitives.spaceName + ")", "mg"),
handler: function (w) {
this.lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
if (lookaheadMatch && lookaheadMatch.index === w.matchStart) {
var title = lookaheadMatch[2] || lookaheadMatch[1];
var alt = lookaheadMatch[1] || lookaheadMatch[2];
createSpaceLink(w.output, lookaheadMatch[3], title, alt);
w.nextMatch = this.lookaheadRegExp.lastIndex;
}
}
});
// ensure space links don't appear as missing links
config.textPrimitives.brackettedLink = "\\[\\[([^\\]][^@\\]][^\\]]*)\\]\\](?=[^@])";
config.textPrimitives.titledBrackettedLink = "\\[\\[([^\\[\\]\\|]+)\\|([^\\[\\]\\|]+)\\]\\](?=[^@])";
// reevaluate derrived expressions ..
config.textPrimitives.tiddlerForcedLinkRegExp = new RegExp("(?:" + config.textPrimitives.titledBrackettedLink + ")|(?:" +
config.textPrimitives.brackettedLink + ")|(?:" +
config.textPrimitives.urlPattern + ")","mg");
config.textPrimitives.tiddlerAnyLinkRegExp = new RegExp("("+ config.textPrimitives.wikiLink + ")|(?:" +
config.textPrimitives.titledBrackettedLink + ")|(?:" +
config.textPrimitives.brackettedLink + ")|(?:" +
config.textPrimitives.urlPattern + ")","mg");
// treat space links in titledBracketedLink as external links
var missingTiddlySpaceLink = new RegExp("^@@" + config.textPrimitives.spaceName + "$", "");
var isExternalLink = config.formatterHelpers.isExternalLink;
config.formatterHelpers.isExternalLink = function(link) {
return missingTiddlySpaceLink.test(link) || isExternalLink(link);
};
}(jQuery));
//}}}
// The closing of the frame that wraps the TiddlyWiki code.
// create the formatter global that is needed. Must be here
// at the end because we need to have config established.
// XXX Why is formatter a global!!!!
var formatter = new Formatter(config.formatters);
//clobber createTiddlyLink
function createTiddlyLink(place,title,includeText,className,isStatic,linkedFromTiddler,noToggle)
{
var text = includeText ? title : null;
var i = getTiddlyLinkInfo(title,className);
var urlString = store.getTiddlerText("SiteUrl");
var linktext = urlString ? urlString + '/' + title : title;
var btn = createExternalLink(place, linktext, text);
btn.className += ' ' + className;
return btn;
}
// clobber creatTagButton
function createTagButton(place,tag,excludeTiddler,title,tooltip)
{
var taglink = serverOptions.container ?
serverOptions.container + '?select=tag:' + encodeURIComponent(tag) :
"/search?q=tag:" + encodeURIComponent(tag);
var btn = createExternalLink(place, taglink, tag);
return btn;
}
// messages required for invokeMacro
function createTiddlyError(place, msg, details) {
jQuery(place).append("<!-- " + msg + "\n" + details + " -->");
}
// override createSpaceLink
function createSpaceLink(place, spaceName, title, alt, isBag) {
var link, a;
// XXX this needs to come from config or parameters
link = serverOptions.host;
// assumes a http URI without user:pass@ prefix
link = link.replace("http://", "http://" + spaceName.toLowerCase() + ".");
if (title) {
a = createExternalLink(place, link + "/" +
encodeURIComponent(title), alt || title);
} else {
a = createExternalLink(place, link, alt || spaceName);
}
jQuery(a).addClass('tiddlySpaceLink').attr('tiddler', title);
jQuery(a).attr('tiddlyspace', spaceName);
return a;
}
config.options.chkOpenInNewWindow = false;
config.evaluateMacroParameters = 'none';
return [wikify, store, Tiddler];
};
if (typeof exports != "undefined")
exports.createWikifier = createWikifier;
I sweat so much climbing that I'm now freezing in my own evaporation.
i have a replacement phone now
!URL
http://sandben.tiddlyspace.com/bookmarklet.js.txt
!Description
* A new bookmarklet for TiddlySpace
<!--{{{-->
<div class='toolbar'
macro='toolbar [[ToolbarCommands::EditToolbar]] icons:yes'>
</div>
<div class='heading editorHeading'>
<div class='editor title' macro='edit title'></div>
<div class='tagClear'></div>
</div>
<div class='annotationsBox' macro='annotations'>
<div class='editSpaceSiteIcon'
macro='tiddlerOrigin height:16 width:16 label:no interactive:no'>
</div>
<div class="privacyEdit" macro='setPrivacy label:no interactive:no'></div>
<div class='tagClear'></div>
</div>
<div class='editor' macro='edit text'></div>
<div class='editorFooter'>
<div class='tagTitle'>tags</div>
<div class='editor' macro='edit tags'></div>
<div class='tagAnnotation'>
<span macro='message views.editor.tagPrompt'></span>
<span macro='tagChooser excludeLists'></span>
</div>
</div>
Custom Fields:
<div macro="editFields"></div>
<!--}}}-->
/***
|''Name''|RandomColorPalettePlugin|
|''Description''|Adds a random color palette to TiddlyWiki|
|''Author''|Jon Robson|
|''Version''|1.4.0|
|''Status''|stable|
|''Source''|https://github.com/jdlrobson/TiddlyWikiPlugins/raw/master/plugins/RandomColorPalettePlugin/RandomColorPalettePlugin.js|
|''License''|[[BSD|http://www.opensource.org/licenses/bsd-license.php]]|
!Usage
{{{
<<RandomColorPalette>>
}}}
Sets and saves a random color palette on execution
{{{
<<RandomColorPaletteButton>>
}}}
Creates a button, which when clicked will change the color palette
More information at http://macros.tiddlyspace.com/#%5B%5BRandomColorPaletteButton%20macro%5D%5D
!Code
***/
//{{{
RGB.prototype.toRGBString = function() {
return "rgb(%0,%1,%2)".format(parseInt(this.r * 255, 10),
parseInt(this.g * 255, 10), parseInt(this.b * 255, 10))
}
function HSL_TO_RGB(h, s, l) { // h (hue) between 0 and 360, s (saturation) & l (lightness) between 0 and 1
var c = l <= 0.5 ? 2 * l * s : ( 2 - (2 * l)) * s;
var h1 = h / 60;
var x = c * (1 - Math.abs((h1 % 2) - 1));
var r, g, b;
if(typeof(h) == 'undefined') {
r = 0;
g = 0;
b = 0;
} else if(0 <= h1 && h1 < 1) {
r = c;
g = x;
b = 0;
} else if(1 <= h1 && h1 < 2) {
r = x;
g = c;
b = 0;
} else if(2 <= h1 && h1 < 3) {
r = 0;
g = c;
b = x;
} else if(3 <= h1 && h1 < 4) {
r = 0;
g = x;
b = c;
} else if(4 <= h1 && h1 < 5) {
r = x;
g = 0;
b = c;
} else if(5 <= h1 && h1 < 6) {
r = c;
g = 0;
b = x;
}
m = l - (0.5 * c);
return new RGB(r + m, g + m, b + m);
}
(function($){
var macro = config.macros.RandomColorPalette = {
messagesOn: false,
changedPaletteText: "We have assigned you a random theme by adjusting the [[ColorPalette]] tiddler.\nDon't like it? Click <<RandomColorPalette>> for another one.",
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
paramString = paramString || "";
var options = macro.getOptions(paramString);
macro.generatePalette(options, true);
},
optionTypes: {
floats: ["hue", "saturation", "darkest", "lightness", "huevariance", "dark", "pale", "light", "mid",
"saturation_light", "saturation_pale", "saturation_mid", "saturation_dark"
]
},
getOptions: function(paramString) {
var args = paramString.parseParams("name", null, true, false, true)[0];
var options = {};
var numbers = macro.optionTypes.floats;
for(var i in args) {
options[i] = numbers.indexOf(i) > -1 ? parseFloat(args[i][0], 10) : args[i][0];
}
return options;
},
generateRandomNumber: function(min, max, info) {
var num = (Math.random() * 1);
info = !info ? { attempts:0 } : info;
info.attempts += 1;
var good = true;
if(min == max) {
return max;
}
if(min && num < min) {
good = false;
} else if(max && num > max) {
good = false;
}
if(!good) {
if(info.attempts < 5) {
return macro.generateRandomNumber(min, max, info);
} else {
if(max) {
return max;
} else if(min) {
return min;
} else {
return 1;
}
}
}
return num;
},
getExistingPalette: function(asJSON) {
var title = "ColorPalette";
var tiddlerText;
if(store.tiddlerExists(title)) {
tiddlerText = store.getTiddlerText(title);
} else if(store.isShadowTiddler(title)){
tiddlerText = config.shadowTiddlers[title];
}
if(asJSON) {
var json = {};
if(tiddlerText) {
var lines = tiddlerText.split("\n");
for(var i = 0; i < lines.length; i++) {
var definition = lines[i].split(":");
if(definition.length == 2) {
var name = definition[0].trim();
var value = definition[1].trim();
json[name] = value;
}
}
}
return json;
} else {
return tiddlerText;
}
},
generatePalette: function(options, save) {
var outputRGB = options.rgb;
var palette = macro.getExistingPalette(true);
var hue = options.hue || Math.floor(Math.random() * 359);
var saturation = options.saturation || macro.generateRandomNumber(0.3, 0.7);
var dark = options.dark || options.darkest || macro.generateRandomNumber(0, 0.10);
var pale = options.pale || options.lightness || macro.generateRandomNumber(0.90, 1);
var delta = ( ( pale - dark ) / 3 );
var mid = options.mid || dark + delta;
var light = options.light || dark + (delta * 2);
var lightness_values = {Dark: dark, Mid: mid, Light: light, Pale: pale};
var saturation_values = {};
for(i in lightness_values) {
if(true) {
saturation_values[i] = options["saturation_" + i.toLowerCase()] || saturation;
}
}
var opposite_hue = (hue + 180) % 360;
var seed = options.huevariance || Math.floor((85 * Math.random()) + 5); // we want it to be at least 5 degrees
var huetwo = (opposite_hue + seed) % 360;
var huethree = (opposite_hue - seed) % 360;
if(huetwo < 0) {
huetwo = 360 + huetwo;
}
if(huethree < 0) {
huethree = 360 + huethree;
}
for(var j in lightness_values) {
if(true) {
var saturation = saturation_values[j];
palette["Primary" + j] = HSL_TO_RGB(hue, saturation, lightness_values[j]);
palette["Secondary" + j] = HSL_TO_RGB(huetwo, saturation, lightness_values[j]);
palette["Tertiary" + j] = HSL_TO_RGB(huethree, saturation, lightness_values[j]);
}
}
palette.Background = HSL_TO_RGB(hue, saturation, 0.92);
palette.Foreground = HSL_TO_RGB(hue, saturation, 0.08);
palette.ColorPaletteParameters = ["HSL([", hue, "|", seed, "], [", saturation_values.Pale, "|",
saturation_values.Light, "|", saturation_values.Mid, "|", saturation_values.Dark, "],",
"[", dark, "|", mid, "|", light, "|", pale, "])"].join("");
// construct new ColorPalette
var text = ["/*{{{*/\n"];
var colorcode;
for(var id in palette) {
if(true) {
var color = palette[id];
colorcode = outputRGB ? color.toRGBString() : color.toString();
text.push("%0: %1\n".format(id, colorcode));
}
}
text.push("/*}}}*/");
text = text.join("");
if(save) {
macro.saveColorPalette(text);
}
return text;
},
saveColorPalette: function(text) {
var tid = store.getTiddler("ColorPalette");
if(!tid) {
tid = new Tiddler("ColorPalette");
tid.fields = merge({}, config.defaultCustomFields);
} // TODO: detect that the ColorPalette in the space comes from outside recipe
tid.fields["server.page.revision"] = "false"; // edit conflicts dont matter
// save the color palette in tid
tid = store.saveTiddler(tid.title, tid.title, text, tid.modifier, tid.modified,
tid.tags, tid.fields, false, tid.created, tid.creator);
// an interval is used to cope with users clicking on the palette button quickly.
if(macro._nextSave) {
window.clearTimeout(macro._nextSave);
}
macro._nextSave = window.setTimeout(function() {
autoSaveChanges(null, [tid]);
}, 2000);
// temporary workaround for IE.
$.twStylesheet.remove({ id: "StyleSheetColors" });
$.twStylesheet.remove({ id: "StyleSheet" });
refreshAll();
macro.reportChange();
return tid;
},
reportChange: function() {
if(macro.messagesOn) { // only display message once..
var msgPlace = getMessageDiv();
if(!$(".changedPalette", msgPlace)[0]) {
var tempPlace = document.createElement("div");
wikify("{{changedPalette{" + macro.changedPaletteText + "}}}", tempPlace);
msgPlace.appendChild(tempPlace);
}
}
}
};
var btnMacro = config.macros.RandomColorPaletteButton = {
text: "New ColorPalette",
tooltip: "Generate a random colour scheme for your TiddlyWiki",
makeButton: function(place, options) {
var btnHandler = function(ev) {
var t = $(ev.target);
var options = t.data("options");
macro.generatePalette(options, true);
ev.preventDefault();
return false;
};
var btn = createTiddlyButton(place, this.text, this.tooltip, btnHandler);
$(btn).data("options", options);
return btn;
},
handler: function(place, macroName, params, wikifier, paramString, tiddler) {
var options = macro.getOptions(paramString);
btnMacro.makeButton(place, options);
}
};
})(jQuery);
//}}}
booked to thailand for honeymoon
!URL
http://programming-motherfucker.com/
!Description
We are a community of motherfucking programmers who have been humiliated by software development methodologies for years.
!Notes
Do you speak it?
!URL
https://coral.dev.java.net/
!Description
JEE serverside tiddlywiki
//This is part of an email in response to a London resident who rather despises it but wondered how the rest of us in the thread reached our similar opinions. How we came to be in England was a relevant piece. We've acknowledged elsewhere in the conversation that everything sucks everywhere, so its not like we expect much better elsewhere. England is just especially egregious on some factors.//
----
I was born in England of English parents but was raised in the US from two months on. I came back here to be with family in late 2007 and for the first year benefitted from the kindness of Russ and lived in his Oxford flat. I work as a contract software designer and developer, mostly with BT's "open source innovation" group.
I'm supposed to go into London fairly often to meet up with the group, but try to avoid it because London makes me ill, literally. While its not happening, it's a convenient excuse, while it is, it is a bit of a problem: I come home from days in London with breathing difficulties and spend the next day exhausted and deflated. I'm assuming it is particulates of some kind.
I live in a little village out in West Berkshire where because most people commute to London the housing prices are just crazy.
London in particular, southern England in general, is dirty, crowded, rude, dangerous and expensive with an exceptionally high cost of living for a quality of life that is dismal if your definition of fun is something other than getting drunk off your ass.
I struggle to explain this to my US friends who have been infected by the rom coms and other tourist propaganda. Even when they visit they don't quite see it because they aren't living it, they're just visiting. Some of the more savvy do go home, look in their bank accounts, and wonder "what the hell happened?"
My mother, who is still back in the states, tells me that I'm not going the right places and spending time with the right people. There may be some truth to this, but I think she underestimates how hard it is to get to the right places and how many of the wrong people you have to pass through to get there. Nevermind how much money is involved.
That's probably the real killer for me: the cost::value disparity. I think it's come up before with this group. You spend multiple star prices to get dismal quality and service. To get truly good quality and service you have to spend a fortune.
Which of course you don't have because all the money is already spent.
*{margin:0;padding:0;}a{-webkit-tap-highlight-color:rgba(0,0,0,0);}body{overflow-x:hidden;-webkit-user-select:none;-webkit-text-size-adjust:none;font-family:Helvetica;-webkit-perspective:800;-webkit-transform-style:preserve-3d;}.selectable,input,textarea{-webkit-user-select:auto;}body>*{-webkit-backface-visibility:hidden;-webkit-box-sizing:border-box;display:none;position:absolute;left:0;width:100%;-webkit-transform:translate3d(0,0,0) rotate(0) scale(1);min-height:420px!important;}body.fullscreen>*{min-height:460px!important;}body.fullscreen.black-translucent>*{min-height:480px!important;}body.landscape>*{min-height:320px;}body>.current{display:block!important;}.in,.out{-webkit-animation-timing-function:ease-in-out;-webkit-animation-duration:350ms;}.slide.in{-webkit-animation-name:slideinfromright;}.slide.out{-webkit-animation-name:slideouttoleft;}.slide.in.reverse{-webkit-animation-name:slideinfromleft;}.slide.out.reverse{-webkit-animation-name:slideouttoright;}@-webkit-keyframes slideinfromright{from{-webkit-transform:translateX(100%);}to{-webkit-transform:translateX(0);}}@-webkit-keyframes slideinfromleft{from{-webkit-transform:translateX(-100%);}to{-webkit-transform:translateX(0);}}@-webkit-keyframes slideouttoleft{from{-webkit-transform:translateX(0);}to{-webkit-transform:translateX(-100%);}}@-webkit-keyframes slideouttoright{from{-webkit-transform:translateX(0);}to{-webkit-transform:translateX(100%);}}@-webkit-keyframes fadein{from{opacity:0;}to{opacity:1;}}@-webkit-keyframes fadeout{from{opacity:1;}to{opacity:0;}}.fade.in{z-index:10;-webkit-animation-name:fadein;}.fade.out{z-index:0;}.dissolve.in{-webkit-animation-name:fadein;}.dissolve.out{-webkit-animation-name:fadeout;}.flip{-webkit-animation-duration:.65s;}.flip.in{-webkit-animation-name:flipinfromleft;}.flip.out{-webkit-animation-name:flipouttoleft;}.flip.in.reverse{-webkit-animation-name:flipinfromright;}.flip.out.reverse{-webkit-animation-name:flipouttoright;}@-webkit-keyframes flipinfromright{from{-webkit-transform:rotateY(-180deg) scale(.8);}to{-webkit-transform:rotateY(0) scale(1);}}@-webkit-keyframes flipinfromleft{from{-webkit-transform:rotateY(180deg) scale(.8);}to{-webkit-transform:rotateY(0) scale(1);}}@-webkit-keyframes flipouttoleft{from{-webkit-transform:rotateY(0) scale(1);}to{-webkit-transform:rotateY(-180deg) scale(.8);}}@-webkit-keyframes flipouttoright{from{-webkit-transform:rotateY(0) scale(1);}to{-webkit-transform:rotateY(180deg) scale(.8);}}.slideup.in{-webkit-animation-name:slideup;z-index:10;}.slideup.out{-webkit-animation-name:dontmove;z-index:0;}.slideup.out.reverse{z-index:10;-webkit-animation-name:slidedown;}.slideup.in.reverse{z-index:0;-webkit-animation-name:dontmove;}@-webkit-keyframes slideup{from{-webkit-transform:translateY(100%);}to{-webkit-transform:translateY(0);}}@-webkit-keyframes slidedown{from{-webkit-transform:translateY(0);}to{-webkit-transform:translateY(100%);}}@-webkit-keyframes dontmove{from{opacity:1;}to{opacity:1;}}.swap{-webkit-transform:perspective(800);-webkit-animation-duration:.7s;}.swap.out{-webkit-animation-name:swapouttoleft;}.swap.in{-webkit-animation-name:swapinfromright;}.swap.out.reverse{-webkit-animation-name:swapouttoright;}.swap.in.reverse{-webkit-animation-name:swapinfromleft;}@-webkit-keyframes swapouttoright{0%{-webkit-transform:translate3d(0px,0px,0px) rotateY(0deg);-webkit-animation-timing-function:ease-in-out;}50%{-webkit-transform:translate3d(-180px,0px,-400px) rotateY(20deg);-webkit-animation-timing-function:ease-in;}100%{-webkit-transform:translate3d(0px,0px,-800px) rotateY(70deg);}}@-webkit-keyframes swapouttoleft{0%{-webkit-transform:translate3d(0px,0px,0px) rotateY(0deg);-webkit-animation-timing-function:ease-in-out;}50%{-webkit-transform:translate3d(180px,0px,-400px) rotateY(-20deg);-webkit-animation-timing-function:ease-in;}100%{-webkit-transform:translate3d(0px,0px,-800px) rotateY(-70deg);}}@-webkit-keyframes swapinfromright{0%{-webkit-transform:translate3d(0px,0px,-800px) rotateY(70deg);-webkit-animation-timing-function:ease-out;}50%{-webkit-transform:translate3d(-180px,0px,-400px) rotateY(20deg);-webkit-animation-timing-function:ease-in-out;}100%{-webkit-transform:translate3d(0px,0px,0px) rotateY(0deg);}}@-webkit-keyframes swapinfromleft{0%{-webkit-transform:translate3d(0px,0px,-800px) rotateY(-70deg);-webkit-animation-timing-function:ease-out;}50%{-webkit-transform:translate3d(180px,0px,-400px) rotateY(-20deg);-webkit-animation-timing-function:ease-in-out;}100%{-webkit-transform:translate3d(0px,0px,0px) rotateY(0deg);}}.cube{-webkit-animation-duration:.55s;}.cube.in{-webkit-animation-name:cubeinfromright;-webkit-transform-origin:0 50%;}.cube.out{-webkit-animation-name:cubeouttoleft;-webkit-transform-origin:100% 50%;}.cube.in.reverse{-webkit-animation-name:cubeinfromleft;-webkit-transform-origin:100% 50%;}.cube.out.reverse{-webkit-animation-name:cubeouttoright;-webkit-transform-origin:0 50%;}@-webkit-keyframes cubeinfromleft{from{-webkit-transform:rotateY(-90deg) translateZ(320px);opacity:.5;}to{-webkit-transform:rotateY(0deg) translateZ(0);opacity:1;}}@-webkit-keyframes cubeouttoright{from{-webkit-transform:rotateY(0deg) translateX(0);opacity:1;}to{-webkit-transform:rotateY(90deg) translateZ(320px);opacity:.5;}}@-webkit-keyframes cubeinfromright{from{-webkit-transform:rotateY(90deg) translateZ(320px);opacity:.5;}to{-webkit-transform:rotateY(0deg) translateZ(0);opacity:1;}}@-webkit-keyframes cubeouttoleft{from{-webkit-transform:rotateY(0deg) translateZ(0);opacity:1;}to{-webkit-transform:rotateY(-90deg) translateZ(320px);opacity:.5;}}.pop{-webkit-transform-origin:50% 50%;}.pop.in{-webkit-animation-name:popin;z-index:10;}.pop.out.reverse{-webkit-animation-name:popout;z-index:10;}.pop.in.reverse{z-index:0;-webkit-animation-name:dontmove;}@-webkit-keyframes popin{from{-webkit-transform:scale(.2);opacity:0;}to{-webkit-transform:scale(1);opacity:1;}}@-webkit-keyframes popout{from{-webkit-transform:scale(1);opacity:1;}to{-webkit-transform:scale(.2);opacity:0;}}
<<<
Sausage is a jQuery UI widget for contextual pagination.
<<<
[[sausage.js|http://christophercliff.github.com/sausage/]]
ZOMG we are the proud new owners of a tumble dryer.
!URL
http://www.nytimes.com/2011/05/21/opinion/21nocera.html?_r=2&hp
!Description
The LinkedIn deal suggests something darker. The crisis hasn’t changed them a bit. They’re still just in it for themselves.
!Notes
How many times do people need to write things like this before people start changing the global financial institutions. They don't provide a service, they provide a scam.
!URL
http://howtosavetheworld.ca/2011/11/05/the-metamovements-message-were-not-buying-it-any-more/
!Description
worked very hard to shift the entire economy from a production one that depends on dedicated and thoughtful labour and innovation, to a financial one that depends on endless increases in spending and indebtedness, where wealth comes not from making anything useful but from the mere printing of money and the perpetuation of the illusion that only money — not anything else, not work, not love, not collaboration, not citizens’ health or well-being, not people at all — has value
User-agent: *
Disallow: /bags/*/tiddlers.wiki
Disallow: /recipes/*/tiddlers.wiki
Disallow: /*/revisions
!URL
http://blog.kissmetrics.com/beginners-guide-to-landing-pages/
!Description
Landing pages need to be greatly simplified compared to many other website designs. This is because landing pages have very specific goals and shouldn’t include any extraneous information that might distract your visitors and prevent them from converting.
!URL
http://www.youtube.com/watch?v=kDd6fwUgJIE
!Description
<html>
<head>
<title>Friends</title>
<style type='text/css'>
.friend.active {
margin-right: -40px;
-webkit-box-shadow: 10px 10px 10px #555;
}
.friend:hover {
-webkit-box-shadow: 5px 5px 5px #ccc;
margin-right: -10px;
}
.friend a.tiddlers {
display: block;
}
.friend {
-webkit-transition: max-height,margin-right 0.2s ease-in;
padding: 10px;
background-color: white;
}
ul {
list-style: none;
}
ul .friend {
border-bottom: solid 1px black;
cursor: pointer;
}
ul .friend .tiddler {
margin-left: 10px;
margin-bottom: 30px;
padding: 10px;
border: dotted 2px #CCC;
color: #006100;
}
textarea {
width: 100%;
height: 150px;
}
.friend h2 {
display: inline-block;
}
button {
display: inline-block;
}
.inactiveFriend {
background-color: #ccc;
max-height: 10px;
overflow: hidden;
opacity: 0.1;
}
.inactiveFriend:hover {
max-height: 200px;
opacity: 1;
}
#friends {
position: relative;
width: 20%;
float: left;
background-color: white;
}
#message {
display: block;
padding: 20px;
background-color: white;
margin-bottom: 10px;
border-bottom: solid 3px #CCC;
}
#message.error {
border-bottom: solid 3px red;
color: #900;
font-weight: bold;
}
</style>
<link rel="stylesheet" href="/bags/common/tiddlers/profile.css" type="text/css">
</head>
<body>
<div id="message"></div>
<div id='friends' class="section">loading...</div>
<div id="container">
<div id="header">
<h1>Your friends</h1>
</div>
<noscript>
javascript is required to see friend's activity
</noscript>
<div id="displayArea" class="main section"></div>
</div>
<script src="/bags/common/tiddlers/jquery.js" type="text/javascript" charset="utf-8"></script>
<script src="/bags/common/tiddlers/jquery-json.js" type="text/javascript" charset="utf-8"></script>
<script src="/bags/tiddlyspace/tiddlers/chrjs" type="text/javascript" charset="utf-8"></script>
<script type='text/javascript' src='/friendjs'></script>
</body>
</html>
!URL
http://www.computerworld.com/s/article/9217863/Cerf_Streaming_network_crunch_could_be_eliminated
!Description
"It actually puts less stress on the network to have the higher speed of operation," he said.
!Notes
Um, duh? Cool, yes, let's do it. But, duh?
onsighted all the new vb-v2 problems at [[rcc]] this morning
!URL
http://www.v-outdoor.co.uk/products/climbing_mountaineering/peak_district_climbing.php
!Description
potentially good guidebook for the easier stuff in the peak district
!URL
http://www.readwriteweb.com/archives/creator_of_instant_messaging_protocol_to_launch_ap.php
!Description
Here's how The Locker Project will work. Users will be able to download the data capture and storage code and run it on their own server, or sign up for hosted service - like WordPress.org and WordPress.com.
!Notes
[[IBOC]] ish
most wedding invites sent out today
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="364 157 64 51" width="30" height="30"><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><g><path class="glyph" d="M 364.50006 184.50061 L 386.99985 207.00037 L 396 198.00002 L 373.50003 175.50066 Z M 403.02295 181.97704 C 400.38693 179.34099 396.11307 179.34099 393.47702 181.97704 C 390.841 184.61307 390.841 188.88695 393.47702 191.52298 C 396.11307 194.15903 400.38693 194.15903 403.02295 191.52298 C 405.65906 188.88695 405.65906 184.61307 403.02295 181.97704 M 414.27298 170.72704 C 411.63693 168.091 407.36307 168.091 404.72702 170.72704 C 402.091 173.36308 402.091 177.63693 404.72702 180.27296 C 407.36307 182.90901 411.63693 182.90901 414.27298 180.27296 C 416.90903 177.63693 416.90903 173.36308 414.27298 170.72704 M 425.523 159.47705 C 422.88696 156.841 418.6131 156.841 415.97705 159.47705 C 413.341 162.11308 413.341 166.38695 415.97705 169.02295 C 418.6131 171.65903 422.88696 171.65903 425.523 169.02295 C 428.15906 166.38695 428.15906 162.11308 425.523 159.47705" fill="#020202"/></g></g></svg>
'Why open that can?' Because that's what it says on my label: Can Opener.