scroll.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. var scroll = (() => {
  2. function race (done) {
  3. Promise.race([
  4. Promise.all([
  5. new Promise((resolve) => {
  6. var images = Array.from(document.querySelectorAll('img'))
  7. if (!images.length) {
  8. resolve()
  9. }
  10. else {
  11. var loaded = 0
  12. images.forEach((img) => {
  13. img.addEventListener('load', () => {
  14. if (++loaded === images.length) {
  15. resolve()
  16. }
  17. }, {once: true})
  18. })
  19. }
  20. }),
  21. new Promise((resolve) => {
  22. var code = Array.from(document.querySelectorAll('code[class^=language-]'))
  23. if (!state.content.syntax || !code.length) {
  24. resolve()
  25. }
  26. else {
  27. setTimeout(() => resolve(), 40)
  28. }
  29. }),
  30. new Promise((resolve) => {
  31. var diagrams = Array.from(document.querySelectorAll('code.mermaid'))
  32. if (!state.content.mermaid || !diagrams.length) {
  33. resolve()
  34. }
  35. else {
  36. var timeout = setInterval(() => {
  37. var svg = Array.from(document.querySelectorAll('code.mermaid svg'))
  38. if (diagrams.length === svg.length) {
  39. clearInterval(timeout)
  40. resolve()
  41. }
  42. }, 50)
  43. }
  44. }),
  45. new Promise((resolve) => {
  46. if (!state.content.mathjax) {
  47. resolve()
  48. }
  49. else {
  50. var timeout = setInterval(() => {
  51. if (mj.loaded) {
  52. clearInterval(timeout)
  53. resolve()
  54. }
  55. }, 50)
  56. }
  57. })
  58. ]),
  59. new Promise((resolve) => setTimeout(resolve, 500))
  60. ])
  61. .then(done)
  62. }
  63. function debounce (container, done) {
  64. var listener = /html|body/i.test(container.nodeName) ? window : container
  65. var timeout = null
  66. listener.addEventListener('scroll', () => {
  67. clearTimeout(timeout)
  68. timeout = setTimeout(done, 100)
  69. })
  70. }
  71. function listen (container, prefix) {
  72. var key = prefix + location.origin + location.pathname
  73. try {
  74. container.scrollTop = parseInt(localStorage.getItem(key))
  75. debounce(container, () => {
  76. localStorage.setItem(key, container.scrollTop)
  77. })
  78. }
  79. catch (err) {
  80. chrome.storage.local.get(key, (res) => {
  81. container.scrollTop = parseInt(res[key])
  82. })
  83. debounce(container, () => {
  84. chrome.storage.local.set({[key]: container.scrollTop})
  85. })
  86. }
  87. }
  88. return () => {
  89. var loaded
  90. race(() => {
  91. if (!loaded) {
  92. loaded = true
  93. var container = ((html = $('html')) => (
  94. html.scrollTop = 1,
  95. html.scrollTop ? (html.scrollTop = 0, html) : $('body')
  96. ))()
  97. if (state.content.scroll) {
  98. listen(container, 'md-')
  99. }
  100. else if (location.hash && $(location.hash)) {
  101. container.scrollTop = $(location.hash).offsetTop
  102. }
  103. if (state.content.toc) {
  104. setTimeout(() => listen($('#_toc'), 'md-toc-'), 10)
  105. }
  106. }
  107. })
  108. }
  109. })()