/* ほぼ、マウス前提なので、Vimperatorらしからぬプラグインですが... == Settings == g:twittperator_plugin_twlist_tab = 1 $RUNTIMEDIR/plugin/twittperator に入れている場合は設定してください。 g:twittperator_screen_name = "" あなたのScreenName、返信された時ににMentionsタブにも入ります == ScreenShot == http://gyazo.com/6832f5a0e615e8d1242ecedb8f9e0812.png == Options == set [no]showtwlist[!] show twittperator timeline :noremap {lhs} :set showtwlist! しておくと便利かも! */ let ID_TIMELINE = "twlist-timeline", ID_MENTION = "twlist-mentions", ID_ROOT = "twlist-box", ID_SPLITTER = "twlist-splitter"; let rows = 6; let timelineBox = null, mentionsBox = null, root = null, screenName = null, screenNameReg = null; let contextPath = 'liberator.plugins.contexts["'+PATH.replace("\\","\\\\","g")+'"]'; let baseXML = <> ; function setStyleSheet() { highlight.loadCSS(<>label,chrome://browser/content/browser.xul margin: 1px 2px 2px 2px !important; TwlistMetaInfo,.twlist-metainfo,chrome://browser/content/browser.xul TwlistScreenName,.twlist-screenname,chrome://browser/content/browser.xul font-weight: bold; TwlistLink,.twlist-link,chrome://browser/content/browser.xul color: -moz-hyperlinktext; TwlistLink:hover,.twlist-link:hover,chrome://browser/content/browser.xul cursor: pointer !important; TwlistLinkHash,.twlist-hash,chrome://browser/content/browser.xul color: DarkGreen !important; TwlistLinkUser,.twlist-user,chrome://browser/content/browser.xul TwlistLinkURL,.twlist-url,chrome://browser/content/browser.xul ]]>.toString()); } function add (msg, target) { if (!target) target = timelineBox; let isRT = ("retweeted_status" in msg); let domContent = formatText(isRT ? msg.retweeted_status.text : msg.text); XML.ignoreWhitespace = true; let xml = isRT ? : ; let dom = xmlToDom(xml, XUL); dom.querySelector(".twlist-content").appendChild(domContent); target.insertBefore(dom, target.firstChild); if (target.getRowCount() > 50) { target.removeChild(target.lastChild); } } function onLoad () { screenName = liberator.globalVariables.twittperator_screen_name || ""; if (screenName) screenNameReg = new RegExp("@" + screenName + "\\b"); setStyleSheet(); let (app = document.getElementById("appcontent")) { app.appendChild(xmlToDom(baseXML)); } root = document.getElementById(ID_ROOT); timelineBox = document.getElementById(ID_TIMELINE); mentionsBox = document.getElementById(ID_MENTION); splitter = document.getElementById(ID_SPLITTER); plugins.twittperator.ChirpUserStream.addListener(streamListener); options.add(["showtwlist"], "expand/collapse twittperator list", "boolean", true, { setter: function (value) { let elm = document.getElementById(ID_SPLITTER); elm.setAttribute("state", value ? "open" : "collapsed"); return value; }, getter: function() document.getElementById(ID_SPLITTER).getAttribute("state") != "collapsed" }); } function onUnload () { let elm = document.getElementById(ID_ROOT); if (elm) elm.parentNode.removeChild(elm); plugins.twittperator.ChirpUserStream.removeListener(streamListener); styles.removeSheet(false, "twlist"); } function xmlToDom(xml, xmlns) { XML.prettyPrinting = false; var doc = (new DOMParser).parseFromString( '' + xml.toXMLString() + "", "application/xml"); var imported = document.importNode(doc.documentElement, true); var range = document.createRange(); range.selectNodeContents(imported); var fragment = range.extractContents(); range.detach(); return fragment.childNodes.length > 1 ? fragment : fragment.firstChild; } function streamListener(msg, raw) { if (msg.text && msg.user) { add(msg, timelineBox); if (msg.in_reply_to_status_id == screenName || (screenNameReg && screenNameReg.test(msg.text))){ add(msg, mentionsBox); } } } function formatText (str) { str = str.trim(); let reg = /https?:\/\/[^\s]+|[#@]\w+/g; XML.ignoreWhitespace = false; let m, i = 0, buf = "", x = ; while((m=reg.exec(str))){ buf = str.substring(i, m.index); if (buf) x.appendChild(buf); let class = "twlist-link", href = ""; switch (m[0].charAt(0)){ case "@": class += " twlist-user"; href = "http://twitter.com/" + m[0].substr(1); break; case "#": class += " twlist-hash"; href = "http://twitter.com/search?q=%23" + m[0].substr(1); break; default: class += " twlist-url"; href = m[0]; } x.appendChild({m[0]}); i=reg.lastIndex; } buf = str.substr(i); if (buf) x.appendChild(buf); return xmlToDom(x, "http://www.w3.org/1999/xhtml"); } function onClick (evt) { if (evt.button == 2) return; evt.preventDefault(); evt.stopPropagation(); let where = (evt.ctrlKey || evt.button == 1) ? liberator.NEW_TAB : liberator.CURRENT_TAB; let url = evt.target.getAttribute("href"); liberator.open(url, {where: where}); } onLoad(); // vim: sw=2 ts=2 et filetype=javascript: