public
Last active

A gist that shows how I'm embedding gists into Propane. Probably crappy but at least it feels a bit meta...

  • Download Gist
gistfile1.js
JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
if (displayExpandedGists) {
 
Campfire.GistExpander = Class.create({
initialize: function(chat) {
this.chat = chat;
var messages = this.chat.transcript.messages;
for (var i = 0; i < messages.length; i++) {
this.detectGistURL(messages[i]);
}
},
 
detectGistURL: function(message) {
/* we are going to use the messageID to uniquely identify our requestJSON request
so we don't check pending messages */
if (!message.pending() && message.kind === 'text') {
var links = message.bodyElement().select('a:not(image)');
if (links.length != 1) {
return;
}
var href = links[0].getAttribute('href');
var match = href.match(/^https:\/\/gist.github.com\/([0-9]+)\/?$/);
if (!match) return;
href = 'https://api.github.com/gists/' + match[1];
window.propane.requestJSON(message.id(), href, 'window.chat.gistexpander', 'onEmbedDataLoaded', 'onEmbedDataFailed');
}
},
 
onEmbedDataLoaded: function(messageID, data) {
var message = window.chat.transcript.getMessageById(messageID);
if (!message) return;
var payload = '';
 
var description = data['description'];
if (description) {
payload += '<strong>Gist:</strong> ' + description + '<br />';
}
 
var files = data['files'];
if (files) {
payload += '<strong>Files:</strong> ';
 
for (var fileKey in files) {
var file = files[fileKey];
payload += '<a target="_blank" href="' + file['raw_url'] + '">' + fileKey + '</a> ';
}
}
 
message.resize((function() {
message.bodyCell.insert({bottom: '<div style="width:100%; margin-top:5px; padding-top: 5px; border-top:1px dotted #ccc;">' + payload + '</div>'});
}).bind(this));
},
 
onEmbedDataFailed: function(messageID) {
/* No cleanup required, we only alter the HTML after we get back a succesful load from the data */
},
 
onMessagesInsertedBeforeDisplay: function(messages) {
for (var i = 0; i < messages.length; i++) {
this.detectGistURL(messages[i]);
}
},
 
onMessageAccepted: function(message, messageID) {
this.detectGistURL(message);
}
});
 
Campfire.Responders.push("GistExpander");
window.chat.installPropaneResponder("GistExpander", "gistexpander");
}

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.