X-Git-Url: http://git.bytex64.net/?a=blobdiff_plain;f=www%2Fjs%2Fblerg.js;h=6d555b8868058767eaa942c5af84b623a825c443;hb=21db04ef3e4f66d7b5c4c9be2be36703b18cbcaa;hp=9b1db74f346ba316edc5eb3a0d2bb8a03dcce7a1;hpb=a2ca84770dd9230c1c6d4e2f08b0d3638604d99a;p=blerg.git diff --git a/www/js/blerg.js b/www/js/blerg.js index 9b1db74..6d555b8 100644 --- a/www/js/blerg.js +++ b/www/js/blerg.js @@ -5,13 +5,13 @@ // Config var baseURL = ''; var recordTemplate = new Template( - '
');
if (pi != -1) {
@@ -314,6 +396,44 @@ 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
+ var re;
+
+ // Craft a regex that finds URLs that end in the extensions specified by BlergMedia.audioExtensions.
+ re = new RegExp('(\\s|^)\\[([^\\]]+)\\]\\((https?:\\/\\/[a-zA-Z0-9.-]*[a-zA-Z0-9]\\/[^)"]*?\\.(' + BlergMedia.audioExtensions.join('|') + '))\\)', 'g');
+ l = l.replace(re, '$1$2 ');
+
+ // Ditto, but use the extended markdown link syntax to specify the format
+ re = new RegExp('(\\s|^)\\[([^\\]]+)\\]\\((https?:\\/\\/[a-zA-Z0-9.-]*[a-zA-Z0-9](\\/[^)"]*?)?)\\s+audio:(' + BlergMedia.audioExtensions.join('|') + ')\\)', 'g');
+ l = l.replace(re, '$1$2
');
+
+ // Craft a regex that finds URLs that end in the extensions specified by BlergMedia.videoExtensions.
+ re = new RegExp('(\\s|^)\\[([^\\]]+)\\]\\((https?:\\/\\/[a-zA-Z0-9.-]*[a-zA-Z0-9]\\/[^)"]*?\\.(' + BlergMedia.videoExtensions.join('|') + '))\\)', 'g');
+ l = l.replace(re, '$1$2
');
+
+ // Ditto, but use the extended markdown link syntax to specify the format
+ re = new RegExp('(\\s|^)\\[([^\\]]+)\\]\\((https?:\\/\\/[a-zA-Z0-9.-]*[a-zA-Z0-9](\\/[^)"]*?)?)\\s+video:(' + BlergMedia.videoExtensions.join('|') + ')\\)', 'g');
+ l = l.replace(re, '$1$2
');
+
+ // Regular markdown 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');
+
+ // 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_-]+)(\/\d+)?/g, '$1@$2');
+
+ // Create lists when lines begin with *
if (l[0] == '*') {
if (!listMode) {
var pi = out.lastIndexOf('
'); @@ -324,32 +444,20 @@ function mangleRecord(record, template) { out.push('
') out.pop(); + if (listMode) + out.push(''); record.data = out.join(''); record.date = (new Date(record.timestamp * 1000)).toString(); @@ -373,27 +483,28 @@ function displayError(msg) { // Object for browsing tags -function Tag(type, tag) { - this.initPager(); - this.type = type; - this.tag = tag; +function Tag(m) { + Pager.call(this); + this.type = m[1]; + this.tag = m[2]; + this.pageStart = parseInt(m[3]); var url = baseURL + "/tag/"; - switch(type) { + switch(this.type) { case 'tag': //url += '%23'; url += 'H'; // apache is eating the hash, even encoded. Probably a security feature. - this.baseFrag = '/tag/' + tag; + this.baseFrag = '/tag/' + this.tag; break; case 'ref': url += '%40'; - this.baseFrag = '/ref/' + tag; + this.baseFrag = '/ref/' + this.tag; break; default: - alert('Invalid tag type: ' + type); + alert('Invalid tag type: ' + this.type); return; } - url += tag; + url += this.tag; new Ajax.Request(url, { method: 'get', @@ -406,7 +517,9 @@ function Tag(type, tag) { mangleRecord(v, tagRecordTemplate) }); this.addItems(j); - this.pageStart = j.length - 1; + if (!this.pageStart) + this.pageStart = j.length - 1; + this.itemCount = j.length; } this.displayItems(); }.bind(this), @@ -419,26 +532,33 @@ function Tag(type, tag) { Tag.prototype = new Pager(); Tag.prototype.constructor = Tag; +Tag.prototype.updateState = function(m) { + if (this.type != m[1] || this.tag != m[2]) + return false; + + this.pageStart = parseInt(m[3]) || this.itemCount - 1; + this.displayItems(); + + return true; +} + Tag.prototype.show = function() { + Pager.prototype.show.call(this); + var ctype = {ref: '@', tag: '#'}[this.type]; $$('[name=section]').each(function(v) { v.update(' about ' + ctype + this.tag); }.bind(this)); - $('welcome').hide(); - $('post').hide(); - $('older_link').hide(); - $('newer_link').hide(); - $('rss').hide(); - items.show(); - $('usercontrols').hide(); } // Pager for browsing subscription feeds -function Feed() { - this.initPager(); +function Feed(m) { + Pager.call(this); + this.username = loginStatus.username; this.baseFrag = '/feed'; + this.pageStart = parseInt(m[1]); new Ajax.Request(baseURL + '/feed', { method: 'post', @@ -454,7 +574,10 @@ function Feed() { mangleRecord(v, tagRecordTemplate) }); this.addItems(response); - this.pageStart = response.length - 1; + if (!this.pageStart) + this.pageStart = response.length - 1; + this.itemCount = response.length; + loginStatus.requestFeedStatus(); } this.displayItems(); }.bind(this), @@ -466,28 +589,31 @@ function Feed() { Feed.prototype = new Pager(); Feed.prototype.constructor = Feed; +Feed.prototype.updateState = function(m) { + this.pageStart = parseInt(m[1]) || this.itemCount - 1; + this.displayItems(); + + return true; +} + Feed.prototype.show = function() { + Pager.prototype.show.call(this); $$('[name=section]').each(function(v) { v.update(' ' + loginStatus.username + "'s spycam"); }.bind(this)); - $('welcome').hide(); - $('post').hide(); - $('older_link').hide(); - $('newer_link').hide(); - $('rss').hide(); - items.show(); - $('usercontrols').hide(); } -function postPopup() { - if (loginStatus.loggedIn) { +function postPopup(initial) { + if (loginStatus.loggedIn || initial) { var post = $('post'); if (post.visible()) { post.hide(); } else { post.show(); - if (currentPager.username && currentPager.username != loginStatus.username && !$('post.content').value) { + if (initial) { + $('post.content').value = initial; + } else if (!$('post.content').value && currentPager.username && currentPager.username != loginStatus.username) { $('post.content').value = '@' + currentPager.username + ': '; } $('post.content').focus(); @@ -518,7 +644,37 @@ function signup() { function signup_cancel() { $('signup').hide(); - hashSwitch(); + urlSwitch(); +} + +function passwd() { + var old_password = $('passwd.old_password').value; + var new_password = $('passwd.new_password').value; + + new Ajax.Request(baseURL + '/passwd', { + parameters: { + username: loginStatus.username, + password: old_password, + new_password: new_password + }, + onSuccess: function(r) { + if (r.responseJSON.status == 'success') { + alert('Password changed'); + passwd_cancel(); + } else { + alert('Password change failed. Your password has NOT been changed.'); + } + }, + onFailure: function(r) { + alert('Password change error'); + } + }); +} + +function passwd_cancel() { + $('passwd').hide(); + $('navigation').show(); + urlSwitch(); } function subscribe() { @@ -634,14 +790,15 @@ function stopTicker() { function loadLatest() { new Ajax.Request(baseURL + '/latest.json', { + method: 'GET', onSuccess: function(r) { var j = r.responseText.evalJSON(); $('latest-tags').update(); j.tags.each(function(v) { - var a = new Element('a', {href: '/#/tag/' + v}); + var a = new Element('a', {href: baseURL + '/#/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,87 +819,23 @@ 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; } - hashSwitch(); + lastHash = location.hash; + urlSwitch(); return false; } -function hashSwitch() { - var m; - stopTicker(); - 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]); - currentPager.show(); - } else if (m = location.hash.match(/^#\/feed/)) { - if (loginStatus.loggedIn) { - currentPager = new Feed(); - currentPager.show(); - } else { - location.href = baseURL; - } - } else if (m = location.hash.match(/^#([A-Za-z0-9_-]+)(?:\/(p)?(\d+))?$/)) { - if (!currentPager || currentPager.username != m[1]) - currentPager = new User(m[1]); - currentPager.show(); - loginStatus.update(); - - if (m[3]) { - var r = parseInt(m[3]); - if (m[2] == 'p') { - currentPager.showPageAt(r); - } else { - currentPager.showRecord(r); - } - } else { - currentPager.pageStart = currentPager.itemCount - 1; - currentPager.loadItems(); - } - } else { - $$('[name=section]').each(function(v) { v.update('Welcome') }); - $('signup').hide(); - items.update(); - items.hide(); - $('newer_link').hide(); - $('older_link').hide(); - $('welcome').show(); - $('rss').hide(); - $('usercontrols').hide(); - loadLatest(); - } +function ExternalURLPost(m) { + this.title = decodeURIComponent(m[1]).replace(']','').replace('[',''); + this.url = decodeURIComponent(m[2]); } -var lastHash; -function hashCheck() { - if (location.hash != lastHash) { - lastHash = location.hash; - hashSwitch(); - } -} - -function init() { - items = $('items'); - loginStatus = new LoginStatus(); - - lastHash = location.hash; - hashSwitch(); - - setInterval(hashCheck, 250); - - document.body.observe('keyup', function(event) { - if (event.shiftKey && event.keyCode == '32') { - postPopup(); - event.stop(); - } - }); - $('post.content').addEventListener('keyup', function(event) { - event.stopPropagation(); - }, true); +ExternalURLPost.prototype.show = function() { + $('post.content').value = '[' + this.title + '](' + this.url + ')'; + $('post').show(); }