Gelbooru KonaStyle

Changed gelbooru.com main theme to dark theme, similar to konachan style.

2015/01/27のページです。最新版はこちら。

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
  1. // ==UserScript==
  2. // @name Gelbooru KonaStyle
  3. // @namespace http://Aestellar.homepage/
  4. // @version 0.1
  5. // @description Changed gelbooru.com main theme to dark theme, similar to konachan style.
  6. // @author Aestellar
  7. // @include *://gelbooru.com/*
  8. // @resource gelbooruCss1 https://userstyles.org/styles/109424/gelbooru-konastyle.css
  9. // @grant GM_getResourceText
  10. // @grant GM_addStyle
  11.  
  12. // @run-at document-start
  13.  
  14. // ==/UserScript==
  15. (function(){
  16. var win = window;
  17. var ls = localStorage;
  18. if(!!!win){
  19. console.log(win + "Failed to load window object");
  20. return;
  21. }
  22. if(win.self != win.top){
  23. return;
  24. }
  25. var css = GM_getResourceText ("gelbooruCss1");
  26. addStyle(css);
  27. document.addEventListener("DOMContentLoaded",updateUI, false);
  28. function loadPrereq(){
  29. var hrefVar = win.location.href;
  30. if(/(htt[ps]:\/\/gelbooru\.com[\/]*)$/.test(hrefVar)){
  31. document.body.className = 'main-page';
  32. }
  33. var t = document.createElement('d');
  34. //Font awesome support Don't work with @requ
  35. t.innerHTML = '<link rel="stylesheet" type="text/css" media="screen" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.0.3/css/font-awesome.css" />';
  36. t = t.children[0];
  37. document.head.appendChild(t);
  38. }
  39. function checkLastVisit(){
  40. var timer = 7200000;
  41. var lastVisit = parseInt(ls.getItem('lastVisit'));
  42. var prevVisit = parseInt(ls.getItem('preLastVisit'));
  43. var currentVisit = new Date().valueOf();
  44. if ((!lastVisit)||(!prevVisit)) {
  45. updateLastVisit();
  46. }
  47. if ((lastVisit + timer) < currentVisit) {
  48. updateLastVisit();
  49. }
  50. }
  51. function updateLastVisit(){
  52. var posts = 'http://gelbooru.com/index.php?page=post&s=list&tags=all';
  53. handleXHRDoc(posts, function(doc){
  54. var lastIdElt = doc.getElementsByClassName('thumb')[0];
  55. var lastID = lastIdElt.getAttribute('id');
  56. lastID = lastID.replace('s', '');
  57. if (!!ls.getItem('lastVisit')) {
  58. ls.setItem('preLastVisit',ls.getItem('lastVisit'));
  59. }
  60. else{
  61. ls.setItem('preLastVisit',new Date().valueOf());
  62. }
  63. if (ls.getItem('lastImageId')) {
  64. ls.setItem('preImageId',ls.getItem('lastImageId'));
  65. }
  66. else{
  67. ls.setItem('preImageId',lastID);
  68. }
  69. localStorage.setItem('lastVisit',new Date().valueOf());
  70. localStorage.setItem('lastImageId', lastID);
  71. });
  72. }
  73. function getLastVisit(){
  74. var t = localStorage.getItem('preLastVisit');
  75. return parseInt(t);
  76. }
  77. function getLastImageId(){
  78. var t = localStorage.getItem('preImageId');
  79. return parseInt(t);
  80. }
  81. function submit(e){
  82. var textElt = _$('#stags')||_$('#tags');
  83. text = textElt.value;
  84. console.log(text);
  85. text = applySearchFilters(text);
  86. textElt.value = text;
  87. }
  88. function applySearchFilters(text)
  89. {
  90. if (ls.getItem('onlyNewSearch')==='true') {
  91. if (!!getLastImageId()) {
  92. text+=' id:>' + getLastImageId() + ' ';
  93. };
  94. };
  95. return text;
  96. }
  97.  
  98. function replaceSubmit(){
  99. var form = _$('.sidebar3 form');
  100. form.onsubmit = submit;
  101. }
  102. function updateUI(){
  103. loadPrereq();
  104. checkLastVisit();
  105. replaceSubmit();
  106. updateNav();
  107. }
  108. function updateNav() {
  109. var navBar = _$('#navbar');
  110. var navBtn = document.createElement("li");
  111. navBtn.classList.add('collapse-button');
  112. navBar.insertBefore(navBtn, navBar.firstChild);
  113. var sett = {name:'navCollapse', glyphOff:'fa fa-minus-square-o', glyphOn:'fa fa-plus-square-o', callbackOff:showNav, callbackOn:hideNav};
  114. var collapseBtn = makeToggleButton(navBtn,sett);
  115. makeUserNavBar();
  116. function hideNav(btn) {
  117. var li, i;
  118. for (i = 0; i < navBar.children.length; ++i) {
  119. li = navBar.children[i];
  120. if (!((hasClass(li, 'current-page'))
  121. || (hasClass(li, 'collapse-button')))) {
  122. li.style.display = 'none';
  123. }
  124. }
  125. var subNav = document.getElementById('subnavbar');
  126. if(!!subNav){
  127. subNav.style.display = 'none';
  128. }
  129. }
  130. function showNav(btn) {
  131. var li, i;
  132. for (i = 0; i < navBar.children.length; ++i) {
  133. li = navBar.children[i];
  134. if (!((hasClass(li, 'current-page'))
  135. || (hasClass(li, 'collapse-button')))) {
  136. li.style.display = 'inline-block';
  137. }
  138. }
  139. var subNav = document.getElementById('subnavbar');
  140. if(!!subNav){
  141. subNav.style.display = 'block';
  142. }
  143. }
  144. }
  145. function makeUserNavBar()
  146. {
  147. var userBar = document.createElement('ul');
  148. userBar.className = 'flat-list';
  149. userBar.setAttribute('id', 'usernavbar');
  150. var navBar = _$('#navbar');
  151. var navParent = navBar.parentNode;
  152. navParent.appendChild(userBar);
  153. var fitBtn = document.createElement("li");
  154. userBar.appendChild(fitBtn);
  155. var imageFit = makeToggleButton(fitBtn, {name:'fitImage',
  156. glyphOff:'fa fa-compress',
  157. glyphOn:'fa fa-expand',
  158. callbackOff:fit,
  159. callbackOn:fit});
  160. var img = _$('#image');
  161. function fit(){
  162. var img = _$('#image');
  163. if (img === undefined) {
  164. return;
  165. }
  166. img.removeAttribute('width');
  167. img.removeAttribute('height');
  168. if ((localStorage.getItem('fitImage')==='true')) {
  169. //img.setAttribute('max-width','100%');
  170. img.style.maxWidth = '100%';
  171. }
  172. else{
  173. img.style.maxWidth = '';
  174. //img.removeAttribute('max-width');
  175. }
  176. }
  177. if(!!img){
  178. img.addEventListener('load', fit, false);
  179. }
  180. var advSearch = document.createElement('div');
  181. advSearch.innerHTML = '<div id = "adv-search">\
  182. <span>Advanced Search: </span>\
  183. <span id = "only-new" style = "padding-right:3px;">Only new image </span>\
  184. </div>';
  185. advSearch = advSearch.firstChild;
  186. userBar.appendChild(advSearch);
  187. var onlyNew = document.getElementById('only-new');
  188.  
  189. makeToggleButton(onlyNew, {name:'onlyNewSearch',
  190. glyphOff:'fa fa-square-o',
  191. glyphOn:'fa fa-check-square-o',
  192. callbackOff:null,
  193. callbackOn:null});
  194.  
  195.  
  196. }
  197. function makeAdvSearchPane()
  198. {
  199.  
  200. }
  201.  
  202. function makeToggleButton(elem, settings){
  203. var btn = new ButtonToggle(settings);
  204. btn.bindElement(elem);
  205. btn.load();
  206. elem.addEventListener('click', btn.handlerClick, false);
  207. return btn;
  208. }
  209. function ButtonToggle(settings) {
  210. var self = this;
  211. this.name = settings.name;
  212. this.active = false;
  213. this.bindedElt = null;
  214. this.glyphElt = document.createElement('i');
  215. this.bindElement = function (elem) {
  216. self.bindedElt = elem;
  217. if (self.bindedElt.length > 0) {
  218. elem.insertChildBefore(self.glyphElt, elem.FirstChild);
  219. }
  220. else {
  221. elem.appendChild(self.glyphElt);
  222. }
  223. };
  224. this.glyphOn = settings.glyphOn;
  225. this.glyphOff = settings.glyphOff;
  226. this.callbackOn = settings.callbackOn;
  227. this.callbackOff = settings.callbackOff;
  228. this.save = function () {
  229. localStorage.setItem(self.name, self.active);
  230. };
  231. this.load = function () {
  232. var t = localStorage.getItem(self.name);
  233. if (t === 'true') {
  234. self.setActive(true);
  235. }
  236. else {
  237. self.setActive(false);
  238. }
  239. };
  240. this.handlerClick = function (e) {
  241. if (self.active) {
  242. self.setActive(false);
  243. }
  244. else {
  245. self.setActive(true);
  246. }
  247. };
  248. this.setActive = function (val) {
  249. val = !!val;
  250. self.active = val;
  251. self.save(val);
  252. if (val) {
  253. if (!!self.bindedElt) {
  254. self.bindedElt.classList.add('active');
  255. self.glyphElt.className = self.glyphOn;
  256. }
  257. if (!!self.callbackOn) {
  258. self.callbackOn(self);
  259. }
  260. }
  261. else {
  262. if (!!self.bindedElt) {
  263. self.bindedElt.classList.remove('active');
  264. self.glyphElt.className = self.glyphOff;
  265. }
  266. if (!!self.callbackOff) {
  267. self.callbackOff(self);
  268. }
  269. }
  270. };
  271. }
  272. })();
  273.  
  274. function handleXHRDoc(reqString, callback){
  275. var doc = document.implementation.createHTMLDocument("example");
  276. var xmlhttp = new XMLHttpRequest();
  277. xmlhttp.open('GET', reqString, true);
  278. xmlhttp.send(null);
  279. xmlhttp.onreadystatechange = handle;
  280. function handle(){
  281. if (xmlhttp.readyState == 4) {
  282. if(xmlhttp.status == 200) {
  283. doc.documentElement.innerHTML = xmlhttp.responseText;
  284. console.log(doc);
  285. callback(doc);
  286. }
  287. else{
  288. console.log('Error xhr of ' + reqString);
  289. }
  290. }
  291. }
  292. }
  293.  
  294.  
  295. //from http://stackoverflow.com/questions/2246901/how-can-i-use-jquery-in-greasemonkey-scripts-in-google-chrome
  296. function load(a, b, c) {
  297. var d;
  298. d = document.createElement("script"), d.setAttribute("src", a), b !== null && d.addEventListener("load", b), c !== null && d.addEventListener("error", c), document.body.appendChild(d);
  299. return d;
  300. }
  301. function execute(a) {
  302. var b, c;
  303. typeof a == "function" ? b = "(" + a + ")();" : b = a, c = document.createElement("script"), c.textContent = b, document.body.appendChild(c);
  304. return c;
  305. }
  306. function loadAndExecute(a, b) {
  307. return load(a, function () {
  308. return execute(b);
  309. });
  310. }
  311. //
  312. function _$(selector){
  313. return document.querySelectorAll(selector)[0];
  314. }
  315.  
  316.  
  317.  
  318. function hasClass(elem, name) {
  319. if (!!elem) {
  320. if (!!elem.classList) {
  321. if (elem.classList.contains(name)) {
  322. return true;
  323. }
  324. }
  325. }
  326. return false;
  327. }
  328.  
  329. function addStyle(css){
  330. if (typeof GM_addStyle != "undefined") {
  331. GM_addStyle(css);
  332. } else if (typeof PRO_addStyle != "undefined") {
  333. PRO_addStyle(css);
  334. } else if (typeof addStyle != "undefined") {
  335. addStyle(css);
  336. } else {
  337. var node = document.createElement("style");
  338. node.type = "text/css";
  339. node.appendChild(document.createTextNode(css));
  340. var heads = document.getElementsByTagName("head");
  341. if (heads.length > 0) {
  342. heads[0].appendChild(node);
  343. } else {
  344. // no head yet, stick it whereever
  345. document.documentElement.appendChild(node);
  346. }
  347. }
  348. }