diff --git a/CHANGELOG.md b/CHANGELOG.md index 182bd4685..ed12aa9c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +- New setting: `Quote Markers`, enabled by default + - This merges `Mark Quotes of You`, `Mark OP Quotes` and `Mark Cross-thread Quotes` into one feature. + - Backlinks now also get these markers. + - Multiple markers are now more compact, for example `>>123 (You/OP)` instead of `>>123 (You) (OP)`. + ### 3.16.5 - *2014-02-07* - Added `Archive link` to the Custom Board Navigation Rice diff --git a/src/General/Config.coffee b/src/General/Config.coffee index e192edcfb..9b523b481 100644 --- a/src/General/Config.coffee +++ b/src/General/Config.coffee @@ -73,9 +73,7 @@ Config = 'Quote Previewing': [true, 'Show quoted post on hover.'] 'Quote Highlighting': [true, 'Highlight the previewed post.'] '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 Cross-thread Quotes': [true, 'Add \'(Cross-thread)\' to cross-threads quotes.'] + 'Quote Markers': [true, 'Add "(You)", "(OP)", "(Cross-thread)", "(Dead)" markers to quote links.'] imageExpansion: 'Fit width': [true, ''] 'Fit height': [false, ''] diff --git a/src/General/Main.coffee b/src/General/Main.coffee index c7bdd1ecd..6f7a455ea 100644 --- a/src/General/Main.coffee +++ b/src/General/Main.coffee @@ -96,9 +96,7 @@ Main = initFeature 'Quote Inlining', QuoteInline initFeature 'Quote Previewing', QuotePreview initFeature 'Quote Backlinks', QuoteBacklink - initFeature 'Mark Quotes of You', QuoteYou - initFeature 'Mark OP Quotes', QuoteOP - initFeature 'Mark Cross-thread Quotes', QuoteCT + initFeature 'Quote Markers', QuoteMarkers initFeature 'Anonymize', Anonymize initFeature 'Color User IDs', IDColor initFeature 'Time Formatting', Time diff --git a/src/General/Post.coffee b/src/General/Post.coffee index f3b69895b..2226ff64b 100644 --- a/src/General/Post.coffee +++ b/src/General/Post.coffee @@ -177,8 +177,11 @@ class Post # Get quotelinks/backlinks to this post # and paint them (Dead). for quotelink in Get.allQuotelinksLinkingTo @ when not $.hasClass quotelink, 'deadlink' - $.add quotelink, $.tn '\u00A0(Dead)' $.addClass quotelink, 'deadlink' + continue unless Conf['Quote Markers'] + post = Get.postFromNode quotelink + {board, thread} = if post.isClone then post.context else post + QuoteMarkers.parseQuotelink board, thread, post, quotelink, true return # XXX tmp fix for 4chan's racing condition # giving us false-positive dead posts. @@ -197,10 +200,12 @@ class Post for clone in @clones clone.resurrect() - for quotelink in Get.allQuotelinksLinkingTo @ - if $.hasClass quotelink, 'deadlink' - quotelink.textContent = quotelink.textContent.replace '\u00A0(Dead)', '' - $.rmClass quotelink, 'deadlink' + for quotelink in Get.allQuotelinksLinkingTo @ when $.hasClass quotelink, 'deadlink' + $.rmClass quotelink, 'deadlink' + continue unless Conf['Quote Markers'] + post = Get.postFromNode quotelink + {board, thread} = if post.isClone then post.context else post + QuoteMarkers.parseQuotelink board, thread, post, quotelink, true return collect: -> diff --git a/src/General/Settings.coffee b/src/General/Settings.coffee index 3359a82db..86c027c4e 100644 --- a/src/General/Settings.coffee +++ b/src/General/Settings.coffee @@ -192,8 +192,8 @@ Settings = 'Remember QR size': '' 'Quote Inline': 'Quote Inlining' 'Quote Preview': 'Quote Previewing' - 'Indicate OP quote': 'Mark OP Quotes' - 'Indicate Cross-thread Quotes': 'Mark Cross-thread Quotes' + 'Indicate OP quote': '' + 'Indicate Cross-thread Quotes': '' # filter 'uniqueid': 'uniqueID' 'mod': 'capcode' diff --git a/src/Quotelinks/QuoteBacklink.coffee b/src/Quotelinks/QuoteBacklink.coffee index 5383e1dfd..b6b00d825 100644 --- a/src/Quotelinks/QuoteBacklink.coffee +++ b/src/Quotelinks/QuoteBacklink.coffee @@ -24,10 +24,17 @@ QuoteBacklink = cb: @secondNode firstNode: -> return if @isClone or !@quotes.length + text = QuoteBacklink.funk @ID a = $.el 'a', href: "/#{@board}/res/#{@thread}#p#{@}" - className: if @isHidden then 'filtered backlink' else 'backlink' - textContent: QuoteBacklink.funk @ID + className: 'backlink' + textContent: text + if @isHidden + $.addClass a, 'filtered' + if @isDead + $.addClass a, 'deadlink' + if Conf['Quote Markers'] + QuoteMarkers.parseQuotelink @board, @thread, @, a, false, text for quote in @quotes containers = [QuoteBacklink.getContainer quote] if (post = g.posts[quote]) and post.nodes.backlinkContainer diff --git a/src/Quotelinks/QuoteCT.coffee b/src/Quotelinks/QuoteCT.coffee deleted file mode 100644 index 62735db26..000000000 --- a/src/Quotelinks/QuoteCT.coffee +++ /dev/null @@ -1,22 +0,0 @@ -QuoteCT = - init: -> - return if !Conf['Mark Cross-thread Quotes'] - - # \u00A0 is nbsp - @text = '\u00A0(Cross-thread)' - Post.callbacks.push - name: 'Mark Cross-thread Quotes' - cb: @node - node: -> - # Stop there if it's a clone of a post in the same thread. - return if @isClone and @thread is @context.thread - - {board, thread} = if @isClone then @context else @ - for quotelink in @nodes.quotelinks - {boardID, threadID} = Get.postDataFromLink quotelink - continue unless threadID # deadlink - if @isClone - quotelink.textContent = quotelink.textContent.replace QuoteCT.text, '' - if boardID is board.ID and threadID isnt thread.ID - $.add quotelink, $.tn QuoteCT.text - return diff --git a/src/Quotelinks/QuoteMarkers.coffee b/src/Quotelinks/QuoteMarkers.coffee new file mode 100644 index 000000000..60433f7b6 --- /dev/null +++ b/src/Quotelinks/QuoteMarkers.coffee @@ -0,0 +1,39 @@ +QuoteMarkers = + init: -> + return if !Conf['Quote Markers'] + + Post.callbacks.push + name: 'Quote Markers' + cb: @node + node: -> + {board, thread} = if @isClone then @context else @ + for quotelink in @nodes.quotelinks + QuoteMarkers.parseQuotelink board, thread, @, quotelink, !!@isClone + return + parseQuotelink: (board, thread, post, quotelink, mayReset, customText) -> + markers = [] + {boardID, threadID, postID} = Get.postDataFromLink quotelink + + if QR.db?.get {boardID, threadID, postID} + markers.push 'You' + + if board.ID is boardID + if thread.ID is postID + markers.push 'OP' + + if threadID and threadID isnt thread.ID # threadID is 0 for deadlinks + markers.push 'Cross-thread' + + if $.hasClass quotelink, 'deadlink' + markers.push 'Dead' + + text = if customText + customText + else if boardID is post.board.ID + ">>#{postID}" + else + ">>>/#{boardID}/#{postID}" + if markers.length + quotelink.textContent = "#{text}\u00A0(#{markers.join '/'})" + else if mayReset + quotelink.textContent = text diff --git a/src/Quotelinks/QuoteOP.coffee b/src/Quotelinks/QuoteOP.coffee deleted file mode 100644 index 65e468fe9..000000000 --- a/src/Quotelinks/QuoteOP.coffee +++ /dev/null @@ -1,29 +0,0 @@ -QuoteOP = - init: -> - return if !Conf['Mark OP Quotes'] - - # \u00A0 is nbsp - @text = '\u00A0(OP)' - Post.callbacks.push - name: 'Mark OP Quotes' - cb: @node - node: -> - # Stop there if it's a clone of a post in the same thread. - return if @isClone and @thread is @context.thread - # Stop there if there's no quotes in that post. - return unless (quotes = @quotes).length - {quotelinks} = @nodes - - # rm (OP) from cross-thread quotes. - if @isClone and @thread.fullID in quotes - for quotelink in quotelinks - quotelink.textContent = quotelink.textContent.replace QuoteOP.text, '' - - {fullID} = (if @isClone then @context else @).thread - # add (OP) to quotes quoting this context's OP. - return unless fullID in quotes - for quotelink in quotelinks - {boardID, postID} = Get.postDataFromLink quotelink - if "#{boardID}.#{postID}" is fullID - $.add quotelink, $.tn QuoteOP.text - return diff --git a/src/Quotelinks/QuoteYou.coffee b/src/Quotelinks/QuoteYou.coffee deleted file mode 100644 index a480916a8..000000000 --- a/src/Quotelinks/QuoteYou.coffee +++ /dev/null @@ -1,14 +0,0 @@ -QuoteYou = - init: -> - return if !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: -> - return if @isClone - for quotelink in @nodes.quotelinks when QR.db.get Get.postDataFromLink quotelink - $.add quotelink, $.tn QuoteYou.text - return diff --git a/src/Quotelinks/Quotify.coffee b/src/Quotelinks/Quotify.coffee index 0cd5bbcea..333f47ec1 100644 --- a/src/Quotelinks/Quotify.coffee +++ b/src/Quotelinks/Quotify.coffee @@ -37,28 +37,20 @@ Quotify = quoteID = "#{boardID}.#{postID}" if post = g.posts[quoteID] - unless post.isDead - # Don't (Dead) when quotifying in an archived post, - # and we know the post still exists. - a = $.el 'a', - href: "/#{boardID}/res/#{post.thread}#p#{postID}" - className: 'quotelink' - textContent: quote - else - # Replace the .deadlink span if we can redirect. - a = $.el 'a', - href: "/#{boardID}/res/#{post.thread}#p#{postID}" - className: 'quotelink deadlink' - target: '_blank' - textContent: "#{quote}\u00A0(Dead)" - $.extend a.dataset, {boardID, threadID: post.thread.ID, postID} - else if redirect = Redirect.to 'thread', {boardID, threadID: 0, postID} + # Don't add 'deadlink' when quotifying in an archived post, + # and we don't know if the post died yet. + a = $.el 'a', + href: "/#{boardID}/res/#{post.thread}#p#{postID}" + className: if post.isDead then 'quotelink deadlink' else 'quotelink' + textContent: quote + $.extend a.dataset, {boardID, threadID: post.thread.ID, postID} + else if redirect = Redirect.to 'thread', {boardID, postID} # Replace the .deadlink span if we can redirect. a = $.el 'a', href: redirect className: 'deadlink' + textContent: quote target: '_blank' - textContent: "#{quote}\u00A0(Dead)" if Redirect.to 'post', {boardID, postID} # Make it function as a normal quote if we can fetch the post. $.addClass a, 'quotelink' @@ -68,7 +60,7 @@ Quotify = @quotes.push quoteID unless a - deadlink.textContent = "#{quote}\u00A0(Dead)" + deadlink.textContent = "#{quote}\u00A0(Dead)" if Conf['Quote Markers'] return $.replace deadlink, a