content.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. var $ = document.querySelector.bind(document)
  2. var state = {
  3. theme: '',
  4. html: '',
  5. markdown: '',
  6. raw: false,
  7. getURL: () => chrome.extension.getURL('/themes/' + state.theme + '.css')
  8. }
  9. chrome.extension.sendMessage({message: 'settings'}, (data) => {
  10. state.theme = data.theme
  11. state.raw = data.raw
  12. m.redraw()
  13. })
  14. chrome.extension.onMessage.addListener((req, sender, sendResponse) => {
  15. if (req.message === 'reload') {
  16. window.location.reload(true)
  17. }
  18. else if (req.message === 'theme') {
  19. state.theme = req.theme
  20. m.redraw()
  21. }
  22. else if (req.message === 'raw') {
  23. state.raw = req.raw
  24. m.redraw()
  25. }
  26. })
  27. var oncreate = {
  28. markdown: () => {
  29. document.body.scrollTop = parseInt(localStorage.getItem('scrolltop'))
  30. },
  31. html: () => {
  32. document.body.scrollTop = parseInt(localStorage.getItem('scrolltop'))
  33. setTimeout(() => Prism.highlightAll(), 20)
  34. }
  35. }
  36. function mount () {
  37. $('pre').style.display = 'none'
  38. var md = $('pre').innerText
  39. m.mount($('body'), {
  40. oninit: () => {
  41. ;((done) => {
  42. if (document.charset === 'UTF-8') {
  43. done()
  44. return
  45. }
  46. m.request({url: window.location.href,
  47. deserialize: (body) => {
  48. done(body)
  49. return body
  50. }
  51. })
  52. })((data) => {
  53. state.markdown = data || md
  54. chrome.extension.sendMessage({
  55. message: 'markdown',
  56. markdown: state.markdown
  57. }, (res) => {
  58. state.html = res.marked
  59. m.redraw()
  60. })
  61. })
  62. },
  63. view: () => {
  64. var dom = []
  65. if (state.raw) {
  66. updateStyles()
  67. dom.push(m('pre#markdown', {oncreate: oncreate.markdown}, state.markdown))
  68. }
  69. if (state.theme && !state.raw) {
  70. updateStyles()
  71. dom.push(m('link#theme [rel="stylesheet"] [type="text/css"]',
  72. {href: state.getURL()}))
  73. }
  74. if (state.html && !state.raw) {
  75. dom.push(m('#html', {oncreate: oncreate.html}, m.trust(state.html)))
  76. }
  77. return (dom.length ? dom : m('div'))
  78. }
  79. })
  80. }
  81. function scroll () {
  82. setTimeout(() => {
  83. var timeout = null
  84. window.addEventListener('scroll', () => {
  85. clearTimeout(timeout)
  86. timeout = setTimeout(() => {
  87. localStorage.setItem('scrolltop', document.body.scrollTop)
  88. }, 100)
  89. })
  90. document.body.scrollTop = parseInt(localStorage.getItem('scrolltop'))
  91. }, 100)
  92. }
  93. if (document.readyState === 'complete') {
  94. mount()
  95. scroll()
  96. }
  97. else {
  98. window.addEventListener('DOMContentLoaded', mount)
  99. window.addEventListener('load', scroll)
  100. }
  101. function updateStyles () {
  102. if (state.raw) {
  103. $('html').classList.remove('markdown-theme-html')
  104. $('body').classList.remove('markdown-theme')
  105. $('html').classList.remove('markdown-body-html')
  106. $('body').classList.remove('markdown-body')
  107. }
  108. else if (/github(-dark)?/.test(state.theme)) {
  109. $('html').classList.remove('markdown-theme-html')
  110. $('body').classList.remove('markdown-theme')
  111. $('html').classList.add('markdown-body-html')
  112. $('body').classList.add('markdown-body')
  113. }
  114. else {
  115. $('html').classList.remove('markdown-body-html')
  116. $('body').classList.remove('markdown-body')
  117. $('html').classList.add('markdown-theme-html')
  118. $('body').classList.add('markdown-theme')
  119. }
  120. }