/* * twitter-entities.js * This function converts a tweet with "entity" metadata * from plain text to linkified HTML. * * See the documentation here: http://dev.twitter.com/pages/tweet_entities * Basically, add ?include_entities=true to your timeline call * * Based off existing code from Wade Simmons * Licensed under the MIT license * http://wades.im/mons * * Requires jQuery * */ function has_entities(entities) { if (!entities) return false; for (var entity in entities) { if (entity.length>0) return true; } return false; }; function escapeHTML(text) { return $('<div/>').text(text).html(); }; function linkify_entities(tweet) { var index_map = {}, result="", last_i=0, i=0; // return w/o any processing if no entities passed if (!has_entities(tweet.entities)) { return escapeHTML(tweet.text); } if (tweet.entities.urls) { $.each(tweet.entities.urls, function(i, entry) { index_map[entry.indices[0]] = [entry.indices[1], function(text) { return "<a href='" + escapeHTML(entry.url) + "' title='" + escapeHTML(entry.expanded_url) + "'>" + escapeHTML(entry.display_url) + "</a>"; }]; }); } if (tweet.entities.media) { $.each(tweet.entities.media, function(i, entry) { index_map[entry.indices[0]] = [entry.indices[1], function(text) { return "<a href='" + escapeHTML(entry.url) + "' title='" + escapeHTML(entry.expanded_url) + "'>" + escapeHTML(entry.display_url) + "</a>"; }]; }); } if (tweet.entities.hashtags) { $.each(tweet.entities.hashtags, function(i, entry) { index_map[entry.indices[0]] = [entry.indices[1], function(text) { return "<a href='http://twitter.com/search?q=" + escape("#" + entry.text) + "'>" + escapeHTML(text) + "</a>"; }]; }); } if (tweet.entities.user_mentions) { $.each(tweet.entities.user_mentions, function(i, entry) { index_map[entry.indices[0]] = [entry.indices[1], function(text) { return "<a title='" + escapeHTML(entry.name) + "' href='http://twitter.com/" + escapeHTML(entry.screen_name) + "'>" + escapeHTML(text) + "</a>"; }]; }); } // iterate through the string looking for matches in the index_map for (i = 0; i < tweet.text.length; i++) { var ind = index_map[i]; if (ind) { var end = ind[0], func = ind[1]; if (i > last_i) { result += escapeHTML(tweet.text.substring(last_i, i)); } result += func(tweet.text.substring(i, end)); i = end - 1; last_i = end; } } if (i > last_i) { result += escapeHTML(tweet.text.substring(last_i, i)); } return result; }