content.js 3.4 KB

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