diff options
author | anekos | 2011-07-17 09:50:48 +0900 |
---|---|---|
committer | anekos | 2011-07-17 10:16:46 +0900 |
commit | e5856e244028333739da73bd4ce3f598042ea257 (patch) | |
tree | 10e80e32715ad2cbd975824824ab16358397bfbf /google-plus-commando.js | |
parent | 320a7bb47aceda837aefbc207e2920e3092cb5a2 (diff) | |
download | vimperator-plugins-e5856e244028333739da73bd4ce3f598042ea257.tar.bz2 |
セレクタ用の定数追加
Diffstat (limited to 'google-plus-commando.js')
-rw-r--r-- | google-plus-commando.js | 309 |
1 files changed, 177 insertions, 132 deletions
diff --git a/google-plus-commando.js b/google-plus-commando.js index 59ec7ae..06e1620 100644 --- a/google-plus-commando.js +++ b/google-plus-commando.js @@ -81,157 +81,202 @@ let INFO = // }}} - // Elements {{{ + // Selector {{{ + + const S = (function () { + + return { + role: role, + typePlusone: '[g\\:type="plusone"]', + editable: '.editable', + + currentEntry: { + root: '.a-f-oi-Ai', + unfold: [ + role('button', '.a-b-f-i-gc-cf-Xb-h'), // 発言の省略 (以前) + role('button', '.a-b-f-i-gc-Sb-Xb-h'), // 発言の省略 (以降) + role('button', '.a-b-f-i-p-gc-h') // 投稿の省略 + ], + menuButton: role('button', '.d-h.a-f-i-Ia-D-h.a-b-f-i-Ia-D-h'), + cancel: role('button', '[id$=".cancel"]'), + submit: role('button', '[id$=".post"]'), + }, + post: { + root: '.n-Ob', + open: '.n-Nd', + cancel: 'div.om[id$=".c"]', + submit: role('button', '.d-s-r.tk3N6e-e.tk3N6e-e-qc.n-Ja-xg') + }, + notification: '#gbi1', + viewer: { + root: '.zg', + prev: '.vn.GE.AH', + next: '.vn.GE.BH' + }, + dialog: { + root: '.va-Q', + }, + frames: { + notifications: 'iframe[src*="/_/notifications/"]' + }, + closeButton: '.CH' + }; - const Names = { - viewer: 'zg', - dialog: 'va-Q', - closeButton: 'CH' - }; + function role (name, prefix) + ((prefix || '') + '[role="' + name + '"]'); - 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, - // Elements.postForm.querySelector('.editable').parentNode - get root () Elements.doc.querySelector('.n-Ob'), - get open () Elements.doc.querySelector('.n-Nd'), - get cancel () Elements.post.root.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)), + })(); - frames: { - get notifications () MakeElement(Notifications, Elements.doc.querySelector('iframe[src*="/_/notifications/"]')) - }, + // }}} - get focusedEditor () { - function hasIFrame (elem) { - let iframe = elem.querySelector('iframe'); - return iframe && iframe.contentWindow === win; - } + // Elements {{{ + + const Elements = (function () { + + return { + get doc() content.document, + get currentEntry () MakeElement(Entry, Elements.doc.querySelector(S.currentEntry.root)), + post: { + // get editor () Elements.postForm.querySelector('.editable').parentNode, + // Elements.postForm.querySelector('.editable').parentNode + get root () Elements.doc.querySelector(S.post.root), + get open () Elements.doc.querySelector(S.post.open), + get cancel () Elements.post.root.querySelector(S.post.cancel), + get submit () Elements.doc.querySelector(S.post.submit) + }, + get notification () Elements.doc.querySelector(S.notification), + get viewer () MakeElement(Viewer, Elements.doc.querySelector(S.viewer.root)), + get dialog () MakeElement(Dialog, Elements.doc.querySelector(S.dialog.root)), - function get1 () { - function button (editor, name) - editor.parentNode.querySelector(String(<>[role="button"][id$=".{name}"]</>)); + frames: { + get notifications () MakeElement(Notifications, Elements.doc.querySelector(S.frames.notifications)) + }, - const names = {submit: 'post', cancel: 'cancel'}; + get focusedEditor () { + function hasIFrame (elem) { + let iframe = elem.querySelector('iframe'); + return iframe && iframe.contentWindow === win; + } - 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.'; + function get1 () { + function button (editor, name) + editor.parentNode.querySelector(S.role('button', <>[id$=".{name}"]</>)); + + 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 { + editor: #1=(editors[0]), + button: { + submit: button(#1#, 'post'), + cancel: button(#1#, 'cancel') + } + }; + } - return { - editor: #1=(editors[0]), - button: { - submit: button(#1#, 'post'), - cancel: button(#1#, 'cancel') + function get2 () { + function button (editor, index) { + let result = editor.querySelectorAll('td > ' + S.role('button'))[index]; + if (result) + return result; + if (index === 1) + return editor.querySelector('.om[id$=".c"]'); } - }; - } - function get2 () { - function button (editor, index) { - let result = editor.querySelectorAll('td > [role="button"]')[index]; - if (result) - return result; - if (index === 1) - return editor.querySelector('.om[id$=".c"]'); + 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.'; + + return { + editor: #1=(editors[0]), + button: { + submit: button(#1#, 0), + cancel: button(#1#, 1) + } + }; } - 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 doc = content.document; + let win = document.commandDispatcher.focusedWindow; - return { - editor: #1=(editors[0]), - button: { - submit: button(#1#, 0), - cancel: button(#1#, 1) - } - }; + return get1() || get2(); } + }; - let doc = content.document; - let win = document.commandDispatcher.focusedWindow; - - return get1() || get2(); + function MakeElement (constructor, root) { + if (root && !/none/.test(util.computedStyle(root).display)) + return constructor(root); } - }; - function MakeElement (constructor, root) { - if (root && !/none/.test(util.computedStyle(root).display)) - 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 () { + for (let [, sel] in Iterator(S.currentEntry.unfold)) { + let result = root.querySelector(sel); + if (result) + return result; + } + }, + get buttons () A(self.plusone.parentNode.querySelectorAll(S.role('button'))), + get commentButton () self.buttons[0], + get commentEditor () let (e = root.querySelector(S.editable)) (e && e.parentNode), + get comment() (self.commentEditor || self.commentButton), + get plusone () root.querySelector(S.typePlusone), + get share () self.buttons[1], + get menu () root.querySelector(S.role('menu')), + get menuButton () root.querySelector(S.currentEntry.menuButton), + get cancel () root.querySelector(S.currentEntry.cancel), + get submit () root.querySelector(S.currentEntry.submit) + }; + return self; + } - 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 menuButton () root.querySelector('[role="button"].d-h.a-f-i-Ia-D-h.a-b-f-i-Ia-D-h'), - 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(S.role('button'))), + get submit () nButton(0), + get cancel () nButton(1) + }; + return self; + } - function Dialog (root) { - function nButton (n) { - let bs = self.buttons; - if (bs.length === 2) - return bs[n]; + function Viewer (root) { + let self = { + get cancel () root.querySelector(S.closeButton), + get prev () root.querySelector(S.viewer.prev), + get next () root.querySelector(S.viewer.next) + }; + return self; } - let self = { - get buttons () A(root.querySelectorAll('[role="button"]')), - get submit () nButton(0), - get cancel () nButton(1) - }; - return self; - } - function Viewer (root) { - let self = { - get cancel () root.querySelector('.' + Names.closeButton), - get prev () root.querySelector('.vn.GE.AH'), - get next () root.querySelector('.vn.GE.BH'), - }; - return self; - } + function Notifications (root) { + let self = { + get root () root, + get visible () (parseInt(root.style.height, 10) > 0) + }; + return self; + } - function Notifications (root) { - let self = { - get root () root, - get visible () (parseInt(root.style.height, 10) > 0) - }; - return self; - } + return [S, Elements]; + })(); // }}} @@ -314,7 +359,7 @@ let INFO = if (notifications && notifications.visible) return notifications.root.contentDocument.body; - let menus = A(Elements.doc.querySelectorAll('[tabindex="0"][role="menu"]')); + let menus = A(Elements.doc.querySelectorAll(S.role('menu', '[tabindex="0"]'))); if (menus.length === 1) return menus[0]; })(); @@ -484,8 +529,8 @@ let INFO = for (let [, name] in Iterator(['viewer', 'dialog'])) { if (!Elements[name]) continue; - xpath.push(String(<>div[contains(@class, "{Names.closeButton}")]</>)); - xpath = xpath.map(function (it) String(<>*[contains(@class, "{Names[name]}")]//{it}</>)) + xpath.push(String(<>div[contains(@class, "{C.closeButton}")]</>)); + xpath = xpath.map(function (it) String(<>*[contains(@class, "{C[name].root}")]//{it}</>)) break; } |