aboutsummaryrefslogtreecommitdiffstats
path: root/ego_counter.js
blob: 77c8f36d23cfe90ae2ab104a985144b274fce1df (plain)
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
/*
 * ステータスバーにはてブ数を表示
 *
 * Usage:
 *   let g:ego_counter_uri = 'Your site URI'
 *     or
 *   js liberator.globalVariables.ego_counter_hatenaId = 'Your site URI'
 *
 *   ex.
 *   let g:ego_counter_uri = 'http://d.hatena.ne.jp/snaka72'
 *
 */
(function() {

  const MY_SITE = liberator.globalVariables.ego_counter_uri || '';
  let update = function(color) {
    myHatebu.setAttribute(
      'src',
      <>http://b.hatena.ne.jp/bc/{color}/{MY_SITE}/</>.toSource()
    );
  };

  let rotate = (function() {
    var current;
    var colors = "bl de dg gr pr br rd sp pk te lg lb wh li or".split(" ");

    return function(next) {
      if (!next) return current;

      current = colors.shift();
      colors.push(current);
      return current;
    };
  })();

  let myHatebu = document.getElementById('status-bar')
                 .insertBefore(document.createElement('statusbarpanel'),
                               document.getElementById('security-button')
                               .nextSibling);
  myHatebu.setAttribute('id', 'my-hatebu-count-icon');
  myHatebu.setAttribute('class', 'statusbarpanel-iconic');
  update(rotate(true));

  setInterval(function() update(rotate(true)), 1000 * 60 * 10);
  myHatebu.addEventListener("click", function(event){
    update(rotate(true));
  }, false);

})()
reTags.filter(function(tag) tag[tag.length - 1] == "/" || !stripTags.push(tag)) .map(function(tag) tag.replace(/\/$/, "")); if (stripTags.length > 0) { stripTags = stripTags.length > 1 ? "(?:" + stripTags.join("|") + ")" : String(stripTags); exp += "|<" + stripTags + "(?:\\s[^>]*|/)?>|</" + stripTags + "\\s*>"; } } str = str.replace(new RegExp(exp, "ig"), ""); var res = document.implementation.createDocument(null, "html", null); var range = document.createRange(); range.setStartAfter(window.content.document.body); res.documentElement.appendChild(res.importNode(range.createContextualFragment(str), true)); if (ignoreTags) ignoreTags.forEach(function(tag) { var elements = res.getElementsByTagName(tag); for (var i = elements.length, el; el = elements.item(--i); el.parentNode.removeChild(el)); }); return res; } function getElementsByXPath(xpath, node){ node = node || document; var nodesSnapshot = (node.ownerDocument || node).evaluate(xpath, node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); var data = []; for(var i = 0, l = nodesSnapshot.snapshotLength; i < l; data.push(nodesSnapshot.snapshotItem(i++))); return (data.length > 0) ? data : null; } function getFirstElementByXPath(xpath, node){ node = node || document; var result = (node.ownerDocument || node).evaluate(xpath, node, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null); return result.singleNodeValue ? result.singleNodeValue : null; } function showFollowersStatus(){ var xhr = new XMLHttpRequest(); xhr.open("GET", "http://mixi.jp/recent_echo.pl", false); xhr.send(null); var nodes = getElementsByXPath('id("echo")//div[@class="archiveList"]//tr', parseHTML(xhr.responseText, ['script'])); var statuses = []; if (nodes && nodes.length) nodes.forEach(function(node) { var img = getFirstElementByXPath('.//img', node).src; var name = getFirstElementByXPath('.//*[@class="nickname"]', node).textContent.replace(/(?:\r?\n|\r)[ \t]*/g, ""); var c = getFirstElementByXPath('.//*[@class="comment"]', node).childNodes; var text = ''; for (var n = 0; n < c.length; n++) { if (c[n].nodeName.toUpperCase() == 'SPAN') break; text += c[n].textContent.replace(/^\s+|\s+$/g, '').replace(/&/g, '&amp;').replace(/>/g, '&gt;').replace(/</g, '&lt;'); if (c[n].nodeName.toUpperCase() == 'A') text += ' '; } statuses.push({ user : { profile_image_url : img, name : name, screen_name : name }, text : text }); }); var html = <style type="text/css"><![CDATA[ span.twitter.entry-content a { text-decoration: none; } img.twitter.photo { border; 0px; width: 16px; height: 16px; vertical-align: baseline; } ]]></style>.toSource() .replace(/(?:\r?\n|\r)[ \t]*/g, " ") + statuses.map(function(status) <> <img src={status.user.profile_image_url} alt={status.user.screen_name} title={status.user.screen_name} class="twitter photo"/> <strong>{status.user.name}&#x202C;</strong> </>.toSource() .replace(/(?:\r?\n|\r)[ \t]*/g, " ") + sprintf(': <span class="twitter entry-content">%s&#x202C;</span>', status.text)) .join("<br/>"); //liberator.log(html); liberator.echo(html, true); } function sayEcho(text){ var xhr = new XMLHttpRequest(); xhr.open("GET", "http://mixi.jp/recent_echo.pl", false); xhr.send(null); var form = getFirstElementByXPath('//form[@action="add_echo.pl"]', parseHTML(xhr.responseText, ['script'])); var input = getFirstElementByXPath('.//textarea', form); input.value = text; var params = []; var inputs = getElementsByXPath('.//*[contains(" INPUT TEXTAREA SELECT ", concat(" ", local-name(), " "))]', form); inputs.forEach(function(input) { if (input.name.length) params.push(input.name + '=' + escape(ucnv.ConvertFromUnicode(input.value))); }); xhr.open("POST", "http://mixi.jp/add_echo.pl", false); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.send(params.join('&')); } commands.addUserCommand(["mixiecho"], "Change mixi echo", function(arg, special){ arg = arg.string; if (special || arg.length == 0) showFollowersStatus() else sayEcho(arg); },{ bang: true } ); })();