diff --git a/CHANGELOG.md b/CHANGELOG.md
index 03b2486e0..3d39fe6fb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,12 @@
Sometimes the changelog has notes (not comprehensive) acknowledging people's work. This does not mean the changes are their fault, only that their code was used. All changes to the script are chosen by and the fault of the maintainer (ccd0).
+### v1.11.29
+
+**v1.11.29.0** *(2016-03-31)* - [[Firefox](https://raw.githubusercontent.com/ccd0/4chan-x/1.11.29.0/builds/4chan-X-noupdate.user.js "Firefox version")] [[Chromium](https://raw.githubusercontent.com/ccd0/4chan-x/1.11.29.0/builds/4chan-X-noupdate.crx "Chromium version")]
+- Based on v1.11.28.3.
+- Add upvote count and button.
+
### v1.11.28
**v1.11.28.3** *(2016-03-27)* - [[Firefox](https://raw.githubusercontent.com/ccd0/4chan-x/1.11.28.3/builds/4chan-X-noupdate.user.js "Firefox version")] [[Chromium](https://raw.githubusercontent.com/ccd0/4chan-x/1.11.28.3/builds/4chan-X-noupdate.crx "Chromium version")]
diff --git a/builds/4chan-X-beta.crx b/builds/4chan-X-beta.crx
index 30c0b9da5..4c81116f0 100644
Binary files a/builds/4chan-X-beta.crx and b/builds/4chan-X-beta.crx differ
diff --git a/builds/4chan-X-beta.meta.js b/builds/4chan-X-beta.meta.js
index 177bddaa7..194ea53e7 100644
--- a/builds/4chan-X-beta.meta.js
+++ b/builds/4chan-X-beta.meta.js
@@ -1,6 +1,6 @@
// ==UserScript==
// @name 4chan X beta
-// @version 1.11.28.3
+// @version 1.11.29.0
// @minGMVer 1.14
// @minFFVer 26
// @namespace 4chan-X
diff --git a/builds/4chan-X-beta.user.js b/builds/4chan-X-beta.user.js
index 289916e2c..01d90fbcf 100644
--- a/builds/4chan-X-beta.user.js
+++ b/builds/4chan-X-beta.user.js
@@ -1,7 +1,7 @@
// Generated by CoffeeScript
// ==UserScript==
// @name 4chan X beta
-// @version 1.11.28.3
+// @version 1.11.29.0
// @minGMVer 1.14
// @minFFVer 26
// @namespace 4chan-X
@@ -119,7 +119,7 @@
'use strict';
(function() {
- var $, $$, Anonymize, AntiAutoplay, ArchiveLink, Banner, Board, Build, Callbacks, Captcha, CatalogLinks, CatalogThread, Clone, Conf, Config, Connection, CrossOrigin, CustomCSS, DataBoard, DeleteLink, DownloadLink, E, Embedding, ExpandComment, ExpandThread, FappeTyme, Favicon, Fetcher, FileInfo, Filter, Flash, Fourchan, Gallery, Get, Header, IDColor, IDHighlight, ImageCommon, ImageExpand, ImageHover, ImageLoader, Index, Keybinds, Linkify, Main, MarkNewIPs, Menu, Metadata, Nav, NormalizeURL, Notice, PSAHiding, PassLink, Polyfill, Post, PostHiding, PostSuccessful, PruneReplies, QR, QuoteBacklink, QuoteCT, QuoteInline, QuoteOP, QuotePreview, QuoteStrikeThrough, QuoteThreading, QuoteYou, Quotify, RandomAccessList, Recursive, Redirect, RelativeDates, RemoveSpoilers, Report, ReportLink, RevealSpoilers, Sauce, Settings, ShimSet, SimpleDict, Thread, ThreadExcerpt, ThreadHiding, ThreadLinks, ThreadStats, ThreadUpdater, ThreadWatcher, Time, UI, Unread, Volume, c, d, doc, g,
+ var $, $$, Anonymize, AntiAutoplay, ArchiveLink, Banner, Board, Build, Callbacks, Captcha, CatalogLinks, CatalogThread, Clone, Conf, Config, Connection, CrossOrigin, CustomCSS, DataBoard, DeleteLink, DownloadLink, E, Embedding, ExpandComment, ExpandThread, FappeTyme, Favicon, Fetcher, FileInfo, Filter, Flash, Fourchan, Gallery, Get, Header, IDColor, IDHighlight, ImageCommon, ImageExpand, ImageHover, ImageLoader, Index, Keybinds, Linkify, Main, MarkNewIPs, Menu, Metadata, Nav, NormalizeURL, Notice, PSAHiding, PassLink, Polyfill, Post, PostHiding, PostSuccessful, PruneReplies, QR, QuoteBacklink, QuoteCT, QuoteInline, QuoteOP, QuotePreview, QuoteStrikeThrough, QuoteThreading, QuoteYou, Quotify, RandomAccessList, Recursive, Redirect, RelativeDates, RemoveSpoilers, Report, ReportLink, RevealSpoilers, Sauce, Settings, ShimSet, SimpleDict, Thread, ThreadExcerpt, ThreadHiding, ThreadLinks, ThreadStats, ThreadUpdater, ThreadWatcher, Time, UI, Unread, Upvotes, Volume, c, d, doc, g,
slice = [].slice,
indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },
extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
@@ -270,7 +270,8 @@
'Highlight Own Posts': [true, 'Highlights own posts.', 1],
'Mark OP Quotes': [true, 'Add \'(OP)\' to OP quotes.'],
'Mark Cross-thread Quotes': [true, 'Add \'(Cross-thread)\' to cross-threads quotes.'],
- 'Quote Threading': [false, 'Thread conversations']
+ 'Quote Threading': [false, 'Thread conversations'],
+ 'Upvotes': [true, 'Upvote posts.']
}
},
imageExpansion: {
@@ -443,7 +444,7 @@
doc = d.documentElement;
g = {
- VERSION: '1.11.28.3',
+ VERSION: '1.11.29.0',
NAMESPACE: '4chan X.',
boards: {}
};
@@ -7112,6 +7113,88 @@
}
};
+ Upvotes = {
+ count: {},
+ text: '\u305D\u3046\u3060\u306D',
+ regexp: /(?:^>.*\n)+(?:i|top|holy|shit|ay*|oh?|omg|god|jesus|christ|fuck|fukken|fucking?|\s|[.,-])*(?:\u305D\u3046\u3060\u306D|this(?! )|\+1|upvote(?! )d?|under[ -]?rated|\/thread|10\/10|(?:lol|kek|lel|lmao)(?:'?d|[.!]?$)|(?:ha)+[.!]?$|saved|nice(?! )|my sides)(?=\b|\W|$)/gmi,
+ init: function() {
+ var ref;
+ if (!(((ref = g.VIEW) === 'thread' || ref === 'index') && Conf['Upvotes'])) {
+ return;
+ }
+ this.textPosted = g.BOARD.ID === 'r9k' ? 'This.' : this.text;
+ return Post.callbacks.push({
+ name: 'Upvotes',
+ cb: this.node
+ });
+ },
+ node: function() {
+ var a, context, k, len1, len2, q, quote, quotes, ref, ref1, ref2, results;
+ if (this.isFetchedQuote || ((ref = this.origin) != null ? ref.isFetchedQuote : void 0)) {
+ return;
+ }
+ if (this.isClone) {
+ this.nodes.vote = $('.upvote', this.nodes.info);
+ $.on(this.nodes.vote, 'click', Upvotes.vote);
+ return;
+ }
+ a = $.el('a', {
+ className: 'upvote',
+ href: 'javascript:;',
+ textContent: '+'
+ });
+ $.add(this.nodes.info, a);
+ this.nodes.vote = a;
+ $.on(a, 'click', Upvotes.vote);
+ if (g.VIEW !== 'thread') {
+ return;
+ }
+ Upvotes.count[this.fullID] = 0;
+ quotes = {};
+ ref1 = this.info.comment.match(Upvotes.regexp) || [];
+ for (k = 0, len1 = ref1.length; k < len1; k++) {
+ context = ref1[k];
+ ref2 = context.match(/>>\d+/g) || [];
+ for (q = 0, len2 = ref2.length; q < len2; q++) {
+ quote = ref2[q];
+ quotes[quote.slice(2)] = true;
+ }
+ }
+ results = [];
+ for (quote in quotes) {
+ results.push(Upvotes.increment(g.BOARD + "." + quote));
+ }
+ return results;
+ },
+ increment: function(fullID) {
+ var count, k, len1, post, ref;
+ if (!(fullID in Upvotes.count)) {
+ return;
+ }
+ count = ++Upvotes.count[fullID];
+ post = g.posts[fullID];
+ ref = [post].concat(slice.call(post.clones));
+ for (k = 0, len1 = ref.length; k < len1; k++) {
+ post = ref[k];
+ post.nodes.vote.textContent = Upvotes.text + "x" + count;
+ }
+ },
+ vote: function() {
+ var com, pos, text;
+ if (!QR.postingIsEnabled) {
+ return;
+ }
+ QR.quote.call(this);
+ com = QR.nodes.com;
+ text = Upvotes.textPosted + "\n";
+ pos = com.selectionStart;
+ com.value = com.value.slice(0, +pos + 1 || 9e9) + text + com.value.slice(pos);
+ pos += text.length;
+ com.setSelectionRange(pos, pos);
+ return $.event('input', null, com);
+ }
+ };
+
QR = {
mimeTypes: ['image/jpeg', 'image/png', 'image/gif', 'application/pdf', 'application/vnd.adobe.flash.movie', 'application/x-shockwave-flash', 'video/webm'],
validExtension: /\.(jpe?g|png|gif|pdf|swf|webm)$/i,
@@ -21304,6 +21387,13 @@
":root.gallery-open.fixed #header-bar:not(.autohide) #shortcuts .fa::before {\n" +
" visibility: hidden;\n" +
"}\n" +
+"/* Upvotes */\n" +
+".upvote {\n" +
+" margin: 0 4px;\n" +
+"}\n" +
+".post .menu-button:not(:last-of-type) {\n" +
+" margin-right: -4px;\n" +
+"}\n" +
"/* General */\n" +
":root.yotsuba .dialog {\n" +
" background-color: #F0E0D6;\n" +
@@ -21820,7 +21910,7 @@
cssWWW: "#captcha-cnt {\n" +
" height: auto;\n" +
"}",
- features: [['Polyfill', Polyfill], ['Normalize URL', NormalizeURL], ['Captcha Configuration', Captcha.replace], ['Redirect', Redirect], ['Header', Header], ['Catalog Links', CatalogLinks], ['Settings', Settings], ['Index Generator', Index], ['Disable Autoplay', AntiAutoplay], ['Announcement Hiding', PSAHiding], ['Fourchan thingies', Fourchan], ['Color User IDs', IDColor], ['Highlight by User ID', IDHighlight], ['Custom CSS', CustomCSS], ['Thread Links', ThreadLinks], ['Linkify', Linkify], ['Reveal Spoilers', RemoveSpoilers], ['Resurrect Quotes', Quotify], ['Filter', Filter], ['Thread Hiding Buttons', ThreadHiding], ['Reply Hiding Buttons', PostHiding], ['Recursive', Recursive], ['Strike-through Quotes', QuoteStrikeThrough], ['Quick Reply', QR], ['Cooldown', QR.cooldown], ['Pass Link', PassLink], ['Menu', Menu], ['Index Generator (Menu)', Index.menu], ['Report Link', ReportLink], ['Thread Hiding (Menu)', ThreadHiding.menu], ['Reply Hiding (Menu)', PostHiding.menu], ['Delete Link', DeleteLink], ['Filter (Menu)', Filter.menu], ['Edit Link', QR.oekaki.menu], ['Download Link', DownloadLink], ['Archive Link', ArchiveLink], ['Quote Inlining', QuoteInline], ['Quote Previewing', QuotePreview], ['Quote Backlinks', QuoteBacklink], ['Mark Quotes of You', QuoteYou], ['Mark OP Quotes', QuoteOP], ['Mark Cross-thread Quotes', QuoteCT], ['Anonymize', Anonymize], ['Time Formatting', Time], ['Relative Post Dates', RelativeDates], ['File Info Formatting', FileInfo], ['Fappe Tyme', FappeTyme], ['Gallery', Gallery], ['Gallery (menu)', Gallery.menu], ['Sauce', Sauce], ['Image Expansion', ImageExpand], ['Image Expansion (Menu)', ImageExpand.menu], ['Reveal Spoiler Thumbnails', RevealSpoilers], ['Image Loading', ImageLoader], ['Image Hover', ImageHover], ['Volume Control', Volume], ['WEBM Metadata', Metadata], ['Comment Expansion', ExpandComment], ['Thread Expansion', ExpandThread], ['Thread Excerpt', ThreadExcerpt], ['Favicon', Favicon], ['Unread', Unread], ['Quote Threading', QuoteThreading], ['Thread Stats', ThreadStats], ['Thread Updater', ThreadUpdater], ['Thread Watcher', ThreadWatcher], ['Thread Watcher (Menu)', ThreadWatcher.menu], ['Mark New IPs', MarkNewIPs], ['Index Navigation', Nav], ['Keybinds', Keybinds], ['Banner', Banner], ['Flash Features', Flash], ['Prune Replies', PruneReplies]]
+ features: [['Polyfill', Polyfill], ['Normalize URL', NormalizeURL], ['Captcha Configuration', Captcha.replace], ['Redirect', Redirect], ['Header', Header], ['Catalog Links', CatalogLinks], ['Settings', Settings], ['Index Generator', Index], ['Disable Autoplay', AntiAutoplay], ['Announcement Hiding', PSAHiding], ['Fourchan thingies', Fourchan], ['Color User IDs', IDColor], ['Highlight by User ID', IDHighlight], ['Custom CSS', CustomCSS], ['Thread Links', ThreadLinks], ['Linkify', Linkify], ['Reveal Spoilers', RemoveSpoilers], ['Resurrect Quotes', Quotify], ['Filter', Filter], ['Thread Hiding Buttons', ThreadHiding], ['Reply Hiding Buttons', PostHiding], ['Recursive', Recursive], ['Strike-through Quotes', QuoteStrikeThrough], ['Quick Reply', QR], ['Cooldown', QR.cooldown], ['Pass Link', PassLink], ['Menu', Menu], ['Index Generator (Menu)', Index.menu], ['Report Link', ReportLink], ['Thread Hiding (Menu)', ThreadHiding.menu], ['Reply Hiding (Menu)', PostHiding.menu], ['Delete Link', DeleteLink], ['Filter (Menu)', Filter.menu], ['Edit Link', QR.oekaki.menu], ['Download Link', DownloadLink], ['Archive Link', ArchiveLink], ['Upvotes', Upvotes], ['Quote Inlining', QuoteInline], ['Quote Previewing', QuotePreview], ['Quote Backlinks', QuoteBacklink], ['Mark Quotes of You', QuoteYou], ['Mark OP Quotes', QuoteOP], ['Mark Cross-thread Quotes', QuoteCT], ['Anonymize', Anonymize], ['Time Formatting', Time], ['Relative Post Dates', RelativeDates], ['File Info Formatting', FileInfo], ['Fappe Tyme', FappeTyme], ['Gallery', Gallery], ['Gallery (menu)', Gallery.menu], ['Sauce', Sauce], ['Image Expansion', ImageExpand], ['Image Expansion (Menu)', ImageExpand.menu], ['Reveal Spoiler Thumbnails', RevealSpoilers], ['Image Loading', ImageLoader], ['Image Hover', ImageHover], ['Volume Control', Volume], ['WEBM Metadata', Metadata], ['Comment Expansion', ExpandComment], ['Thread Expansion', ExpandThread], ['Thread Excerpt', ThreadExcerpt], ['Favicon', Favicon], ['Unread', Unread], ['Quote Threading', QuoteThreading], ['Thread Stats', ThreadStats], ['Thread Updater', ThreadUpdater], ['Thread Watcher', ThreadWatcher], ['Thread Watcher (Menu)', ThreadWatcher.menu], ['Mark New IPs', MarkNewIPs], ['Index Navigation', Nav], ['Keybinds', Keybinds], ['Banner', Banner], ['Flash Features', Flash], ['Prune Replies', PruneReplies]]
};
Main.init();
diff --git a/builds/4chan-X-noupdate.crx b/builds/4chan-X-noupdate.crx
index 05984697e..abc8843e8 100644
Binary files a/builds/4chan-X-noupdate.crx and b/builds/4chan-X-noupdate.crx differ
diff --git a/builds/4chan-X-noupdate.user.js b/builds/4chan-X-noupdate.user.js
index 73717479d..e13f3317f 100644
--- a/builds/4chan-X-noupdate.user.js
+++ b/builds/4chan-X-noupdate.user.js
@@ -1,7 +1,7 @@
// Generated by CoffeeScript
// ==UserScript==
// @name 4chan X
-// @version 1.11.28.3
+// @version 1.11.29.0
// @minGMVer 1.14
// @minFFVer 26
// @namespace 4chan-X
@@ -119,7 +119,7 @@
'use strict';
(function() {
- var $, $$, Anonymize, AntiAutoplay, ArchiveLink, Banner, Board, Build, Callbacks, Captcha, CatalogLinks, CatalogThread, Clone, Conf, Config, Connection, CrossOrigin, CustomCSS, DataBoard, DeleteLink, DownloadLink, E, Embedding, ExpandComment, ExpandThread, FappeTyme, Favicon, Fetcher, FileInfo, Filter, Flash, Fourchan, Gallery, Get, Header, IDColor, IDHighlight, ImageCommon, ImageExpand, ImageHover, ImageLoader, Index, Keybinds, Linkify, Main, MarkNewIPs, Menu, Metadata, Nav, NormalizeURL, Notice, PSAHiding, PassLink, Polyfill, Post, PostHiding, PostSuccessful, PruneReplies, QR, QuoteBacklink, QuoteCT, QuoteInline, QuoteOP, QuotePreview, QuoteStrikeThrough, QuoteThreading, QuoteYou, Quotify, RandomAccessList, Recursive, Redirect, RelativeDates, RemoveSpoilers, Report, ReportLink, RevealSpoilers, Sauce, Settings, ShimSet, SimpleDict, Thread, ThreadExcerpt, ThreadHiding, ThreadLinks, ThreadStats, ThreadUpdater, ThreadWatcher, Time, UI, Unread, Volume, c, d, doc, g,
+ var $, $$, Anonymize, AntiAutoplay, ArchiveLink, Banner, Board, Build, Callbacks, Captcha, CatalogLinks, CatalogThread, Clone, Conf, Config, Connection, CrossOrigin, CustomCSS, DataBoard, DeleteLink, DownloadLink, E, Embedding, ExpandComment, ExpandThread, FappeTyme, Favicon, Fetcher, FileInfo, Filter, Flash, Fourchan, Gallery, Get, Header, IDColor, IDHighlight, ImageCommon, ImageExpand, ImageHover, ImageLoader, Index, Keybinds, Linkify, Main, MarkNewIPs, Menu, Metadata, Nav, NormalizeURL, Notice, PSAHiding, PassLink, Polyfill, Post, PostHiding, PostSuccessful, PruneReplies, QR, QuoteBacklink, QuoteCT, QuoteInline, QuoteOP, QuotePreview, QuoteStrikeThrough, QuoteThreading, QuoteYou, Quotify, RandomAccessList, Recursive, Redirect, RelativeDates, RemoveSpoilers, Report, ReportLink, RevealSpoilers, Sauce, Settings, ShimSet, SimpleDict, Thread, ThreadExcerpt, ThreadHiding, ThreadLinks, ThreadStats, ThreadUpdater, ThreadWatcher, Time, UI, Unread, Upvotes, Volume, c, d, doc, g,
slice = [].slice,
indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },
extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
@@ -270,7 +270,8 @@
'Highlight Own Posts': [true, 'Highlights own posts.', 1],
'Mark OP Quotes': [true, 'Add \'(OP)\' to OP quotes.'],
'Mark Cross-thread Quotes': [true, 'Add \'(Cross-thread)\' to cross-threads quotes.'],
- 'Quote Threading': [false, 'Thread conversations']
+ 'Quote Threading': [false, 'Thread conversations'],
+ 'Upvotes': [true, 'Upvote posts.']
}
},
imageExpansion: {
@@ -443,7 +444,7 @@
doc = d.documentElement;
g = {
- VERSION: '1.11.28.3',
+ VERSION: '1.11.29.0',
NAMESPACE: '4chan X.',
boards: {}
};
@@ -7112,6 +7113,88 @@
}
};
+ Upvotes = {
+ count: {},
+ text: '\u305D\u3046\u3060\u306D',
+ regexp: /(?:^>.*\n)+(?:i|top|holy|shit|ay*|oh?|omg|god|jesus|christ|fuck|fukken|fucking?|\s|[.,-])*(?:\u305D\u3046\u3060\u306D|this(?! )|\+1|upvote(?! )d?|under[ -]?rated|\/thread|10\/10|(?:lol|kek|lel|lmao)(?:'?d|[.!]?$)|(?:ha)+[.!]?$|saved|nice(?! )|my sides)(?=\b|\W|$)/gmi,
+ init: function() {
+ var ref;
+ if (!(((ref = g.VIEW) === 'thread' || ref === 'index') && Conf['Upvotes'])) {
+ return;
+ }
+ this.textPosted = g.BOARD.ID === 'r9k' ? 'This.' : this.text;
+ return Post.callbacks.push({
+ name: 'Upvotes',
+ cb: this.node
+ });
+ },
+ node: function() {
+ var a, context, k, len1, len2, q, quote, quotes, ref, ref1, ref2, results;
+ if (this.isFetchedQuote || ((ref = this.origin) != null ? ref.isFetchedQuote : void 0)) {
+ return;
+ }
+ if (this.isClone) {
+ this.nodes.vote = $('.upvote', this.nodes.info);
+ $.on(this.nodes.vote, 'click', Upvotes.vote);
+ return;
+ }
+ a = $.el('a', {
+ className: 'upvote',
+ href: 'javascript:;',
+ textContent: '+'
+ });
+ $.add(this.nodes.info, a);
+ this.nodes.vote = a;
+ $.on(a, 'click', Upvotes.vote);
+ if (g.VIEW !== 'thread') {
+ return;
+ }
+ Upvotes.count[this.fullID] = 0;
+ quotes = {};
+ ref1 = this.info.comment.match(Upvotes.regexp) || [];
+ for (k = 0, len1 = ref1.length; k < len1; k++) {
+ context = ref1[k];
+ ref2 = context.match(/>>\d+/g) || [];
+ for (q = 0, len2 = ref2.length; q < len2; q++) {
+ quote = ref2[q];
+ quotes[quote.slice(2)] = true;
+ }
+ }
+ results = [];
+ for (quote in quotes) {
+ results.push(Upvotes.increment(g.BOARD + "." + quote));
+ }
+ return results;
+ },
+ increment: function(fullID) {
+ var count, k, len1, post, ref;
+ if (!(fullID in Upvotes.count)) {
+ return;
+ }
+ count = ++Upvotes.count[fullID];
+ post = g.posts[fullID];
+ ref = [post].concat(slice.call(post.clones));
+ for (k = 0, len1 = ref.length; k < len1; k++) {
+ post = ref[k];
+ post.nodes.vote.textContent = Upvotes.text + "x" + count;
+ }
+ },
+ vote: function() {
+ var com, pos, text;
+ if (!QR.postingIsEnabled) {
+ return;
+ }
+ QR.quote.call(this);
+ com = QR.nodes.com;
+ text = Upvotes.textPosted + "\n";
+ pos = com.selectionStart;
+ com.value = com.value.slice(0, +pos + 1 || 9e9) + text + com.value.slice(pos);
+ pos += text.length;
+ com.setSelectionRange(pos, pos);
+ return $.event('input', null, com);
+ }
+ };
+
QR = {
mimeTypes: ['image/jpeg', 'image/png', 'image/gif', 'application/pdf', 'application/vnd.adobe.flash.movie', 'application/x-shockwave-flash', 'video/webm'],
validExtension: /\.(jpe?g|png|gif|pdf|swf|webm)$/i,
@@ -21304,6 +21387,13 @@
":root.gallery-open.fixed #header-bar:not(.autohide) #shortcuts .fa::before {\n" +
" visibility: hidden;\n" +
"}\n" +
+"/* Upvotes */\n" +
+".upvote {\n" +
+" margin: 0 4px;\n" +
+"}\n" +
+".post .menu-button:not(:last-of-type) {\n" +
+" margin-right: -4px;\n" +
+"}\n" +
"/* General */\n" +
":root.yotsuba .dialog {\n" +
" background-color: #F0E0D6;\n" +
@@ -21820,7 +21910,7 @@
cssWWW: "#captcha-cnt {\n" +
" height: auto;\n" +
"}",
- features: [['Polyfill', Polyfill], ['Normalize URL', NormalizeURL], ['Captcha Configuration', Captcha.replace], ['Redirect', Redirect], ['Header', Header], ['Catalog Links', CatalogLinks], ['Settings', Settings], ['Index Generator', Index], ['Disable Autoplay', AntiAutoplay], ['Announcement Hiding', PSAHiding], ['Fourchan thingies', Fourchan], ['Color User IDs', IDColor], ['Highlight by User ID', IDHighlight], ['Custom CSS', CustomCSS], ['Thread Links', ThreadLinks], ['Linkify', Linkify], ['Reveal Spoilers', RemoveSpoilers], ['Resurrect Quotes', Quotify], ['Filter', Filter], ['Thread Hiding Buttons', ThreadHiding], ['Reply Hiding Buttons', PostHiding], ['Recursive', Recursive], ['Strike-through Quotes', QuoteStrikeThrough], ['Quick Reply', QR], ['Cooldown', QR.cooldown], ['Pass Link', PassLink], ['Menu', Menu], ['Index Generator (Menu)', Index.menu], ['Report Link', ReportLink], ['Thread Hiding (Menu)', ThreadHiding.menu], ['Reply Hiding (Menu)', PostHiding.menu], ['Delete Link', DeleteLink], ['Filter (Menu)', Filter.menu], ['Edit Link', QR.oekaki.menu], ['Download Link', DownloadLink], ['Archive Link', ArchiveLink], ['Quote Inlining', QuoteInline], ['Quote Previewing', QuotePreview], ['Quote Backlinks', QuoteBacklink], ['Mark Quotes of You', QuoteYou], ['Mark OP Quotes', QuoteOP], ['Mark Cross-thread Quotes', QuoteCT], ['Anonymize', Anonymize], ['Time Formatting', Time], ['Relative Post Dates', RelativeDates], ['File Info Formatting', FileInfo], ['Fappe Tyme', FappeTyme], ['Gallery', Gallery], ['Gallery (menu)', Gallery.menu], ['Sauce', Sauce], ['Image Expansion', ImageExpand], ['Image Expansion (Menu)', ImageExpand.menu], ['Reveal Spoiler Thumbnails', RevealSpoilers], ['Image Loading', ImageLoader], ['Image Hover', ImageHover], ['Volume Control', Volume], ['WEBM Metadata', Metadata], ['Comment Expansion', ExpandComment], ['Thread Expansion', ExpandThread], ['Thread Excerpt', ThreadExcerpt], ['Favicon', Favicon], ['Unread', Unread], ['Quote Threading', QuoteThreading], ['Thread Stats', ThreadStats], ['Thread Updater', ThreadUpdater], ['Thread Watcher', ThreadWatcher], ['Thread Watcher (Menu)', ThreadWatcher.menu], ['Mark New IPs', MarkNewIPs], ['Index Navigation', Nav], ['Keybinds', Keybinds], ['Banner', Banner], ['Flash Features', Flash], ['Prune Replies', PruneReplies]]
+ features: [['Polyfill', Polyfill], ['Normalize URL', NormalizeURL], ['Captcha Configuration', Captcha.replace], ['Redirect', Redirect], ['Header', Header], ['Catalog Links', CatalogLinks], ['Settings', Settings], ['Index Generator', Index], ['Disable Autoplay', AntiAutoplay], ['Announcement Hiding', PSAHiding], ['Fourchan thingies', Fourchan], ['Color User IDs', IDColor], ['Highlight by User ID', IDHighlight], ['Custom CSS', CustomCSS], ['Thread Links', ThreadLinks], ['Linkify', Linkify], ['Reveal Spoilers', RemoveSpoilers], ['Resurrect Quotes', Quotify], ['Filter', Filter], ['Thread Hiding Buttons', ThreadHiding], ['Reply Hiding Buttons', PostHiding], ['Recursive', Recursive], ['Strike-through Quotes', QuoteStrikeThrough], ['Quick Reply', QR], ['Cooldown', QR.cooldown], ['Pass Link', PassLink], ['Menu', Menu], ['Index Generator (Menu)', Index.menu], ['Report Link', ReportLink], ['Thread Hiding (Menu)', ThreadHiding.menu], ['Reply Hiding (Menu)', PostHiding.menu], ['Delete Link', DeleteLink], ['Filter (Menu)', Filter.menu], ['Edit Link', QR.oekaki.menu], ['Download Link', DownloadLink], ['Archive Link', ArchiveLink], ['Upvotes', Upvotes], ['Quote Inlining', QuoteInline], ['Quote Previewing', QuotePreview], ['Quote Backlinks', QuoteBacklink], ['Mark Quotes of You', QuoteYou], ['Mark OP Quotes', QuoteOP], ['Mark Cross-thread Quotes', QuoteCT], ['Anonymize', Anonymize], ['Time Formatting', Time], ['Relative Post Dates', RelativeDates], ['File Info Formatting', FileInfo], ['Fappe Tyme', FappeTyme], ['Gallery', Gallery], ['Gallery (menu)', Gallery.menu], ['Sauce', Sauce], ['Image Expansion', ImageExpand], ['Image Expansion (Menu)', ImageExpand.menu], ['Reveal Spoiler Thumbnails', RevealSpoilers], ['Image Loading', ImageLoader], ['Image Hover', ImageHover], ['Volume Control', Volume], ['WEBM Metadata', Metadata], ['Comment Expansion', ExpandComment], ['Thread Expansion', ExpandThread], ['Thread Excerpt', ThreadExcerpt], ['Favicon', Favicon], ['Unread', Unread], ['Quote Threading', QuoteThreading], ['Thread Stats', ThreadStats], ['Thread Updater', ThreadUpdater], ['Thread Watcher', ThreadWatcher], ['Thread Watcher (Menu)', ThreadWatcher.menu], ['Mark New IPs', MarkNewIPs], ['Index Navigation', Nav], ['Keybinds', Keybinds], ['Banner', Banner], ['Flash Features', Flash], ['Prune Replies', PruneReplies]]
};
Main.init();
diff --git a/builds/4chan-X.crx b/builds/4chan-X.crx
index c3bf74329..3eb259976 100644
Binary files a/builds/4chan-X.crx and b/builds/4chan-X.crx differ
diff --git a/builds/4chan-X.meta.js b/builds/4chan-X.meta.js
index 165516fe5..75e17b303 100644
--- a/builds/4chan-X.meta.js
+++ b/builds/4chan-X.meta.js
@@ -1,6 +1,6 @@
// ==UserScript==
// @name 4chan X
-// @version 1.11.28.3
+// @version 1.11.29.0
// @minGMVer 1.14
// @minFFVer 26
// @namespace 4chan-X
diff --git a/builds/4chan-X.user.js b/builds/4chan-X.user.js
index 2e643f20f..7605f4ffc 100644
--- a/builds/4chan-X.user.js
+++ b/builds/4chan-X.user.js
@@ -1,7 +1,7 @@
// Generated by CoffeeScript
// ==UserScript==
// @name 4chan X
-// @version 1.11.28.3
+// @version 1.11.29.0
// @minGMVer 1.14
// @minFFVer 26
// @namespace 4chan-X
@@ -119,7 +119,7 @@
'use strict';
(function() {
- var $, $$, Anonymize, AntiAutoplay, ArchiveLink, Banner, Board, Build, Callbacks, Captcha, CatalogLinks, CatalogThread, Clone, Conf, Config, Connection, CrossOrigin, CustomCSS, DataBoard, DeleteLink, DownloadLink, E, Embedding, ExpandComment, ExpandThread, FappeTyme, Favicon, Fetcher, FileInfo, Filter, Flash, Fourchan, Gallery, Get, Header, IDColor, IDHighlight, ImageCommon, ImageExpand, ImageHover, ImageLoader, Index, Keybinds, Linkify, Main, MarkNewIPs, Menu, Metadata, Nav, NormalizeURL, Notice, PSAHiding, PassLink, Polyfill, Post, PostHiding, PostSuccessful, PruneReplies, QR, QuoteBacklink, QuoteCT, QuoteInline, QuoteOP, QuotePreview, QuoteStrikeThrough, QuoteThreading, QuoteYou, Quotify, RandomAccessList, Recursive, Redirect, RelativeDates, RemoveSpoilers, Report, ReportLink, RevealSpoilers, Sauce, Settings, ShimSet, SimpleDict, Thread, ThreadExcerpt, ThreadHiding, ThreadLinks, ThreadStats, ThreadUpdater, ThreadWatcher, Time, UI, Unread, Volume, c, d, doc, g,
+ var $, $$, Anonymize, AntiAutoplay, ArchiveLink, Banner, Board, Build, Callbacks, Captcha, CatalogLinks, CatalogThread, Clone, Conf, Config, Connection, CrossOrigin, CustomCSS, DataBoard, DeleteLink, DownloadLink, E, Embedding, ExpandComment, ExpandThread, FappeTyme, Favicon, Fetcher, FileInfo, Filter, Flash, Fourchan, Gallery, Get, Header, IDColor, IDHighlight, ImageCommon, ImageExpand, ImageHover, ImageLoader, Index, Keybinds, Linkify, Main, MarkNewIPs, Menu, Metadata, Nav, NormalizeURL, Notice, PSAHiding, PassLink, Polyfill, Post, PostHiding, PostSuccessful, PruneReplies, QR, QuoteBacklink, QuoteCT, QuoteInline, QuoteOP, QuotePreview, QuoteStrikeThrough, QuoteThreading, QuoteYou, Quotify, RandomAccessList, Recursive, Redirect, RelativeDates, RemoveSpoilers, Report, ReportLink, RevealSpoilers, Sauce, Settings, ShimSet, SimpleDict, Thread, ThreadExcerpt, ThreadHiding, ThreadLinks, ThreadStats, ThreadUpdater, ThreadWatcher, Time, UI, Unread, Upvotes, Volume, c, d, doc, g,
slice = [].slice,
indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },
extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
@@ -270,7 +270,8 @@
'Highlight Own Posts': [true, 'Highlights own posts.', 1],
'Mark OP Quotes': [true, 'Add \'(OP)\' to OP quotes.'],
'Mark Cross-thread Quotes': [true, 'Add \'(Cross-thread)\' to cross-threads quotes.'],
- 'Quote Threading': [false, 'Thread conversations']
+ 'Quote Threading': [false, 'Thread conversations'],
+ 'Upvotes': [true, 'Upvote posts.']
}
},
imageExpansion: {
@@ -443,7 +444,7 @@
doc = d.documentElement;
g = {
- VERSION: '1.11.28.3',
+ VERSION: '1.11.29.0',
NAMESPACE: '4chan X.',
boards: {}
};
@@ -7112,6 +7113,88 @@
}
};
+ Upvotes = {
+ count: {},
+ text: '\u305D\u3046\u3060\u306D',
+ regexp: /(?:^>.*\n)+(?:i|top|holy|shit|ay*|oh?|omg|god|jesus|christ|fuck|fukken|fucking?|\s|[.,-])*(?:\u305D\u3046\u3060\u306D|this(?! )|\+1|upvote(?! )d?|under[ -]?rated|\/thread|10\/10|(?:lol|kek|lel|lmao)(?:'?d|[.!]?$)|(?:ha)+[.!]?$|saved|nice(?! )|my sides)(?=\b|\W|$)/gmi,
+ init: function() {
+ var ref;
+ if (!(((ref = g.VIEW) === 'thread' || ref === 'index') && Conf['Upvotes'])) {
+ return;
+ }
+ this.textPosted = g.BOARD.ID === 'r9k' ? 'This.' : this.text;
+ return Post.callbacks.push({
+ name: 'Upvotes',
+ cb: this.node
+ });
+ },
+ node: function() {
+ var a, context, k, len1, len2, q, quote, quotes, ref, ref1, ref2, results;
+ if (this.isFetchedQuote || ((ref = this.origin) != null ? ref.isFetchedQuote : void 0)) {
+ return;
+ }
+ if (this.isClone) {
+ this.nodes.vote = $('.upvote', this.nodes.info);
+ $.on(this.nodes.vote, 'click', Upvotes.vote);
+ return;
+ }
+ a = $.el('a', {
+ className: 'upvote',
+ href: 'javascript:;',
+ textContent: '+'
+ });
+ $.add(this.nodes.info, a);
+ this.nodes.vote = a;
+ $.on(a, 'click', Upvotes.vote);
+ if (g.VIEW !== 'thread') {
+ return;
+ }
+ Upvotes.count[this.fullID] = 0;
+ quotes = {};
+ ref1 = this.info.comment.match(Upvotes.regexp) || [];
+ for (k = 0, len1 = ref1.length; k < len1; k++) {
+ context = ref1[k];
+ ref2 = context.match(/>>\d+/g) || [];
+ for (q = 0, len2 = ref2.length; q < len2; q++) {
+ quote = ref2[q];
+ quotes[quote.slice(2)] = true;
+ }
+ }
+ results = [];
+ for (quote in quotes) {
+ results.push(Upvotes.increment(g.BOARD + "." + quote));
+ }
+ return results;
+ },
+ increment: function(fullID) {
+ var count, k, len1, post, ref;
+ if (!(fullID in Upvotes.count)) {
+ return;
+ }
+ count = ++Upvotes.count[fullID];
+ post = g.posts[fullID];
+ ref = [post].concat(slice.call(post.clones));
+ for (k = 0, len1 = ref.length; k < len1; k++) {
+ post = ref[k];
+ post.nodes.vote.textContent = Upvotes.text + "x" + count;
+ }
+ },
+ vote: function() {
+ var com, pos, text;
+ if (!QR.postingIsEnabled) {
+ return;
+ }
+ QR.quote.call(this);
+ com = QR.nodes.com;
+ text = Upvotes.textPosted + "\n";
+ pos = com.selectionStart;
+ com.value = com.value.slice(0, +pos + 1 || 9e9) + text + com.value.slice(pos);
+ pos += text.length;
+ com.setSelectionRange(pos, pos);
+ return $.event('input', null, com);
+ }
+ };
+
QR = {
mimeTypes: ['image/jpeg', 'image/png', 'image/gif', 'application/pdf', 'application/vnd.adobe.flash.movie', 'application/x-shockwave-flash', 'video/webm'],
validExtension: /\.(jpe?g|png|gif|pdf|swf|webm)$/i,
@@ -21304,6 +21387,13 @@
":root.gallery-open.fixed #header-bar:not(.autohide) #shortcuts .fa::before {\n" +
" visibility: hidden;\n" +
"}\n" +
+"/* Upvotes */\n" +
+".upvote {\n" +
+" margin: 0 4px;\n" +
+"}\n" +
+".post .menu-button:not(:last-of-type) {\n" +
+" margin-right: -4px;\n" +
+"}\n" +
"/* General */\n" +
":root.yotsuba .dialog {\n" +
" background-color: #F0E0D6;\n" +
@@ -21820,7 +21910,7 @@
cssWWW: "#captcha-cnt {\n" +
" height: auto;\n" +
"}",
- features: [['Polyfill', Polyfill], ['Normalize URL', NormalizeURL], ['Captcha Configuration', Captcha.replace], ['Redirect', Redirect], ['Header', Header], ['Catalog Links', CatalogLinks], ['Settings', Settings], ['Index Generator', Index], ['Disable Autoplay', AntiAutoplay], ['Announcement Hiding', PSAHiding], ['Fourchan thingies', Fourchan], ['Color User IDs', IDColor], ['Highlight by User ID', IDHighlight], ['Custom CSS', CustomCSS], ['Thread Links', ThreadLinks], ['Linkify', Linkify], ['Reveal Spoilers', RemoveSpoilers], ['Resurrect Quotes', Quotify], ['Filter', Filter], ['Thread Hiding Buttons', ThreadHiding], ['Reply Hiding Buttons', PostHiding], ['Recursive', Recursive], ['Strike-through Quotes', QuoteStrikeThrough], ['Quick Reply', QR], ['Cooldown', QR.cooldown], ['Pass Link', PassLink], ['Menu', Menu], ['Index Generator (Menu)', Index.menu], ['Report Link', ReportLink], ['Thread Hiding (Menu)', ThreadHiding.menu], ['Reply Hiding (Menu)', PostHiding.menu], ['Delete Link', DeleteLink], ['Filter (Menu)', Filter.menu], ['Edit Link', QR.oekaki.menu], ['Download Link', DownloadLink], ['Archive Link', ArchiveLink], ['Quote Inlining', QuoteInline], ['Quote Previewing', QuotePreview], ['Quote Backlinks', QuoteBacklink], ['Mark Quotes of You', QuoteYou], ['Mark OP Quotes', QuoteOP], ['Mark Cross-thread Quotes', QuoteCT], ['Anonymize', Anonymize], ['Time Formatting', Time], ['Relative Post Dates', RelativeDates], ['File Info Formatting', FileInfo], ['Fappe Tyme', FappeTyme], ['Gallery', Gallery], ['Gallery (menu)', Gallery.menu], ['Sauce', Sauce], ['Image Expansion', ImageExpand], ['Image Expansion (Menu)', ImageExpand.menu], ['Reveal Spoiler Thumbnails', RevealSpoilers], ['Image Loading', ImageLoader], ['Image Hover', ImageHover], ['Volume Control', Volume], ['WEBM Metadata', Metadata], ['Comment Expansion', ExpandComment], ['Thread Expansion', ExpandThread], ['Thread Excerpt', ThreadExcerpt], ['Favicon', Favicon], ['Unread', Unread], ['Quote Threading', QuoteThreading], ['Thread Stats', ThreadStats], ['Thread Updater', ThreadUpdater], ['Thread Watcher', ThreadWatcher], ['Thread Watcher (Menu)', ThreadWatcher.menu], ['Mark New IPs', MarkNewIPs], ['Index Navigation', Nav], ['Keybinds', Keybinds], ['Banner', Banner], ['Flash Features', Flash], ['Prune Replies', PruneReplies]]
+ features: [['Polyfill', Polyfill], ['Normalize URL', NormalizeURL], ['Captcha Configuration', Captcha.replace], ['Redirect', Redirect], ['Header', Header], ['Catalog Links', CatalogLinks], ['Settings', Settings], ['Index Generator', Index], ['Disable Autoplay', AntiAutoplay], ['Announcement Hiding', PSAHiding], ['Fourchan thingies', Fourchan], ['Color User IDs', IDColor], ['Highlight by User ID', IDHighlight], ['Custom CSS', CustomCSS], ['Thread Links', ThreadLinks], ['Linkify', Linkify], ['Reveal Spoilers', RemoveSpoilers], ['Resurrect Quotes', Quotify], ['Filter', Filter], ['Thread Hiding Buttons', ThreadHiding], ['Reply Hiding Buttons', PostHiding], ['Recursive', Recursive], ['Strike-through Quotes', QuoteStrikeThrough], ['Quick Reply', QR], ['Cooldown', QR.cooldown], ['Pass Link', PassLink], ['Menu', Menu], ['Index Generator (Menu)', Index.menu], ['Report Link', ReportLink], ['Thread Hiding (Menu)', ThreadHiding.menu], ['Reply Hiding (Menu)', PostHiding.menu], ['Delete Link', DeleteLink], ['Filter (Menu)', Filter.menu], ['Edit Link', QR.oekaki.menu], ['Download Link', DownloadLink], ['Archive Link', ArchiveLink], ['Upvotes', Upvotes], ['Quote Inlining', QuoteInline], ['Quote Previewing', QuotePreview], ['Quote Backlinks', QuoteBacklink], ['Mark Quotes of You', QuoteYou], ['Mark OP Quotes', QuoteOP], ['Mark Cross-thread Quotes', QuoteCT], ['Anonymize', Anonymize], ['Time Formatting', Time], ['Relative Post Dates', RelativeDates], ['File Info Formatting', FileInfo], ['Fappe Tyme', FappeTyme], ['Gallery', Gallery], ['Gallery (menu)', Gallery.menu], ['Sauce', Sauce], ['Image Expansion', ImageExpand], ['Image Expansion (Menu)', ImageExpand.menu], ['Reveal Spoiler Thumbnails', RevealSpoilers], ['Image Loading', ImageLoader], ['Image Hover', ImageHover], ['Volume Control', Volume], ['WEBM Metadata', Metadata], ['Comment Expansion', ExpandComment], ['Thread Expansion', ExpandThread], ['Thread Excerpt', ThreadExcerpt], ['Favicon', Favicon], ['Unread', Unread], ['Quote Threading', QuoteThreading], ['Thread Stats', ThreadStats], ['Thread Updater', ThreadUpdater], ['Thread Watcher', ThreadWatcher], ['Thread Watcher (Menu)', ThreadWatcher.menu], ['Mark New IPs', MarkNewIPs], ['Index Navigation', Nav], ['Keybinds', Keybinds], ['Banner', Banner], ['Flash Features', Flash], ['Prune Replies', PruneReplies]]
};
Main.init();
diff --git a/builds/4chan-X.zip b/builds/4chan-X.zip
index 077cbbbae..fae8d86ce 100644
Binary files a/builds/4chan-X.zip and b/builds/4chan-X.zip differ
diff --git a/builds/updates-beta.xml b/builds/updates-beta.xml
index 6dff11717..f165f228b 100644
--- a/builds/updates-beta.xml
+++ b/builds/updates-beta.xml
@@ -1,7 +1,7 @@
-
+
diff --git a/builds/updates.xml b/builds/updates.xml
index bcb289ce2..d7d10940e 100644
--- a/builds/updates.xml
+++ b/builds/updates.xml
@@ -1,7 +1,7 @@
-
+
diff --git a/version.json b/version.json
index 6b5c37797..0dbf834ef 100644
--- a/version.json
+++ b/version.json
@@ -1,4 +1,4 @@
{
- "version": "1.11.28.3",
- "date": "2016-03-27T23:59:43.063Z"
+ "version": "1.11.29.0",
+ "date": "2016-03-31T11:03:12.056Z"
}