4chan-x/src/Quotelinks/QuoteBacklink.coffee
Zixaphir 8ddf2b4e5f Start working on tightening our control of the Navigation context
Currently breaks posting.

TODO:
* Fix style switching from NSFW to SFW (SFW to NSFW works)
  - It is worth noting this used to work.
* Fix post form not updating its currently selected thread.
* Fix navigation between threads in different boards (same boards
  works? Maybe?)
* Handle race conditions due to pop states.
  - I'm having a lot of trouble wrapping my mind around this one.
    Mostly due to the fact that I have no idea where to begin with
    it. But this isn't a big issue unless you pop state multiple
    times within seconds.

    I just need some exceptions when we try to disconnect features
    that haven't even finished connecting due to threads not being
    available yet.

Most of the early issues, like double-backlinks, incorrect
thumbnails, etc, have been fixed, I think. Or at least I'm no
longer running into them all the time.
2014-01-18 02:34:18 -07:00

59 lines
2.3 KiB
CoffeeScript
Executable File

QuoteBacklink =
# Backlinks appending need to work for:
# - previous, same, and following posts.
# - existing and yet-to-exist posts.
# - newly fetched posts.
# - in copies.
# XXX what about order for fetched posts?
#
# First callback creates backlinks and add them to relevant containers.
# Second callback adds relevant containers into posts.
# This is is so that fetched posts can get their backlinks,
# and that as much backlinks are appended in the background as possible.
containers: {}
init: ->
return if g.VIEW is 'catalog' or !Conf['Quote Backlinks']
format = Conf['backlink'].replace /%id/g, "' + id + '"
@funk = Function 'id', "return '#{format}'"
Post.callbacks.push
name: 'Quote Backlinking Part 1'
cb: @firstNode
Post.callbacks.push
name: 'Quote Backlinking Part 2'
cb: @secondNode
firstNode: ->
return if @isClone or !@quotes.length
a = $.el 'a',
href: "/#{@board}/res/#{@thread}#p#{@}"
className: if @isHidden then 'filtered backlink' else 'backlink'
textContent: (QuoteBacklink.funk @ID) + (if Conf['Mark Quotes of You'] and @info.yours then '\u00A0(You)' else '')
for quote in @quotes
containers = [QuoteBacklink.getContainer quote]
if (post = g.posts[quote]) and post.nodes.backlinkContainer
# Don't add OP clones when OP Backlinks is disabled,
# as the clones won't have the backlink containers.
for clone in post.clones
containers.push clone.nodes.backlinkContainer
for container in containers
nodes = [$.tn(' '), link = a.cloneNode true]
if Conf['Quote Previewing']
$.on link, 'mouseover', QuotePreview.mouseover
if Conf['Quote Inlining']
$.on link, 'click', QuoteInline.toggle
nodes.push QuoteInline.qiQuote link, $.hasClass link, 'filtered' if Conf['Quote Hash Navigation']
$.add container, nodes
return
secondNode: ->
if @isClone and (@origin.isReply or Conf['OP Backlinks'])
@nodes.backlinkContainer = $ '.container', @nodes.info
return
# Don't backlink the OP.
return unless @isReply or Conf['OP Backlinks']
container = QuoteBacklink.getContainer @fullID
@nodes.backlinkContainer = container
$.add @nodes.info, container
getContainer: (id) ->
@containers[id] or=
$.el 'span', className: 'container'