Add (You). Close #920.

This commit is contained in:
Nicolas Stepien 2013-02-23 17:07:40 +01:00
parent ce5e03fa81
commit 0c220617d9
5 changed files with 89 additions and 30 deletions

View File

@ -43,7 +43,7 @@
*/ */
(function() { (function() {
var $, $$, Anonymize, ArchiveLink, AutoGIF, Board, Build, Clone, Conf, Config, DeleteLink, DownloadLink, ExpandComment, ExpandThread, Favicon, FileInfo, Filter, Fourchan, Get, Header, ImageExpand, ImageHover, Keybinds, Main, Menu, Misc, Nav, Notification, Polyfill, Post, QR, QuoteBacklink, QuoteCT, QuoteInline, QuoteOP, QuotePreview, Quotify, Recursive, Redirect, RelativeDates, ReplyHiding, ReportLink, RevealSpoilers, Sauce, Settings, Thread, ThreadExcerpt, ThreadHiding, ThreadStats, ThreadUpdater, ThreadWatcher, Time, UI, Unread, d, doc, g, var $, $$, Anonymize, ArchiveLink, AutoGIF, Board, Build, Clone, Conf, Config, DeleteLink, DownloadLink, ExpandComment, ExpandThread, Favicon, FileInfo, Filter, Fourchan, Get, Header, ImageExpand, ImageHover, Keybinds, Main, Menu, Misc, Nav, Notification, Polyfill, Post, QR, QuoteBacklink, QuoteCT, QuoteInline, QuoteOP, QuotePreview, QuoteYou, Quotify, Recursive, Redirect, RelativeDates, ReplyHiding, ReportLink, RevealSpoilers, Sauce, Settings, Thread, ThreadExcerpt, ThreadHiding, ThreadStats, ThreadUpdater, ThreadWatcher, Time, UI, Unread, d, doc, g,
__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; }, __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; },
__hasProp = {}.hasOwnProperty, __hasProp = {}.hasOwnProperty,
__extends = 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; }; __extends = 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; };
@ -111,6 +111,7 @@
'Quote Previewing': [true, 'Show quoted post on hover.'], 'Quote Previewing': [true, 'Show quoted post on hover.'],
'Quote Highlighting': [true, 'Highlight the previewed post.'], 'Quote Highlighting': [true, 'Highlight the previewed post.'],
'Resurrect Quotes': [true, 'Link dead quotes to the archives.'], 'Resurrect Quotes': [true, 'Link dead quotes to the archives.'],
'Mark Quotes of You': [true, 'Add \'(You)\' to quotes linking to your posts.'],
'Mark OP Quotes': [true, 'Add \'(OP)\' to OP quotes.'], 'Mark OP Quotes': [true, 'Add \'(OP)\' to OP quotes.'],
'Mark Cross-thread Quotes': [true, 'Add \'(Cross-thread)\' to cross-threads quotes.'] 'Mark Cross-thread Quotes': [true, 'Add \'(Cross-thread)\' to cross-threads quotes.']
} }
@ -3904,6 +3905,36 @@
} }
}; };
QuoteYou = {
init: function() {
if (g.VIEW === 'catalog' || !Conf['Mark Quotes of You'] || !Conf['Quick Reply']) {
return;
}
this.text = '\u00A0(You)';
return Post.prototype.callbacks.push({
name: 'Mark Quotes of You',
cb: this.node
});
},
node: function() {
var postID, quotelink, quotelinks, quotes, thread, threadID, _i, _len, _ref;
if (this.isClone) {
return;
}
if (!(quotes = this.quotes).length) {
return;
}
quotelinks = this.nodes.quotelinks;
for (_i = 0, _len = quotelinks.length; _i < _len; _i++) {
quotelink = quotelinks[_i];
_ref = Get.postDataFromLink(quotelink), threadID = _ref.threadID, postID = _ref.postID;
if ((thread = QR.yourPosts.threads[threadID]) && __indexOf.call(thread, postID) >= 0) {
$.add(quotelink, $.tn(QuoteYou.text));
}
}
}
};
QuoteOP = { QuoteOP = {
init: function() { init: function() {
if (g.VIEW === 'catalog' || !Conf['Mark OP Quotes']) { if (g.VIEW === 'catalog' || !Conf['Mark OP Quotes']) {
@ -3916,7 +3947,7 @@
}); });
}, },
node: function() { node: function() {
var board, op, postID, quote, quotelinks, quotes, _i, _j, _len, _len1, _ref, _ref1; var board, op, postID, quotelink, quotelinks, quotes, _i, _j, _len, _len1, _ref, _ref1;
if (this.isClone && this.thread === this.context.thread) { if (this.isClone && this.thread === this.context.thread) {
return; return;
} }
@ -3926,8 +3957,8 @@
quotelinks = this.nodes.quotelinks; quotelinks = this.nodes.quotelinks;
if (this.isClone && (_ref = this.thread.fullID, __indexOf.call(quotes, _ref) >= 0)) { if (this.isClone && (_ref = this.thread.fullID, __indexOf.call(quotes, _ref) >= 0)) {
for (_i = 0, _len = quotelinks.length; _i < _len; _i++) { for (_i = 0, _len = quotelinks.length; _i < _len; _i++) {
quote = quotelinks[_i]; quotelink = quotelinks[_i];
quote.textContent = quote.textContent.replace(QuoteOP.text, ''); quotelink.textContent = quotelink.textContent.replace(QuoteOP.text, '');
} }
} }
op = (this.isClone ? this.context : this).thread.fullID; op = (this.isClone ? this.context : this).thread.fullID;
@ -3935,10 +3966,10 @@
return; return;
} }
for (_j = 0, _len1 = quotelinks.length; _j < _len1; _j++) { for (_j = 0, _len1 = quotelinks.length; _j < _len1; _j++) {
quote = quotelinks[_j]; quotelink = quotelinks[_j];
_ref1 = Get.postDataFromLink(quote), board = _ref1.board, postID = _ref1.postID; _ref1 = Get.postDataFromLink(quotelink), board = _ref1.board, postID = _ref1.postID;
if (("" + board + "." + postID) === op) { if (("" + board + "." + postID) === op) {
$.add(quote, $.tn(QuoteOP.text)); $.add(quotelink, $.tn(QuoteOP.text));
} }
} }
} }
@ -3956,7 +3987,7 @@
}); });
}, },
node: function() { node: function() {
var board, data, quote, quotelinks, quotes, thread, _i, _len, _ref; var board, data, quotelink, quotelinks, quotes, thread, _i, _len, _ref;
if (this.isClone && this.thread === this.context.thread) { if (this.isClone && this.thread === this.context.thread) {
return; return;
} }
@ -3966,16 +3997,16 @@
quotelinks = this.nodes.quotelinks; quotelinks = this.nodes.quotelinks;
_ref = this.isClone ? this.context : this, board = _ref.board, thread = _ref.thread; _ref = this.isClone ? this.context : this, board = _ref.board, thread = _ref.thread;
for (_i = 0, _len = quotelinks.length; _i < _len; _i++) { for (_i = 0, _len = quotelinks.length; _i < _len; _i++) {
quote = quotelinks[_i]; quotelink = quotelinks[_i];
data = Get.postDataFromLink(quote); data = Get.postDataFromLink(quotelink);
if (!data.threadID) { if (!data.threadID) {
continue; continue;
} }
if (this.isClone) { if (this.isClone) {
quote.textContent = quote.textContent.replace(QuoteCT.text, ''); quotelink.textContent = quotelink.textContent.replace(QuoteCT.text, '');
} }
if (data.board === this.board.ID && data.threadID !== thread.ID) { if (data.board === this.board.ID && data.threadID !== thread.ID) {
$.add(quote, $.tn(QuoteCT.text)); $.add(quotelink, $.tn(QuoteCT.text));
} }
} }
} }
@ -6962,6 +6993,7 @@
initFeature('Quote Inlining', QuoteInline); initFeature('Quote Inlining', QuoteInline);
initFeature('Quote Previewing', QuotePreview); initFeature('Quote Previewing', QuotePreview);
initFeature('Quote Backlinks', QuoteBacklink); initFeature('Quote Backlinks', QuoteBacklink);
initFeature('Mark Quotes of You', QuoteYou);
initFeature('Mark OP Quotes', QuoteOP); initFeature('Mark OP Quotes', QuoteOP);
initFeature('Mark Cross-thread Quotes', QuoteCT); initFeature('Mark Cross-thread Quotes', QuoteCT);
initFeature('Anonymize', Anonymize); initFeature('Anonymize', Anonymize);

