Gelbooru KonaStyle

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

27.01.2015 itibariyledir. En son verisyonu görün.

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