aboutsummaryrefslogtreecommitdiffstats
path: root/hatebuCounter.js
blob: 891c24f65fa207f5d9b05215268c5a2d8e7d48cf (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
// Vimperator plugin: Hatena Bookmark image counter
// Maintainer: mattn <mattn.jp@gmail.com> - http://mattn.kaoriya.net

(function() {
    const ICON = 'data:image/x-icon;base64,'+
        'AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAA'+
        'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+
        'AAAAAAAAAAAAAAAAAAAAAOd5Uv/JXyr/yV8q/8lfKv/JXyr/yV8q/8lfKv/JXyr/yV8q/8lfKv/J'+
        'Xyr/yV8q/8lfKv/JXyr/AAAAAAAAAAD6pYX/53lS/+d5Uv/neVL/53lS/+d5Uv/neVL/53lS/+d5'+
        'Uv/neVL/53lS/+d5Uv/neVL/yV8q/wAAAAAAAAAA+qWF/+d5Uv/neVL/53lS/+d5Uv/neVL/53lS'+
        '/+d5Uv/neVL/53lS/+d5Uv/neVL/53lS/8lfKv8AAAAAAAAAAPqlhf/neVL/53lS/+d5Uv//////'+
        '///////////////////////////neVL/53lS/+d5Uv/JXyr/AAAAAAAAAAD6pYX/53lS/+d5Uv/n'+
        'eVL////////////neVL/53lS/+d5Uv///////////+d5Uv/neVL/yV8q/wAAAAAAAAAA+qWF/+d5'+
        'Uv/neVL/53lS////////////53lS/+d5Uv/neVL////////////neVL/53lS/8lfKv8AAAAAAAAA'+
        'APqlhf/neVL/53lS/+d5Uv///////////+d5Uv/neVL/53lS////////////53lS/+d5Uv/JXyr/'+
        'AAAAAAAAAAD6pYX/53lS/+d5Uv/neVL/////////////////////////////////53lS/+d5Uv/n'+
        'eVL/yV8q/wAAAAAAAAAA+qWF/+d5Uv/neVL/53lS////////////53lS/+d5Uv///////////+d5'+
        'Uv/neVL/53lS/8lfKv8AAAAAAAAAAPqlhf/neVL/53lS/+d5Uv///////////+d5Uv/neVL/////'+
        '///////neVL/53lS/+d5Uv/JXyr/AAAAAAAAAAD6pYX/53lS/+d5Uv/neVL/////////////////'+
        '///////////neVL/53lS/+d5Uv/neVL/yV8q/wAAAAAAAAAA+qWF/+d5Uv/neVL/53lS/+d5Uv/n'+
        'eVL/53lS/+d5Uv/neVL/53lS/+d5Uv/neVL/53lS/8lfKv8AAAAAAAAAAPqlhf/neVL/53lS/+d5'+
        'Uv/neVL/53lS/+d5Uv/neVL/53lS/+d5Uv/neVL/53lS/+d5Uv/JXyr/AAAAAAAAAAD6pYX/+qWF'+
        '//qlhf/6pYX/+qWF//qlhf/6pYX/+qWF//qlhf/6pYX/+qWF//qlhf/6pYX/53lS/wAAAAAAAAAA'+
        'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'+
        'AAAA//8AAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB'+
        'AACAAQAA//8AAA==';
    var hbCountIcon = document.getElementById('status-bar')
                              .insertBefore(document.createElement('statusbarpanel'),
                                            document.getElementById('security-button')
                                                    .nextSibling);
    hbCountIcon.setAttribute('id', 'hatena-bookmark-count-icon');
    hbCountIcon.setAttribute('src', ICON);
    hbCountIcon.setAttribute('class', 'statusbarpanel-iconic');
    hbCountIcon.addEventListener('click', function(e) {
        liberator.open('http://b.hatena.ne.jp/entry/' + liberator.modules.buffer.URL
                                                                 .replace(/#/g, '%23'),
                       liberator.NEW_TAB);
    }, false);
    liberator.plugins.hbCountUpdate = function() {
        hbCountIcon.setAttribute('src',
                                 'http://b.hatena.ne.jp/entry/image/' +
                                 liberator.modules.buffer.URL.replace(/#/g, '%23'));
    };
    liberator.modules.autocommands.add('LocationChange', '.*',
                                       'js liberator.plugins.hbCountUpdate()');
})();
// vim:sw=4 ts=4 et:
">) { return migemo ? (str.indexOf('/') == 0) ? new RegExp(str.slice(1), 'i') : migemo.getRegExp(str) : new RegExp(str, 'i'); } function filteredLinks (word) { if (word.match(/^\s*$/)) return []; let re = makeRegExp(word); return [it for each (it in content.document.links) if (lmatch(re, it))]; } function charToWhere (str, fail) { const table = { f: liberator.NEW_TAB, t: liberator.NEW_TAB, n: liberator.NEW_TAB, b: liberator.NEW_BACKGROUND_TAB, c: liberator.CURRENT_TAB, w: liberator.NEW_WINDOW, }; return (str && table[str.charAt(0).toLowerCase()]) || fail; } const WHERE_COMPLETIONS = ['f', 't', 'n', 'b', 'c', 'w']; let (foihandle) { commands.addUserCommand( ['fo[pen]', 'filteropen'], 'Filtered open', function (args, bang) { let where = charToWhere(args['-where'], bang ? liberator.NEW_TAB : liberator.NEW_BACKGROUND_TAB); let [i, links] = [1, filteredLinks(args.join(''))]; if (!links.length) return; liberator.open(links[0].href, where); if (links.length <= 1) return; let interval = (args['-interval'] || liberator.globalVariables.fopen_default_interval || 1) * 1000; foihandle = setInterval(function () { try { liberator.open(links[i].href, where); if ((++i) >= links.length) clearInterval(foihandle); } catch (e) { clearInterval(foihandle); } }, interval); }, { bang: true, argCount: '1', options: [ [['-interval', '-i'], commands.OPTION_INT], [['-where', '-w'], commands.OPTION_STRING], ], completer: function (context, arg, bang) { context.title = ['URL', 'Text Content']; context.completions = filteredLinks(context.filter).map(function (it) ([it.href, it.textContent])); }, }, true ); commands.addUserCommand( ['stopfilteropen', 'stopfo[pen]'], 'Stop filtered open', function () { clearInterval(foihandle); } ); } let ( lolinks = [], looptions = [ [['-where', '-w'], commands.OPTION_STRING, null, WHERE_COMPLETIONS] ] ) { commands.addUserCommand( ['lo[pen]', 'linkopen'], 'Filtered open', function (args, bang) { let where = charToWhere(args['-where'], bang ? liberator.NEW_TAB : liberator.CURRENT_TAB); let numUrl = args[0]; let m = numUrl.match(/^(\d+),(.+)$/); if (m) { let link = lolinks[parseInt(m[1], 10)]; if (link) buffer.followLink(link, where); else liberator.open(m[2], where); } else { liberator.open(numUrl, where); } }, { argCount: '1', options: looptions, bang: true, completer: function (context) { let last = context.contextList.slice(-1)[0]; lolinks = filteredLinks(last.filter); context.title = ['URL', 'Text Content']; context.advance(last.offset - last.caret); context.completions = lolinks.map(function (it, i) ([i + ',' + it.href, it.textContent])); } }, true ); } })(); // vim:sw=2 ts=2 et si fdm=marker: