From 9460ec715c857b09f12ffc47cdf957c7d692ffda Mon Sep 17 00:00:00 2001 From: Nicolas Stepien Date: Wed, 7 Dec 2011 21:47:19 +0100 Subject: [PATCH] Favicon customization. --- 4chan_x.user.js | 73 +++++++++++++++++++++++++++++++++++-------------- changelog | 1 + script.coffee | 60 ++++++++++++++++++++++++++++------------ 3 files changed, 95 insertions(+), 39 deletions(-) diff --git a/4chan_x.user.js b/4chan_x.user.js index c6650384b..8e038f277 100644 --- a/4chan_x.user.js +++ b/4chan_x.user.js @@ -137,6 +137,7 @@ flavors: ['http://iqdb.org/?url=', 'http://google.com/searchbyimage?image_url=', '#http://tineye.com/search?url=', '#http://saucenao.com/search.php?db=999&url=', '#http://3d.iqdb.org/?url=', '#http://regex.info/exif.cgi?imgurl=', '#http://imgur.com/upload?url='].join('\n'), time: '%m/%d/%y(%a)%H:%M', backlink: '>>%id', + favicon: 'ferongr', hotkeys: { close: 'Esc', spoiler: 'ctrl+s', @@ -1241,7 +1242,7 @@ } }, dialog: function() { - var arr, back, checked, description, dialog, hiddenNum, hiddenThreads, indicator, indicators, input, key, li, obj, overlay, ta, time, ul, _i, _j, _k, _len, _len2, _len3, _ref, _ref2, _ref3, _ref4; + var arr, back, checked, description, dialog, favicon, hiddenNum, hiddenThreads, indicator, indicators, input, key, li, obj, option, overlay, ta, time, ul, _i, _j, _k, _l, _len, _len2, _len3, _len4, _ref, _ref2, _ref3, _ref4, _ref5; dialog = ui.dialog('options', '', '\
\
\ @@ -1297,6 +1298,12 @@
  • Hour: %k, %H, %l (lowercase L), %I (uppercase i), %p, %P
  • \
  • Minutes: %M
  • \ \ +
    Unread Count is disabled.
    \ + \ + \
    \ \
    \ @@ -1362,17 +1369,27 @@ (time = $('[name=time]', dialog)).value = conf['time']; $.on(back, 'keyup', options.backlink); $.on(time, 'keyup', options.time); - _ref3 = $$('#keybinds_tab + div input', dialog); + favicon = $('select', dialog); + _ref3 = favicon.options; for (_j = 0, _len2 = _ref3.length; _j < _len2; _j++) { - input = _ref3[_j]; + option = _ref3[_j]; + if (option.textContent === conf['favicon']) { + option.selected = true; + break; + } + } + $.on(favicon, 'change', options.favicon); + _ref4 = $$('#keybinds_tab + div input', dialog); + for (_k = 0, _len3 = _ref4.length; _k < _len3; _k++) { + input = _ref4[_k]; input.type = 'text'; input.value = conf[input.name]; $.on(input, 'keydown', options.keybind); } indicators = {}; - _ref4 = $$('.error', dialog); - for (_k = 0, _len3 = _ref4.length; _k < _len3; _k++) { - indicator = _ref4[_k]; + _ref5 = $$('.error', dialog); + for (_l = 0, _len4 = _ref5.length; _l < _len4; _l++) { + indicator = _ref5[_l]; key = indicator.firstChild.textContent; indicator.hidden = conf[key]; indicators[key] = indicator; @@ -1391,8 +1408,9 @@ }); $.add(overlay, dialog); $.add(d.body, overlay); + options.backlink.call(back); options.time.call(time); - return options.backlink.call(back); + return options.favicon.call(favicon); }, clearHidden: function() { $["delete"]("hiddenReplies/" + g.BOARD + "/"); @@ -1405,20 +1423,23 @@ e.stopPropagation(); if ((key = keybinds.keyCode(e)) == null) return; this.value = key; - $.set(this.name, key); - return conf[this.name] = key; + return $.cb.value.call(this); }, time: function() { - $.set('time', this.value); - conf['time'] = this.value; + $.cb.value.call(this); Time.foo(); Time.date = new Date(); return $('#timePreview').textContent = Time.funk(Time); }, backlink: function() { - $.set('backlink', this.value); - conf['backlink'] = this.value; + $.cb.value.call(this); return $('#backlinkPreview').textContent = conf['backlink'].replace(/%id/, '123456789'); + }, + favicon: function() { + $.cb.value.call(this); + Favicon["switch"](); + Favicon.update(); + return this.nextElementSibling.innerHTML = ""; } }; @@ -2712,19 +2733,29 @@ favicon = $('link[rel="shortcut icon"]', d.head); favicon.type = 'image/x-icon'; href = favicon.href; - Favicon["default"] = href; - return Favicon.unread = /ws/.test(href) ? Favicon.unreadSFW : Favicon.unreadNSFW; + this.SFW = /ws.ico$/.test(href); + this["default"] = href; + return this["switch"](); + }, + "switch": function() { + switch (conf['favicon']) { + case 'ferongr': + this.unreadDead = 'data:image/gif;base64,R0lGODlhEAAQAOMHAOgLAnMFAL8AAOgLAukMA/+AgP+rq////////////////////////////////////yH5BAEKAAcALAAAAAAQABAAAARZ8MhJ6xwDWIBv+AM1fEEIBIVRlNKYrtpIECuGzuwpCLg974EYiXUYkUItjGbC6VQ4omXFiKROA6qSy0A8nAo9GS3YCswIWnOvLAi0be23Z1QtdSUaqXcviQAAOw=='; + this.unreadSFW = 'data:image/gif;base64,R0lGODlhEAAQAOMHAADX8QBwfgC2zADX8QDY8nnl8qLp8v///////////////////////////////////yH5BAEKAAcALAAAAAAQABAAAARZ8MhJ6xwDWIBv+AM1fEEIBIVRlNKYrtpIECuGzuwpCLg974EYiXUYkUItjGbC6VQ4omXFiKROA6qSy0A8nAo9GS3YCswIWnOvLAi0be23Z1QtdSUaqXcviQAAOw=='; + this.unreadNSFW = 'data:image/gif;base64,R0lGODlhEAAQAOMHAFT+ACh5AEncAFT+AFX/Acz/su7/5v///////////////////////////////////yH5BAEKAAcALAAAAAAQABAAAARZ8MhJ6xwDWIBv+AM1fEEIBIVRlNKYrtpIECuGzuwpCLg974EYiXUYkUItjGbC6VQ4omXFiKROA6qSy0A8nAo9GS3YCswIWnOvLAi0be23Z1QtdSUaqXcviQAAOw=='; + break; + case 'None': + this.unreadDead = this.unreadSFW = this.unreadNSFW = this["default"]; + } + return this.unread = this.SFW ? this.unreadSFW : this.unreadNSFW; }, empty: 'data:image/gif;base64,R0lGODlhEAAQAJEAAAAAAP///9vb2////yH5BAEAAAMALAAAAAAQABAAAAIvnI+pq+D9DBAUoFkPFnbs7lFZKIJOJJ3MyraoB14jFpOcVMpzrnF3OKlZYsMWowAAOw==', dead: 'data:image/gif;base64,R0lGODlhEAAQAKECAAAAAP8AAP///////yH5BAEKAAIALAAAAAAQABAAAAIvlI+pq+D9DAgUoFkPDlbs7lFZKIJOJJ3MyraoB14jFpOcVMpzrnF3OKlZYsMWowAAOw==', - unreadDead: 'data:image/png;base64,R0lGODlhEAAQAOMHAOgLAnMFAL8AAOgLAukMA/+AgP+rq////////////////////////////////////yH5BAEKAAcALAAAAAAQABAAAARZ8MhJ6xwDWIBv+AM1fEEIBIVRlNKYrtpIECuGzuwpCLg974EYiXUYkUItjGbC6VQ4omXFiKROA6qSy0A8nAo9GS3YCswIWnOvLAi0be23Z1QtdSUaqXcviQAAOw==', - unreadSFW: 'data:image/png;base64,R0lGODlhEAAQAOMHAADX8QBwfgC2zADX8QDY8nnl8qLp8v///////////////////////////////////yH5BAEKAAcALAAAAAAQABAAAARZ8MhJ6xwDWIBv+AM1fEEIBIVRlNKYrtpIECuGzuwpCLg974EYiXUYkUItjGbC6VQ4omXFiKROA6qSy0A8nAo9GS3YCswIWnOvLAi0be23Z1QtdSUaqXcviQAAOw==', - unreadNSFW: 'data:image/png;base64,R0lGODlhEAAQAOMHAFT+ACh5AEncAFT+AFX/Acz/su7/5v///////////////////////////////////yH5BAEKAAcALAAAAAAQABAAAARZ8MhJ6xwDWIBv+AM1fEEIBIVRlNKYrtpIECuGzuwpCLg974EYiXUYkUItjGbC6VQ4omXFiKROA6qSy0A8nAo9GS3YCswIWnOvLAi0be23Z1QtdSUaqXcviQAAOw==', update: function() { var clone, favicon, l; l = unread.replies.length; favicon = $('link[rel="shortcut icon"]', d.head); - favicon.href = g.dead ? l ? Favicon.unreadDead : Favicon.dead : l ? Favicon.unread : Favicon["default"]; + favicon.href = g.dead ? l ? this.unreadDead : this.dead : l ? this.unread : this["default"]; if (engine === "gecko") { clone = favicon.cloneNode(true); return $.replace(favicon, clone); @@ -2929,7 +2960,8 @@ innerHTML: " " }); imageType = $.get('imageType', 'full'); - _ref = $$('option', controls); + select = $('select', controls); + _ref = select.options; for (_i = 0, _len = _ref.length; _i < _len; _i++) { option = _ref[_i]; if (option.textContent === imageType) { @@ -2937,7 +2969,6 @@ break; } } - select = $('select', controls); imgExpand.cb.typeChange.call(select); $.on(select, 'change', $.cb.value); $.on(select, 'change', imgExpand.cb.typeChange); diff --git a/changelog b/changelog index 323fd991d..216864283 100644 --- a/changelog +++ b/changelog @@ -1,5 +1,6 @@ master - mayhem + multiple unread favicons to chose in the options quotes are now inserted at the caret position in the QR quotes also replace the text selection in the QR open QR focused when using the `Open QR without post number inserted` keybind diff --git a/script.coffee b/script.coffee index 35ffc136d..b0c4030df 100644 --- a/script.coffee +++ b/script.coffee @@ -66,6 +66,7 @@ config = ].join '\n' time: '%m/%d/%y(%a)%H:%M' backlink: '>>%id' + favicon: 'ferongr' hotkeys: close: 'Esc' spoiler: 'ctrl+s' @@ -948,6 +949,12 @@ options =
  • Hour: %k, %H, %l (lowercase L), %I (uppercase i), %p, %P
  • Minutes: %M
  • +
    Unread Count is disabled.
    + +
    @@ -1009,6 +1016,12 @@ options = (time = $ '[name=time]', dialog).value = conf['time'] $.on back, 'keyup', options.backlink $.on time, 'keyup', options.time + favicon = $ 'select', dialog + for option in favicon.options + if option.textContent is conf['favicon'] + option.selected = true + break + $.on favicon, 'change', options.favicon #keybinds for input in $$ '#keybinds_tab + div input', dialog @@ -1031,8 +1044,9 @@ options = $.add overlay, dialog $.add d.body, overlay - options.time.call time options.backlink.call back + options.time.call time + options.favicon.call favicon clearHidden: -> #'hidden' might be misleading; it's the number of IDs we're *looking* for, @@ -1046,18 +1060,20 @@ options = e.stopPropagation() return unless (key = keybinds.keyCode e)? @value = key - $.set @name, key - conf[@name] = key + $.cb.value.call @ time: -> - $.set 'time', @value - conf['time'] = @value + $.cb.value.call @ Time.foo() Time.date = new Date() $('#timePreview').textContent = Time.funk Time backlink: -> - $.set 'backlink', @value - conf['backlink'] = @value + $.cb.value.call @ $('#backlinkPreview').textContent = conf['backlink'].replace /%id/, '123456789' + favicon: -> + $.cb.value.call @ + Favicon.switch() + Favicon.update() + @nextElementSibling.innerHTML = "" cooldown = #TODO merge into qr @@ -2103,14 +2119,22 @@ Favicon = favicon = $ 'link[rel="shortcut icon"]', d.head favicon.type = 'image/x-icon' {href} = favicon - Favicon.default = href - Favicon.unread = if /ws/.test href then Favicon.unreadSFW else Favicon.unreadNSFW + @SFW = /ws.ico$/.test href + @default = href + @switch() + + switch: -> + switch conf['favicon'] + when 'ferongr' + @unreadDead = 'data:image/gif;base64,R0lGODlhEAAQAOMHAOgLAnMFAL8AAOgLAukMA/+AgP+rq////////////////////////////////////yH5BAEKAAcALAAAAAAQABAAAARZ8MhJ6xwDWIBv+AM1fEEIBIVRlNKYrtpIECuGzuwpCLg974EYiXUYkUItjGbC6VQ4omXFiKROA6qSy0A8nAo9GS3YCswIWnOvLAi0be23Z1QtdSUaqXcviQAAOw==' + @unreadSFW = 'data:image/gif;base64,R0lGODlhEAAQAOMHAADX8QBwfgC2zADX8QDY8nnl8qLp8v///////////////////////////////////yH5BAEKAAcALAAAAAAQABAAAARZ8MhJ6xwDWIBv+AM1fEEIBIVRlNKYrtpIECuGzuwpCLg974EYiXUYkUItjGbC6VQ4omXFiKROA6qSy0A8nAo9GS3YCswIWnOvLAi0be23Z1QtdSUaqXcviQAAOw==' + @unreadNSFW = 'data:image/gif;base64,R0lGODlhEAAQAOMHAFT+ACh5AEncAFT+AFX/Acz/su7/5v///////////////////////////////////yH5BAEKAAcALAAAAAAQABAAAARZ8MhJ6xwDWIBv+AM1fEEIBIVRlNKYrtpIECuGzuwpCLg974EYiXUYkUItjGbC6VQ4omXFiKROA6qSy0A8nAo9GS3YCswIWnOvLAi0be23Z1QtdSUaqXcviQAAOw==' + when 'None' + @unreadDead = @unreadSFW = @unreadNSFW = @default + @unread = if @SFW then @unreadSFW else @unreadNSFW empty: 'data:image/gif;base64,R0lGODlhEAAQAJEAAAAAAP///9vb2////yH5BAEAAAMALAAAAAAQABAAAAIvnI+pq+D9DBAUoFkPFnbs7lFZKIJOJJ3MyraoB14jFpOcVMpzrnF3OKlZYsMWowAAOw==' dead: 'data:image/gif;base64,R0lGODlhEAAQAKECAAAAAP8AAP///////yH5BAEKAAIALAAAAAAQABAAAAIvlI+pq+D9DAgUoFkPDlbs7lFZKIJOJJ3MyraoB14jFpOcVMpzrnF3OKlZYsMWowAAOw==' - unreadDead: 'data:image/png;base64,R0lGODlhEAAQAOMHAOgLAnMFAL8AAOgLAukMA/+AgP+rq////////////////////////////////////yH5BAEKAAcALAAAAAAQABAAAARZ8MhJ6xwDWIBv+AM1fEEIBIVRlNKYrtpIECuGzuwpCLg974EYiXUYkUItjGbC6VQ4omXFiKROA6qSy0A8nAo9GS3YCswIWnOvLAi0be23Z1QtdSUaqXcviQAAOw==' - unreadSFW: 'data:image/png;base64,R0lGODlhEAAQAOMHAADX8QBwfgC2zADX8QDY8nnl8qLp8v///////////////////////////////////yH5BAEKAAcALAAAAAAQABAAAARZ8MhJ6xwDWIBv+AM1fEEIBIVRlNKYrtpIECuGzuwpCLg974EYiXUYkUItjGbC6VQ4omXFiKROA6qSy0A8nAo9GS3YCswIWnOvLAi0be23Z1QtdSUaqXcviQAAOw==' - unreadNSFW: 'data:image/png;base64,R0lGODlhEAAQAOMHAFT+ACh5AEncAFT+AFX/Acz/su7/5v///////////////////////////////////yH5BAEKAAcALAAAAAAQABAAAARZ8MhJ6xwDWIBv+AM1fEEIBIVRlNKYrtpIECuGzuwpCLg974EYiXUYkUItjGbC6VQ4omXFiKROA6qSy0A8nAo9GS3YCswIWnOvLAi0be23Z1QtdSUaqXcviQAAOw==' update: -> l = unread.replies.length @@ -2119,14 +2143,14 @@ Favicon = favicon.href = if g.dead if l - Favicon.unreadDead + @unreadDead else - Favicon.dead + @dead else if l - Favicon.unread + @unread else - Favicon.default + @default #XXX `favicon.href = href` doesn't work on Firefox if engine is "gecko" @@ -2255,11 +2279,11 @@ imgExpand = " " imageType = $.get 'imageType', 'full' - for option in $$ 'option', controls + select = $ 'select', controls + for option in select.options if option.textContent is imageType option.selected = true break - select = $ 'select', controls imgExpand.cb.typeChange.call select $.on select, 'change', $.cb.value $.on select, 'change', imgExpand.cb.typeChange