View File

@ -2,13 +2,16 @@ beta
- Mayhem - Mayhem
Major rewrite of 4chan X. Major rewrite of 4chan X.
New feature, the Header: New features:
Access the list of boards directly from the Header. Header:
From the Header's menu, access to: Access the list of boards directly from the Header.
Settings From the Header's menu, access to:
Quick Reply shortcut Settings
Image Expansion Quick Reply shortcut
Can be auto-hidden. Image Expansion
Can be auto-hidden.
(You):
"(You)" will be added to quotes linking to your posts.
QR changes: QR changes:
Clicking the submit button while uploading will abort the upload and won't start re-uploading automatically anymore. Clicking the submit button while uploading will abort the upload and won't start re-uploading automatically anymore.

View File

@ -55,6 +55,7 @@ Config =
'Quote Previewing': [true, 'Show quoted post on hover.'] 'Quote Previewing': [true, 'Show quoted post on hover.']
'Quote Highlighting': [true, 'Highlight the previewed post.'] 'Quote Highlighting': [true, 'Highlight the previewed post.']
'Resurrect Quotes': [true, 'Link dead quotes to the archives.'] 'Resurrect Quotes': [true, 'Link dead quotes to the archives.']
'Mark Quotes of You': [true, 'Add \'(You)\' to quotes linking to your posts.']
'Mark OP Quotes': [true, 'Add \'(OP)\' to OP quotes.'] 'Mark OP Quotes': [true, 'Add \'(OP)\' to OP quotes.']
'Mark Cross-thread Quotes': [true, 'Add \'(Cross-thread)\' to cross-threads quotes.'] 'Mark Cross-thread Quotes': [true, 'Add \'(Cross-thread)\' to cross-threads quotes.']
imageExpansion: imageExpansion:

