Instantly share code, notes, and snippets.
Created
October 13, 2010 14:39
-
Star
0
(0)
You must be signed in to star a gist -
Fork
0
(0)
You must be signed in to fork a gist
-
Save rummelonp/624148 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name Twitter add RT button for new UI | |
// @namespace http://mitukiii.jp/ | |
// @description TwitterのWebクライアントに非公式のRTボタンを追加するスクリプト | |
// @include http://twitter.com/* | |
// @include https://twitter.com/* | |
// ==/UserScript== | |
(function() { | |
// 1. RT @mitukiii: ほげほげぴよぴよツイート | |
// 2. RT @mitukiii: http://twitter.com/mitukiii/status/123456789 | |
const RT_TYPE = 1; | |
Object.isBoolean = function(object) { | |
return typeof object === 'boolean'; | |
}; | |
Object.isString = function(object) { | |
return typeof object === 'string'; | |
}; | |
var dispatchMouseEvent = function() { | |
var e = { | |
element: document, | |
type: 'click', | |
bubbles: true, | |
cancelable: true | |
}; | |
return function(element, type, options) { | |
element = element || e.element; | |
type = Object.isString(type) ? type : e.type; | |
options = options || {}; | |
var bubbles = Object.isBoolean(options.bubbles) ? options.bubbles : e.bubbles; | |
var cancelable = Object.isBoolean(options.cancelable) ? options.cancelable : e.bubbles; | |
var click_event = document.createEvent('MouseEvents'); | |
click_event.initEvent(type, bubbles, cancelable); | |
return element.dispatchEvent(click_event); | |
}; | |
}(); | |
var getNewTweetButton = function() { | |
var newTweetButton = document.getElementById('new-tweet'); | |
return function() { | |
return newTweetButton; | |
}; | |
}(); | |
var getUserName = function(tweet) { | |
var user_name = tweet.getElementsByClassName('tweet-screen-name')[0]; | |
if (!user_name) { | |
user_name = tweet.getElementsByClassName('tweet-user-block-screen-name')[0]; | |
} | |
if (!user_name) { | |
return; | |
} | |
return user_name.textContent.replace(/^@/, ''); | |
}; | |
var getContent = function(tweet) { | |
return tweet.getElementsByClassName('tweet-text')[0].textContent; | |
}; | |
var getRTContent = function(rt_type) { | |
if (rt_type === 2) { | |
return function(tweet) { | |
return tweet.getElementsByClassName('tweet-timestamp')[0].href.replace(/^https/, 'http').replace(/#!\//, ''); | |
}; | |
} else { | |
return getContent; | |
} | |
}(RT_TYPE); | |
var getQTContent = getContent; | |
var setRTStatus = function() { | |
var tweet_boxes = document.getElementsByClassName('twitter-anywhere-tweet-box-editor'); | |
return function(tweet, text) { | |
dispatchMouseEvent(getNewTweetButton(), 'click'); | |
var tweet_box = tweet_boxes[tweet_boxes.length - 1]; | |
tweet_box.value = text; | |
tweet_box.focus(); | |
tweet_box.setSelectionRange(0, 0); | |
return tweet; | |
}; | |
}(); | |
var setQTStatus = function() { | |
var tweet_boxes = document.getElementsByClassName('twitter-anywhere-tweet-box-editor'); | |
return function(tweet, text) { | |
var reply_action = tweet.getElementsByClassName('reply-action')[0]; | |
dispatchMouseEvent(reply_action, 'click'); | |
var tweet_box = tweet_boxes[tweet_boxes.length - 1]; | |
tweet_box.value = text; | |
tweet_box.focus(); | |
tweet_box.setSelectionRange(0, 0); | |
return tweet; | |
}; | |
}(); | |
var mouseOverButton = function(action) { | |
action.getElementsByTagName('i')[0].style.backgroundPosition = '-16px 0'; | |
return action; | |
}; | |
var mouseOutButton = function(action) { | |
action.getElementsByTagName('i')[0].style.backgroundPosition = '0 0'; | |
return actions; | |
}; | |
var addButtons = function(tweet) { | |
var user_name = getUserName(tweet); | |
var actions = tweet.getElementsByClassName('tweet-actions')[0]; | |
if (!user_name || !actions) { | |
return tweet; | |
} | |
if (actions.getElementsByClassName('rt-action').length == 0) { | |
var rt_content = getRTContent(tweet); | |
var rt_text = 'RT @' + user_name + ': ' + rt_content; | |
var rt = document.createElement('a'); | |
rt.href = '#'; | |
rt.className = 'rt-action'; | |
rt.setAttribute('data-screen-name', user_name); | |
rt.innerHTML = '<span><i></i><b>RT</b></span></a>'; | |
rt.addEventListener('mouseover', function() { | |
mouseOverButton(rt); | |
}, false); | |
rt.addEventListener('mouseout', function() { | |
mouseOutButton(rt); | |
}, false); | |
rt.addEventListener('click', function() { | |
setRTStatus(tweet, rt_text); | |
}, false); | |
actions.appendChild(rt); | |
} | |
if (actions.getElementsByClassName('qt-action').length == 0) { | |
var qt_content = getQTContent(tweet); | |
var qt_text = 'QT @' + user_name + ': ' + qt_content; | |
var qt = document.createElement('a'); | |
qt.href = '#'; | |
qt.className = 'qt-action'; | |
qt.setAttribute('data-screen-name', user_name); | |
qt.innerHTML = '<span><i></i><b>QT</b></span></a>'; | |
qt.addEventListener('mouseover', function() { | |
mouseOverButton(qt); | |
}, false); | |
qt.addEventListener('mouseout', function() { | |
mouseOutButton(qt); | |
}, false); | |
qt.addEventListener('click', function() { | |
setQTStatus(tweet, qt_text); | |
}, false); | |
actions.appendChild(qt); | |
} | |
return tweet; | |
}; | |
var getParentElementByAttributeRegExp = function(element, attribute, reg_exp) { | |
var parent_element = element; | |
do { | |
if (reg_exp.test(parent_element[attribute])) { | |
return parent_element; | |
} | |
} while (parent_element = parent_element.parentNode); | |
return null; | |
}; | |
document.addEventListener('DOMNodeInserted', function(event) { | |
var element = event.target; | |
if (/(stream-item|component)/.test(element.className)) { | |
addButtons(element); | |
} else if (/tweet-actions/.test(element.className)) { | |
var tweet = getParentElementByAttributeRegExp(element, 'className', /(stream-item|component)/); | |
addButtons(tweet); | |
} else { | |
var tweets = element.getElementsByClassName('stream-item'); | |
for (var i = tweets.length - 1; i >= 0; i -= 1) { | |
addButtons(tweets[i]); | |
} | |
} | |
return event; | |
}, false); | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment