favicon.coffee 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. defaultUrl = null
  2. currentSlug = null
  3. imageCache = {}
  4. urlCache = {}
  5. withImage = (url, action) ->
  6. if imageCache[url]
  7. action(imageCache[url])
  8. else
  9. img = new Image()
  10. img.crossOrigin = 'anonymous'
  11. img.src = url
  12. img.onload = () =>
  13. imageCache[url] = img
  14. action(img)
  15. @setFaviconForDoc = (doc) ->
  16. return if currentSlug == doc.slug
  17. favicon = $('link[rel="icon"]')
  18. if defaultUrl == null
  19. defaultUrl = favicon.href
  20. if urlCache[doc.slug]
  21. favicon.href = urlCache[doc.slug]
  22. currentSlug = doc.slug
  23. return
  24. styles = window.getComputedStyle($("._icon-#{doc.slug}"), ':before')
  25. bgUrl = styles['background-image'].slice(5, -2)
  26. sourceSize = if bgUrl.includes('@2x') then 32 else 16
  27. sourceX = Math.abs(parseInt(styles['background-position-x'].slice(0, -2)))
  28. sourceY = Math.abs(parseInt(styles['background-position-y'].slice(0, -2)))
  29. withImage(bgUrl, (docImg) ->
  30. withImage(defaultUrl, (defaultImg) ->
  31. size = defaultImg.width
  32. canvas = document.createElement('canvas')
  33. ctx = canvas.getContext('2d')
  34. canvas.width = size
  35. canvas.height = size
  36. ctx.drawImage(defaultImg, 0, 0)
  37. docIconPercentage = 65
  38. destinationCoords = size / 100 * (100 - docIconPercentage)
  39. destinationSize = size / 100 * docIconPercentage
  40. ctx.drawImage(docImg, sourceX, sourceY, sourceSize, sourceSize, destinationCoords, destinationCoords, destinationSize, destinationSize)
  41. urlCache[doc.slug] = canvas.toDataURL()
  42. favicon.href = urlCache[doc.slug]
  43. currentSlug = doc.slug
  44. )
  45. )
  46. @resetFavicon = () ->
  47. if defaultUrl != null and currentSlug != null
  48. $('link[rel="icon"]').href = defaultUrl
  49. currentSlug = null