(function($, block) { // Entity formatters for use by tweet list var entity_formatters = { 'urls': function(e) { return '' + e.display_url + ''; }, 'user_mentions': function(e) { return '@'+e.screen_name+''; }, 'hashtags': function(e) { return '#' +e.text+''; }, 'default': function(e) { return '{ENTITY}'; } }; // processes entities for the given message and entity object var process_entities = function(message, entities) { // short-circuit failure mode if(typeof entities === 'undefined') { return message; } // build list of entities sorted on starting index var es = []; $.each(entities, function(t, ts) { $.each(ts, function(_, e) { e['type'] = t; es.push(e); }); }); es.sort(function(a,b) { return a['indices'][0] - b['indices'][0]; }); // process entities one-by-one in order of appearance var marker = 0; var result = ""; for(var i in es) { var e = es[i]; var start = e['indices'][0]; var stop = e['indices'][1]; //copy string content result += message.substring(marker, start); //process entity (through formatter or no-op function) var formatter = entity_formatters[e.type] || function(e) { return message.substring(start,stop) }; result += formatter(e); // update marker location marker = stop; } // append tail of message result += message.substring(marker, message.length); return result; } block.fn.tweets = function(config) { var options = $.extend({ memory: 20 }, config); // store list for later // var $list = $("div.tweetcontainer"); var $list = document.querySelector("#latest") // register default handler for handling tweet data this.actions(function(e, tweet){ $(window).trigger("filter"); tweets = window.sessionStorage.getItem('tweets'); tweets = JSON.parse(tweets); tweets.push(tweet); var localMemory = 100; if(tweets.length >= localMemory) { tweets.shift(); } window.sessionStorage.setItem('tweets', JSON.stringify(tweets)); // remove tweets $list.replaceChildren(); var displayTweets = tweets.reverse().slice(0, options.memory).reverse(); for (i = 0; i < options.memory-1; i++){ $list.prepend(tweetCell(displayTweets[i])); } }); return this.$element; }; })(jQuery, block);