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')),
post: {
//get editor () Elements.postForm.querySelector('.editable').parentNode,
get editor () (
Elements.doc.querySelector('.n-Ob')
||
Elements.postForm.querySelector('.editable').parentNode
),
get cancel () Elements.post.editor.querySelector('div.om[id$=".c"]'),
get submit () Elements.doc.querySelector('[role="button"].d-s-r.tk3N6e-e.tk3N6e-e-qc.n-Ja-xg')
},
get notification () Elements.doc.querySelector('#gbi1'),
get viewer () MakeElement(Viewer, Elements.doc.querySelector('.' + Names.viewer)),
get dialog () MakeElement(Dialog, Elements.doc.querySelector('.' + Names.dialog)),
getFocusedEditorButton: function (type) {
function hasIFrame (elem) {
let iframe = elem.querySelector('iframe');
return iframe && iframe.contentWindow === win;
}
function get1 () {
const names = {submit: 'post', cancel: 'cancel'};
let editors = A(doc.querySelectorAll('div[id$=".editor"]')).filter(hasIFrame);
if (editors.length === 0)
return;
if (editors.length > 1)
throw 'Two and more editors were found.';
return editors[0].parentNode.querySelector(String(<>[role="button"][id$=".{names[type]}"]>));;
}
function get2 () {
const indexes = {submit: 0, cancel: 1};
let editors = A(doc.querySelectorAll('.n')).filter(hasIFrame);
if (editors.length === 0)
return;
if (editors.length > 1)
throw 'Two and more editors were found.';
let result = editors[0].querySelectorAll('td > [role="button"]')[indexes[type]];
if (result)
return result;
if (type === 'cancel')
return editors[0].querySelector('.om[id$=".c"]');
}
let doc = content.document;
let win = document.commandDispatcher.focusedWindow;
return get1() || get2();
}
};
function MakeElement (constructor, root) {
if (root)
return constructor(root);
}
function Entry (root) {
let self = {
get root () root,
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"]'),
get cancel () root.querySelector('[role="button"][id$=".cancel"]'),
get submit () root.querySelector('[role="button"][id$=".post"]')
};
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 ? ['