X-Git-Url: http://git.bytex64.net/?a=blobdiff_plain;f=www%2Fjs%2Fblerg.js;h=d227a7a0e5f24f875ec7acf2b697d201f8d3fe8a;hb=d4ad5c4cff7183fdbac1c47f3ab0fa1db204397b;hp=713f5f177a814b95a94a652475a97212ed766f9b;hpb=c75a75b8c56f80e9364fcbe0b88a2b432f15bc75;p=blerg.git diff --git a/www/js/blerg.js b/www/js/blerg.js index 713f5f1..d227a7a 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!'); @@ -185,18 +184,29 @@ Pager.prototype.displayItems = function() { 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) { 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)); + } } @@ -234,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) }); @@ -254,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; @@ -270,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(); @@ -329,8 +341,11 @@ function mangleRecord(record, template) { 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'); + 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'); @@ -348,12 +363,12 @@ function mangleRecord(record, template) { endpush = ''; } - // Create headers when lines begin with = - if (l[0] == '=') { - var m = l.match(/^(=+)/); + // Create headers when lines begin with = or # + if (l[0] == '=' || l[0] == '#') { + var m = l.match(/^([=#]+)/); var depth = m[1].length; if (depth <= 5) { - l = l.replace(/^=+\s*/, '').replace(/\s*=+$/, ''); + l = l.replace(/^[=#]+\s*/, '').replace(/\s*[=#]+$/, ''); out.push(''); endpush = ''; } @@ -692,7 +707,7 @@ function hashSwitch() { $('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_-]+)(?:\/p(\d+))?$/)) { - if (!currentPager || currentPager.type != m[1] || currentPager.tag != m[2]) + if (!currentPager || !(currentPager instanceof Tag) || currentPager.type != m[1] || currentPager.tag != m[2]) currentPager = new Tag(m[1], m[2]); currentPager.show(); @@ -702,7 +717,7 @@ function hashSwitch() { } } else if (m = location.hash.match(/^#\/feed(?:\/p(\d+))?$/)) { if (loginStatus.loggedIn) { - if (!currentPager || currentPager.username != loginStatus.username) + if (!currentPager || !(currentPager instanceof Feed) || currentPager.username != loginStatus.username) currentPager = new Feed(); currentPager.show(); if (m[3]) { @@ -713,7 +728,7 @@ function hashSwitch() { 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(); @@ -725,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();