Skip to content

Instantly share code, notes, and snippets.

@petergerard
Forked from wadey/twitter-entities.js
Last active December 15, 2015 01:18
Show Gist options
  • Save petergerard/5178617 to your computer and use it in GitHub Desktop.
Save petergerard/5178617 to your computer and use it in GitHub Desktop.
/*
* 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;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment