Guest User

Untitled

a guest
Jan 23rd, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.65 KB | None | 0 0
  1. /*jslint vars: true, unparam: true, white: true */
  2. /*global jQuery, tiddlyspy, Showdown */
  3.  
  4. tiddlyspy.ui = (function($, ts, Showdown) {
  5.  
  6. "use strict";
  7.  
  8. ts.renderers = {
  9. "text/x-markdown": (new Showdown.converter()).makeHtml
  10. };
  11.  
  12. var ui = {};
  13. var onEntityClick, onLinkClick;
  14.  
  15. ui.loadPage = function(page) {
  16. if(page.tiddler) {
  17. ui.displayTiddler(page.tiddler);
  18. } else if(page.list) {
  19. ui.listTiddlers(ts.store.tiddlers); // TODO: simply restore (unhide) existing elements
  20. }
  21. };
  22.  
  23. ui.listTiddlers = function(tiddlers) {
  24. // sort (case-insensitive) -- XXX: inefficient!?
  25. var ordered = $.map(tiddlers, function(tid, id) {
  26. return [[id, tid]]; // nested array prevents flattening
  27. }).sort(function(a, b) {
  28. var x = a[1].title.toLowerCase();
  29. var y = b[1].title.toLowerCase();
  30. return ((x < y) ? -1 : ((x > y) ? 1 : 0));
  31. });
  32. // generate list
  33. var els = $.map(ordered, function(arr, i) {
  34. var id = arr[0];
  35. var tid = arr[1];
  36. var link = $("<a />").attr("href", tid.uri).text(tid.title)
  37. .data("id", id).click(onEntityClick); // TODO: s/click/live/ for efficiency
  38. return $("<li />").append(link)[0];
  39. });
  40. // render
  41. $("#tiddler_view").hide(); // XXX: hardcoded selector -- XXX: breaks encapsulation
  42. $("#tiddler_index").empty().append(els).show(); // XXX: hardcoded selector
  43. ts.history.push({ list: "all" });
  44. };
  45.  
  46. ui.displayTiddler = function(id) {
  47. var tid = ts.store.get(id);
  48.  
  49. $("#tiddler_index").hide(); // XXX: hardcoded selector -- XXX: breaks encapsulation
  50. var el = $("#tiddler_view"); // XXX: hardcoded selector
  51. var renderer = ts.renderers[tid.type];
  52. if(renderer) {
  53. el.html(renderer(tid.text)).show();
  54. $("a", el).data("srcBag", tid.bag.name).live("click", onLinkClick);
  55. } else {
  56. el.text(tid.text).show();
  57. }
  58.  
  59. $("<a />").attr("href", tid.uri).text("link").prependTo(el);
  60.  
  61. ts.history.push({ tiddler: id });
  62. };
  63.  
  64. onEntityClick = function(ev) { // TODO: rename
  65. var id = $(this).data("id");
  66. ui.displayTiddler(id);
  67. ev.preventDefault();
  68. return false;
  69. };
  70.  
  71. onLinkClick = function(ev) { // TODO: rename
  72. var el = $(this),
  73. target = el.attr("href"),
  74. bag = el.data("srcBag"), // XXX: this gets lost when repeatedly following internal links
  75. candidates = ts.store.titles[target], // XXX: should use accessor?
  76. tid, i;
  77. // select matching tiddler from the same bag if available, using last
  78. // candidate as fallback -- XXX: overly simplistic?
  79. for(i = 0; i < candidates.length; i++) {
  80. tid = candidates[i];
  81. if(tid.bag === bag) {
  82. break;
  83. }
  84. }
  85. if(tid) { // XXX: what if tiddler only exists remotely?
  86. ui.displayTiddler(tid.bag.name + "/" + tid.title); // XXX: might be more efficient to pass `tid` directly
  87. ev.preventDefault();
  88. }
  89. };
  90.  
  91. return ui;
  92.  
  93. }(jQuery, tiddlyspy, Showdown));
Add Comment
Please, Sign In to add comment