View File

@ -2546,6 +2546,28 @@ QuoteBacklink =
@containers[id] or= @containers[id] or=
$.el 'span', className: 'container' $.el 'span', className: 'container'
QuoteYou =
init: ->
return if g.VIEW is 'catalog' or !Conf['Mark Quotes of You'] or !Conf['Quick Reply']
# \u00A0 is nbsp
@text = '\u00A0(You)'
Post::callbacks.push
name: 'Mark Quotes of You'
cb: @node
node: ->
# Stop there if it's a clone.
return if @isClone
# Stop there if there's no quotes in that post.
return unless (quotes = @quotes).length
{quotelinks} = @nodes
for quotelink in quotelinks
{threadID, postID} = Get.postDataFromLink quotelink
if (thread = QR.yourPosts.threads[threadID]) and postID in thread
$.add quotelink, $.tn QuoteYou.text
return
QuoteOP = QuoteOP =
init: -> init: ->
return if g.VIEW is 'catalog' or !Conf['Mark OP Quotes'] return if g.VIEW is 'catalog' or !Conf['Mark OP Quotes']
@ -2560,20 +2582,20 @@ QuoteOP =
return if @isClone and @thread is @context.thread return if @isClone and @thread is @context.thread
# Stop there if there's no quotes in that post. # Stop there if there's no quotes in that post.
return unless (quotes = @quotes).length return unless (quotes = @quotes).length
quotelinks = @nodes.quotelinks {quotelinks} = @nodes
# rm (OP) from cross-thread quotes. # rm (OP) from cross-thread quotes.
if @isClone and @thread.fullID in quotes if @isClone and @thread.fullID in quotes
for quote in quotelinks for quotelink in quotelinks
quote.textContent = quote.textContent.replace QuoteOP.text, '' quotelink.textContent = quotelink.textContent.replace QuoteOP.text, ''
op = (if @isClone then @context else @).thread.fullID op = (if @isClone then @context else @).thread.fullID
# add (OP) to quotes quoting this context's OP. # add (OP) to quotes quoting this context's OP.
return unless op in quotes return unless op in quotes
for quote in quotelinks for quotelink in quotelinks
{board, postID} = Get.postDataFromLink quote {board, postID} = Get.postDataFromLink quotelink
if "#{board}.#{postID}" is op if "#{board}.#{postID}" is op
$.add quote, $.tn QuoteOP.text $.add quotelink, $.tn QuoteOP.text
return return
QuoteCT = QuoteCT =
@ -2590,16 +2612,16 @@ QuoteCT =
return if @isClone and @thread is @context.thread return if @isClone and @thread is @context.thread
# Stop there if there's no quotes in that post. # Stop there if there's no quotes in that post.
return unless (quotes = @quotes).length return unless (quotes = @quotes).length
quotelinks = @nodes.quotelinks {quotelinks} = @nodes
{board, thread} = if @isClone then @context else @ {board, thread} = if @isClone then @context else @
for quote in quotelinks for quotelink in quotelinks
data = Get.postDataFromLink quote data = Get.postDataFromLink quotelink
continue unless data.threadID # deadlink continue unless data.threadID # deadlink
if @isClone if @isClone
quote.textContent = quote.textContent.replace QuoteCT.text, '' quotelink.textContent = quotelink.textContent.replace QuoteCT.text, ''
if data.board is @board.ID and data.threadID isnt thread.ID if data.board is @board.ID and data.threadID isnt thread.ID
$.add quote, $.tn QuoteCT.text $.add quotelink, $.tn QuoteCT.text
return return
Anonymize = Anonymize =

View File

@ -330,6 +330,7 @@ Main =
initFeature 'Quote Inlining', QuoteInline initFeature 'Quote Inlining', QuoteInline
initFeature 'Quote Previewing', QuotePreview initFeature 'Quote Previewing', QuotePreview
initFeature 'Quote Backlinks', QuoteBacklink initFeature 'Quote Backlinks', QuoteBacklink
initFeature 'Mark Quotes of You', QuoteYou
initFeature 'Mark OP Quotes', QuoteOP initFeature 'Mark OP Quotes', QuoteOP
initFeature 'Mark Cross-thread Quotes', QuoteCT initFeature 'Mark Cross-thread Quotes', QuoteCT
initFeature 'Anonymize', Anonymize initFeature 'Anonymize', Anonymize