X-Git-Url: http://git.bytex64.net/?a=blobdiff_plain;f=www%2Fjs%2Fblerg.js;h=d227a7a0e5f24f875ec7acf2b697d201f8d3fe8a;hb=d4ad5c4cff7183fdbac1c47f3ab0fa1db204397b;hp=9b1db74f346ba316edc5eb3a0d2bb8a03dcce7a1;hpb=a2ca84770dd9230c1c6d4e2f08b0d3638604d99a;p=blerg.git diff --git a/www/js/blerg.js b/www/js/blerg.js index 9b1db74..d227a7a 100644 --- a/www/js/blerg.js +++ b/www/js/blerg.js @@ -5,7 +5,7 @@ // Config var baseURL = ''; var recordTemplate = new Template( - '
'); if (pi != -1) { @@ -314,6 +330,28 @@ function mangleRecord(record, template) { l = l.replace(/^>\s*/, ''); } } + + // Sanitize HTML input + l = l.replace(/&/g, '&').replace(//g, '>'); + + // Turn HTTP URLs into links + l = l.replace(/(\s|^)(https?:\/\/[a-zA-Z0-9.-]*[a-zA-Z0-9](\/([^\s"]*[^.!,;?()\s])?)?)/g, '$1$2'); + + // Turn markdown links into links + l = l.replace(/(\s|^)\[([^\]]+)\]\((https?:\/\/[a-zA-Z0-9.-]*[a-zA-Z0-9](\/[^)"]*?)?)\)/g, '$1$2'); + + // Turn *foo* into italics and **foo** into bold + l = l.replace(/([^\w\\]|^)\*\*(\w[^*]*)\*\*(\W|$)/g, '$1$2$3'); + l = l.replace(/([^\w\\]|^)\*(\w[^*]*)\*(\W|$)/g, '$1$2$3'); + + // Remove backslashes from escaped metachars + l = l.replace(/\\([*\[\]])/g, '$1'); + + // Turn refs and tags into links + l = l.replace(/(\s|^)#([A-Za-z0-9_-]+)/g, '$1#$2'); + l = l.replace(/(\s|^)@([A-Za-z0-9_-]+)/g, '$1@$2'); + + // Create lists when lines begin with * if (l[0] == '*') { if (!listMode) { var pi = out.lastIndexOf('
'); @@ -324,33 +362,18 @@ function mangleRecord(record, template) { out.push('
') out.pop(); + if (listMode) + out.push(''); record.data = out.join(''); record.date = (new Date(record.timestamp * 1000)).toString(); @@ -407,6 +432,7 @@ function Tag(type, tag) { }); this.addItems(j); this.pageStart = j.length - 1; + this.itemCount = j.length; } this.displayItems(); }.bind(this), @@ -438,6 +464,7 @@ Tag.prototype.show = function() { // Pager for browsing subscription feeds function Feed() { this.initPager(); + this.username = loginStatus.username; this.baseFrag = '/feed'; new Ajax.Request(baseURL + '/feed', { @@ -455,6 +482,7 @@ function Feed() { }); this.addItems(response); this.pageStart = response.length - 1; + this.itemCount = response.length; } this.displayItems(); }.bind(this), @@ -641,7 +669,7 @@ function loadLatest() { j.tags.each(function(v) { var a = new Element('a', {href: '/#/tag/' + v}); a.insert('#' + v); - a.onclick = qlink; + a.onclick = "return qlink()"; a.className = 'ref'; $('latest-tags').insert(a); $('latest-tags').appendChild(document.createTextNode(' ')); @@ -662,8 +690,8 @@ function loadLatest() { function qlink(loc) { if (loc) { location.hash = loc; - } else if (this.href) { - location.hash = this.href; + } else if (event && event.target) { + location.href = event.target.href; } else { // Bogus qlink return; @@ -678,18 +706,29 @@ function hashSwitch() { if (m = location.search.match(/^\?post\/([^/]+)\/(.+)/)) { $('post').show(); $('post.content').value = '[' + decodeURIComponent(m[1]).replace(']','').replace('[','') + '](' + decodeURIComponent(m[2]) + ')'; - } else if (m = location.hash.match(/^#\/(ref|tag)\/([A-Za-z0-9_-]+)$/)) { - currentPager = new Tag(m[1], m[2]); + } else if (m = location.hash.match(/^#\/(ref|tag)\/([A-Za-z0-9_-]+)(?:\/p(\d+))?$/)) { + if (!currentPager || !(currentPager instanceof Tag) || currentPager.type != m[1] || currentPager.tag != m[2]) + currentPager = new Tag(m[1], m[2]); currentPager.show(); - } else if (m = location.hash.match(/^#\/feed/)) { + + if (m[3]) { + var r = parseInt(m[3]); + currentPager.showPageAt(r); + } + } else if (m = location.hash.match(/^#\/feed(?:\/p(\d+))?$/)) { if (loginStatus.loggedIn) { - currentPager = new Feed(); + if (!currentPager || !(currentPager instanceof Feed) || currentPager.username != loginStatus.username) + currentPager = new Feed(); currentPager.show(); + if (m[3]) { + var r = parseInt(m[3]); + currentPager.showPageAt(r); + } } else { location.href = baseURL; } } else if (m = location.hash.match(/^#([A-Za-z0-9_-]+)(?:\/(p)?(\d+))?$/)) { - if (!currentPager || currentPager.username != m[1]) + if (!currentPager || !(currentPager instanceof User) || currentPager.username != m[1]) currentPager = new User(m[1]); currentPager.show(); loginStatus.update(); @@ -701,10 +740,8 @@ function hashSwitch() { } else { currentPager.showRecord(r); } - } else { - currentPager.pageStart = currentPager.itemCount - 1; - currentPager.loadItems(); } + // Do nothing otherwise, the User constructor takes care of it } else { $$('[name=section]').each(function(v) { v.update('Welcome') }); $('signup').hide(); @@ -737,7 +774,7 @@ function init() { setInterval(hashCheck, 250); document.body.observe('keyup', function(event) { - if (event.shiftKey && event.keyCode == '32') { + if (event.shiftKey && event.keyCode == 32) { postPopup(); event.stop(); }