Changeset 18787
- Timestamp:
- 09/04/08 07:23:46 (5 years ago)
- Location:
- websites/twicli
- Files:
-
- 2 modified
-
index.html (modified) (1 diff)
-
twicli.html (modified) (16 diffs)
Legend:
- Unmodified
- Added
- Removed
-
websites/twicli/index.html
r18198 r18787 45 45 <li>ユーザのアイコンをクリックするとプロフィールのWebページへジャンプ(設定されている場合のみ) 46 46 <li>「☞」をクリックすると、返信先を次々と辿っていくことができます。一覧に無い場合も返信先をオーバーレイ表示します。 47 <li>ユーザのTLの最後に▽が出ている場合、クリックすると過去の発言を取得します。 47 48 </ul> 48 49 <li>発言/fav -
websites/twicli/twicli.html
r18408 r18787 24 24 #tw div { border-bottom: solid 1px #777; } 25 25 #tw div div, #tw2 div div { padding: 2px; border-bottom: solid 1px #999; } 26 .dir { color: #679; } 26 27 .status { text-decoration: none; color: black; cursor: pointer; } 27 28 .date { color: #999; font-size: x-small; } … … 33 34 #next { text-align: center; background-color: #999; color: #fec; cursor: pointer; } 34 35 #rep { display: none; background-color: #fee; position: absolute; width: 90%; left: 4%; top: 200px; border: #666 4px solid; z-index: 2; padding: 2px; font-size: small; } 35 #user_info { margin: 1px; border: #888 solid 1px:}36 #user_info { margin: 1px; border: solid 1px #888; } 36 37 #user_info td { font-size: small; } 37 38 --></style> 39 <script> 40 var nr_limit = 500; // 表示する発言数の上限 41 function $(id) { return document.getElementById(id); } 42 // クロスドメインJavaScript呼び出し 43 function loadXDomainScript(url, ele) { 44 if (ele) 45 ele.parentNode.removeChild(ele); 46 ele = document.createElement("script"); 47 ele.src = url; 48 ele.type = "text/javascript"; 49 document.body.appendChild(ele); 50 return ele; 51 } 52 // クロスドメインJavaScript呼び出し(クラスバージョン) 53 function XDomainScript() { 54 this.cb_cnt = (new Date).getTime(); 55 } 56 XDomainScript.prototype = { 57 load: function(url, callback) { 58 var id = this.cb_cnt++; 59 var ele = document.createElement("script"); 60 ele.src = url + (url.indexOf('?') < 0 ? '?' : '&') + 'callback=xds.cb' + id; 61 ele.type = "text/javascript"; 62 this['cbe' + id] = ele; 63 this['cb' + id] = function(){ this.abort(id); callback.apply(this, arguments); } 64 document.body.appendChild(ele); 65 return id; 66 }, 67 abort: function(id) { 68 var ele = this['cbe' + id]; 69 ele.parentNode.removeChild(ele); 70 delete this['cb' + id]; 71 delete this['cbe' + id]; 72 } 73 }; 74 var xds = new XDomainScript; 75 // 要素の位置を取得 76 function cumulativeOffset(ele) { 77 var top = 0, left = 0; 78 do { 79 top += ele.offsetTop || 0; 80 left += ele.offsetLeft || 0; 81 ele = ele.offsetParent; 82 } while (ele); 83 return [left, top]; 84 } 85 // Cookie 86 function readCookie(key) { 87 key += "="; 88 var scookie = document.cookie + ";"; 89 start = scookie.indexOf(key); 90 if (start != -1) { 91 var end = scookie.indexOf(";", key); 92 return unescape(scookie.substring(start + key.length, end)); 93 } 94 return null; 95 } 96 function writeCookie(key, val, days) { 97 var sday = new Date(); 98 sday.setTime(sday.getTime() + (days * 1000 * 60 * 60 * 24)); 99 document.cookie = key + "=" + escape(val) + ";expires=" + sday.toGMTString(); 100 } 101 102 function twAuth(a) {} // 認証(FIXME - FF:毎回認証要求される・Safari:ログインできない) 103 </script> 104 <!--script src="http://twitter.com/account/verify_credentials.json?callback=twAuth"></script--> 38 105 </head> 39 106 <body onLoad="init()"> … … 55 122 <a id="user" href="javascript:void switchUser()">user</a> 56 123 <a id="direct" href="javascript:void switchDirect()">direct</a> 57 <a id=" help" href="javascript:void switchHelp()">?</a>124 <a id="misc" href="javascript:void switchMisc()">+</a> 58 125 </div> 59 126 </div> … … 65 132 66 133 <script type="text/javascript"> 67 var nr_limit = 500; // 表示する発言数の上限 68 69 function $(id) { return document.getElementById(id); } 134 var pluginstr = readCookie('tw_plugins') || ''; 135 var plugins = new Array; 70 136 var nr_tw = 0; 71 137 var seq = (new Date).getTime(); … … 87 153 var failover_timeout = false; 88 154 89 // クロスドメインなJavaScriptを呼び出し90 function loadXDomainScript(url, ele) {91 if (ele)92 ele.parentNode.removeChild(ele);93 ele = document.createElement("script");94 ele.src = url;95 ele.type = "text/javascript";96 document.body.appendChild(ele);97 return ele;98 }99 // 要素の位置を取得100 function cumulativeOffset(ele) {101 var top = 0, left = 0;102 do {103 top += ele.offsetTop || 0;104 left += ele.offsetLeft || 0;105 ele = ele.offsetParent;106 } while (ele);107 return [left, top];108 }109 155 // ローディング表示ON、twit更新 110 156 function reload(to) { … … 146 192 } 147 193 } 148 // reply 194 // reply先を設定 149 195 function replyTo(user, id) { 150 196 if (window.getSelection() && window.getSelection().toString() == '') { … … 179 225 $("loading").style.display = "none"; 180 226 $('reps').innerHTML = makeHTML(tw); 227 callPlugins("newMessageElement", $('reps'), tw); 181 228 $('rep').style.display = "block"; 182 229 $('rep').style.top = rep_top; … … 188 235 // 最新タイムラインを取得 189 236 function update() { 237 for (var i in plugins) if (plugins[i].update) plugins[i].update(s, tw); 190 238 update_ele = loadXDomainScript('http://twitter.com/statuses/friends_timeline?seq=' + (seq++) + 191 239 '&callback=twShow' + (since_id ? '&since_id='+since_id : ''), update_ele); … … 203 251 (tw.user.url ? '<a target="twitter" href="'+tw.user.url+'">' : '') + 204 252 '<img align="left" width="24" height="24" src="' + tw.user.profile_image_url + '">' + (tw.user.url ? '</a>' : '') + 205 /*ダイレクトメッセージの方向*/ (tw.d_dir == 1 ? '<b>←</b> ' : tw.d_dir == 2 ? '<b>→</b> ' : '') +206 253 //名前 207 254 "<a href=\"javascript:switchUser('" + tw.user.screen_name + "')\">" + tw.user.screen_name + 208 255 /*プロフィールの名前*/ (tw.user.name!=tw.user.screen_name ? '('+tw.user.name+')' : '') + '</a>' + 209 /* protected? */ (tw.user.protected ? '<img class="lock" src="http://assets0.twitter.com/images/icon_red_lock.gif">' : '') 256 /* protected? */ (tw.user.protected ? '<img class="lock" src="http://assets0.twitter.com/images/icon_red_lock.gif">' : '') + 257 /*ダイレクトメッセージの方向*/ (tw.d_dir == 1 ? '<span class="dir">→</span> ' : tw.d_dir == 2 ? '<span class="dir">←</span> ' : '') 210 258 : '') + 211 259 //本文クリックで@追加 … … 237 285 // 自分の最新の発言を受信 238 286 function twUser(tw) { 287 if (!tw[0]) return; 239 288 myname = last_user = tw[0].user.screen_name; 240 289 $("user").innerHTML = last_user; … … 281 330 // 受信twitを表示 282 331 function twShow(tw) { 332 tw.reverse(); 333 for (var j in tw) callPlugins("gotNewMessage", tw[j]); 334 tw.reverse(); 283 335 twShowToNode(tw, $("tw"), false, false, true, true); 284 336 } … … 305 357 function twShowToNode(tw, twNode, no_name, after, animation, check_since) { 306 358 $('loading').style.display = 'none'; 307 if (failover_timeout) clearTimeout(failover_timeout); 359 if (failover_timeout) { 360 clearTimeout(failover_timeout); 361 switchTL(); 362 } 308 363 failover_timeout = false; 309 364 var len = tw.length; … … 322 377 if (tw[i].d_dir == 2 || tw[i].user.screen_name == myname) 323 378 s.className = "fromme"; 379 callPlugins("newMessageElement", s, tw[i]); 324 380 pNode.insertBefore(s, pNode.childNodes[0]); 325 381 } … … 430 486 '&callback=twDirect2', direct_ele2); 431 487 } 432 function switch Help() {433 switchTo(" help");488 function switchMisc() { 489 switchTo("misc"); 434 490 $("tw2h").innerHTML = '<p><a target="twitter" href="index.html"><b>twicli</b></a> : browser-base Twitter client</p><hr>' + 435 '<p><form onSubmit="switchUser($(\'user_id\').value); return false;">show user info : @<input type="text" size="15" id="user_id" value="' + myname + '"></form></p><hr>'; 491 '<p><form onSubmit="switchUser($(\'user_id\').value); return false;">show user info : @<input type="text" size="15" id="user_id" value="' + myname + '"><input type="image" src="go.png"></form></p><hr>' + 492 '<p><form onSubmit="setPugins(this.list.value); return false;"><textarea cols="30" rows="4" name="list">' + pluginstr + '</textarea><br><input type="submit" value="register"></form></p><hr>'; 436 493 $("loading").style.display = "block"; 437 494 update_ele2 = loadXDomainScript('http://twitter.com/account/rate_limit_status.json?seq=' + (seq++) + 438 '&id=' + user + '&callback=twLimit', update_ele2); 495 '&id=' + myname + '&callback=twLimit', update_ele2); 496 } 497 // プラグイン 498 function setPugins(str) { 499 alert("Plugins are registerd. Please reload."); 500 writeCookie('tw_plugins', str, 3652); 501 } 502 function registerPlugin(obj) { 503 plugins.push(obj); 504 } 505 function callPlugins(name) { 506 var args = [].slice.apply(arguments); 507 args.shift(); 508 for (var i in plugins) 509 if (typeof plugins[i][name] == "function") 510 plugins[i][name].apply(this, args); 511 } 512 if (pluginstr) { 513 var list = pluginstr.split("\n"); 514 for (var i = 0; i < list.length; i++) 515 document.write('<scr'+'ipt src="'+list[i]+'"></scr'+'ipt>'); 439 516 } 440 517 // 初期化 … … 445 522 setInterval(update, 30*1000); 446 523 // ログインしていなかったときなどに15秒で本家にリダイレクト 447 failover_timeout = setTimeout( "location.href='http://twitter.com/home'", 15*1000);524 failover_timeout = setTimeout(function(){ switchTo("misc"); $("tw2c").innerHTML = '<iframe style="display:block" src="http://twitter.com/home" width="100%" height="400"></iframe>' }, 15*1000); 448 525 } 449 526 … … 466 543 if (window.addEventListener) window.addEventListener('DOMMouseScroll', wheel, false); 467 544 window.onmousewheel = document.onmousewheel = wheel; 545 loadXDomainScript('http://twitter.com/statuses/user_timeline.json?count=1&callback=twUser&seq=' + (seq++)); 468 546 </script> 469 <script type="text/javascript" src="http://twitter.com/statuses/user_timeline.json?count=1&callback=twUser"></script>470 547 </body> 471 548 </html>
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)