diff --git a/4chan_x.user.js b/4chan_x.user.js index 6c45d450e..0fc9f62ba 100644 --- a/4chan_x.user.js +++ b/4chan_x.user.js @@ -137,13 +137,13 @@ } }, filter: { - name: [''].join('\n'), - tripcode: [''].join('\n'), + name: ['# Filter any namefags:', '#/^(?!Anonymous$)/'].join('\n'), + tripcode: ['# Filter any tripfags', '#/^!/'].join('\n'), email: ['# Filter any e-mails that are not `sage` on /a/ and /jp/:', '#/^(?!sage$)/;boards:a,jp'].join('\n'), subject: ['# Filter Generals on /v/:', '#/general/i;boards:v;op:only'].join('\n'), comment: ['# Filter Stallman copypasta on /g/:', '#/what you\'re refer+ing to as linux/i;boards:g'].join('\n'), filename: [''].join('\n'), - dimensions: ['# Highlight potential wallpapers:', '#/1920x1080/;op:yes;highlight;boards:w,wg'].join('\n'), + dimensions: ['# Highlight potential wallpapers:', '#/1920x1080/;op:yes;highlight;top:no;boards:w,wg'].join('\n'), filesize: [''].join('\n'), md5: [''].join('\n') }, @@ -536,7 +536,7 @@ filter = { filters: {}, init: function() { - var boards, filter, hl, key, op, regexp, _i, _len, _ref, _ref2, _ref3, _ref4; + var boards, filter, hl, key, op, regexp, top, _i, _len, _ref, _ref2, _ref3, _ref4, _ref5; for (key in config.filter) { this.filters[key] = []; _ref = conf[key].split('\n'); @@ -555,30 +555,34 @@ alert(e.message); continue; } - op = ((_ref3 = filter.match(/op:(yes|no|only)/)) != null ? _ref3[1].toLowerCase() : void 0) || 'no'; + op = ((_ref3 = filter.match(/[^t]op:(yes|no|only)/)) != null ? _ref3[1].toLowerCase() : void 0) || 'no'; if (hl = /highlight/.test(filter)) { hl = ((_ref4 = filter.match(/highlight:(\w+)/)) != null ? _ref4[1].toLowerCase() : void 0) || 'filter_highlight'; + top = ((_ref5 = filter.match(/top:(yes|no)/)) != null ? _ref5[1].toLowerCase() : void 0) || 'yes'; + top = top === 'yes'; } - this.filters[key].push(this.createFilter(regexp, op, hl)); + this.filters[key].push(this.createFilter(regexp, op, hl, top)); } if (!this.filters[key].length) delete this.filters[key]; } if (Object.keys(this.filters).length) return g.callbacks.push(this.node); }, - createFilter: function(regexp, op, hl) { + createFilter: function(regexp, op, hl, top) { return function(root, value, isOP) { var firstThread, thisThread; if (isOP && op === 'no' || !isOP && op === 'only') return false; if (!regexp.test(value)) return false; if (hl) { $.addClass(root, hl); - if (isOP && !g.REPLY) { + if (isOP && top && !g.REPLY) { thisThread = root.parentNode; if (firstThread = $('div[class=op]')) { $.before(firstThread.parentNode, [thisThread, thisThread.nextElementSibling]); } } - } else if (isOP) { + return false; + } + if (isOP) { if (!g.REPLY) threadHiding.hideHide(root.parentNode); } else { replyHiding.hideHide(root.previousSibling); @@ -2130,7 +2134,8 @@ \

Name:

\

Tripcode:

\ @@ -3488,8 +3493,8 @@ var rect, thumb; thumb = a.firstChild; if (thumb.hidden) { - rect = a.parentNode.getBoundingClientRect(); - if (rect.top < 0) d.body.scrollTop += rect.top; + rect = a.getBoundingClientRect(); + if (rect.top < 0) d.body.scrollTop += rect.top - 42; if (rect.left < 0) d.body.scrollLeft += rect.left; return imgExpand.contract(thumb); } else { diff --git a/changelog b/changelog index 3f4d1e880..061b24184 100644 --- a/changelog +++ b/changelog @@ -3,11 +3,13 @@ master expand images from current position - ahodesuka Add Open Reply in New Tab option for replies made from the main board (not dumping). + Scroll back up (top of anchor - 42px) when unexpanding images. - Mayhem The Filter now has per filter settings: - Filter the OP only along its thread, replies only, or both. - Per boards, or global. - - Highlight, or hide. Highlighted OPs will have their threads put on top of the board page. + - Highlight, or hide. + - Highlighted OPs will have their threads put on top of the board page by default. New filter group: Image dimensions. Fix posting on Safari. Fix rare case where the QR would not accept certain image types. diff --git a/script.coffee b/script.coffee index 00a4f51d5..0972fe59d 100644 --- a/script.coffee +++ b/script.coffee @@ -13,8 +13,8 @@ config = 'Check for Updates': [true, 'Check for updated versions of 4chan X'] Filtering: 'Anonymize': [false, 'Make everybody anonymous'] - 'Filter': [true, 'Self-moderation placebo'] - 'Recursive Filtering': [true, 'Filter replies of filtered posts, recursively'] + 'Filter': [true, 'Self-moderation placebo'] + 'Recursive Filtering': [true, 'Filter replies of filtered posts, recursively'] 'Reply Hiding': [true, 'Hide single replies'] 'Thread Hiding': [true, 'Hide entire threads'] 'Show Stubs': [true, 'Of hidden threads / replies'] @@ -55,10 +55,12 @@ config = 'Forward Hiding': [true, 'Hide original posts of inlined backlinks'] filter: name: [ - '' + '# Filter any namefags:' + '#/^(?!Anonymous$)/' ].join '\n' tripcode: [ - '' + '# Filter any tripfags' + '#/^!/' ].join '\n' email: [ '# Filter any e-mails that are not `sage` on /a/ and /jp/:' @@ -77,7 +79,7 @@ config = ].join '\n' dimensions: [ '# Highlight potential wallpapers:' - '#/1920x1080/;op:yes;highlight;boards:w,wg' + '#/1920x1080/;op:yes;highlight;top:no;boards:w,wg' ].join '\n' filesize: [ '' @@ -462,15 +464,19 @@ filter = # Filter OPs along with their threads, replies only, or both. # Defaults to replies only. - op = filter.match(/op:(yes|no|only)/)?[1].toLowerCase() or 'no' + op = filter.match(/[^t]op:(yes|no|only)/)?[1].toLowerCase() or 'no' # Highlight the post, or hide it. # If not specified, the highlight class will be filter_highlight. # Defaults to post hiding. if hl = /highlight/.test filter - hl = filter.match(/highlight:(\w+)/)?[1].toLowerCase() or 'filter_highlight' + hl = filter.match(/highlight:(\w+)/)?[1].toLowerCase() or 'filter_highlight' + # Put highlighted OP's thread on top of the board page or not. + # Defaults to on top. + top = filter.match(/top:(yes|no)/)?[1].toLowerCase() or 'yes' + top = top is 'yes' # Turn it into a boolean - @filters[key].push @createFilter regexp, op, hl + @filters[key].push @createFilter regexp, op, hl, top # Only execute filter types that contain valid filters. unless @filters[key].length @@ -479,7 +485,7 @@ filter = if Object.keys(@filters).length g.callbacks.push @node - createFilter: (regexp, op, hl) -> + createFilter: (regexp, op, hl, top) -> (root, value, isOP) -> if isOP and op is 'no' or !isOP and op is 'only' return false @@ -487,13 +493,15 @@ filter = return false if hl $.addClass root, hl - if isOP and not g.REPLY + if isOP and top and not g.REPLY # Put the highlighted OPs' threads on top of the board pages... thisThread = root.parentNode # ...before the first non highlighted thread. if firstThread = $ 'div[class=op]' $.before firstThread.parentNode, [thisThread, thisThread.nextElementSibling] - else if isOP + # Continue the filter lookup to add more classes or hide it. + return false + if isOP unless g.REPLY threadHiding.hideHide root.parentNode else @@ -1722,7 +1730,8 @@ options =

Name:

Tripcode:

@@ -2802,8 +2811,8 @@ imgExpand = toggle: (a) -> thumb = a.firstChild if thumb.hidden - rect = a.parentNode.getBoundingClientRect() - d.body.scrollTop += rect.top if rect.top < 0 + rect = a.getBoundingClientRect() + d.body.scrollTop += rect.top - 42 if rect.top < 0 d.body.scrollLeft += rect.left if rect.left < 0 imgExpand.contract thumb else