X-Git-Url: http://git.bytex64.net/?a=blobdiff_plain;f=www%2Fjs%2Fblerg.js;h=3c4cc0ed1040439a60a9122604df9af90889f3fa;hb=839ecb35df4dba3ab86bfa45cc8135c59a58fcce;hp=9b1db74f346ba316edc5eb3a0d2bb8a03dcce7a1;hpb=a2ca84770dd9230c1c6d4e2f08b0d3638604d99a;p=blerg.git diff --git a/www/js/blerg.js b/www/js/blerg.js index 9b1db74..3c4cc0e 100644 --- a/www/js/blerg.js +++ b/www/js/blerg.js @@ -5,7 +5,7 @@ // Config var baseURL = ''; var recordTemplate = new Template( - '
#{data}
Posted #{date}
' + '
#{data}
Posted #{date}. [permalink]
' ); var tagRecordTemplate = new Template( '
#{data}
Posted by @#{author} on #{date}
' @@ -111,8 +111,7 @@ LoginStatus.prototype.post = function(msg) { qlink(this.username); } else { currentPager.itemCount++; - currentPager.pageStart = null; - currentPager.loadItems(); + currentPager.reload(); } } else { alert('Post failed!'); @@ -181,19 +180,33 @@ Pager.prototype.displayItems = function() { } else { $('older_link').hide(); } + + document.body.scrollTo(); +} + +Pager.prototype.reload = function() { + this.pageStart = null; + this.loadItems(null, null, Pager.prototype.showPageAt.bind(this, this.itemCount - 1)); } Pager.prototype.showPageAt = function(r) { - if (this.itemCache[r] && this.itemCache[r - 9]) { + var end = (r - 9 > 0 ? r - 9 : 0); + if (this.itemCache[r] && this.itemCache[end]) { this.pageStart = r; this.displayItems(); } else { - this.loadItems((r >= 49 ? r - 49 : 0), r); + this.loadItems((r >= 49 ? r - 49 : 0), r, Pager.prototype.showPageAt.bind(this, r)); } } Pager.prototype.showRecord = function(r) { - this.showPageAt(r); + if (this.itemCache[r]) { + $('older_link').hide(); + $('newer_link').hide(); + items.update(this.itemCache[r].html); + } else { + this.loadItems(r, r, Pager.prototype.showRecord.bind(this, r)); + } } @@ -231,7 +244,8 @@ function User(username) { var j = r.responseText.evalJSON(); if (j) { this.itemCount = parseInt(j.record_count); - this.displayItems(); + if (!this.pageStart) + this.showPageAt(this.itemCount - 1); } }.bind(this) }); @@ -251,7 +265,7 @@ User.prototype.show = function() { $('usercontrols').show(); } -User.prototype.loadItems = function(from, to) { +User.prototype.loadItems = function(from, to, continuation) { var url; if (from != undefined && to != undefined) { url = baseURL + '/get/' + this.username + '/' + from + '-' + to; @@ -267,13 +281,14 @@ User.prototype.loadItems = function(from, to) { if (records && records.length > 0) { records.each(function(v) { v.id = v.record; + v.author = this.username; mangleRecord(v, recordTemplate); - }); + }.bind(this)); this.addItems(records); if (!this.pageStart) this.pageStart = records[0].recInt; } - this.displayItems(); + continuation(); }.bind(this), onFailure: function(r) { this.displayItems(); @@ -307,6 +322,7 @@ function mangleRecord(record, template) { return; } + // Put quoted material into a special paragraph if (l[0] == '>') { var pi = out.lastIndexOf('

'); 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,6 +362,8 @@ function mangleRecord(record, template) { out.push('

  • '); endpush = '
  • '; } + + // Create headers when lines begin with = if (l[0] == '=') { var m = l.match(/^(=+)/); var depth = m[1].length; @@ -334,23 +374,6 @@ function mangleRecord(record, template) { } } - // 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(/(\s)\*\*([^*]+)\*\*(\s)/g, '$1$2$3'); - l = l.replace(/(\s)\*([^*]+)\*(\s)/g, '$1$2$3'); - - // 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'); - out.push(l); if (endpush) { out.push(endpush); @@ -361,6 +384,8 @@ function mangleRecord(record, template) { }); while (out[out.length - 1] == '
    ' || out[out.length - 1] == '

    ') 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(); }