Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*jslint vars: true, unparam: true, white: true */
- /*global jQuery, tiddlyspy, Showdown */
- tiddlyspy.ui = (function($, ts, Showdown) {
- "use strict";
- ts.renderers = {
- "text/x-markdown": (new Showdown.converter()).makeHtml
- };
- var ui = {};
- var onEntityClick, onLinkClick;
- ui.loadPage = function(page) {
- if(page.tiddler) {
- ui.displayTiddler(page.tiddler);
- } else if(page.list) {
- ui.listTiddlers(ts.store.tiddlers); // TODO: simply restore (unhide) existing elements
- }
- };
- ui.listTiddlers = function(tiddlers) {
- // sort (case-insensitive) -- XXX: inefficient!?
- var ordered = $.map(tiddlers, function(tid, id) {
- return [[id, tid]]; // nested array prevents flattening
- }).sort(function(a, b) {
- var x = a[1].title.toLowerCase();
- var y = b[1].title.toLowerCase();
- return ((x < y) ? -1 : ((x > y) ? 1 : 0));
- });
- // generate list
- var els = $.map(ordered, function(arr, i) {
- var id = arr[0];
- var tid = arr[1];
- var link = $("<a />").attr("href", tid.uri).text(tid.title)
- .data("id", id).click(onEntityClick); // TODO: s/click/live/ for efficiency
- return $("<li />").append(link)[0];
- });
- // render
- $("#tiddler_view").hide(); // XXX: hardcoded selector -- XXX: breaks encapsulation
- $("#tiddler_index").empty().append(els).show(); // XXX: hardcoded selector
- ts.history.push({ list: "all" });
- };
- ui.displayTiddler = function(id) {
- var tid = ts.store.get(id);
- $("#tiddler_index").hide(); // XXX: hardcoded selector -- XXX: breaks encapsulation
- var el = $("#tiddler_view"); // XXX: hardcoded selector
- var renderer = ts.renderers[tid.type];
- if(renderer) {
- el.html(renderer(tid.text)).show();
- $("a", el).data("srcBag", tid.bag.name).live("click", onLinkClick);
- } else {
- el.text(tid.text).show();
- }
- $("<a />").attr("href", tid.uri).text("link").prependTo(el);
- ts.history.push({ tiddler: id });
- };
- onEntityClick = function(ev) { // TODO: rename
- var id = $(this).data("id");
- ui.displayTiddler(id);
- ev.preventDefault();
- return false;
- };
- onLinkClick = function(ev) { // TODO: rename
- var el = $(this),
- target = el.attr("href"),
- bag = el.data("srcBag"), // XXX: this gets lost when repeatedly following internal links
- candidates = ts.store.titles[target], // XXX: should use accessor?
- tid, i;
- // select matching tiddler from the same bag if available, using last
- // candidate as fallback -- XXX: overly simplistic?
- for(i = 0; i < candidates.length; i++) {
- tid = candidates[i];
- if(tid.bag === bag) {
- break;
- }
- }
- if(tid) { // XXX: what if tiddler only exists remotely?
- ui.displayTiddler(tid.bag.name + "/" + tid.title); // XXX: might be more efficient to pass `tid` directly
- ev.preventDefault();
- }
- };
- return ui;
- }(jQuery, tiddlyspy, Showdown));
Add Comment
Please, Sign In to add comment