anekos
New BSD License
Mappings for Google+
require: feedSomeKeys_3.js and x-hint.js
>;
// }}}
(function () {
// Utils {{{
function A (list)
Array.slice(list);
function click (elem) {
if (!elem)
throw GPCError('elem is undefined');
buffer.followLink(elem, liberator.CURRENT_TAB);
}
function withCount (command) {
return function (count) {
if (count < 1)
count = 1;
for (let i = 0; i < count; i++)
command();
};
}
function GPCError (msg) {
if (this instanceof GPCError) {
this.toString = function () String(msg);
} else {
return new GPCError(msg);
}
}
// }}}
// Elements {{{
const Names = {
viewer: 'zg',
dialog: 'va-Q',
closeButton: 'CH'
};
const Elements = {
get doc() content.document,
get currentEntry () MakeElement(Entry, Elements.doc.querySelector('.a-f-oi-Ai')),
get postForm () Elements.doc.querySelector('#contentPane > div > div').nextSibling,
//get postEditor () Elements.postForm.querySelector('.editable').parentNode,
get postEditor () (
Elements.doc.querySelector('.n-Ob')
||
Elements.postForm.querySelector('.editable').parentNode
),
get submitButton () Elements.postForm.querySelector('[role="button"]'),
get notification () Elements.doc.querySelector('#gbi1'),
get viewer () MakeElement(Viewer, Elements.doc.querySelector('.' + Names.viewer)),
get dialog () MakeElement(Dialog, Elements.doc.querySelector('.' + Names.dialog))
};
function MakeElement (constructor, root) {
if (root)
return constructor(root);
}
function Entry (root) {
let self = {
get permlink () [
e
for ([, e] in Iterator(A(root.querySelectorAll('a'))))
if (!e.getAttribute('oid'))
][0],
get unfold () (
root.querySelector('.a-b-f-i-gc-cf-Xb-h[role="button"]') // 発言の省略 (以前)
||
root.querySelector('.a-b-f-i-gc-Sb-Xb-h[role="button"]') // 発言の省略 (以降)
||
root.querySelector('.a-b-f-i-p-gc-h[role="button"]') // 投稿の省略
),
get buttons () A(self.plusone.parentNode.querySelectorAll('[role="button"]')),
get commentButton () self.buttons[0],
get commentEditor () let (e = root.querySelector('.editable')) (e && e.parentNode),
get comment() (self.commentEditor || self.commentButton),
get plusone () root.querySelector('[g\\:type="plusone"]'),
get share () self.buttons[1],
get menu () root.querySelector('[role="menu"]')
};
return self;
}
function Dialog (root) {
function nButton (n) {
let bs = self.buttons;
if (bs.length === 2)
return bs[n];
}
let self = {
get buttons () A(root.querySelectorAll('[role="button"]')),
get submit () nButton(0),
get cancel () nButton(1)
};
return self;
}
function Viewer (root) {
function nButton (n) {
let bs = self.buttons;
if (bs.length === 2)
return bs[n];
}
let self = {
get cancel () root.querySelector('.' + Names.closeButton),
get prev () root.querySelector('.vn.GE.AH'),
get next () root.querySelector('.vn.GE.BH'),
};
return self;
}
// }}}
// Commands {{{
const Commands = {
next: withCount(function () {
if (Elements.viewer)
return click(Elements.viewer.next);
let menus = A(Elements.doc.querySelectorAll('[tabindex="0"][role="menu"]'));
plugins.feedSomeKeys_3.API.feed.apply(
null,
menus.length === 1 ? ['